עבור לתוכן

מחפש אלגוריתם - ANSI C

Featured Replies

פורסם
  • מחבר

אני מקווה שזה כבר שיפור:


#include <stdio.h>

#define TRUE 1
#define FALSE 0

int main (void){

char ch;
int dot_flag=TRUE;
int geresh_flag=FLASE;

while (ch=getchar() != EOF){

if ((geresh_flag == TRUE) && (ch=='"'))
{
geresh_flag=FALSE;
}
/*case dot flag*/
if (dot_flag==TRUE)
{
if ((ch >='a') && (ch <='z') )
{
ch-=32;
putchar(ch);
}

dot_flag=FALSE;
}

/*case geresh flag*/
if (geresh_flag==TRUE)
{
if ((ch >='a') && (ch <='z') )
{
ch-=32;
putchar(ch);
}
}

/******** case '.' ********/
if (ch=='.')
{
dot_flag=TRUE;
}


/******** case '"' ********/
else if (ch=='"')
{
geresh_flag=TRUE;
}
}


return 0;
}

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

  • תגובות 42
  • צפיות 11.1k
  • נוצר
  • תגובה אחרונה
פורסם

למספרים אתה פשוט עושה תנאי ראשון בתוך הלולאה


...
while (ch=getchar() != EOF){
if (ch >='0' && ch <='9') continue;
...

פורסם

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

ההצעה שלי היא כזו: תתחיל את התכנית מההתחלה. חלק את התרגיל לשלבים (סה"כ שישה שלבים - "שלב 0" הוא שתהיה לך תכנית שרק מדפיסה את הפלט בלי שום שינויים, ואז בכל שלב תוסיף את השינויים הדרושים מ-1 עד 5). בכל שלב (גם אחרי שלב 0), תוודא היטב שהתכנית שלך עובדת - מתקמפלת ועושה בדיוק את מה שאתה מצפה ממנה, בכל המצבים. חוץ מזה, תוודא שהתכנית שלך נראית טוב - מסודרת, בלי שכפול קוד מיותר וכו'. אם אתה רוצה, תעלה אחרי כל שלב את התכנית לפורום בשביל משוב.

פורסם
  • מחבר

אני יכול להכניס את כל ה-IF-ים בהתחלה בתוך הלולאה, ואז להכניס את ההדפסה הרגילה כמצב default אם אף אחד מה-IF-ים לא התקיים בתור else כדי שלא יהיה מצב של הדפסה בכל מקרה לא ?

כרגע נניח אם אני מתייחס לתנאי תחילת משפט, כלומר לאחר שדגל הנק' נמצא במצב TRUE ובמצב שנכנס תו רגיל לאחריו, אז התוכנית תהיה:

(אני מזכיר שאני עושה כעצתך באופן מודולרי)


#include <stdio.h>

#define TRUE 1
#define FALSE 0

int main (void){

char ch;
int dot_flag=TRUE;
int geresh_flag=FLASE;

while (ch=getchar() != EOF){
if (ch=='.')
{
putchar(ch);
dot_flag=TRUE;
}
if ((dot_flag==TRUE)&&(ch >='a') && (ch <='z'))
{
ch-=32;
putchar(ch);
dot_flag=FALSE;
}
else
putchar(ch);

}
return 0;
}

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

פורסם

אני כבר אומר לך מראש - אתה לא חושב נכון.

תתחיל את התכנית מההתחלה. חלק את התרגיל לשלבים (סה"כ שישה שלבים - "שלב 0" הוא שתהיה לך תכנית שרק מדפיסה את הפלט בלי שום שינויים' date=' ואז בכל שלב תוסיף את השינויים הדרושים מ-1 עד 5). בכל שלב (גם אחרי שלב 0), תוודא היטב שהתכנית שלך עובדת - מתקמפלת ועושה בדיוק את מה שאתה מצפה ממנה, בכל המצבים. חוץ מזה, תוודא שהתכנית שלך נראית טוב - מסודרת, בלי שכפול קוד מיותר וכו'. אם אתה רוצה, תעלה אחרי כל שלב את התכנית לפורום בשביל משוב.

[/quote']

אני אתן לך עוד רמז קטן - המילה "putchar" צריכה להופיע בדיוק במקום אחד בתכנית.

פורסם

אלוגריתם בסיסי.

לולאה (קבל תו)

ספרה? דלג

אם נקודה? הדלק דגל

אחרת אם גרשיים? הדלק/כבה דגל

אחרת אם אות?{

אם דגל נקודה? הגדל אות וכבה דגל

אחרת אם דגל גרשיים דולק? הגדל אות

אחרת הקטן אות

}

הדפס תו

סגור לולאה

פורסם
  • מחבר

#include <stdio.h>

#define TRUE 1
#define FALSE 0

int main (void){

char ch;
int dot_flag=TRUE;
int geresh_flag=FLASE;

while (ch=getchar() != EOF){
if ((ch>='0')&&(ch<='9'))
{
continue;
}
if (ch=='.')
{
dot_flag=TRUE;
}
else if (ch=='"')
{
geresh_flag=TRUE;
}
else if ((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z'))
{
if(dot_flag==TRUE)
{
ch-=32;
dot_flag=FALSE;
}
else if (geresh_flag==TRUE)
{
ch-=32;
}
else ch-=32;


}
putch(ch);


}
return 0;
}

כתבתי את זה... עכשיו באמת זה אמור לעבוד כי אחרת באמת הייתי מדפיס אותיות בלבד כפי ששניצל אמר...

פורסם

א. סדר כבר את האינדנטציה! קשה להבין מה הולך שם.

ב. אתה לא מכבה את geresh_flag בשום מקום.

ג. יש לך באג - מה קורה כשיש כבר אות גדולה בתחילת משפט?

פורסם

ובנוסף קח טריק קטן.

הגדלת אות

ch=ch&223;

הקטנת אות

ch=ch|32;

פורסם

אבל... הטריק לא חוסך כלום.

אם כבר, אז:

ch ^= 32

שמבצע את שניהם (הופך אות קטנה לגדולה ולהיפך).

כמובן, הוא ידפוק כל תו שאינו אות.

פורסם

בטח שחוסך

הוא חוסך את הבדיקה אם האות גדולה או קטנה.

אם אני צריך אות גדולה, אז

ch &= 223;

יגדיל לי את האות במקרה של אות קטנה, ולא ישפיע במקרה של אות גדולה.

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

ובהתאם השני שרשמתי מקטין, וחוסך את הבדיקה שוב

פורסם
  • מחבר

הכנתי את התוכנית:


#include <stdio.h>

#define TRUE 1
#define FALSE 0

int main (void){

char ch;
int dot_flag=TRUE;
int geresh_flag=FLASE;

while (ch=getchar() != EOF){
if ((ch>='0')&&(ch<='9'))
{
continue;
}
if (ch=='.')
{
dot_flag=TRUE;
}
else if (ch=='"')
{
if (geresh_flag==TRUE)
{
geresh_flag=FALSE;
}
else geresh_flag=TRUE;


}
else if ((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z'))
{
if(dot_flag==TRUE)
{
ch=ch&223;
dot_flag=FALSE;
}
else if (geresh_flag==TRUE)
{
ch=ch&223;
}
else ch=ch&223;



}
putch(ch);

}
return 0;
}

אני עובד על עניין האינדנטציה אבל יש לי בעיה עם סביבת העבודה ואין לי תיקונים כמו בויזואל סטודיו אז אני מבצע את זה ידנית.

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

אם אני מריץ את זה על יבש אז אני נופל לתנאי הבא:

else if ((ch>='a')&&(ch<='z')||(ch>='A')&&(ch<='Z'))

אבל השאלה אם:

ch=ch&223;

לא פתר לי בעצם את בעיית הבדיקה ואז אני לא מחוייב בבדיקה פנימית בתוך ה-if ? ???

פורסם

לגבי האינדנטציה, תדאג שכל if וה-elseים שלו יהיו באותה רמה, כלומר, לא ככה:

if (blabla)
{
blablabla
}
else if (bla)
{
bla
}

אלא ככה:

if (blabla)
{
blablabla
}
else if (bla)
{
bla
}

ואפילו יותר טוב:

if (blabla)
{
blablabla
}
else if (bla)
{
bla
}

ועוד טיפ קטן: תסתכל על הפונקציות שכאן.

פורסם
  • מחבר

את ה-

tolower Convert uppercase letter to lowercase (function)

toupper Convert lowercase letter to uppercase (function)

אני הכרתי כבר לפני תחילת התרגיל, אבל הנחתי שכוונת המרצה היתה לא להשתמש בפונק' ספרייה כרגע לפחות בתרגיל זה...

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

תודה ;D

ארכיון

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

דיונים חדשים