
سنتعلم في هذا الدرس برمجة مسابقة تتكون من عدد من أسئلة الاختيار من متعدد ، نقوم بعرض الأسئلة مرتبة بشكل عشوائي في كل مرة ، وفي نهاية البرنامج يقوم بعرض نقاط المتسابق وإجابات الأسئلة .
في البداية سيكون لدينا مصفوفة test من نوع string ، عدد صفوفها بعدد الأسئلة ، العمود الأول يحوي السؤال ، الأعمدة التالية وحتى قبل الأخير للخيارات ، والعمود الأخير للإجابة الصحيحة . نقوم بإسناد قيم للمصفوفة يدوياً كالآتي :
string test[10][6]={
{"Desert is to oasis as ocean is to :\n\n",
"Water",
"Island",
"Sand",
"Sea",
"Island"
},
{"Which number should come next in the series : 1 4 9 16 25\n\n",
"27",
"34",
"36",
"45",
"36"
},
{"If the day before yesterday is two days after Monday then what day is it today?\n\n",
"Monday",
"Tuesday",
"Wednesday",
"Friday",
"Friday"
},
{"Joe was both 5th highest and 5th lowest in a race.How many people participated?\n\n",
"8",
"9",
"10",
"11",
"9"
},
{"Which letter logically follows? T, Q, N, K, H,\n\n",
"Y",
"E",
"M",
"Z",
"E"
},
{"Which number should come next in the series ? 1 - 1 - 2 - 3 - 5 - 8 - 13\n\n",
"21",
"26",
"31",
"16",
"21"
},
{"PEACH is to HCAEP as 46251 is to :\n\n",
"25641",
"26451",
"12654",
"15264",
"15264"
},
{"What number is one half of one quarter of one tenth of 800?\n\n",
"10",
"40",
"80",
"8",
"10"
},
{"Divide 30 by 1/2 and add 10. What is the answer?\n\n",
"25",
"35",
"60",
"70",
"70"
},
{"Some months have 31 days; how many have 28?\n\n",
"1",
"2",
"6",
"12",
"12"
}
};ولكي نطبع الأسئلة مرتبة بشكل عشوائي في كل مرة ، نقوم بتعريف مصفوفة عددية num تحوي ارقاماً من 0 إلى 9 ، ثم نقوم بتغيير أماكن عناصرها عشوائياً كما تعلمنا في درس سابق ، لكي نجعل ترتيب عرض الأسئلة يختلف من مرة لأخرى ، كما ستجد في الدرس نفسه طريقة لاختيار 10 اسئلة من بين 100 سؤال بشكل عشوائي ، وهنا ستكون الفائدة أكبر ؛ إن لن يعود الأمر مقتصراً على اختلاف ترتيب الأسئلة في كل مرة ، بل إن الأسئلة نفسها ستتغير وهذا يجعل البرنامج أفضل بكثير .
int num[10];
for(int i=0;i<10;i++)
num=i;
for(int counter=10;counter>0;counter--)
{
int x=rand()%counter;
int temp=num[x];
for(int i=x;i<counter-1;i++)
num=num[i+1];
num[counter-1]=temp;
}وداخل دوران بعدد الأسئلة ( من 0 إلى 9 ) نقوم بطباعة السؤال والخيارات كالآتي :
cout<<test[num][0]
<<"1. "<<test[num][1]
<<" "<<"2. "<<test[num][2]
<<" "<<"3. "<<test[num][3]
<<" "<<"4. "<<test[num][4]<<endl;ومن ثم نطلب من المستخدم رمز إدخال إجابته ونقوم بتخزينها بمتغير answer . رمز الاجابة في هذا البرنامج من 1 إلى 4 ، وإن أدخل قيمة خارج هذا النطاق سيدخل البرنامج في دوران while لن يخرج منه إلا بعد إعطاء قيمة صحيحة لرمز الاجابة :
cout<<"\nEnter your answer : ";
cin>>answer;
while(answer<1 || answer>4)
{
cout<<"\n\aPlease insert a number between 1 and 4 : ";
cin>>answer;
}عدد النقاط سيزداد مع كل إجابة صحيحة ، وسيتم تخزينه في متغير score :
if(test[num][answer] == test[num][5])
score++;وفي النهاية طباعة نقاط المتسابق وبعدها الاجابات الصحيحة على الأسئلة :
cout<<"Your score is : "<<score<<endl;
cout<<"\n\nANSWERS\n\n";
for(int k=0;k<10;k++)
{
cout<<test[num[k]][0]<<test[num[k]][5]<<"\n\n";
}بعد تجميع أجزاء البرنامج تحصل على الآتي :
#include<iostream> // For input-output operations
#include<cstdlib> // For srand()
#include<string> // For declaring strings
#include<ctime> // For time()
using namespace std;
void main()
{
srand(time(0));
int answer;
int score=0;
int num[10];
for(int i=0;i<10;i++)
num=i;
for(int counter=10;counter>0;counter--)
{
int x=rand()%counter;
int temp=num[x];
for(int i=x;i<counter-1;i++)
num=num[i+1];
num[counter-1]=temp;
}
string test[10][6]={
{"Desert is to oasis as ocean is to :\n\n",
"Water",
"Island",
"Sand",
"Sea",
"Island"
},
{"Which number should come next in the series : 1 4 9 16 25\n\n",
"27",
"34",
"36",
"45",
"36"
},
{"If the day before yesterday is two days after Monday then what day is it today?\n\n",
"Monday",
"Tuesday",
"Wednesday",
"Friday",
"Friday"
},
{"Joe was both 5th highest and 5th lowest in a race.How many people participated?\n\n",
"8",
"9",
"10",
"11",
"9"
},
{"Which letter logically follows? T, Q, N, K, H,\n\n",
"Y",
"E",
"M",
"Z",
"E"
},
{"Which number should come next in the series ? 1 - 1 - 2 - 3 - 5 - 8 - 13\n\n",
"21",
"26",
"31",
"16",
"21"
},
{"PEACH is to HCAEP as 46251 is to :\n\n",
"25641",
"26451",
"12654",
"15264",
"15264"
},
{"What number is one half of one quarter of one tenth of 800?\n\n",
"10",
"40",
"80",
"8",
"10"
},
{"Divide 30 by 1/2 and add 10. What is the answer?\n\n",
"25",
"35",
"60",
"70",
"70"
},
{"Some months have 31 days; how many have 28?\n\n",
"1",
"2",
"6",
"12",
"12"
}
};
for(i=0;i<10;i++,cout<<endl)
{
cout<<test[num][0]
<<"1. "<<test[num][1]
<<" "<<"2. "<<test[num][2]
<<" "<<"3. "<<test[num][3]
<<" "<<"4. "<<test[num][4]<<endl;
cout<<"\nEnter your answer : ";
cin>>answer;
while(answer<1 || answer>4)
{
cout<<"\n\aPlease insert a number between 1 and 4 : ";
cin>>answer;
}
if(test[num][answer]==test[num][5])
score++;
}
cout<<"Your score is : "<<score<<endl;
cout<<"\n\nANSWERS\n\n";
for(int k=0;k<10;k++)
{
cout<<test[num[k]][0]<<test[num[k]][5]<<"\n\n";
}
}وإذا لم يعجبك شكل البرنامج ، بإمكانك أن تجعله بالألوان بعمل التعديل التالي :
#include<windows.h> // For printing in colors
.
.
.
void setColor(int color)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);
}
void main()
{
.
.
.
for(i=0;i<10;i++,cout<<endl)
{
setColor(15);
cout<<test[num][0];
for(int j=1;j<=4;j++)
{
if(j>1) cout<<" ";
setColor(14);
cout<<j<<". ";
setColor(10);
cout<<test[num][j];
}
setColor(14);
cout<<"\n\nEnter your answer : ";
cin>>answer;
while(answer<1 || answer>4)
{
cout<<"\n\aPlease insert a number between 1 and 4 : ";
cin>>answer;
}
setColor(10);
cout<<"\n------------------------------\n";
if(test[num][answer]==test[num][5])
score++;
}
setColor(15);
cout<<"Your score is : "<<score<<endl;
setColor(14);
cout<<"\n\nANSWERS\n\n";
for(int k=0;k<10;k++)
{
setColor(15);
cout<<test[num[k]][0];
setColor(10);
cout<<test[num[k]][5]<<"\n\n";
}
}
◄ للأمانة العلمية ، يرجى ذكر المصدر عند النقل
الموضوع الاصلي
http://psd-development.com/vb/t506.html
شبكة تكنولوجيا المعلومات والهندسة التقنية