עבור לתוכן

תרגיל בשפת C

Featured Replies

פורסם

שלום,

יש לי תרגיל בC שאני צריך קצת עזרה בגישה אליו.

עליכם לכתוב תכנית שתקלוט מקובץ סדרות תווים (ללא מספרים) בגודל X. כל שורת תווים תיגמר בנקודה.

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

.1 התו הכי גדול בשתי הסדרות (ASCII) .

.2 התו הכי קטן בשתי הסדרות (ASCII) .

.3 התו ההנפוץ ביותר בשתי הסדרות (במידה ויש כמה בעלי אותה שכיחות, יש להדפיס את התו שערכו ה ASCII

הוא הקטן ביותר).

.4 סדרת התווים המשותפים לשתי הסדרות (ללא חזרות) - מודפסים לפי הסדר בטבלת ה ASCII .

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

במקרה של קלט תקין, עליכם להציג בנוסף גם את הסדרות שנקלטו (ראו דוגמאות הרצה).

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

פורסם

נתחיל לפי הסדר:

לקרוא סדרת תווים מקובץ, אתה יודע?

פורסם
  • מחבר

האם אתה מתכוון להגדרת הקובץ ופתיחתו? כן.

לגבי קליטת השורה ממנו, אני יודע שאני יכול להשתמש בfscanf אבל האם ישנה דרך אחרת?

ובעצם איך אני גורם לתכנית לעצור בנקודה?

פורסם

אתה יכול לקרוא תו בודד גם באמצעות הפונקציה fgetc.

ובשביל לקרוא עד הנקודה, בשביל זה יש while.

פורסם
  • מחבר

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

פורסם
  • מחבר

ראשית, האם ניתן לעשות "מקרה" של סוף הקובץ כפי שעשיתי פה? האם זה יעבוד? או שישנה דרך אחרת לעשות זאת?

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

תודה על הסבלנות :)

txtFile = fopen ("textInput.txt", "r"); //open txt file

if (txtFile != NULL) //check file exists

{

do

{

temp=fgetc(txtFile);

switch(temp)

{

case '.':

r++;

break;

case EOF:

flag = 1;

break;

default:

tav[r][c++]=temp;

}

}

while(flag = 0);

fclose(txtFile); //close txt file

}

else

{

printf("Error, file doesn't exist");

}

פורסם

אל תשים את הקוד הציטוט, שים אותו בטג קוד.

לשאלתך: קודם כל, עשית = במקום == בwhile. חוץ מזה, מה הטיפוס של temp?

פורסם
  • מחבר

char

פורסם

הוא צריך להיות int, כי זה טיפוס ההחזרה של fgetc, והקבוע EOF הוא גם כן int.

פורסם
  • מחבר

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

פורסם

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

לרדת שורה = לקרוא עד סוף השורה. בדיוק כמו שגרמת לו לקרוא עד שהגעת לנקודה. תו ירידת שורה זה 'n\'.

פורסם
  • מחבר

הממ הסתדרתי עם ירידה השורה וקריאת השורה השניה, תודה!

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


while(flag == 0)
{
temp=fgetc(file);
switch(temp) //what to do with char
{
case 10: // ignore /n char
break;
case '.': //end of LINE
r++;
c = 0;
break;
case EOF: //end of FILE
flag = 1;
break;
default: //good digit/char
if((temp > 47) && (temp < 58)) //check if digit
{
(r=0)?(flag=2):(flag=3);
}
if(biggest < temp) //biggest char (ascii value)
{
biggest = temp;
}
if (smallest > temp) //smallest char (ascii value)
{
smallest = temp;
}
tav[r][c++]=temp;
counter[temp]+=1;
}
}

אני לא מצליח לגרום לו לשמור את הערך הקטן ביותר, הוא תמיד שומר לי תו ריק (כנראה של ירידת השורה)

פורסם

מי זה flag? אתה אכן לא בודק האם הגעת לתו ירידת השורה ולכן smallest מקבל את הערך שלו (שקטן מתווים אחרים).

פורסם
  • מחבר

flag זהו משתנה שמקבל ערכים בהתאם לשגיאות שאני צריך להציג.

עליתי על הבעיה - הייתי צריך לאתחל את small למספר המקסימלי. כי כאשר הוא היה מאותחל ל0, הוא היה התו הקטן ביותר ובעצם הציג לי NULL.

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

ארכיון

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

דיונים חדשים