1 / 13

תכנות מערכות בשפת C

מכללת אורט כפר-סבא. תכנות מערכות בשפת C. מבנים ( struct ) מחרוזות. 26.10.14. אורי וולטמן. uri.weltmann@gmail.com. ברשותי שישה כדורים: שלושה שחורים ושלושה לבנים. כמו כן, ברשותי שלוש קופסאות, אשר על כל אחת מהן מודבקת תווית: על הקופסא הראשונה כתוב ' שחור-שחור '.

Download Presentation

תכנות מערכות בשפת C

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. מכללת אורט כפר-סבא תכנות מערכות בשפת C מבנים (struct) מחרוזות 26.10.14 אורי וולטמן uri.weltmann@gmail.com

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

  3. שתי הפונקציות התקניות sscanf ו-sprintf מוגדרות ב-stdio.h ומשמשות לקלט/פלט בדומה ל-scanf ו-printf. מהו ההבדל בין הפונקציות? printf משמשת לפלט אל stdout (הפלט הסטנדרטי; ברירת המחדל היא פלט למסך). scanf משמשת לקלט מ-stdin (הקלט הסטנדרטי; ברירת המחדל היא קלט מהמקלדת). שתי הפונקציות sscanf ו-sprintf משמשות לקלט מתוך מחרוזת מסוימת או לפלט אל תוך מחרוזת מסוימת. הכותרות של שתי הפונקציות זהות לכותרות של scanf ו-printf הרגילות, אלא שהן מקבלות פרמטר אחד נוסף (הפרמטר הראשון) שהוא המחרוזת ממנה יש לקלוט או אליה יש לפלוט. sscanf, sprintf

  4. לדוגמא: char mystr[] = "makom 3 ze beseder"; char s1[6]; int num; sscanf(mystr, "%s %d", s1, &num); puts(s1); printf ("%d", num); כלומר, הפונקציה sscanf קלטה ערכים לתוך s1 ו-num מתוך המחרוזת mystr, במקום מתוך הקלט הסטנדרטי (המקלדת). הפלט שיוצג למסך יהיה: makom 3 sscanf, sprintf

  5. נראה עכשיו דוגמא לשימוש ב-sprintf: char mystr[100]; int a = 2, b = 3; sprintf(mystr, "%d + %d = %d", a, b, a+b); puts(mystr); הפלט יהיה: 2 + 3 = 5 שימו לב שאם נמחק את ההוראה puts(mystr) אז קטע הקוד לא יציג פלט למסך. זאת מכיוון שההוראה sprintf "מדפיסה לתוך המחרוזת mystr", במקום להדפיס למסך. sscanf, sprintf

  6. לעיתים יש בתכנית שלנו מספר משתנים הקשורים ביניהם בקשר לוגי. לדוגמא, בתכנית המטפלת במידע על עובדים ייתכן ויש לנו את המשתנים 'שם עובד', 'מספר עובד' ו-'ותק במקצוע'. בשפת C ניתן להגדיר מבנה (structure) בשם 'עובד', שיהיה מורכב ממשתנים אלו. הגדרת המבנה נעשית באופן הבא: struct <שם סוג המבנה> { <הגדרת המשתנים במבנה > }; לעיתים מכנים מבנה בשם 'רשומה' (record) ואת המשתנים במבנה בשם 'שדות' (fields). מבנים

  7. לדוגמא, נגדיר מבנה חדש הנקרא student: struct student { char name[15]; char address[20]; unsigned int age; }; כאן עוד לא הצהרנו על אף משתנה, אלא רק הגדרנו טיפוס. כעת, נצהיר על שני משתנים מטיפוס struct student: struct student talmid, std1; אל שדה ברשומה פונים בצורה הבאה – שדה.שם רשומה . לדוגמא: talmid.age = 27; strcpy(talmid.name,”Bob”); strcpy(talmid.address,”Abbey Road”); מבנים

  8. #include <stdio.h> #include <string.h> struct student { char name[15]; char address[20]; unsigned int age; }; int main() { struct student talmid; printf(“הקש שם \n”); gets(talmid.name); printf(“הקש כתובת \n”); gets(talmid.address); printf(“הקש גיל \n”); scanf(“%u”,&talmid.age); return 0; } מבנים • נדגים תכנית העושה שימוש במבנה: • יכולנו לתת למבנה שם מקוצר, באמצעות ההוראה typedef. • כעת היינו יכולים להצהיר על משתנים באמצעות השם המקוצר: • stud_rec talmid; • יכולנו לרשום את הוראת ה-typedef אף לפני שהגדרנו את ה-struct. • המשמעות היא שאנחנו מגדירים 'שם נרדף' לטיפוס, עוד לפני שאמרנו מהו בעצם הטיפוס. זה חוקי לגמרי. • כמובן שעדיין ניתן להצהיר על משתנים בעזרת השם הארוך (struct student), על אף שיצרנו שם קצר באמצעות typedef. typedef struct student stud_rec; חשבו: מדוע שורה זו מיותרת?

  9. במקום להגדיר קודם את ה-struct ואח"כ לתת לו שם קצר באמצעות typedef, או לחלופין – קודם לתת לו שם קצר באמצעות typedef ואח"כ להגדיר את ה-struct, ניתן לעשות את שני הדברים בבת אחת. typedef struct student { char name[15]; char address[20]; unsigned int age; } stud_rec; כאשר מגדירים טיפוס בצורה כזו, ניתן להשמיט את השם המופיע בין המילה struct לבין הסוגריים המסולסלים (במקרה שלנו – את המילה student). מבנה הוא טיפוס נתונים לכל דבר, ולכן כל מה שניתן לעשות עם משתנה, ניתן לעשות גם איתו: להעביר אותו כפרמטר לפונקציה, להגדיר מערך של מבנים, להגדיר מבנה שאחד מהשדות שלו הוא בעצמו מבנה, וכו'. מבנים

  10. #include <stdio.h> #include <string.h> struct student { char name[15]; char address[20]; unsigned int age; }; int main() { struct student a, *std_ptr; std_ptr = &a; (*std_ptr).age = 13; strcpy((*std_ptr).name,”Shaltiel”); printf (“%s %u”, a.name, a.age); return 0; } מבנים • ישנה צורת כתיבה מקוצרת כאשר עובדים עם מצביע למבנה. • במקום לכתוב, למשל, (*std_ptr).age, אפשר לכתוב std_ptr -> age .

  11. struct test { int num; int *pnum; }; struct test a; struct test *b; b = &a; a.pnum *a.pnum (*a).pnum b.pnum *b.pnum (*b).pnum b->pnum מבנים • מצהירים על המבנה struct test, ומגדירים את המשתנה a להיות מטיפוס המבנה, ואת המשתנה b להיות מטיפוס מצביע למבנה הזה. • להלן מספר ביטויים, אשר חלקם נכונים תחבירית וחלקם לא. קבעו לגבי כל אחד מהם האם הוא תקין או לא, ובמידה וכן – הסבירו מה משמעותו.

  12. struct account { unsigned int num; char name[16]; int balance; }; typedef struct account acnt; תרגיל • בבנק "תן-לי-כסף-תן-לי" שומרים מידע על חשבונות בנק של לקוח. המידע על כל לקוח נשמר במחרוזת תווים בצורה הבאה: במחרוזת יש את מס' החשבון (מספר טבעי), שם הלקוח (עד 15 תווים) ואת יתרת החשבון שלו בשקלים (מספר שלם). • לדוגמא: "115- Yossi 4235" • מעוניינים להגדיר טיפוס נתונים חדש. במקום לשמור את פרטי כל חשבון במחרוזת, רוצים להגדיר מבנה (struct) מתאים. • הגדירו מבנה כזה.

  13. sscanf(s,"%u %s %d", &a.num, a.name, &a.balance); תרגיל • כתבו קטע קוד, המקבל מחרוזת תווים s בצורה שתוארה שלעיל ומציב את פרטי החשבון בתוך מבנה a מהסוג שהגדרנו. • פרטי כל 10000 הלקוחות של הבנק שמורים במערך של מחרוזות. מעוניינים להעביר את כל פרטי הלקוחות הללו, למערך חדש של 10000 מבנים. char *accounts[10000]; acnt accounts_new[10000]; ... for (i=0 ; i<10000 ; i++) sscanf(accounts[i],"%u %s %d",&accounts_new[i].num, accounts_new[i].name, &accounts_new[i].balance(;

More Related