k-o-b-y פורסם 2007 בנובמבר 30 Share פורסם 2007 בנובמבר 30 אני חושב שהבעיה היא בזה שאתה מאפס את selection בכל כניסה לולאה ואז אתה בעצם דורס את הקלט שלך. הרי במידה וקלטת ספרה אתה מוסיף אותה ל selection וממשיך לאיטרציה הבאה של הלולאה אבל שם אתה מאפס את selection ובעצם קולט את התו הבא.תנסה לאפס את selection רק כשאתה צריך - רק כסיימת לקלוט את selection (אחרי שקלטת \n ובדקת את הערך הנוכחי שלו). קישור לתוכן שתף באתרים אחרים More sharing options...
Stoned Junglist פורסם 2007 בדצמבר 1 מחבר Share פורסם 2007 בדצמבר 1 תודה.הוספתי פונקציה קטנטה. שבמקרה ו יש 1<space> אז הוא יקלוט עד זה כאחד , אבל יותר מרווח אחד ואז מספר אז הוא יקלוט את זה כשגיאה. הבעיה שנשארה היא במקרה ואני קולט = 1 , אז הוא מדפיס lol1 ואז מבקש קלט נוסף, בקלט הנוסף אני מקליד לדוגמה 3 שיהיה לי כתוב lol3 אז הוא כותב לי error. בעיה נוספת היא שבמקרה אני מקליד 34 או או 31 (מספר שבו יש שתי ספרות שהם בבחירה (מתוך 1 עד 4)) אז הוא לא כותב כלום ומבקש קלט נוסף. ואז אם נגיד אני כותב את אותו מספר שוב אז הוא יכתוב ERROR. או נגיד אם אני מקליד (רווח)(רווח) 2 אז הוא יורד שורה ומבקש קלט עוד פעם זה קורה על כל שתי רווחים ומספר בין 1 ל-4 לידיהם. =\ הנה הקוד יהיה נחמד תיקונון לסיים את התרגיל . =] #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');} קישור לתוכן שתף באתרים אחרים More sharing options...
k-o-b-y פורסם 2007 בדצמבר 2 Share פורסם 2007 בדצמבר 2 כמה דברים:- כשקלטת \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'); קישור לתוכן שתף באתרים אחרים More sharing options...
Stoned Junglist פורסם 2007 בדצמבר 2 מחבר Share פורסם 2007 בדצמבר 2 תודה רבה רבה רבה. שאלה אחרונת. =] אני רוצה להדפיס 5.5% . אז כתבתי printf("%%.1lf",num); נגיד, תאורתית, עכשיו זה לא פועל לי, אני רוצה שהוא ידפיס 5.5% נגיד, אך הוא לא מדפיס את זה והוא מדפיס %1.lf או בקיצור, אני אני מדפיס מספר מסוג double עם % לידו.? תודה רבה אתה גדול אחי =] קישור לתוכן שתף באתרים אחרים More sharing options...
k-o-b-y פורסם 2007 בדצמבר 2 Share פורסם 2007 בדצמבר 2 תנסה להוסיף עוד % לפני ה .1lf . קישור לתוכן שתף באתרים אחרים More sharing options...
Stoned Junglist פורסם 2007 בדצמבר 3 מחבר Share פורסם 2007 בדצמבר 3 אני סיימתי את הערות הכול התוכנה פועלת, פתאום בדקתי, וכשאני נכנס לאפשרות 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.תודה רבה קישור לתוכן שתף באתרים אחרים More sharing options...
k-o-b-y פורסם 2007 בדצמבר 3 Share פורסם 2007 בדצמבר 3 הבעיה היא היא שאחרי שנקלט @ עדיין נשאר ב 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');} קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.