ABA


"שאלה ממבחן ב-C (קבצים) - כולל פתרון."
גירסת הדפסה        
קבוצות דיון לימודים, מדע ותרבות נושא #11394 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 11394
DanDun

דרג אמינות חבר זה
   14:24   08.02.12   
אל הפורום  
  שאלה ממבחן ב-C (קבצים) - כולל פתרון.  
 
   ערכתי לאחרונה בתאריך 08.02.12 בשעה 14:36 בברכה, DanDun
 
שאלה 6 (18 נקודות)

נתונים שני הקבצים הבאים של תווים “first.dat” ו- “second.dat”.
כתוב פונקציה check(…)המקבלת שני שמות של הקבצים הנ"ל ובודקת האם השני "מסתתר" בראשון , כלומר האם ניתן להגיע לשני ע"י מחיקת תווים כלשהם מהראשון?
הפונקציה מחזירה 1 עם הקובץ השני "מסתתר" בראשון, אחרת – 0.
למשל עבור זוג קבצים:


“first.dat”: cbjdskjsdfmnsdf
“second.dat”: bdff

התוצאה היא 1.

הפתרון שהציאו:


int check(char *first_name, char *second_name)

{
FILE *first = fopen(first_name, "r");

FILE *second = fopen(second_name, "r");


int f, s;


if (!first || !second)
{
perror("Fatal error");

exit(1);
}


while ((s = fgetc(second)) != EOF)
{
while ((f = fgetc(first)) != EOF && f != s);


if (f == EOF)

return 0;
}


return 1;
}

אני לא מצליח להבין למה הפונקציה מקבלת מצביע למחרוזת ולא לקבצים בעצם?
ואיך בעצם דרך המצביע למחרוזת הוא פותח את הקבצים?
ולמה f ו-s הם מטיפוס int? אם יהיה בקבצים char הם יכנסו ל-f/s?

אשמח אם מישהו יוכל להסביר את זה.


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  שם של קובץ הוא מחרוזת. ShocKi  08.02.12 20:11 1
     תודה רבה על ההסבר. DanDun 08.02.12 21:54 2

       
ShocKi  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 19.3.02
20171 הודעות, 10 פידבק, 17 נקודות
   20:11   08.02.12   
אל הפורום  
  1. שם של קובץ הוא מחרוזת.  
בתגובה להודעה מספר 0
 
   התוכנית בד"כ מקבלת אותו כפרמטר ל MAIN.

להזכירך כדי לפתוח קובץ צריך לדעת באיזה מצב פותחים אותו : קריאה בלבד, כתיבה וקריאה וכו'.
התוכנית לא יכולה לנחש מה אתה צריך, אתה צריך לציין לה מפורשות.
פתיחת קובץ נעשת בעזרת הפונקציה fopen, אתה צריך לספק לה את שם הקובץ ובאיזה מצב אתה רוצה לפתוח אותו. אם הקובץ נמצא בתיקיה שונה מתיקיית ברירת המחדל אז צריך לתת גם את הנתיב של הקובץ.
איך fopen פותחת את הקובץ? לא נראה לי שאתה נדרש לדעת את זה. בדיוק כמו שאתה לא נדרש לדעת איך printf כותבת למסך.. התעמקת בזה פעם?


אין שום בעיה לפתוח קובץ ב MAIN ולשלוח כפרמטר את הפוינטר FILE במקום את שם המחרוזת. זה כבר סמנטיקה. במקרה שלך הגדירו לך שהפונקציה מקבלת פרמטרים מסוימים - אתה לא יכול להחליט שאתה מתעלם מההוראות.
לשם השוואה, תחשוב שנתנו לך תרגיל בגאומטריה ואמרו לך שאורך צלע מסוימת היא 4, מנגד יכלו לתת משולש ישר זווית ו-2 צלעות אחרות ואתה היית צריך להגיע לבד עם פיתגורס לכך שאורך הצלע המבוקשת הוא 4 ומשם להמשיך במטלה. אתה עובד עם הנתונים שיש לך, אל תתוכח עם השאלה אם זה יעיל או חכם לפתור בעיה בדרך אליה מכוון מי שחיבר את השאלה.

לגבי שאלתך האחרונה.. f,s הם מטיפוס int בגלל שמשתמשים ב getc. פונקציה זו מחזירה int.
http://www.elook.org/programming/c/fgetc.html

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


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


קאש-באק ישראלי: https://www.cashback.co.il/?uref=33330
קאשבק לAsos ואמזון דרך Ebates: https://goo.gl/MX87Y7 - מקבלים 10$ לאחר שימוש ראשון.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DanDun

דרג אמינות חבר זה
   21:54   08.02.12   
אל הפורום  
  2. תודה רבה על ההסבר.  
בתגובה להודעה מספר 1
 
   לא הבנתי רק את ההסבר בנוגע ל- f/s?
האם אפשר להכניס לתוך char משתנה int בעצם?

ועוד שאלה מתוך חוסר ידע...
x = (y = 4, z = 5);

למה x=5 פה בעצם? מה קורה בביטוי הזה? מזה הפסיק בין Y\Z?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net