تسجيل الدخول

مشاهدة النسخة كاملة : cin.get and EOF



-Cheetah-
13-01-2007, 10:36 AM
السلام عليكم ورحمة الله وبركاته
عمل البرنامج:
يولد الرنامج عددين (1-9) ويطلب من المستخدم إدخال ناتج ضربهما.
يعرض رسالة مختارة عشوائيا من ثلاث رسائل. (تختلف هذه الرسائل تبعا لصحة الإجابة).
بعد عشرة أسئلة يعرض نسبة مئوية لأداء المستخدم.
يتوقف البرنامج في حالة إدخال رمز EOF :
(Ctrl+Z).

المشاكل:
1-البرنامج لا يتوقف بإدخال EOF، بل يخرج باستمرار وبلا نهاية إحدى الرسائل الثلاث الخاصة بالإجابة الخطأ.
2-عند استعمال in=cin.get البرنامج لا يقرأ القيمة المدخلة بواسطة المستخدم.

# include <iostream>
# include <cstdlib>
# include <ctime>

using namespace std;

void main()
{
int n1,n2;
int res;
int in;
int countGlob = 1;
int countWrong = 0;
int test;
int rcase;
bool clear = false;

srand(time(0));

n1 = (rand()%9)+1;
n2 = (rand()%9)+1;
res = n1*n2;

cout << "How much is " << n1 << " times " << n2 << endl;
cin >> in;


while ((in)!=EOF)
{
rcase = (rand()%3)+1;

if (in==res)
{
test=1;
}
else
{
test=2;
}

switch(test)
{
case 1:


if (rcase==1)
{
cout << "Great job, keep it up." << endl;
}
else
if (rcase==2)
{
cout << "Correct!!" << endl;
}
else
{
cout << "Right, keep up the good work." << endl;
}

if (countGlob==10)
{
cout << "Your percentage is "
<< (static_cast<double>(10-countWrong)/countGlob)*100 << "%."<< endl;

countWrong = 0;
countGlob = 0;
}

n1 = (rand()%9)+1;
n2 = (rand()%9)+1;
res = n1*n2;

cout << "How much is " << n1 << " times " << n2 << endl;
cin >> in;

clear = false;

countGlob++;

break;

case 2:
if (rcase==1)
{
cout << "Wrong, try again." << endl;
}
else
if (rcase==2)
{
cout << "Too bad, give it another shot." << endl;
}
else
{
cout << "No, don't give up!" << endl;
}

if (!clear)
{
countWrong++;
clear = true;
}

cin >> in;


break;

}
}
}


# include <iostream>
# include <cstdlib>
# include <ctime>

using namespace std;

void main()
{
int n1,n2;
int res;
int in;
int countGlob = 1;
int countWrong = 0;
int test;
int rcase;
bool clear = false;

srand(time(0));

n1 = (rand()%9)+1;
n2 = (rand()%9)+1;
res = n1*n2;

cout << "How much is " << n1 << " times " << n2 << endl;


while ((in=cin.get())!=EOF)
{
rcase = (rand()%3)+1;

if (in==res)
{
test=1;
}
else
{
test=2;
}

switch(test)
{
case 1:


if (rcase==1)
{
cout << "Great job, keep it up." << endl;
}
else
if (rcase==2)
{
cout << "Correct!!" << endl;
}
else
{
cout << "Right, keep up the good work." << endl;
}

if (countGlob==10)
{
cout << "Your percentage is "
<< (static_cast<double>(10-countWrong)/countGlob)*100 << "%."<< endl;

countWrong = 0;
countGlob = 0;
}

n1 = (rand()%9)+1;
n2 = (rand()%9)+1;
res = n1*n2;

cout << "How much is " << n1 << " times " << n2 << endl;


clear = false;

countGlob++;

break;

case 2:
if (rcase==1)
{
cout << "Wrong, try again." << endl;
}
else
if (rcase==2)
{
cout << "Too bad, give it another shot." << endl;
}
else
{
cout << "No, don't give up!" << endl;
}

if (!clear)
{
countWrong++;
clear = true;
}



break;

}
}
}

الكود الأول يتعرض للمشكلة الأولى، والثاني للثانية، والاختلاف بينهما في استعمال cin.get

Wolf Sniper
13-01-2007, 08:25 PM
السلام عليكم


أخي الكريم -Cheetah-


لقد حللت بعض المشاكل الموجودة في البرنامج و كانت كالتالي :


1 – يجب عليك أن تضع أوامر إخراج المعدل بعد اختبار قيمة المتغير test أي بعد switch .. بالإضافة إلى ضرورة أيضاً طلب النتيجة التالية لضرب عددين قبل انتهاء while .


2 – قمت بإضافة متغير عام لأجل عدد الأسئلة و سنزيد هذا العداد في كل مرة نطرح سؤال و ذلك أيضاً بعد switch .. و القيمة الابتدائية لهذا العداد هي الواحد لأننا طلبنا أول سؤال قبل الحلقة while .


3 – من أجل حساب المعدل قمت بتغيير المعادلة بحيث أصبحت عدد الأجوبة الصحيحة ( countGlob ) مع تقسيمها على عدد الأسئلة و هو count – 1 لأننا سنزيد العداد ثم سنختبره و لأننا نريد 10 أسئلة فستكون قيمة count لذلك تساوي 11 .


4 – قمت بترتيب بسيط لطباعة النصوص و وضع سطر من أجل عملية إدخال العشرة أرقام التالية مع إضافة رقم السؤال عند طرحه .


5 – من أجل انهاء البرنامج .. لاحظ أن EOF هي ثابت له القيمة ( 1- ) و بالتالي فور ادخال هذه القيمة سينتهي البرنامج .. و إذا كنت تريد كتابة المعدل بعد إدخال ( 1- ) و قبل انتهاء البرنامج و الخروج منه فأضف أوامر حساب المعدل بعد نهاية الحلقة while و لكن مع الانتباه إلى عدم التقسيم على count – 1 بل على 10 .


هذا هو البرنامج :


# include <iostream>
# include <cstdlib>
# include <ctime>

using namespace std;

void main()
{
int n1,n2;
int res;
int in;
int count = 1;
int countGlob = 0;
int countWrong = 0;
int test;
int rcase;
bool clear = false;

srand(unsigned( time(0) ));
n1 = (rand()%9)+1;
n2 = (rand()%9)+1;
res = n1*n2;

cout << count << ". How much is " << n1 << " times " << n2 << endl;
cin >> in;

while ( in != EOF )
{
rcase = (rand()%3)+1;
if (in==res)
{
test=1;
}
else
{
test=2;
}
switch(test)
{
case 1:

if (rcase==1)
{
cout << "Great job, keep it up.\n" << endl;
}
else
{
if (rcase==2)
{
cout << "Correct!!\n" << endl;
}
else
{
cout << "Right, keep up the good work.\n" << endl;
}
}

clear = false;
countGlob++;
break;
case 2:
if (rcase==1)
{
cout << "Wrong, try again.\n" << endl;
}
else
if (rcase==2)
{
cout << "Too bad, give it another shot.\n" << endl;
}
else
{
cout << "No, don't give up!\n" << endl;
}

if (!clear)
{
countWrong++;
clear = true;
}
break;
}

count++;

if (count==11)
{
cout << "Your percentage is "
<< (static_cast<double>(countGlob) / (count-1) ) * 100 << "%."<< endl
<< "==================================\n";

countWrong = 0;
countGlob = 0;
count = 1;
}

n1 = (rand()%9)+1;
n2 = (rand()%9)+1;
res = n1*n2;
cout << count << ". How much is " << n1 << " times " << n2 << endl;
cin >> in;

}
}



هذا حل سريع لمشكلة البرنامج .. بالتوفيق

-Cheetah-
13-01-2007, 08:48 PM
شكرا جزيلا أخي الكريم على الجهد والمساعدة.
إخراج تلك الأجزاء من الكود إلى خارج بناء switvh شكل فارقا كبيرا وسهل الكثير.

انتبهت الآن إلى أن -1 هو EOF.

شكرا جزيلا مرة أخرى.