Stoned Junglist פורסם 2007 בדצמבר 5 Share פורסם 2007 בדצמבר 5 שלומות! =]אני עובד על תוכנה שאמורה לקרוא משפט, לזהות אם יש בו calc ואז לחשב את המספרים אחרי.לדוגמא קלט-calc 4+3 פלט-7להלן הפונקציה הלא גמורה שלי(עוד לא בדקתי מקרה של קלט לא תקין ) שלא מתקמפלת בגלל הבעיה unterminated character constant.אך אינני יודע למה ישנה הבעיה מכיוון שבדקתי את הפונקציה ולא מצאתי את הבעיה =\.עזרה למצוא את בעיית הקימפול יהיה נחמד =] תודה רבה. להלן הפונקציה:#include <stdio.h>#include <string.h>int function_calc(char str[200],int i);int main(){ char str[200]; gets(str); if(str[0]=='c' && str[1]=='a' && str[2]=='l' && str[3]=='c') { puts("calc"); function_calc(char str[200],int i); }}int function_calc(char str[200],int i){ char ch,plus,diving,subtract,multi,square,hadError; int i; double num,sum; for(i=5;i<200;i++) { ch=str[i]; if(ch>='0' && ch<='9') { if(plus=='y') num=num+ch-48; else if(diving=='y') num=num/(double)(ch-48); else if(subtract=='y') num=num-ch-48; else if(multi=='y') num=num*(ch-48); else if(square=='y') num=num+(ch-48); else num=ch-48; } else { switch(ch) { case '+':plus='y';break; case '\':diving='y';break; case '-':subtract='y';break; case '*':multi='y';break; case '^':square='y';break; default:hadError='y';break; } } }} קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2007 בדצמבר 5 Share פורסם 2007 בדצמבר 5 קודם כל, בד"כ הקומפיילר אומר לך באיזו שורה הבעיה.חוץ מזה, הגדרת את הפונקציה function_calc כך שהיא לא מקבלת פרמטרים בכלל.(יש לך עוד באגים אחרים, אבל קודם כל נביא את התכנית למצב שהיא מתקמפלת) קישור לתוכן שתף באתרים אחרים More sharing options...
Stoned Junglist פורסם 2007 בדצמבר 5 מחבר Share פורסם 2007 בדצמבר 5 קודם כל, בד"כ הקומפיילר אומר לך באיזו שורה הבעיה.חוץ מזה, הגדרת את הפונקציה function_calc כך שהיא לא מקבלת פרמטרים בכלל.(יש לך עוד באגים אחרים, אבל קודם כל נביא את התכנית למצב שהיא מתקמפלת)למה אתה מתכוון בכך שהיא לא מקבלת פרמטרים? האם אני צריך להגידר אותה כ function_calc(char string[200],int i)?עריכה- ערכתי תיקנתי כמה דברים . קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2007 בדצמבר 5 Share פורסם 2007 בדצמבר 5 כן, בדיוק ככה.ואז כמובן תדאג שהפונקציה תשתמש בפרמטרים האלה. קישור לתוכן שתף באתרים אחרים More sharing options...
Stoned Junglist פורסם 2007 בדצמבר 5 מחבר Share פורסם 2007 בדצמבר 5 כן, בדיוק ככה.ואז כמובן תדאג שהפונקציה תשתמש בפרמטרים האלה.אז בכל פרמרטים ומשתנה שאני משתמש בפונקציה אני צריך לכתוב אותו בהצרה? אתה יכול להסביר בקצרה על זה? קישור לתוכן שתף באתרים אחרים More sharing options...
k-o-b-y פורסם 2007 בדצמבר 5 Share פורסם 2007 בדצמבר 5 אתה צריך לכתוב בהצהרה ובהגדרה של הפונקציה את רשימת הפרטמרים שהפונקציה מקבלת (בהצהרה אתה לא חייב לציין את השמות של המשתנים אלא יכול רק את הטיפוסים שלהם אבל בהגדרה של הפונקציה אתה חייב לציין גם את השמות).אם ההצהרה נראית כך:int function_calc(char string[200],int i)אז גם ההגדרה (איפה שמופיע גוף הפונקציה) צריכה להיות זהה. קישור לתוכן שתף באתרים אחרים More sharing options...
Stoned Junglist פורסם 2007 בדצמבר 6 מחבר Share פורסם 2007 בדצמבר 6 תיקנתי את הפונקציה אך אני עדין מקבל את הERROR הזה. קישור לתוכן שתף באתרים אחרים More sharing options...
שניצל פורסם 2007 בדצמבר 6 Share פורסם 2007 בדצמבר 6 כשאתה קורא לפונקציה, אתה צריך לקרוא לה רק עם השמות של המשתנים שאתה מעביר, ולא עם הטיפוסים שלהם.ככה:function_calc(str, i);עשה טובה, תקרא שוב על פונקציות ואיך משתמשים בהן. קישור לתוכן שתף באתרים אחרים More sharing options...
k-o-b-y פורסם 2007 בדצמבר 6 Share פורסם 2007 בדצמבר 6 כמה דברים:- אתה גם לא צריך להגדיר את i כפרמטר שהפונקציה מקבלת הרי אתה מגדיר אותו שוב בתוך הפונקציה והוא לא משתנה שצריך לקבל ערך ממי שקורא לפונקציה. i גם לא קיים ב main ככה שאתה לא יכול לשלוח את i ל function_calc (הוא לא קיים ב main, אין קשר בין השם של הפרמטר לערך שהוא מקבל ממי שקורא לפונקציה).- ב case עם ה '\' אתה צריך לכתוב '\\' כי \ משמש לתווי בקרה (כמו \n ו- \t) אז כשרוצים להשתמש בתו עצמו צריך להשתמש ב \\.- עוד בעיה: כשאתה קולט מספר אתה ישר בודק את המשתנים שמציינים את הפעולות, אבל כשאתה קולט את המס' הראשון אף אחד מהם לא מאותחל ואתה תקבל שגיאה. אתה צריך לאתחל את כולם (עם 'n' למשל). עריכה: שמתי לב שאתה גם לא עושה כלום עם התוצאה של החישוב. לפי ה int שמחזירה הפונקציה אולי רצית להחזיר את הערך (כדי לעשות את זה אתה משתמש ב return) או שאולי אתה רוצה להדפיס את התוצאה מתוך הפונקציה. קישור לתוכן שתף באתרים אחרים More sharing options...
Stoned Junglist פורסם 2007 בדצמבר 6 מחבר Share פורסם 2007 בדצמבר 6 תודה על הביקורת הבונה. ערכתי קצת את הפונקציה כמו שצריך אך עדין יש לי בעיה עם הפונקציה, למרות התיקון#include <stdio.h>#include <string.h>#define SIZE 200int function_calc(char [],int);int main(){ char str[SIZE]; gets(str); if(str[0]=='c' && str[1]=='a' && str[2]=='l' && str[3]=='c') { puts("calc"); function_calc(str,SIZE); }}int function_calc(char str[],int SIZE){ char ch,plus='n',diving='n',subtract='n',multi='n',square='n',hadError='n'; double num=0,sum=0; int i,j; for(i=5;i!='\0';i++) { ch=str[i]; if(ch>='0' && ch<='9') { if(plus=='y') num=num+ch-48; else if(diving=='y') num=num/(double)(ch-48); else if(subtract=='y') num=num-ch-48; else if(multi=='y') num=num*(ch-48); else if(square=='y') { for(j=1;j<ch;j++) { num=num*(num); } } else num+=ch-48; sum+=num; } else { if(ch=='+') plus='y'; else if(ch=='\\') diving='y'; else if(ch=='-') subtract='y'; num=num-ch-48; else if(multi=='y') num=num*(ch-48); else if(square=='y') { for(j=1;j<ch;j++) { num=num*(num); } } else num+=ch-48; sum+=num; } else { if(ch=='+') plus='y'; else if(ch=='\\') diving='y'; else if(ch=='-') subtract='y'; else if(ch=='*') multi='y'; else if(ch=='^') square='y'; else if(ch=='\n') printf("%.1lf",sum); else hadError='y'; } }}בהצהרה- אני כותב את סוג המשתנים.ובהגדרה את השם שלהם והסוג כמו שעשיתי.אך אני נתקל בבעיות הנ"ל:main.c:16: parse error before `200'main.c: In function `function_calc':main.c:17: number of arguments doesn't match prototypemain.c:5: prototype declarationmain.c:23: `str' undeclared (first use in this function)main.c:23: (Each undeclared identifier is reported only oncemain.c:23: for each function it appears in.)אני לא מבין למה הוא אומר שהוא הצהרתי את str, הרי הגדרתי אותו בMAIN והעברתי אותו כארגונמט לפונקציה function_calc, ואותו דבר לבעיות האחרות, הרי הגדרתי אותם 2 ארגומנטים לכל הפונקציה הזאת.נ.ב זה קימפל לי תפונקציה שהשתמש ב200 ללא DEFINE אך זה השיב לי בsegment fault שזה ERROR חמור אז החלטתי להשתמש בDEFINE.שאני מגיע לסוף שורה אז הוא מתדפיס את הסכום של המספרים. קישור לתוכן שתף באתרים אחרים More sharing options...
k-o-b-y פורסם 2007 בדצמבר 6 Share פורסם 2007 בדצמבר 6 כשאתה משתמש ב #define בכל פעם שמופיע השם של מה שהגדרת הוא מוחלף (ע"י ה preprocessor) בערך שהגדרת. מה שאומר שהשורה:int function_calc(char str[],int SIZE)מתורגמת ל:int function_calc(char str[],int 200)מה שמין הסתם לא חוקי. אין לך צורך במפרמטר נוסף, אתה הרי רץ עד לתו ריק (/0).לגבי הפונקציה קצת הסתבכת שם. הפונקציה אמורה לחשב רק פעולה אחת (כמו למשל 1+2) או כמה (כמו 1+2+3)?לגבי הלולאה, התנאי שלך אמור להיות str[ i ] != '\0' ולא i!='\0' כי אתה רוצה לבדוק את התו שבמקום ה i ולא את i. קישור לתוכן שתף באתרים אחרים More sharing options...
Stoned Junglist פורסם 2007 בדצמבר 6 מחבר Share פורסם 2007 בדצמבר 6 אוקי צודק בקשר לתנאי לולאה, קצת פישלתי שם. בקשר להגדרה הבנתי את הטעות אבל לא הבנתי איך זה עוזר לתקן את הבעית קומלפציה כי היא נשארת אחרי התיקון, אני לא מבין בכלל למה הבעית קומפילציה מופיע שם הגדרתי את הפונקציה כמו שצריך לפי דעתי. לגבי הפונקציה אני רוצה שזה יפתור כל מיני מקרים כמו 3+4-8 או 3+4-7+5+4-5 בנתיים השארי את החזקות הכפל והחילוק שמה אבל לא השתמשתי בהם כי אני חושב על איך לסדר את זה שזה יפעל לפי סדר מתמטי (חזקה קודם אחרכך כפל ואחר כך חיבור וכו') בנתיים אני עובד על החיבור והחיסור. תודה. קישור לתוכן שתף באתרים אחרים More sharing options...
Ghosthunter פורסם 2007 בדצמבר 6 Share פורסם 2007 בדצמבר 6 אם אתה רוצה להוסיף גם כפל וחילוק(כחלק מביטוי ארוך יותר), כדאי לך לתכנן איך תעשה את זה, ואחר כך תתחיל לכתוב. קישור לתוכן שתף באתרים אחרים More sharing options...
Stoned Junglist פורסם 2007 בדצמבר 7 מחבר Share פורסם 2007 בדצמבר 7 אין לי בנתיים רעיון לכפל והחילוק ולכן ביקשתי עזרה רק עם החיבור והחיסור =\ קישור לתוכן שתף באתרים אחרים More sharing options...
Recommended Posts
ארכיון
דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.