זקוק לעזרה, לולאות While וSwitch Case בC. - עמוד 4 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

זקוק לעזרה, לולאות While וSwitch Case בC.


Stoned Junglist

Recommended Posts

אני חושב שהבעיה היא בזה שאתה מאפס את selection בכל כניסה לולאה ואז אתה בעצם דורס את הקלט שלך. הרי במידה וקלטת ספרה אתה מוסיף אותה ל selection וממשיך לאיטרציה הבאה של הלולאה אבל שם אתה מאפס את selection ובעצם קולט את התו הבא.

תנסה לאפס את selection רק כשאתה צריך - רק כסיימת לקלוט את selection (אחרי שקלטת \n ובדקת את הערך הנוכחי שלו).

קישור לתוכן
שתף באתרים אחרים

  • תגובות 51
  • נוצר
  • תגובה אחרונה

תודה.הוספתי פונקציה קטנטה. שבמקרה ו יש 1<space> אז הוא יקלוט עד זה כאחד , אבל יותר מרווח אחד ואז מספר אז הוא יקלוט את זה כשגיאה.

הבעיה שנשארה היא במקרה ואני קולט = 1 , אז הוא מדפיס lol1 ואז מבקש קלט נוסף, בקלט הנוסף אני מקליד לדוגמה 3 שיהיה לי כתוב lol3 אז הוא כותב לי error. בעיה נוספת היא שבמקרה אני מקליד 34 או או 31 (מספר שבו יש שתי ספרות שהם בבחירה (מתוך 1 עד 4)) אז הוא לא כותב כלום ומבקש קלט נוסף. ואז אם נגיד אני כותב את אותו מספר שוב אז הוא יכתוב ERROR. או נגיד אם אני מקליד (רווח)(רווח) 2 אז הוא יורד שורה ומבקש קלט עוד פעם זה קורה על כל שתי רווחים ומספר בין 1 ל-4 לידיהם. =\

הנה הקוד יהיה נחמד תיקונון לסיים את התרגיל . =] :xyxthumbs:



#include <stdio.h>
int main()
{
char c,hadError='n',shouldEnd='n';
int selection=0,count=0;
do
{
c = getchar();
if(c>='1' && c<='4')
selection=10*selection+c-48;
else
{
if(c==0x20)
{
count++;
}
else if(c=='\n')
{
if(hadError=='n'&& count<=1)
{
if(selection==1)
{
printf("lol1\n");
shouldEnd='n';
}
if(selection==2)
{
printf("lol2\n");
shouldEnd='n';
}
if(selection==3)
{
printf("lol3\n");
shouldEnd='n';
}
if(selection==4)
{
printf("lol4");
shouldEnd='y';
}
else
{
shouldEnd='n';
hadError='y';
}
}
selection=0;
}
else
hadError='y';
}
if(hadError == 'y')
{
while (getchar() != '\n');
printf("Error\n");
selection=0;
hadError = 'n';
count=0;
}
}
while(shouldEnd=='n');
}

קישור לתוכן
שתף באתרים אחרים

כמה דברים:

- כשקלטת \n אתה צריך לאפס את count אחרת אתה תמשיך עם אותו count לשורה הבאה.

- כשאתה בודק את selection עם ה if-ים, אחרי ה if הראשון השאר צריכים להיות else if (גם יותר יעיל ובמקרה הזה בלי זה יכולה להיות בעיה).

- כרגע יש בעיה אם המשתמש הכניס 5 למשל ואז אתה נכנס ללולאה while (getchar() != '\n'); כי זו בחירה שגויה אבל כבר קלטת \n אז הוא בעצם יחכה לקלט חדש.

- בכל מקרה כשאתה קולט \n אתה צריך לאפס את selection אז אתה יכול להוציא אותו מ if הפנימי ואז אין צורך לאפס אותו גם כשקרתה שגיאה.

תנסה את זה:

 char c,hadError='n',shouldEnd='n';
int selection=0,count=0;
do
{
c = getchar();
if(c>='1' && c<='4')
selection=10*selection+c-48;
else
{
if(c==0x20)
{
count++;
}
else if(c=='\n')
{
if(hadError=='n'&& count<=1)
{
if(selection==1)
{
printf("lol1\n");
shouldEnd='n';
}
else if(selection==2)
{
printf("lol2\n");
shouldEnd='n';
}
else if(selection==3)
{
printf("lol3\n");
shouldEnd='n';
}
else if(selection==4)
{
printf("lol4");
shouldEnd='y';
}
else
{
houldEnd='n';
hadError='y';
}
}
}
else
hadError='y';
selection=0;
count = 0;
}
if(hadError == 'y')
{
if(c != '\n')
while (getchar() != '\n');
printf("Error\n");
hadError = 'n';
}
}
while(shouldEnd=='n');

קישור לתוכן
שתף באתרים אחרים

תודה רבה רבה רבה. :yelclap::xyxthumbs:

שאלה אחרונת. =] אני רוצה להדפיס 5.5% . אז כתבתי

printf("%%.1lf",num);

נגיד, תאורתית, עכשיו זה לא פועל לי, אני רוצה שהוא ידפיס 5.5% נגיד, אך הוא לא מדפיס את זה והוא מדפיס %1.lf

או בקיצור, אני אני מדפיס מספר מסוג double עם % לידו.?

תודה רבה אתה גדול אחי =] :yelclap:

קישור לתוכן
שתף באתרים אחרים

אני סיימתי את הערות הכול התוכנה פועלת, פתאום בדקתי, וכשאני נכנס לאפשרות 3, ומפעיל את func option3 שזה האפשרות עם המספרים (32 23@ ומדפיס 55.00) אז אני מקליד 23 23@ ואז הוא מדפיס את הסכום כמו שצריך ואז הוא מדפיס פתאום error ונתון לקבל עוד קלט בין 1 ל4 בשורה חדש, כמו שאני רוצה, אך הבעיה היא שאני לא רוצה שיהיה את הERROR שם , ובדקתי הכול הכול והכול ולא יודע מה הבעיה שלי.

הקוד קצת ארוך אז אקצר כמה שאוכל.


#include <stdio.h>
int option1();
int option2();
int option3();
int main()
{
char c,hadError='n',shouldEnd='n';
int selection=0,count=0;
do
{
c = getchar();
if(c>='1' && c<='4')
selection=10*selection+c-48;
else
{
if(c==0x20)
{
count++;
}
else if(c=='\n')
{
if(hadError=='n'&& count<=1)
{
if(selection==1)
{
option1();
shouldEnd='n';
}
else if(selection==2)
{
option2();
shouldEnd='n';
}
else if(selection==3)
{
option3();
shouldEnd='n';
}
else if(selection==4)
{
shouldEnd='y';
}
else
{
houldEnd='n';
hadError='y';
}
}
}
else
hadError='y';
selection=0;
count = 0;
}
if(hadError == 'y')
{
if(c != '\n')
while (getchar() != '\n');
printf("Error\n");
hadError = 'n';
}
}
while(shouldEnd=='n');
}
int option3()
{
double sum=0,num=0, multiplier;
char ch, shouldEnd = 'n',num3='n', state='e', hadError='n',dot='n';
do
{
ch=getchar();
if(ch<='9' && ch>='0')
{
if(dot=='y')
{
num += (ch-48)*multiplier;
multiplier /= 10;
}
else
num=num*10+ch-48;

if(state=='e')
state='p';
if(ch=='3')
num3='y';
}
else if (ch=='-')
{
if(state == 'e')
state='n';
else
hadError = 'y';
}
else if(ch=='.')
{
if(state == 'e' || dot == 'y')
hadError = 'y';
else
{
dot='y';
multiplier=0.1;
}
}
else
{
if(num3=='y')
{
if(state=='p')
sum += num;
else if(state=='n')
sum -= num;
}
if (ch == '@')
{
shouldEnd='y';
printf("%.2lf\n",sum);
}
else if(ch != 0x20)
hadError = 'y';

num=0;
state='e';
num3='n';
dot='n';
}

if(hadError == 'y')
{
while (getchar() != '\n');
printf("error\n");
sum = 0;
hadError = 'n';
}
}
while(shouldEnd == 'n');
}

הורדתי את הערות ואת פונקציה 2 ו1.

תודה רבה

קישור לתוכן
שתף באתרים אחרים

הבעיה היא היא שאחרי שנקלט @ עדיין נשאר ב buffer התו \n שהוכנס (אחרי ה @) והוא נקלט ע"י getchar ב main מה שמטופל כשגיאה. צריך פשוט להוסיף קריאה ל getchar() בתוך התנאי של ה @. getchar "תוציא" את ה \n ובכך תנקה את buffer של הקלט (פשוט תסיים את הקליטה של השורה).

ראיתי עוד באג: אם מכניסים מס' עם שתי נקודות (ב option3), למשל 22 3.3.@ מודפסת שגיאה אבל המשתנים לא מאופסים (בתוך ה if(state == 'e' || dot == 'y') ).

תנסה את זה:

#include <stdio.h>
int option1();
int option2();
int option3();
int main()
{
char c,hadError='n',shouldEnd='n';
int selection=0,count=0;
do
{
c = getchar();
if(c>='1' && c<='4')
selection=10*selection+c-48;
else
{
if(c==0x20)
{
count++;
}
else if(c=='\n')
{
if(hadError=='n'&& count<=1)
{
if(selection==1)
{
option1();
shouldEnd='n';
}
else if(selection==2)
{
option2();
shouldEnd='n';
}
else if(selection==3)
{
option3();
shouldEnd='n';
}
else if(selection==4)
{
shouldEnd='y';
}
else
{
shouldEnd='n';
hadError='y';
}
}
}
else
hadError='y';
selection=0;
count = 0;
}
if(hadError == 'y')
{
if(c != '\n')
while (getchar() != '\n');
printf("Error\n");
hadError = 'n';
}
}
while(shouldEnd=='n');
}
int option3()
{
double sum=0,num=0, multiplier;
char ch, shouldEnd = 'n',num3='n', state='e', hadError='n',dot='n';
do
{
ch=getchar();
if(ch<='9' && ch>='0')
{
if(dot=='y')
{
num += (ch-48)*multiplier;
multiplier /= 10;
}
else
num=num*10+ch-48;

if(state=='e')
state='p';
if(ch=='3')
num3='y';
}
else if (ch=='-')
{
if(state == 'e')
state='n';
else
hadError = 'y';
}
else if(ch=='.')
{
if(state == 'e' || dot == 'y')
{
hadError = 'y';
num=0;
state='e';
num3='n';
dot='n';
}
else
{
dot='y';
multiplier=0.1;
}
}
else
{
if(num3=='y')
{
if(state=='p')
sum += num;
else if(state=='n')
sum -= num;
}
if (ch == '@')
{
getchar(); //for \n
shouldEnd='y';
printf("%.2lf\n",sum);
}
else if(ch != 0x20)
hadError = 'y';

num=0;
state='e';
num3='n';
dot='n';
}

if(hadError == 'y')
{
while (getchar() != '\n');
printf("error\n");
sum = 0;
hadError = 'n';
}
}
while(shouldEnd == 'n');
}

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.


×
  • צור חדש...