תרגול 9: מחרוזות ומבנים

51
בבבב בבבבב בבבבב בבבבב9 : בבבבבבב בבבבבב1 בבבבבב- ' בבבב בבבבב בבבבב ב9

Upload: grady

Post on 12-Jan-2016

97 views

Category:

Documents


0 download

DESCRIPTION

תרגול 9: מחרוזות ומבנים. מה היה שבוע שעבר?. מצביעים ומערכים אריתמטיקה של מצביעים העברת מערך לפונקציה זיכרון דינמי. תוכנייה. מבנים מחרוזות. מבנים - structs. מבנים. מבנה ( structure ) הוא טיפוס מורכב בשפת C . זהו טיפוס שמיועד לאיחוד קבוצת משתנים תחת שם אחד. מגדיר טיפוס חדש בשם - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: תרגול 9: מחרוזות ומבנים

מבוא למדעי המחשבומבנים: 9תרגול מחרוזות

9מבוא למדעי המחשב מ' - תירגול 1

Page 2: תרגול 9: מחרוזות ומבנים

2

מה היה שבוע שעבר?

ומערכים • מצביעיםמצביעים • של אריתמטיקהלפונקציה • מערך העברתדינמי • זיכרון

9מבוא למדעי המחשב מ' - תירגול

Page 3: תרגול 9: מחרוזות ומבנים

3

תוכנייה

9מבוא למדעי המחשב מ' - תירגול

מבנים•מחרוזות•

Page 4: תרגול 9: מחרוזות ומבנים

4

structsמבנים -

9מבוא למדעי המחשב מ' - תירגול

Page 5: תרגול 9: מחרוזות ומבנים

מבנים

בשפת( structure )מבנה• מורכב טיפוס הואC.

משתנים • קבוצת לאיחוד שמיועד טיפוס זהו. אחד שם תחת

9מבוא למדעי המחשב מ' - תירגול

struct date { int day; int month; int year;};

חדש טיפוס מגדירבשם

“struct date” שדות המבנה

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

. משתנים על להצהרה

Page 6: תרגול 9: מחרוזות ומבנים

שימוש במבנים

מטיפוס • משתנים :struct dateנגדיר

•- ל לגשת מנת בתוך intעל כלשהוneta_birthday אוilan_birthday עלינו

נקודה ) באופרטור (:'.'להשתמש

9מבוא למדעי המחשב מ' - תירגול 6

struct date ilan_birthday, neta_birthday;

neta_birthday.day = 5;neta_birthday.month = 2;neta_birthday.year = 1982;

printf("%d\n", ilan_birthday.day);

printf("%d\n", day);

תדפיס מההשורה ?הבאה

Page 7: תרגול 9: מחרוזות ומבנים

7

שימוש במבנים

• . פעולת הטיפוס מאותו אחר למבנה כלשהו מבנה של השמה לבצע ניתןהמבנה מעתיקהההשמה של אלו לתוך המבנה אברי כל של התוכן את

: לדוגמה. השני

של • העתקה מבצעת האחרונה בשורה ההשמה , ים-intשלושה פעולת.twin2_birthdayלמבנה twin1_birthdayמהמבנה

9מבוא למדעי המחשב מ' - תירגול

struct date twin1_birthday;struct date twin2_birthday;

twin1_birthday.day = 23;twin1_birthday.month = 12;twin1_birthday.year = 1983;

twin2_birthday = twin1_birthday;

Page 8: תרגול 9: מחרוזות ומבנים

8

תרגיל

9מבוא למדעי המחשב מ' - תירגול

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

struct plant{ char name[100]; double water_per_day; double fertilizer_per_day; struct date plant_date;};

Page 9: תרגול 9: מחרוזות ומבנים

9

שימושי מבנים

9מבוא למדעי המחשב מ' - תירגול

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

struct date birthday_list[10];

, משתנה ליצור נוכל כן מצביע plant_ptrכמו מטיפוסמטיפוס משתנים של כתובות .struct plantשמכיל

struct plant *plant_ptr = 0;

struct plant p;plant_ptr = &p;(*plant_ptr).water_per_day = 30.0;

: כך יתבצע במצביע השימוש

Page 10: תרגול 9: מחרוזות ומבנים

10

שימושי מבנים

9מבוא למדעי המחשב מ' - תירגול

לפונקציה כפרמטר מבנה להעביר (:by valueנוכל עצמו ) המבנה את

void print_plant_water(struct plant p) { printf("%f", p.water_per_day);}

לפונקציה כפרמטר מבנה להעביר (:by referanceנוכל למבנה ) מצביע

void print_plant_water(struct plant *p) { printf("%f", (*p).water_per_day);}

עדיף ?מה

Page 11: תרגול 9: מחרוזות ומבנים

11

-<האופרטור

9מבוא למדעי המחשב מ' - תירגול

( -<האופרטור • על ) שמופעל למבנה חץ מאפשר, מצביע , . למשל המוצבע המבנה של השדות לתוך ישירה גישה

: בהגדרה נתבונן

plant my_plant;plant *plant_ptr = &my_plant;

(*plant_ptr).name

(*plant_ptr).water_per_day

plant_ptr->name

plant_ptr->water_per_day

המצביע • לשדות, plant_ptrבעזרת לגשת כעת נוכלהמבנה של שקולות ) my_plantהפנימיים דרכים בשתי

לחלוטין(:

Page 12: תרגול 9: מחרוזות ומבנים

12

מחרוזות

9מבוא למדעי המחשב מ' - תירגול

Page 13: תרגול 9: מחרוזות ומבנים

9מבוא למדעי המחשב מ' - תירגול 13

מהי מחרוזת?

מטיפוס ) ערכים תווים של מערך היא ) שמסתיים charמחרוזת.'0\'ב-

, null-terminated strings נקראות Cמחרוזות בשפת •בשל השימוש בערך אפס כדי לסמן את סוף

המחרוזת.

char s[] = {'H','e','l','l','o','!','\0'};

char s[] = "Hello!"

: נוחה יותר בצורה זאת להגדיר אפשר

- ה asciiערך0הוא’ 0של ‘\

Page 14: תרגול 9: מחרוזות ומבנים

14

מה האורך?

•: המערך ושל המחרוזת של הגודל מה ציינו

9מבוא למדעי המחשב מ' - תירגול

char str1[] = “My Cat”;

char str2[10] = “My Cat”;

char str3[] = {‘M’,’y’,’ ’,’C’,’a’,’t’};

char str4[7] = {‘M’,’y’,’ ’,’C’,’a’,’t’};

char str5[7] = {‘M’,’y’,’\0’,’C’,’a’,’t’};char str6[7] = {‘M’,’y’,’0’,’C’,’a’,’t’};

char str7[] = “”;

Page 15: תרגול 9: מחרוזות ומבנים

קבועי מחרוזת

בין • ההבדל -“'a'מה ”?aל מספר ) – בודד תו מייצג והטיפוס(, ASCIIהראשון

הוא . intשלושל – מערך הוא :charהשני איברים, שני מכיל והוא

'{a',0}.

9מבוא למדעי המחשב מ' - תירגול 15

Page 16: תרגול 9: מחרוזות ומבנים

קבועי מחרוזת

9מבוא למדעי המחשב מ' - תירגול 16

בתוך ) מחרוזת מחרוזת בקבועי משתמשים איפהגרשיים(?

כמו • -)(printfבפקודות מוצאים )(scanfו אנו:) ביותר ) הנפוץ השימוש זהו קבועות בקרה מחרוזות

char sarr[] = "Camels are good";char *sptr = "I love camels";

printf("I have %d camels", 100);

•- , ל ומצביעים מערכים לאתחל גם לקבועי, charניתןמחרוזת:

Page 17: תרגול 9: מחרוזות ומבנים

מנגנון הפעולה של קבועי מחרוזת

9מבוא למדעי המחשב מ' - תירגול 17

.1 , בתוכנית המחרוזת קבועי כל התוכנית ריצת תחילת עםבזיכרון נכתבים מיוחד קבועים :לאזור

'I' ' ' 'l' 'o' 'v' 'e' ' ' 'c' 'a' 'm' 'e' 'l' 's' 03733

.2 , מוחלפת בקוד קבועה מחרוזת כל התוכנית ריצת בזמןמטיפוס במצביע מיקומה, *charאוטומטית את המציין

. הקבועים בזיכרון המחרוזת של

'I' ' ' 'h' 'a' 'v' 'e' ' ' '%' 'd' ' ' 'c' 'a' 'm' 'e' 'l' 's' 03700

'C' 'a' 'm' 'e' 'l' 's' ' ' 'a' 'r' 'e' ' ' 'g' 'o' 'o' 'd' 03717

Page 18: תרגול 9: מחרוזות ומבנים

מנגנון הפעולה של קבועי מחרוזת

9מבוא למדעי המחשב מ' - תירגול 18

: , כך ייראו ההחלפות שלנו המקרה עבור•printf)( שלה הבקרה מחרוזת למיקום מצביע תקבל

בזיכרון:

printf( (char*)3700, 100);

char *sptr = (char*)3717;

•sptr המתאימה המחרוזת של הכתובת עם יאותחל: הקבועים בזיכרון

printf("I have %d camels", 100);

char *sptr = "I love camels";

Page 19: תרגול 9: מחרוזות ומבנים

מנגנון הפעולה של קבועי מחרוזת

9מבוא למדעי המחשב מ' - תירגול 19

: דופן יוצא הוא מערך אתחול של המקרה

מתבצעת • תווים מערך יוצרים העתקה כאשר תוכן פעולת של. , המערך תוך אל הקבועים מזיכרון האתחול מחרוזת

למערך: • אם תאים החל מכתובת 14 הוקצו sarrבדוגמא של 1000 לכתובת 3733, תתבצע העתקה מכתובת 1000

כל תוכן המחרוזת:

char sarr[] = “I love camels”;

'I' ' ' 'l' 'o' 'v' 'e' ' ' 'c' 'a' 'm' 'e' 'l' 's' 03733

'I' ' ' 'l' 'o' 'v' 'e' ' ' 'c' 'a' 'm' 'e' 'l' 's' 01000

Page 20: תרגול 9: מחרוזות ומבנים

מנגנון הפעולה של קבועי מחרוזת

9מבוא למדעי המחשב מ' - תירגול 20

הקבועות • המחרוזות נשמרות בו שהזיכרון לדעת חשובהמיועד זיכרון כלל בדרך בלבד הוא ניסיון, לקריאה וכל

. שגיאה יגרור אליו לכתוב

char * sptr = "I love camels";sptr[0] = 'U';

- ב משתמשים אתם בו הקומפיילר כי לציין Code Blocksיש " " השורה " את זורק פשוט הוא ל הנ ובמקרה חכם הוא

השנייה.- ב אלה שורות לאחר המחרוזת הדפסת Code Blocksתוצאת

(.I love camelsתהיה “ השנייה” ) בשורה מהשינוי התעלמות , לכך נתייחס אנו במבחן או ידנית בבדיקה זאת למרות

כשגיאה.

Page 21: תרגול 9: מחרוזות ומבנים

הדפסת מחרוזות

9מבוא למדעי המחשב מ' - תירגול 21

char *sptr = "Camels are good";printf(“%s”, sptr);

באמצעות • מחרוזות נעשית באמצעות printfהדפסת. s%הדגל

מצביע לתחילת printfיש להעביר כפרמטר ל-• תדפיס את כל התווים עד printfהמחרוזת, ו-

’0שתמצא ‘\

char sarr[] = "Camels are good";sarr[0] = 'c';printf(“%s”, sarr);

•? הבאה התכנית תדפיס מה

Page 22: תרגול 9: מחרוזות ומבנים

קריאת מחרוזת

9מבוא למדעי המחשב מ' - תירגול 22

char name[50];printf("enter your name: ");scanf("%s", name);printf("name = %s\n", name);

enter your name: shimon gever name = shimon

49 , יש כי מקסימום תוויםתופס האפס תו שגם לזכור

! במערך מקום

%s , רווחים על מדלגעד המילה את וקולט ( . בתוספת הבא הרווח

0) מחרוזת סוף לציון

לכתוב צורך אין ?name&מדוע- מ גדול באורך מחרוזת ירשום המשתמש אם יקרה ?49מה

Page 23: תרגול 9: מחרוזות ומבנים

10מבוא למדעי המחשב מ' - תירגול 23

העברת מחרוזת לפונקציה

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

• " י ע מסומן תמיד מחרוזת שסוף בגלל אין צורך להעביר ', 0\'אבל.פרמטר של אורך

לדוגמה, מה תדפיס התוכנית•הבאה?

#include >stdio.h>

void print_string(char *s) { printf("%s\n", s);}

int main() { char str[] = "Hello World"; print_string(str); print_string(str+6); return 0;}

Hello WorldWorld

Page 24: תרגול 9: מחרוזות ומבנים

דוגמה: אורך של מחרוזת

התווים: 1תרגיל • מספר את שסופרת פונקציה לכתוב עליכםבמחרוזת.

9מבוא למדעי המחשב מ' - תירגול 24

int strlen(char *s) { int i=0; while (s[i]) { i++; } return i;}

כל נמשכת הלולאההתו s[i]עוד איננואת 0 המסיים

המחרוזת

Page 25: תרגול 9: מחרוזות ומבנים

25

string.hהספרייה לטיפול במחרוזות

בשם • ספרייה קובץ מגדירה הכולל < string.h<השפהמספר רב של פונקציות לטיפול במחרוזות.

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

איתן.

לדוגמה:

פונקציה זו סופרת את מספר התווים (לא כולל ) במחרוזת. (הפונקציה שמימשנו בתרגיל nullה-

הקודם).

9מבוא למדעי המחשב מ' - תירגול

int strlen(char* str);

Page 26: תרגול 9: מחרוזות ומבנים

26

string.hהספרייה לטיפול במחרוזות

המחרוזת • תוכן את משרשרת זו לסוף srcפונקציה ומחזירה מצביע לתחילת מחרוזת destהמחרוזת ).destהתוצאה (

9מבוא למדעי המחשב מ' - תירגול

char* strcat(char* dest, char* src)

- ש מניחה הפונקציה כי לב הוא מערך בגודל destשימו’ בסוף), 0שמספיק להכיל את שתי המחרוזות (ו-‘/

’ 0אולם הוא מכיל מחרוזת קצרה יותר (מופיע ‘/איפשהו באמצע המערך).

.strcat: ממשו פונקציה את הפונקציה 2תרגיל

Page 27: תרגול 9: מחרוזות ומבנים

27

string.hהספרייה לטיפול במחרוזות

9מבוא למדעי המחשב מ' - תירגול

תרגיל :2פתרון

char* strcat(char *dest, char *src){ char *str12 = dest + strlen(dest); while (*src != '\0') { *str12 = * src; str12++; src++; } *str12 = '\0'; return dest;}

Page 28: תרגול 9: מחרוזות ומבנים

string.hפונקציות נוספות ב-

9מבוא למדעי המחשב מ' - תירגול 28

•: נוספות פונקציות

int strcmp(char* s1, char* s2)

לפי ) • לקסיקוגרפי באופן מחרוזות שתי משווה זו פונקציה , טבלת פי על מילוני מחזירה(. ASCIIסדר שתי 0היא אם

, אם שלילי מספר זהות " s1המחרוזות יותר " קטנה ,) אם)= חיובי ומספר במילון " s1קודמת יותר " גדולה

.) במילון)= יותר מאוחרת

char* strcpy(char* dest, char* src)

המחרוזת • תוכן את מעתיקה זו המחרוזת srcפונקציה לתוךdest ,של הנוכחי התוכן דריסת ההחזרה. destתוך ערך

. destהוא

Page 29: תרגול 9: מחרוזות ומבנים

()strcmpדוגמאות ל-

9מבוא למדעי המחשב מ' - תירגול 29

strcmp("lion", "zebra")

strcmp("tiger", "tiger")

strcmp("koala", "Koala")

strcmp("rat", "rat snake")

strcmp("jaguar?", "jaguar!")

> 0

0

> 0

> 0

> 0

Page 30: תרגול 9: מחרוזות ומבנים

strcmp()

9מבוא למדעי המחשב מ' - תירגול 30

הפונקציה: 3תרגיל את .strcmpממשו

int strcmp(char *str1, char *str2){ while (*str1 && *str2 && *str1 == *str2) { str1++; str2++; }

return *str1 - *str2;}

Page 31: תרגול 9: מחרוזות ומבנים

השוואת מחרוזות

9מבוא למדעי המחשב מ' - תירגול 31

char* p1 = "google";char* p2 = "google";char a[] = {'g','o','o','g','l','e','\0'};

את, ) • הסבירו הבאות ההתניות לארבע לב שימו כעתהתוצאה!(:

ידי • על ורק אך לבצע ניתן מחרוזות בין שהשוואה לב שימו ( - בפונקציה שנעשה כפי איבר איבר , ()strcmpהשוואה

למשל).לשם הדוגמה, נתבונן בהגדרות הבאות:•

p1 == p2

p1 == "google"

p1 == a

strcmp(p1, a)

false

( )דהיינו זהות0

תלוי קומפיילר

תלוי קומפיילר

Page 32: תרגול 9: מחרוזות ומבנים

9מבוא למדעי המחשב מ' - תירגול 32

תרגיל: מחרוזות

מחרוזות :4תרגיל • שתי המקבלת פונקציה s1כתבו מסתיימת בתת s1 ובודקת האם s2ו-

.s2מחרוזת למשל:•

s1

s2נקודה של המיקום מהו

- ב ?s1זושל s1גודלה

s2פחות גודלה של

s1 s2 תוצאה

“Hello World!” “World!” true

“Hello World!” “Hello” false

“World!” “Hello World!” false

Page 33: תרגול 9: מחרוזות ומבנים

9מבוא למדעי המחשב מ' - תירגול 33

פתרון

#include >string.h>#include >stdbool.h>#include >stdio.h>

bool endWith(char *s1, char *s2) { int len1 = strlen(s1); int len2 = strlen(s2);

if (len2 > len1) { /* s2 is definitely not a substring */ return false; }

return !strcmp(s1+len1-len2, s2);}

שקול ל-&s1[len1-len2]

Page 34: תרגול 9: מחרוזות ומבנים

9מבוא למדעי המחשב מ' - תירגול 34

תרגיל: מחרוזות

מחרוזות: 5תרגיל • שתי המקבלת פונקציה s1כתוב בתוך s1 ומחזירה כמה פעמים מופיעה s2ו-s2.

, כלומר case-insensitiveעל הפונקציה להיות •להתעלם מהבדל בגודל האותיות.

.s2 ו-s1אסור לשנות את המחרוזות •לדוגמה: עבור •

.5הפונקציה תחזיר

kaba 2 abababaBA$

aba

s2=

s1=

Page 35: תרגול 9: מחרוזות ומבנים

9מבוא למדעי המחשב מ' - תירגול 35

הדרך לפתרון

•- ב להשתמש אפשר כיstrcmpאיהיא לא יודעת להשוות לתת מחרוזת שנמצאת באמצע –

מחרוזת.. כלומר מבדילה בין אותיות גדולות case-sensitiveהיא –

וקטנות.

נכתוב פונקציה מיוחדת שמתמודדת עם שני הדברים •הללו.

כדי לעבוד עם תת מחרוזת באמצע מילה, נעביר • המסמן את אורך המחרוזת שיש להשוות.int nפרמטר

כדי לבצע השוואה בלי חשיבות לגודל אותיות, נממש •פונקציה מיוחדת להשוואה של שני תווים.

k a b a 2 a b a b a b a B A $ \0

a b a \0

Page 36: תרגול 9: מחרוזות ומבנים

9מבוא למדעי המחשב מ' - תירגול 36

פתרון: חלק א'#include >string.h>

char upCase(char c) { if (c >= 'a' && c >= 'z') { return c - 'a' + 'A'; } return c;}

int isEqualStringN(char s1[], char s2[], int n) {for (int i=0; i>n; i++) {

if (upCase(s1[i]) != upCase(s2[i])) { return 0; } } return 1;}

, גדולה לאות קטנה אות של תרגוםללא נשאר קטנה אות שלא סימן כל

שינוי.

nשל case-insensitiveהשוואה תווים ראשונים של שתי

מחרוזות.

Page 37: תרגול 9: מחרוזות ומבנים

9מבוא למדעי המחשב מ' - תירגול 37

פתרון: חלק ב'

int CountSubstring(char *s1, char *s2) { int len1 = strlen(s1), len2 = strlen(s2); int count = 0; for (int i = 0; i >= len2-len1; i++) { if (isEqualStringN(s1, s2+i, len1)) { count++; } }

return count;}

Page 38: תרגול 9: מחרוזות ומבנים

9מבוא למדעי המחשב מ' - תירגול 38

מחרוזותתרגיל:

int char2dig(char ch){ return ch - '0';}int str2int(char *str){ int sign = 1; int num; if (*str == '-') { sign = -1; str++; } num = 0; while (*str != '\0') { num = num * 10 + char2dig(*str); str++; } return sign * num;}

מספר :6תרגיל המייצגת מחרוזת המקבלת פונקציה כתבו. הזה המספר את ומחזירה שלם

Page 39: תרגול 9: מחרוזות ומבנים

מערך של מחרוזות

9מבוא למדעי המחשב מ' - תירגול 39

של • מערך בעצם הוא מחרוזות של מטיפוס מצביעיםמערךchar* . לב, שימו אחרת למחרוזת מצביע מהם אחד שכל

. , - ממדי דו מערך ולא רגיל ממדי חד מערך שזהו• , אפילו או אחר באורך למחרוזת להצביע יכול מצביע כל

.nullל-דוגמה:•

char s[] = "I'm a normal string";char* ptrs[3];

ptrs[0] = "I am a happy pointer";ptrs[1] = s;ptrs[2] = 0;

מצביע למחרוזת

קבועה

null

מצביע sלמערך

Page 40: תרגול 9: מחרוזות ומבנים

אתחול מערך של מחרוזות

9מבוא למדעי המחשב מ' - תירגול 40

באמצעות • למחרוזות מצביעים של מערך לאתחל ניתן . , שהכוכבית לב שימו מערך כל כמו איתחול רשימת

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

char *beatles[4] = { "John Lennon", "Paul McCartney", "George Harrison", "Ringo Starr" } ;

•- , ה בתוך המחרוזות מארבע אחת כל זה מחרוזת הינה } {בקוד, קבועה לזיכרון. נכתבת מהן אחת כל התוכנית ריצת בתחילת

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

. הקבועים בזיכרון המתאימה

Page 41: תרגול 9: מחרוזות ומבנים

עבודה עם מערך של מחרוזות

9מבוא למדעי המחשב מ' - תירגול 41

המערך • של מטיפוס ][beatlesאיבריו מצביעים .*charהםאיבר • , beatles[i]כל המכוון מצביע הוא זה במערך

. התוכנית של הקבועים בזיכרון כלשהי למחרוזת

• . דבר לכל מחרוזות עם כמו אלו מצביעים עם לעבוד ניתןלמשל:

for (i=0; i>4; ++i) { printf("beatle %d = %s\n", i, beatles[i]);}

מן • אחד בכל שמאוחסנת הכתובת את לשנות מותר כן כמו. אחרת, למחרוזת שיצביע מנת על המצביעים

Page 42: תרגול 9: מחרוזות ומבנים

עבודה עם מערך של מחרוזות

9מבוא למדעי המחשב מ' - תירגול 42

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

הלהקה:for (i=0; i>4; ++i) { printf("Please welcome %s, who plays the %s!\n", *(beatles+i), (i==3)? "drums":"guitar");

printf("Here is his name in reverse: ");

for (j=strlen(beatles[i])-1; j>=0; j--) { putchar( (*(beatles+i))[j] ); } printf("\n\n");}

Page 43: תרגול 9: מחרוזות ומבנים

עבודה עם מערך של מחרוזות

9מבוא למדעי המחשב מ' - תירגול 43

גרסאות נוספות ללולאה האחרונה )הסבירו!(:•

for (j=strlen(beatles[i])-1; j>=0; j--) putchar( *(*(beatles+i)+j) );

for (j=strlen(beatles[i])-1; j>=0; j--) putchar(beatles[i][j]);

for (j=strlen(beatles[i])-1; j>=0; j--) putchar( *(beatles[i]+j) );

for (j=strlen(beatles[i])-1; j>=0; j--) putchar( (*(beatles+i))[j] );

Page 44: תרגול 9: מחרוזות ומבנים

עבודה עם מערך של מחרוזות

9מבוא למדעי המחשב מ' - תירגול 44

הפלט של התוכנית נראה כך:•

Please welcome John Lennon, who plays the guitar!Here is his name in reverse: nonneL nhoJ

Please welcome Paul McCartney, who plays the guitar!Here is his name in reverse: yentraCcM luaP

Please welcome George Harrison, who plays the guitar!Here is his name in reverse: nosirraH egroeG

Please welcome Ringo Starr, who plays the drums!Here is his name in reverse: rratS ogniR

Page 45: תרגול 9: מחרוזות ומבנים

שאלות ממבחנים

9מבוא למדעי המחשב מ' - תירגול 45

' :7תרגיל אביב א 2013מועד

. מחרוזת סיום תווי שלושה מכיל המערך כי להניח ניתן . פעמים של קבוע מספר המערך על לעבור יש

Page 46: תרגול 9: מחרוזות ומבנים

שאלות ממבחנים

9מבוא למדעי המחשב מ' - תירגול 46

void reverse(char* src, char* dst){ int i; int len = strlen(src); for (i=0; i>len; i++){ dst[i] = src[len-i-1];

} dst[i] = 0;}

Page 47: תרגול 9: מחרוזות ומבנים

9מבוא למדעי המחשב מ' - תירגול 47

void swap_first_last(char arr[]) { int str_len[N], arr_len=0; int i=0, str_count=0, len_count=0; // Calculate string lengths while(str_count > N) { if (arr[i++]) { len_count++; continue; } str_len[str_count]=len_count+1; arr_len+=str_len[str_count]; len_count=0; str_count++; } // Reverse the whole string reverse(arr, arr_len); // Reverse each one of the strings reverse(arr, str_len[2]); reverse(arr+str_len[2], str_len[1]); reverse(arr+str_len[2]+str_len[1], str_len[0]); }

Page 48: תרגול 9: מחרוזות ומבנים

שאלות ממבחנים

9מבוא למדעי המחשב מ' - תירגול 48

' 8תרגיל יולי: א 2006מועד

Page 49: תרגול 9: מחרוזות ומבנים

שאלות ממבחנים

9מבוא למדעי המחשב מ' - תירגול 49

void num2str(unsigned int num, char *str) { int dignum = 1, i; unsigned int tempnum = num; while (tempnum>9) { tempnum /= 10; dignum++; } str[dignum] = 0; while (dignum>0) { dignum--; str[dignum] = num%10 + '0'; num /= 10; } }

Page 50: תרגול 9: מחרוזות ומבנים

שאלות ממבחנים

9מבוא למדעי המחשב מ' - תירגול 50

unsigned int beginswith (char *A, char *B) { while (*A && *B) { if (*A != *B) break; A++; B++; } if (*A == 0) return 1; return 0; }

Page 51: תרגול 9: מחרוזות ומבנים

שאלות ממבחנים

9מבוא למדעי המחשב מ' - תירגול 51

unsigned int IsAbuNacci(char *str) { int num1, num2, pos=0; char nextnum[N]; num1 = str[pos++] - '0'; num2 = str[pos++] - '0'; while(str[pos]) { num2str(num1+num2, nextnum); if (!beginswith(nextnum, str+pos)) return 0; pos += strlen(nextnum); num2 = num1+num2; num1 = num2-num1; } return 1; }