מחפש אלגוריתם - ANSI C - עמוד 2 - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


iem

Recommended Posts

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


#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
  • נוצר
  • תגובה אחרונה

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

ההצעה שלי היא כזו: תתחיל את התכנית מההתחלה. חלק את התרגיל לשלבים (סה"כ שישה שלבים - "שלב 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;
}

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

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

בטח שחוסך

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

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

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

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

ארכיון

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


×
  • צור חדש...