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

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


iem

Recommended Posts

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

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

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

תודה !!

[attachment deleted by admin]

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

  • תגובות 42
  • נוצר
  • תגובה אחרונה

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

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

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

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

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

זה הכל

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

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

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 אין לי מושג למה אז (לפני יומיים) הוא לא הגדיל את האות אלא קפץ למקומות (תווים) אחרים משרציתי... אני יכול להשתמש בפונק' קבועה שראיתי ב- שמגדילה או מקטינה אותיות (ככה נוח לי לקרוא לזה) אבל אני חושב שהמשורר (מרצה) חושבת אחרת...

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

תודה !!

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

א. מה זה לעזאזל 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?

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

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

ארכיון

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


×
  • צור חדש...