מחרוזות נכתב ע " י כרמי גרושקו. כל הזכויות שמורות © 2010 הטכניון, מכון טכנולוגי לישראל 1.

Slides:



Advertisements
Similar presentations
מבוא למדעי המחשב לתעשייה וניהול
Advertisements

Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
שאלות ממבחנים. 14 תרגולמבוא למדעי המחשב. כל הזכויות שמורות ©2 תרגיל 1: מטריצות כתבו פונקציהvoid Rotation(int in [N][N], int out [N][N]) אשר מקבלת שני.
תכנות תרגול 9 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מה החומר למבחן ? כל החומר שנלמד בהרצאות ובתרגולים. לגבי backtracking: לא תידרשו לממש אלגוריתם, אך כן להבין או להשלים מימוש נתון. אחת משאלות המבחן מבוססת.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות תרגול 2 שבוע : שבוע שעבר כתבו תוכנית המגדירה שלושה משתנים מאתחלת אותם ל 1 2 ו 3 ומדפיסה את המכפלה שלהם את ההפרש שלהם ואת הסכום שלהם.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
11 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא כללי למדעי המחשב תרגול. הבית האדום כתובת : רחוב קוקוריקו 2 הבית הירוק כתובת : רחוב קוקוריקו 4 הבית הצהוב כתובת : רחוב קוקוריקו 1 הבית הורוד כתובת.
תכנות תרגול 9 שבוע : מערכים int a; a=5; int a[10]; a[2] = 5; 5 a a[0] a[1] a[2] a[9]  5 משתנה בודד מערך גישה למשתנה השלישי במערך.
תוכנה 1 - חזרה שולי לב יהודי 2 Arrays and Strings מערך - אוסף משתנים בעלי שם משותף. הפנייה לכל איבר נעשית ע ” י אינדקס. ב -C מערך מוגדר.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 4 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תורת הקבוצות חלק ב'. קבוצה בת מניה הגדרה: קבוצה אינסופית X היא ניתנת למניה אם יש התאמה חד-חד ערכית בין X לבין .
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
מבוא לשפת C תרגול 12: עוד רקורסיה
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site : T.A. :Emilia Katz.
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
#include void main() { int i; char c; char st1[]="abcd"; for (i=-128;i
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
מבוא למדעי המחשב תרגול 6 - מערכים שעת קבלה : יום שני 11:00-12:00 דוא " ל :
תכנות תרגול 5 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
תכנות תרגול 4 שבוע : לולאות for לולאות for for (counter=1 ;counter
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Last time on Clang משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי
מבוא מורחב למדעי המחשב בשפת Scheme תרגול 10. אג'נדה שאלות מבחינות חזרה על מימוש stream אפשרי 2.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא למדעי המחשב תרגול 9 – מערכים ומחרוזות, תרגילי חזרה שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Sscanf example #include int main () { char sentence []="Rudolph is 12 years old"; char str [20]; int i; sscanf (sentence,"%s %*s %d",str,&i); printf ("%s.
תכנות תרגול 8 שבוע : מערכים עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. עד היום התוכניות שלנו לא.
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
1 נתבונן בפונקציה הבאה public static int min(int[] a,int n) { int min = a[0]; for (int i = 1; (i < n ) && (i < a.length) ; i++) if (min > a[i]) min = a[i];
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
Programming Pointers. נדגים היום בעזרת מצביעים העברת משתנים לפונקציה שמשנה אותם  פונקציה שמקבלת מצביעים לסמן תא בזיכרון  פונקציה שמחזירה מצביע מערך.
מחרוזות – הטיפוס String
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבוא למדעי המחשב לתעשייה וניהול
Formal Specifications for Complex Systems (236368) Tutorial #1
מבוא למדעי המחשב סיבוכיות.
מיונים וחיפושים קרן כליף.
מחרוזות קרן כליף.
שיעור חמישי: מערכים ומחרוזות
תירגול 14: מבני נתונים דינאמיים
שיעור שישי: מחרוזות, מצביעים
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
מבוא כללי למדעי המחשב תרגול 4
תרגול 8 תחומי הכרה פונקציות
תיכון אהל שם, רמת גן קורס PHP – הרצאה מס' 10
שאלות מבחינות קודמות יואב ציבין.
מחרוזות קרן כליף.
מבוא למדעי המחשב מצביעים.
תירגול 8:מצביעים והקצאה דינאמית
Computer Programming תרגול 3 Summer 2016
Engineering Programming A
Presentation transcript:

מחרוזות נכתב ע " י כרמי גרושקו. כל הזכויות שמורות © 2010 הטכניון, מכון טכנולוגי לישראל 1

2

רעיונית, מחרוזת היא אוסף של תווים. עם זאת, בשפת C לא קיים מבנה יעודי למחרוזות. טכנית, מצביע לתו מגדיר מחרוזת החל מהתו אליו הוא מצביע, ועד לתו הקרוב שערכו '\ 0' ("backslash-zero") מחרוזת יכולה להיות חלק ממערך, או להווצר ע " י malloc. מערך יכול להכיל כמה מחרוזות. מחרוזת יכולה להיות באורך 0 3

קבועי מחרוזת, כדוגמת "Hi !" הם ביטויים מטיפוס char*. ערכם הוא כתובת באזור מיוחד בזכרון, לקריאה בלבד. printf( "Hello!" ); printf( 4592 ); … 'H''e''l' '!''\0' …

כתלות בקומפיילר, שני קבועי - מחרוזות זהים עשויים להצביע לאותו מקום בזכרון : printf( "%d", a ); printf( "%d", b ); printf( "%d", a ); printf( "%d", b ); printf( 1804, a ); printf( 1804, b ); printf( 1804, a ); printf( 1804, b ); … '%''d''\0' …

הפקודה הבאה מגדירה משתנה המצביע לקבוע מחרוזת : char* str = "Hi !"; ניסיון לשנות את המחרוזת המוצבעת ע " י str עשוי לגרום לקריסת התכנית, כיוון שהמחרוזת נמצאת באזור זכרון לקריאה בלבד : str[0] = 'G'; 6

לעומת זאת, הפקודה הבאה מקצה זכרון, ומעתיקה לתוכו את תוכנו של קבוע המחרוזת. ( כולל ה -'\ 0' !) char str2[5] = "Hi !"; שינוי המחרוזת המוצבעת ע " י str2 יצליח, כיוון ש -str2 הוא זכרון רגיל, שאינו לקריאה - בלבד. str2[0] = 'G'; 7

הדפסת מחרוזת נעשית ע " י תג הבקרה %s: printf( "%s", str ); קלט נעשה באופן דומה : scanf( "%s", str ); str חייב להצביע למקום שמותר לנו לכתוב אליו מערך שהוגדר מראש, או זכרון מהקצאה דינמית. אורך המחרוזת הנקלטת חייב להיות קטן מגודלו של המערך פחות 1, כדי להשאיר מקום לתו המיוחד '\ 0'. שימו לב שאין &, כיוון ש -scanf צריכה לדעת לאן לכתוב את מה שהיא קולטת, ו -str מצביע למקום זה. char str[15]; scanf( "%s", str ); char str[15]; scanf( "%s", str ); 8

כיוון שמחרוזת היא למעשה מצביע, לא ניתן להשוות בין מחרוזות בצורה האינטואיטיבית - char str[15]; scanf( "%s", str ); if( str == "Hi!" ) { /* This will never happen */ } char str[15]; scanf( "%s", str ); if( str == "Hi!" ) { /* This will never happen */ } char str[15]; scanf( "%s", str ); if( 1408 == 1544 ) { /* This will never happen */ } char str[15]; scanf( "%s", str ); if( 1408 == 1544 ) { /* This will never happen */ } 9

בדומה למערך של int, ניתן להגדיר מערך של char*. מערך כזה נקרא " מערך של מחרוזות ", כיוון שכל איבר במערך מגדיר מחרוזת. תמונת זכרון : char* a[4] = {"Hi", NULL, "%d", NULL}; printf( "%s", a[0] ); char* a[4] = {"Hi", NULL, "%d", NULL}; printf( "%s", a[0] ); … 'H''i''\0' … 1500 NULL1804NULL … '%''d''\0' …

11

כתבו את הפונקציה הבאה : strlen - בהנתן מחרוזת (=char*), מחזירה את אורכה unsigned strlen( char* s ) { unsigned res = 0; while( s[res] ) res++; return res; } unsigned strlen( char* s ) { unsigned res = 0; while( s[res] ) res++; return res; } = char s[] 12

char str[35] = "Hello "; strcat( str, "world !" ) printf( "%s", str ); char str[35] = "Hello "; strcat( str, "world !" ) printf( "%s", str ); כתבו את הפונקציה הבאה : strcat המקבלת שתי מחרוזות str1 ו -str2, ומדביקה את השניה לסוף הראשונה. על הפונקציה להחזיר מצביע למחרוזת הראשונה, על מנת שניתן יהיה לשרשר קריאות. הפונקציה תניח שב -str1 יש מספיק מקום. char str[35] = "Hello "; strcat( strcat( str, "world !" ), " Bla Bla !" ); printf( "%s", str ); /* Prints: Hello world! Bla Bla ! */ char str[35] = "Hello "; strcat( strcat( str, "world !" ), " Bla Bla !" ); printf( "%s", str ); /* Prints: Hello world! Bla Bla ! */ 13

תמונת זכרון : char str[35] = "Hello "; strcat( str, "world" ); printf( "%s", str ); /* Prints: Hello world */ char str[35] = "Hello "; strcat( str, "world" ); printf( "%s", str ); /* Prints: Hello world */ 'H''e''l' 'o'' '' ''\0' … str 'H''e''l' 'o'' '' ''w''o''r''l''d''\0' … str 14

נמצא את המקום שבו a מסתיימת, ונעתיק לשם את b. char* strcat( char* str1, char* str2 ) { char* t = str1; while( *str1 ) str1++; while( *str2 ) *str1++ = *str2++; return t; } char* strcat( char* str1, char* str2 ) { char* t = str1; while( *str1 ) str1++; while( *str2 ) *str1++ = *str2++; return t; } 15

הסדר שבו מילים מסודרות במילון. נתונות שתי מחרוזות שונות a ו -b. יהא i האינדקס הראשון בו a[i] != b[i]. אם a[i]<b[i], נאמר ש -a קטנה מ -b, אחרת גדולה. שימו לב שההגדרה תלויה בטבלת התוים (ASCII,...) שימו לב שבסוף מחרוזת תמיד יש תו שערכו 0. לדוגמא, "a" < "b", "bla" < "c". 16

כתבו פונקציה המקבלת שתי מחרוזות str1 ו - str2, ומחזירה אפס אם שתיהן זהות >0 אם str1 > str2 <0 אם str2 < str1 אפשר להסתכל על הפקודה strcmp( str1, str2 ) כעל השאלה : " למה שווה str1-str2 ?" 17

נתקדם עם שתי המחרוזות במקביל, עד שאחת מהן נגמרת. אם גם השניה נגמרה, נחזיר '\ 0' - '\0' = 0 אחרת, נחזיר את ההפרש בין התוים int strcmp2( char* str1, char* str2 ) { while( *str1 && *str2 && *str1 == *str2) { str1++; str2++; } return *str1 - *str2; } int strcmp2( char* str1, char* str2 ) { while( *str1 && *str2 && *str1 == *str2) { str1++; str2++; } return *str1 - *str2; } 18

כתבו פונקציה המקבלת מערך a ואורכו n, ומחזירה את מספר המחרוזות המוכלות בו. שימו לב מה זה מדגיש - מערך ומחרוזת אינם אותו הדבר. הדבר שקול לספירת תוי ה -'\ 0 ' שבמערך. unsigned count_strings( char s[], int n ) { unsigned res = 0; int i; for( i=0; i<n; i++ ) res += (s[i] == '\0'); return res; } unsigned count_strings( char s[], int n ) { unsigned res = 0; int i; for( i=0; i<n; i++ ) res += (s[i] == '\0'); return res; } כזכור, ערכו של ביטוי זה הוא 0 או 1 19

כתבו פונקציה המקבלת מחרוזת המייצגת מספר שלם, ומחזירה את המספר הזה. int n = str2int("-1234"); printf( "%d", n ); /* Prints: */ int n = str2int("-1234"); printf( "%d", n ); /* Prints: */ 20

כתבו פונקציה המקבלת מחרוזת המייצגת מספר שלם, ומחזירה את המספר הזה. int str2int( char* str ) { int res = 0; int negative = (*str == '-'); if( *str == '-' ) str++; while( *str ) { res = 10*res + (*str-'0'); str++; } return negative ? -res : res; } int str2int( char* str ) { int res = 0; int negative = (*str == '-'); if( *str == '-' ) str++; while( *str ) { res = 10*res + (*str-'0'); str++; } return negative ? -res : res; } 21

נתונות שלוש מחרוזות s1, s2, s3 המורכבות מאותיות אנגליות קטנות (a-z) בלבד. כתבו פונקציה המדפיסה רשימה של כל האותיות המופיעות גם ב -s1 וגם ב -s2, אך לא ב -s3. הדפיסו כל אות כזו פעם אחת בלבד, בסדר כלשהו. דוגמא : str1 = "introductionto" str2 = "computer" str3 = "science" פלט : trou פתרו ללא לולאות מקוננות (= מעבר יחיד על המחרוזות ) 22

" כתבו פונקציה המדפיסה רשימה של כל האותיות המופיעות גם ב -s1 וגם ב -s2, אך לא ב -s3." איך הייתם פותרים את הבעיה ללא האילוץ האחרון על הלולאות המקוננות ? הטריק ( שחוזר על עצמו בשאלות רבות ) הוא שניתן להגדיר מערך עזר בגודל 26 ( מספר האותיות האנגליות ). "cable" abcdefghijklmnopqrs… 11111… 23

void print_letters( char* s1, char* s2, char* s3 ) { int i, letters[26] = {0}; for( ; *s1; s1++ ) letters[*s1 - 'a'] = 1; for( ; *s2; s2++ ) if( letters[*s2 - 'a'] ) letters[*s2 - 'a'] = 2; for( ; *s3; s3++ ) letters[*s3 - 'a'] = 0; for( i=0; i<26; i++ ) if( letters[i] == 2 ) printf( "%c", i+'a' ); } void print_letters( char* s1, char* s2, char* s3 ) { int i, letters[26] = {0}; for( ; *s1; s1++ ) letters[*s1 - 'a'] = 1; for( ; *s2; s2++ ) if( letters[*s2 - 'a'] ) letters[*s2 - 'a'] = 2; for( ; *s3; s3++ ) letters[*s3 - 'a'] = 0; for( i=0; i<26; i++ ) if( letters[i] == 2 ) printf( "%c", i+'a' ); } 24

סדרת אבו - נאצ ' י היא כמו סדרת פיבונאצ ' י, רק ששני המספרים הראשונים אינם בהכרח 1. למרות זאת, הם חייבים להיות חד - ספרתיים. לדוגמא : 1, 9, 10, 19, 29, 48, … כתבו פונקציה המקבלת מחרוזת של ספרות, ומכריעה אם היא מהווה סדרת אבו - נאצ ' י. למשל, עבור " " - אמת עבור " " - שקר ניתן להניח שאיברי הסדרה נכנסים ב -unsigned. 25

" למשל, עבור " " - אמת עבור " " - שקר " נקרא את שני האיברים הראשונים ( אנחנו יודעים שהם ספרה בודדת ) בלולאה, נחשב את המספר הבא. אם המספר הזה לא נמצא במקום הנכון במחרוזת, נחזיר 0. אם הגענו לסוף המחרוזת בשלום, נחזיר 1. 26

int is_abunachi( char* str ) { unsigned prev = (str[0]-'0'), curr = (str[1]-'0'), next, next_digits; str += 2; while(*str) { next = prev+curr; prev = curr; curr = next; next_digits = count_digits(next); if( sub_str2int( str, next_digits ) == next ) str += next_digits; else return 0; } return 1; } int is_abunachi( char* str ) { unsigned prev = (str[0]-'0'), curr = (str[1]-'0'), next, next_digits; str += 2; while(*str) { next = prev+curr; prev = curr; curr = next; next_digits = count_digits(next); if( sub_str2int( str, next_digits ) == next ) str += next_digits; else return 0; } return 1; } כמה ספרות יש ב -next ? מה המספר הרשום בתת - המחרוזת המתחילה ב -str באורך next_digits ? 27

נגדיר משקל של אות בא " ב האנגלי כמספרה הסידורי של האות בא " ב (a = 1, b = 2,...). נגדיר משקל של מילה כסכום המשקלות של אותיותיה. "abc" = = 6 "abba" = = 6 "babble" = = 24 28

כתבו פונקציה calc_weight המקבלת מילה כמחרוזת ומחזירה את משקלה. הניחו שהמלה לא ריקה, ומכילה אותיות אנגליות קטנות בלבד. unsigned calc_weight( char* word ) { unsigned w = 0; for( ; *word; word++ ) w += (*word - 'a') + 1; return w; } unsigned calc_weight( char* word ) { unsigned w = 0; for( ; *word; word++ ) w += (*word - 'a') + 1; return w; } 29

כתבו פונקציה המקבלת מערך של מחרוזות ואת אורכו, ומחזירה מצביע למילה שמשקלה מירבי. ( אותן הנחות ) char* max_weight( char* words[], int n ) { unsigned w, max_w = 0; char* max_word = NULL; int i; for( i=0; i<n; i++ ) { w = calc_weight( words[i] ); if( w > max_w ) { max_w = w; max_word = words[i]; } return max_word; } char* max_weight( char* words[], int n ) { unsigned w, max_w = 0; char* max_word = NULL; int i; for( i=0; i<n; i++ ) { w = calc_weight( words[i] ); if( w > max_w ) { max_w = w; max_word = words[i]; } return max_word; } 30