עבור לתוכן

Strings And Arrays Problem in C

Featured Replies

פורסם

שלומות! =]

אני עובד על תוכנה שאמורה לקרוא משפט, לזהות אם יש בו 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;
}
}
}
}

פורסם

קודם כל, בד"כ הקומפיילר אומר לך באיזו שורה הבעיה.

חוץ מזה, הגדרת את הפונקציה function_calc כך שהיא לא מקבלת פרמטרים בכלל.

(יש לך עוד באגים אחרים, אבל קודם כל נביא את התכנית למצב שהיא מתקמפלת)

פורסם
  • מחבר

קודם כל, בד"כ הקומפיילר אומר לך באיזו שורה הבעיה.

חוץ מזה, הגדרת את הפונקציה function_calc כך שהיא לא מקבלת פרמטרים בכלל.

(יש לך עוד באגים אחרים, אבל קודם כל נביא את התכנית למצב שהיא מתקמפלת)

למה אתה מתכוון בכך שהיא לא מקבלת פרמטרים? האם אני צריך להגידר אותה כ function_calc(char string[200],int i)?

עריכה- ערכתי תיקנתי כמה דברים .

פורסם

כן, בדיוק ככה.

ואז כמובן תדאג שהפונקציה תשתמש בפרמטרים האלה.

פורסם
  • מחבר

כן, בדיוק ככה.

ואז כמובן תדאג שהפונקציה תשתמש בפרמטרים האלה.

אז בכל פרמרטים ומשתנה שאני משתמש בפונקציה אני צריך לכתוב אותו בהצרה? אתה יכול להסביר בקצרה על זה?

פורסם

אתה צריך לכתוב בהצהרה ובהגדרה של הפונקציה את רשימת הפרטמרים שהפונקציה מקבלת (בהצהרה אתה לא חייב לציין את השמות של המשתנים אלא יכול רק את הטיפוסים שלהם אבל בהגדרה של הפונקציה אתה חייב לציין גם את השמות).

אם ההצהרה נראית כך:

int function_calc(char string[200],int i)

אז גם ההגדרה (איפה שמופיע גוף הפונקציה) צריכה להיות זהה.

פורסם
  • מחבר

תיקנתי את הפונקציה אך אני עדין מקבל את הERROR הזה. :s07:

פורסם

כשאתה קורא לפונקציה, אתה צריך לקרוא לה רק עם השמות של המשתנים שאתה מעביר, ולא עם הטיפוסים שלהם.

ככה:

function_calc(str, i);

עשה טובה, תקרא שוב על פונקציות ואיך משתמשים בהן.

פורסם

כמה דברים:

- אתה גם לא צריך להגדיר את i כפרמטר שהפונקציה מקבלת הרי אתה מגדיר אותו שוב בתוך הפונקציה והוא לא משתנה שצריך לקבל ערך ממי שקורא לפונקציה. i גם לא קיים ב main ככה שאתה לא יכול לשלוח את i ל function_calc (הוא לא קיים ב main, אין קשר בין השם של הפרמטר לערך שהוא מקבל ממי שקורא לפונקציה).

- ב case עם ה '\' אתה צריך לכתוב '\\' כי \ משמש לתווי בקרה (כמו \n ו- \t) אז כשרוצים להשתמש בתו עצמו צריך להשתמש ב \\.

- עוד בעיה: כשאתה קולט מספר אתה ישר בודק את המשתנים שמציינים את הפעולות, אבל כשאתה קולט את המס' הראשון אף אחד מהם לא מאותחל ואתה תקבל שגיאה. אתה צריך לאתחל את כולם (עם 'n' למשל).

עריכה: שמתי לב שאתה גם לא עושה כלום עם התוצאה של החישוב. לפי ה int שמחזירה הפונקציה אולי רצית להחזיר את הערך (כדי לעשות את זה אתה משתמש ב return) או שאולי אתה רוצה להדפיס את התוצאה מתוך הפונקציה.

פורסם
  • מחבר

תודה על הביקורת הבונה. ערכתי קצת את הפונקציה כמו שצריך אך עדין יש לי בעיה עם הפונקציה, למרות התיקון


#include <stdio.h>
#include <string.h>
#define SIZE 200
int 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 prototype

main.c:5: prototype declaration

main.c:23: `str' undeclared (first use in this function)

main.c:23: (Each undeclared identifier is reported only once

main.c:23: for each function it appears in.)

אני לא מבין למה הוא אומר שהוא הצהרתי את str, הרי הגדרתי אותו בMAIN והעברתי אותו כארגונמט לפונקציה function_calc, ואותו דבר לבעיות האחרות, הרי הגדרתי אותם 2 ארגומנטים לכל הפונקציה הזאת.

נ.ב זה קימפל לי תפונקציה שהשתמש ב200 ללא DEFINE אך זה השיב לי בsegment fault שזה ERROR חמור אז החלטתי להשתמש בDEFINE.

שאני מגיע לסוף שורה אז הוא מתדפיס את הסכום של המספרים.

פורסם

כשאתה משתמש ב #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.

פורסם
  • מחבר

אוקי צודק בקשר לתנאי לולאה, קצת פישלתי שם. בקשר להגדרה הבנתי את הטעות אבל לא הבנתי איך זה עוזר לתקן את הבעית קומלפציה כי היא נשארת אחרי התיקון, אני לא מבין בכלל למה הבעית קומפילציה מופיע שם הגדרתי את הפונקציה כמו שצריך לפי דעתי. :nixweiss:

לגבי הפונקציה אני רוצה שזה יפתור כל מיני מקרים כמו 3+4-8 או 3+4-7+5+4-5

בנתיים השארי את החזקות הכפל והחילוק שמה אבל לא השתמשתי בהם כי אני חושב על איך לסדר את זה שזה יפעל לפי סדר מתמטי (חזקה קודם אחרכך כפל ואחר כך חיבור וכו') בנתיים אני עובד על החיבור והחיסור.

תודה.

פורסם

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

פורסם
  • מחבר

אין לי בנתיים רעיון לכפל והחילוק ולכן ביקשתי עזרה רק עם החיבור והחיסור =\

ארכיון

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

דיונים חדשים