1 / 20

מבוא למדעי המחשב

מבוא למדעי המחשב. ארגומנטים לתוכנית בזמן ריצה קבצים הקדם מעבד Preprocessor טיפוסים סדורים Enumerated Types Typedef. ארגומנטים בזמן ריצה Command line arguments. ניתן בשפת C להעביר ארגומנטים לתכנית ← לפונקציה main . main נקראת (ע"י מערכת ההפעלה) עם שני ארגומנטים:

storm
Télécharger la présentation

מבוא למדעי המחשב

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. מבוא למדעי המחשב ארגומנטים לתוכנית בזמן ריצה קבצים הקדם מעבד Preprocessor טיפוסים סדורים Enumerated Types Typedef

  2. ארגומנטים בזמן ריצהCommand line arguments • ניתן בשפת C להעביר ארגומנטים לתכנית ← לפונקציה main. • main נקראת (ע"י מערכת ההפעלה) עם שני ארגומנטים: • argc – מספר הארגומנטים שהועברו למערכת ההפעלה. • argv: • מצביע למערך של מחרוזות המכילות את הארגומנטים, כל ארגומנט במחרוזת נפרדת. • argv[0] מכיל את שם התכנית, לכן, argc≥1. • הארגומנט הראשון הוא argv[1] והאחרון argv[argc-1] .

  3. ארגומנטים בזמן ריצה - דוגמא /* echo1.c */ /* echo command-line arguments to output */ #include <stdio.h> int main(int argc, char *argv[]) { int i; for (i=1; i<argc; i++) { printf("%s ", argv[i]); } printf("\n"); return 0; }

  4. ארגומנטים בזמן ריצה - דוגמא /* echo2.c */ /* echo command-line arguments to output */ #include <stdio.h> int main(int argc, char *argv[]) { while (--argc>0) { printf("%s ", *++argv); } printf("\n"); return 0; }

  5. ארגומנטים בזמן ריצה - הערות • הנתונים מתקבלים (ע"י argv) כמחרוזות. • אם אנו מעוניינים שהתכנית תקבל ערכים מספריים יש לבצע המרה ממחרוזות לטיפוס המספרי המתאים. • המרה כזאת ניתן לבצע בעזרת הפונקציות (הנמצאות בספריה stdlib.h): • int atoi (char *) – מבצעת המרה ממחרוזת למספר שלם (asci to integer). • float atof (char *) – מבצעת המרה ממחרוזת למספר ממשי (asci to float). • long atol (char *) – מבצעת המרה ממחרוזת למספר שלם גדול (asci to long).

  6. קבצים Files • קובץ הוא סדרה של תווים. • אין גישה אקראית למקום כלשהוא בקובץ, אלא יש לקרוא תו אחר תו ולהגיע לתו שאנו מחפשים (להבדיל ממערך). • עד כה כל התכניות שכתבנו קראו מקובץ הקלט הסטנדרטי (בעזרת הפונקציות scanf() ו- getchar() ) וכתבו לקובץ הפלט הסנדרטי (בעזרת הפונקציות printf() ו- putchar()). • בשפת C ניתן לקרוא מקבצים ולכתוב לקבצים ישירות מהתכנית עצמה.

  7. קבצים בשפת C • FILE הינו טיפוס נתונים שמחזיק אינפורמציה על קבצים ומוגדר ב- <stdio.h> . • יש לעבוד תמיד עם מצביע ל- FILE. FILE *fp; /* FILE הוא מצביע לרשומת fp */ • בקובץ <stdio.h> מוגדרים שלושה מצביעים לטיפוס FILE והם: • stdin – מצביע לקובץ הקלט הסטנדרטי. • stdout – מצביע לקובץ הפלט הסטנדרטי. • stderr – מצביע לקובץ השגיאות הסטנדרטי. • הקבצים אשר מוצבעים ע"י המצביעים הנ"ל נפתחים ע"י מערכת ההפעלה עם התחלת ביצוע התכנית. • אבל, לעיתים נרצה להשתמש גם בקבצים נוספים...

  8. קבצים בשפת C מה צריך לדעת? • פתיחת קובץ • כתיבה לקובץ • קריאה מקובץ • סגירת קובץ

  9. פתיחת קבצים בשפת C פתיחת קובץ – ע"י fopen: FILE *fopen (char *filename, char *mode); • filename – מחרוזת תווים המכילה את שם הקובץ אשר מעוניינים לפתוח. • mode – מחרוזת תווים אשר מציינת את מטרת פתיחת הקובץ: • “r” – פתיחת קובץ לקריאה. • “w” – פתיחת קובץ לכתיבה (מוחק את תוכנו הקיים). • “a” – פתיחת קובץ להוספה בסופו (append). • הפונקציה fopen מחזירה מצביע לקובץ במידה ופתיחתו הצליחה, אחרת מחזירה NULL. • אם קובץ לא קיים, הוא ייווצר, במידת האפשר. FILE *data; data=fopen(“mydata.txt”,”r”);

  10. סגירת קבצים בשפת C סגירת קובץ – ע"י fclose: int fclose (FILE *pfile); הפונקציה מחזירה 0 במידה והסגירה הצליחה. • בסיום השימוש בקובץ חובה לסגור את הקובץ. • הפקודה exit מבצעת fclose לכל הקבצים הפתוחים, להבדיל מהפקודה return. לכן, כשעובדים עם קבצים כדאי להשתמש בפקודה exit.

  11. קבצים - קריאה וכתיבה של תווים בודדים • על מנת לקרואתו מקובץ נשתמש בפונקציה int fgetc (FILE *fp) פונקציה זו פועלת בדיוק כמו הפונקציה getchar() , רק שהקלט הוא מהקובץ שמצביעו fp במקום מקובץ הקלט הסטנדרטי. הפונקציה מחזירה EOF בסוף הקובץ או במקרה של טעות. • על מנת לכתובתו מקובץ נשתמש בפונקציה int fputc (int c, FILE *fp) פונקציה זו פועלת בדיוק כמו הפונקציה putchar() , רק שהפלט הוא לקובץ שמצביעו fp במקום לקובץ הפלט הסטנדרטי. הפונקציה מחזירה את התו שנכתב או EOF במקרה של טעות.

  12. קבצים - קריאה וכתיבה • int fscanf (FILE *fp, …) פונקציה זו פועלת בדיוק כמו הפונקציה scanf() , רק שהקלט הוא מהקובץ שמצביעו fp במקום מקובץ הקלט הסטנדרטי. • int fprintff (FILE *fp, …) פונקציה זו פועלת בדיוק כמו הפונקציה printf() , רק שהפלט הוא לקובץ שמצביעו fp במקום לקובץ הפלט הסטנדרטי.

  13. קבצים - דוגמא /* mycat.c - append the content of the first file to the second file */ #include <stdio.h> int main(int argc, char *argv[]){ FILE *f1, *f2; int c; if (argc != 3){ /* not enough argument files */ printf("Incorrect number of arguments\n"); return 1; } if ((f1=fopen(argv[1],"r"))==NULL){ printf("Can't open file %s\n",argv[1]); return 1; } if ((f2=fopen(argv[2],"a"))==NULL){ printf("Can't open file %s\n",argv[2]); return 1; } while ((c=fgetc(f1))!=EOF){ fputc(c,f2); } fclose(f1); fclose(f2); return 0; }

  14. הקדם מעבד pre processor הקדם מעבד הינו הצעד הראשון של קומפילציה. הוא מספק מספר אפשרויות. למשל: • File inclusion ההנחיה #include “filename” #include <filename> גורמת לתוכן הקובץ filename "להישתל" במקום בו היא מופיעה. קובץ מוכל יכול להכיל בעצמו שורות include. כאשר קובץ מוכל משתנה יש לקמפל מחדש את כל הקבצים שטוענים אותו.

  15. הקדם מעבד pre processor • Macros ההנחיה #define name text גורמת להחלפת כל המופעים של name ב- text. תחום ההחלפה: מנקודת ההגדרה עד סוף הקובץ. text יכול להימשך מעבר לשורה אחת ע"י השימוש בתו "\" בסוף השורה. דוגמאות: #define MAX 100 #define forever for(;;)

  16. קוד מקורי לאחר פעולת ה- pre processor : z=MAX(x,y); : : z=(x)>(y) ? (x):(y); : הקדם מעבד pre processor • Macros - המשך ניתן להגדיר macros עם ארגומנטים. למשל: #define MAX(A,B) ((A)>(B) ? (A):(B)) • ההבדלים בין macros לפונקציות: • אין כל התייחסות לסוג הפרמטרים • אין כל קריאה לפונקציה ב- macros

  17. הקדם מעבד pre processor • Macros - המשך השימוש ב- macros ודרך כתיבתם דורשים זהירות רבה! דוגמאות: • #define MAX(A,B) ((A)>(B) ? (A):(B)) : z=MAX(i++,j++); • #define square(x) x*x : z=square(i+1)

  18. טיפוסים סדורים Enumerated Types • הגדרת סידרה של קבועים שלאבריה יש משהוא משותף (ע"י הגדרת טיפוס נתונים חדש). • דוגמא: #define Jan 1 #deine Feb 2 : #define Dec 12 enum months {Jan=1, Feb=2, …, Dec=12}; enum months {Jan=1, Feb, …, Dec};

  19. טיפוסים סדורים Enumerated Types • דוגמא: #define TRUE 1 #deine FALSE 0 enum boolean {FALSE,TRUE};

  20. Typedef • לא מייצר טיפוסי משתנים חדשים. • מאפשר למתכנת לקחת טיפוס נתונים קיים, ולקרוא לו בשם נוסף. • דוגמא: typedef int Length; : Length len, maxlen; Length length[20]; • יתרונות: • מקל על המשתמש ועל המתכנת בקריאת קוד התכנית וקישורו למטרתה. • עזרה בתיעוד הקוד. • פורטביליות – ע"י הגדרת טיפוסי נתונים בעזרת typedef, עם שינוי טיפוס הנתונים מספיק לשנות את ה- typedef ולא את כל המופעים בקוד.

More Related