עבור לתוכן

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

Featured Replies

פורסם

אני מחפש אלגוריתם לתרגיל המצ"ב...

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

אשמח אם מישהו יציע אלגוריתם שאוכל אח"כ לממש.

תודה !!

[attachment deleted by admin]

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

מה עם צירוף התרגיל?

פורסם
  • מחבר

תוקן.

פורסם

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

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

ברגע שאתה קורא גרשיים אתה מדליק דגל שאומר שכל אות תעבור לאות גדולה,בקריאה הבאה של הגרשיים הדגל יעבור למצב שקר

אם הוא במצב שקר כל אות תהפוך לאות קטנה

ספרות אתה פשוט לא מעביר,ותוו של שורה חדשה אתה מעביר

זה הכל

פורסם
  • מחבר

הבנתי את הרעיון אבל זה מאוד כללי ולא הצלחתי לממש.... :nixweiss:

פורסם

מאוד כללי? הוא כמעט כתב לך את הפתרון.

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

פורסם
  • מחבר

ניסיתי לכתוב משהו אבל קצת הלכתי לאיבוד בשל ריבוי התנאים... אם אני שם נניח:

While ((ch=getchar()) !=EOF)

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

הקוד ההתחלתי:


#include <stdio.h>

int main (void){

char ch;
int start_cen=0; small_2_big=0;



/*for the frst letter*/
if ((ch=getchar()) >='a' && ch <='z' ) {ch=-32; printf("%c",ch);}

for (ch=getchar() ; ch!=EOF;)

if (ch== '.') {start_cen=1;}
if (ch== '"') {small_2_big=0;}

פורסם

התו הראשון לא מיוחד בשום צורה - אין שום סיבה שיהיה מחוץ ללולאה הראשית.

תזכור שבמצב ההתחלתי אתה כן בתחילת משפט.

ותזכור שמרכאות אמורים להחליף בין שני מצבים - אם כבר small_2_big הוא 1, אז הוא צריך להפוך ל-0, ולהיפך. (ואם כבר אנחנו בנושא, כדאי לתת למשתנה שם יותר אינפורמטיבי)

הצעה - קודם כל תכתוב את הלולאה הראשית שרק קוראת תווים ומדפיסה אותם. אחר כך תוסיף לאט לאט את המקרים המיוחדים.

פורסם
  • מחבר

כתבתי את התוכנית המתוקנת הבאה:


#include <stdio.h>

int main (void){

char ch;


while (ch=getchar() != EOF)

/*case number*/
if ((ch>='0') &&(ch<='9')) printf(" ");

/*frst letter*/
if ((ch >='a' && (ch <='z') ) {ch-=32; putchar(ch);}

/* '.' case start of sentence*/
if (ch=='.')

{
ch=getchar();
if( (ch >='a') && (ch <='z') )
{
ch-=32; putchar(ch);}

if ((ch>='0') &&(ch<='9')) printf(" ");

/* case '"'*/
if (ch=='"')
{
while (geresh_flag==ON){


if ((ch>='0') &&(ch<='9')) {printf(" ")}
if (ch=='.') {ch=getchar(); (if(ch >='a') && (ch <='z') ) {ch-=32; putchar(ch);}if ((ch>='0') &&(ch<='9')) {printf(" ");}
if (ch=='"') geresh_flag=OFF;

}}

return 0;
}

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

דבר נוסף.. שכחתי איך אני מייצר ב-C מצב של מפסק ON OFF ב- DEFINE עבור הגרשיים (אם אני לא טועה ... אני טועה ? :))

בגדול בהרצה יבשה נראה לי שאני עובר קומפילציה, למרות שבמבחן הקומפיילר בשלבי בדיקה של תנאי ה-ASCII הראשון שלי המתייחס להגדלת האות נראה לי שנכשלתי למרות שהחסרתי 32 אין לי מושג למה אז (לפני יומיים) הוא לא הגדיל את האות אלא קפץ למקומות (תווים) אחרים משרציתי... אני יכול להשתמש בפונק' קבועה שראיתי ב-GOOGLE שמגדילה או מקטינה אותיות (ככה נוח לי לקרוא לזה) אבל אני חושב שהמשורר (מרצה) חושבת אחרת...

אשמח לעזרה...

תודה !!

פורסם

א. מה זה לעזאזל ON OFF? תשתמש בערכים בוליאנים (0 ו-1) כמו בן אדם. אם זה לא "יפה", תגדיר TRUE ו-FALSE באמצעות define#.

ב. שים סוגריים מסולסלים בכל if/while, ותעשה אינדנטציה נורמלית של הקוד. אי אפשר להבין מה קורה שם בכלל עכשיו.

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

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

פורסם
  • מחבר

עשיתי קצת makeover לתוכנית, למרות שאני לא ממש מרגיש שלם עם התנאי while של מצב הגרשיים...


#include <stdio.h>

#define TRUE 1;
#define FALSE 0;

int main (void){

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

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

/*case number*/
if ((ch>='0') &&(ch<='9'))
{
printf(" ");
}

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

if (geresh_flag==TRUE)
{
while (ch!='"')
{
if ((ch >='a') && (ch <='z') )
{ ch-=32;
putchar(ch);
}
else
{
putchar(ch);
}
}
geresh_flag=FALSE;
}

/******** case '.' ********/
if (ch=='.')

{
dot_flag=TRUE;
}


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

}

return 0;
}

פורסם

לא שמים נקודה-פסיק אחרי define! הקוד שלך לא יתקמפל.

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

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

פורסם
  • מחבר

#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){

/*case #*/
if ((ch>='0')&&(ch<='9'))
return;

/*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);
}

geresh_flag=FALSE;
}

/******** case '.' ********/
if (ch=='.')

{
dot_flag=TRUE;
}


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

}

return 0;
}

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

ובנוגע למספר בקלט, זה הטיפול הראוי? או שאני צריך לצאת מהתנאי בצורה אחרת? או שבכלל אני יכול להוסיף בתנאי של לולאת ה-while התייחסות למספרים ? :silly:

פורסם

א. return יוצא מהפונקציה. עשה טובה, תחזור על התחביר והפקודות הבסיסות של C לפני שאתה ממשיך (if, else, while, break וכו').

ב. אתה עדיין מסרב להשתמש ב-else if, והאינדנטציה שלך עדיין על הפנים.

ג. יש שני מצבים - או שאתה בתוך גרשיים (ואז geresh_flag==TRUE) או שאתה לא (ואז geresh_flag==FALSE). מה גורם לך לעבור ממצב למצב? באיזה מקרה אתה צריך ש-geresh_flag יהפוך ל-TRUE, ובאיזה מקרה הוא צריך להפוך ל-FALSE?

ד. אתה עדיין מדפיס רק אותיות.

ארכיון

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

דיונים חדשים