Strings And Arrays Problem in C - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

Strings And Arrays Problem in C


Stoned Junglist

Recommended Posts

שלומות! =]

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

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

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

כמה דברים:

- אתה גם לא צריך להגדיר את 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

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

תודה.

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

ארכיון

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

×
  • צור חדש...