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

תרגיל בשפת C


talje

Recommended Posts

שלום,

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

דבר נוסף, בתצורה הנוכחית שלה 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");

}

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

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

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

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

לרדת שורה = לקרוא עד סוף השורה. בדיוק כמו שגרמת לו לקרוא עד שהגעת לנקודה. תו ירידת שורה זה '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 זהו משתנה שמקבל ערכים בהתאם לשגיאות שאני צריך להציג.

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

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

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

ארכיון

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

×
  • צור חדש...