SCE-Chapter-8-Strings פרק8 מחרוזות- Strings ד" ר שייקה בילו יועץ ומרצה בכיר למדעי המחשב וטכנולוגית מידע מומחה למערכות מידע חינוכיות, אקדמיות ומנהליותShayke Bilu PhD קורס יסודות התכנות בשפתC 1
SCE-Chapter-8-Strings
8פרק
Strings -מחרוזות
בילור שייקה "ד
יועץ ומרצה בכיר למדעי המחשב וטכנולוגית מידע
אקדמיות ומנהליות, מומחה למערכות מידע חינוכיות
Shayke Bilu PhD
Cקורס יסודות התכנות בשפת
1
אתחול מערכים בשורת ההגדרה -חזרה
SCE-Chapter-8-Strings
int Arr[5]={0,1,2,3,4};
בשורת ההגדרה אך ורקניתן לאתחל מערכים בצורה זו.
הערכים מוצבים בתאים לפי הסדר החל מהתא הראשון.
0שאר התאים מאותחלים לערך , אם אין מספיק ערכים.
int Arr[5]={1,2};
int Arr[5]={0};
הוא יהיה כמספר ערכי , אם לא נציין את מספר תאי המערך (:תאים 6בדוגמא הבאה יהיו לו )האתחול
int Arr[]={1,2,3,4,5,6};
Shayke Bilu PhD
2
SCE-Chapter-8-Strings
אחרי שורת ההגדרהמערכים -חזרה
אחרי הגדרת המערך אפשר רק להתייחס לכל תא בנפרד.
אחת-אפשר לשים ערכים בתאי המערך בבת-אי :
י "אחת את כל התאים ע-אפשר לאפס בבת-למשל איArr=0
י לולאה"צריך לעשות זאת ע:
for(i=0; i<SIZE; i++)
Arr[i]=0;
י פעולת השמה "לא ניתן להעתיק מערך למערך אחר עArr1=Arr2 זה מחייב שימוש בלולאה:
for(i=0; i<SIZE; i++)
Arr[i]=Bll[i];
וכו, קלט, הדפסה, כך גם לגבי פעולות השוואה'
3
Shayke Bilu PhD
3
SCE-Chapter-8-Strings
מגבולות המערךחריגה -חזרה
הוגדר גודל מערך :define SIZE 10#
מותר לגשת לכל תא במערך לפי כתובתו.
לגשת לתאים שנמצאים מחוץ למערך אסור.
גישה לתא שנמצא מחוץ למערך תגרום לבעיות:
בסבירות גבוהה התוכנית תקרוס.
או שהיא פשוט לא תעבוד כראוי.
למשל:
4
int arr[SIZE];
int i = 0;
for ( i=0; i <= SIZE; i++ )
{
arr[i] = i;
} arr[10] לא שייך למערך!
Shayke Bilu PhD
4
לב-תשומתנקודה -חזרה
גודל מערך יכול להיות קבוע שמוגדר ב- #define ( כי זה מספר
(.המוגדר גלובלית אינו יכול להשתנות במהלך הריצה
#define SIZE 10
int arr[SIZE]; או משתנה , בהגדרת מערך הגודל שלו חייב להיות מספר קבוע
.גלובלי ולא יכול להיות ערך של משתנה
למשל :
int arr[10]; //int arr[SIZE];
int my_size=10; ולא :
int arr[my_size];
5
SCE-Chapter-8-Strings Shayke Bilu PhD
5
דוגמא -מערכים -חזרה
#include <stdio.h>
#define SIZE 10
int main()
{
int i, num, digits[SIZE]={0};
printf(“Enter a positive integer:\n”);
scanf(“%d”, &num);
while (num!=0)
{
digits[num%10]++;
num=num/10;
}
for (i=0; i<SIZE; i++)
printf(“Digit %d appeared %d times\n”,i,digits[i]);
}
6
מספר שלם חיובי ומדפיסה כמה קולטת התוכנית
פעמים הופיעה בו כל סיפרה
במערך iבכתובת אותה מציין תא
מספר ההופעות יופיע מספר המייצג את
numבמספר iשל הספרה
SCE-Chapter-8-Strings
6
Shayke Bilu PhD
SCE-Chapter-8-Strings
מערך לפונקציה העברת -חזרה
נדגים פונקציה שמקבלת מערך של מספרים שלמים ומחזירה את
. סכום המספרים במערך
הקריאה לפונקציה:
sum = calc_sum(array);
כותרת הפונקציה:
int calc_sum(int array[ ]);
בכותרת הפונקציה] [ -אין צורך חובה לציין את גודל המערך בתוך ה.
אין צורך להעביר את גודל המערך במידה והוא הוגדר כמשתנה גלובלי.
מציין היות המשתנה מערך לוקאלי לפונקציה זו בלבד ] [ -סימון ה!!!
Shayke Bilu PhD
7
פונקציה שמסכמת מערך -חזרה
#include <stdio.h>
#define SIZE 10
int calc_sum(int arr[])
{
int i, sum = 0;
for(i=0; i<SIZE; i++)
sum=sum+arr[i];
return sum;
}
int main()
{
int input[SIZE], i;
for(i=0; i<SIZE; i++)
scanf("%d", &input[i]);
printf("The sum is %d\n", calc_sum(input, 10));
return 0;
}
8
קריאה לפונקציה
הסכוםפונקציית
קליטת המערך
, עוברים על תאי המערך בלולאה
מסכמים אותם לתוך משתנה סוכם
ומחזירים את הסכום כאשר בסיום
SCE-Chapter-8-Strings Shayke Bilu PhD
8
פונקציית סכום איברים -חזרה
int sumf(int arr[])
}
int sum=0,i;
for(i=0 ; i<SIZE ; ++i)
sum+=arr[i];
printf("The sum of array is : %d\n", sum);
{
9
SCE-Chapter-8-Strings Shayke Bilu PhD
9
משתנים קבועים לפונקציההעברת -חזרה
SCE-Chapter-8-Strings
אפשר להגדיר משתני קלט בפונקציה כקבועים(const .) כך נוכל להבטיח שלא נשנה בטעות את ערך המשתנה.
הכי שימושי כאשר אנו מעבירים מערך לפונקציה.
לא ניתן להעביר מערך שהוגדר כקבוע(const ) לפונקציה שבה הוא
.לא קבוע ועלול להשתנות
void print_array(const int array[])
{
int i = 0;
for( i=0; i<SIZE; i++ )
printf("%3d",array[i]);
printf("\n");
{
Shayke Bilu PhD
10
SCE-Chapter-8-Strings
void printArrayZogi(int a[ ][ COLUMN ])
{
int i, j;
for ( i = 0; i < ROW; i++ )
{
for ( j = 0; j < COLUMN; j++ )
if(a[i][j] % 2 == 0)
printf( "%4d", a[i][j]);
printf( "\n" );
}
}
פונקציה המקבלת מערך דו ממדי -חזרה
השורותמעבר על
איברי השורה הדפסת
הזוגיים בלבד
Shayke Bilu PhD
11
עמודותמעבר על
SCE-Chapter-8-Strings
#include <stdio.h>
#define ROW 3
#define COLUMN 4
void printArray(int [ ][ COLUMN ]);
int main()
{
int array1[ ROW ][ COLUMN ] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
printf( "Values in array1 by row are:\n" );
printArray( array1);
return 0;
}
תוכנית השולחת לפונקציה -חזרה
מערך דו ממדי המודפס בתוכה
Shayke Bilu PhD
12
SCE-Chapter-8-Strings
void printArray(int a[ ][ COLUMN ])
{
int i, j;
for ( i = 0; i < ROW; i++ )
{
for ( j = 0; j < COLUMN; j++ )
printf( "%4d", a[ i ][ j ] );
printf( "\n" );
}
}
תוכנית השולחת לפונקציה -חזרה
מערך דו ממדי המודפס בתוכה
Shayke Bilu PhD
13
(לינארי)חיפוש במערכים - 2תרגיל
. במקרה זה נתון מערך ממוין שנרצה לחפש בו איבר כלשהו
בכפוף המערך נתונים לאורך סודר קווי חיפוש הוא ליניארי חיפוש
.באינדקס שימוש י"ע לתנועה
5 8 9 12 15 17 20 21 24 27 29 31
15
, לינארי, י חיפוש רגיל"במערך ע 17במקרה זה נחפש את הערך
תוך כדי מעבר על כל איברי המערך מהאיבר הראשון לאחרון עד
למציאתו או לאי מציאתו במערך
SCE-Chapter-8-Strings Shayke Bilu PhD
15
Shayke Bilu PhD SCE-Chapter-8-Strings
פתרון חיפוש לינארי במערכים
#include <stdio.h>
#define SIZE 5
int linarySearch(int arr[], int item )
{
int i;
for(i=0;i<SIZE;i++)
{
if (arr[i] == item)
{
printf(“The item %d in place %d”,arr[i], i+1);
return 1;
}
}
return 0;
}
16
התוכנית הראשית
int main()
{
int arr[SIZE]={1,2,3,4,5},item=5,status=0;
status=linarySearch( arr,item);
if(status == 1)
printf(“Item is found in array!!!\n");
else
printf(“Item is not found in array!!!\n");
return 0;
}
17
SCE-Chapter-8-Strings Shayke Bilu PhD
17
(בינארי)חיפוש במערכים - 3תרגיל
. נתון מערך ממוין נרצה לחפש בו איבר כלשהו
חיפוש בינארי הוא חיפוש לאורך המערך תוך כדי חלוקתו לחצי
והגדרת תחום ימני ותחום שמאלי המשתנים לפי התקדמות
.החיפוש
5 8 9 12 15 17 20 21 24 27 29 31
18
כמות חלוקת י"ע המערך בתוך בינארי בחיפוש 24 את נחפש
אותו המספר בין היחס בדיקת כדי תוך לחצי פעם כל המערך איברי
.באמצע העומד במערך המספרי הערך לבין מחפשים
SCE-Chapter-8-Strings Shayke Bilu PhD
18
במערכיםחיפוש - 3תרגיל
5 8 9 12 15 17 20 21 23 24 29 31
19
לחצי חיפוש כל המערך חלוקת י"ע בינארי חיפוש 24 את נחפש
כל לאחר ,בו ימצא והוא יתכן בו בחצי פעם כל 24 הערך וחיפוש
.מציאתו לאי או הערך למציאת עד החיפוש גבולות משתנים חלוקה
SCE-Chapter-8-Strings Shayke Bilu PhD
19
Shayke Bilu PhD SCE-Chapter-8-Strings
#include <stdio.h>
#define SIZE 10
int binarySearch(int arr[ ], int item )
{
int lsize=0, rsize=SIZE-1, middle;
while ( lsize <= rsize )
{
middle = (rsize + lsize ) / 2;
if ( item == arr[ middle ] ) return 1;
if ( item < arr[ middle ] )
rsize = middle-1;
else
lsize = middle+1;
}
return 0; }
פתרון חיפוש בינארי במערכים 20
התוכנית הראשית
int main()
{
int arr[SIZE]={1,2,3,4,5,6,7,8,9,10};
int item=5, status=0;
status=binarySearch(arr,item);
if(status == 1)
printf(“Item is found in array!!!\n");
else
printf(“Item is not found in array!!!\n");
return 0;
}
21
SCE-Chapter-8-Strings Shayke Bilu PhD
21
נושאי הפרק מחרוזות
הגדרת מחרוזת.
אתחול מחרוזת וסימון סוף מחרוזת.
פלט של מחרוזות/קלט.
מחרוזותפעולות על.
מציאת אורך מחרוזת.
איתור תו במחרוזת.
פונקציות פנימיות על מחרוזות.
פונקציות פנימיות על תווים.
מערכים דו ממדיים ומחרוזות.
23
SCE-Chapter-8-Strings Shayke Bilu PhD
23
מחרוזות
למשל מילה או )מחרוזת היא רצף תווים בעל משמעות כלשהי
(. משפט
לשמירת מחרוזת בזיכרון נשתמש באופן טבעי במערך של תווים .
למשל:
char word[SIZE];
ולא רק , אחת-אבל בהרבה מקרים נתייחס אל מחרוזת בבת
(. תו-אחת ולא תו-למשל לקלוט מילה בבת)כמערך של תווים
יתכן )במקרים רבים אורך המחרוזת לא ידוע מראש , כן-כמו
(.שנקבל מהקלט מילה קצרה יותר מגודל המערך
ספריה שכבר נכתבו במיוחד לצורך -נכיר היום פקודות ופונקציות
.ומאפשרות להתגבר על הבעיות האלה, עבודה עם מחרוזות
24
SCE-Chapter-8-Strings Shayke Bilu PhD
24
אתחול –מחרוזות
יש דרך טבעית יותר לאתחל מערך שמייצג מחרוזת , לדוגמא
(:במקום לרשום את התווים מופרדים בפסיקים)
char message[ ]=“Hello dear C student”;
ולא בגרשיים , " "שימו לב שמשתמשים כאן בגרשיים כפולים
.כמו שעשינו עבור תו בודד' ' בודדים
י גרשיים כפולים"בהמשך נבחין שייצוג מחרוזת קבועה נעשה תמיד ע.
י השמתם בתוך גרשים "ייצוג תווים בודדים כחלק ממחרוזת יעשה ע' '.
לבין קליטת תו בין גרשים( בין גרשיים)זהו ההבדל בין קליטת מילה.
25
Shayke Bilu PhD SCE-Chapter-8-Strings
25
SCE-Chapter-8-Strings
'\0'התו המיוחד : סימון סוף המחרוזת
יש מוסכמה , בכל הפקודות והפעולות הקיימות לגבי מחרוזות
'\0'שלפיה בסוף תווי המחרוזת מופיע במערך התו
תו זה משמעותו סיום המחרוזת( ב 0מקום- ASCII)
הכנסת התו מאפשרת לבצע פעולות על מחרוזת בלי לדעת
.מראש את אורכה
יודעים שהמחרוזת הסתיימה \0ברגע שמגיעים לתו .
26
str[0] str[9]
. ‘H’ . . . ‘E’ ‘L’ ‘L’ ‘O’ ‘\0’
Shayke Bilu PhD
26
' \0'התו המיוחד : סימון סוף המחרוזת
כל הפעולות שנכיר על מחרוזות דואגות בעצמן לשמירת
.המוסכמה הזו של תו הסיום
למשל פעולת האתחול הזו:
char word[ ]=“HELLO”;
שקולה לפעולת האתחול הזו:
char word[ ]={‘H’,’E’,’L’,’L’,’O’,’\0’};
תווים 6דורשת מערך של 5מחרוזת באורך.
27
word[0]
‘H’ ‘E’ ‘L’ ‘L’ ‘O’ ‘\0’
word[5]
SCE-Chapter-8-Strings Shayke Bilu PhD
27
SCE-Chapter-8-Strings
' \0'הוספת תו הסיום
ורוצים להפעיל עליו , במידה וקיים ערך של תווים ללא תו סיוםאז צריך להוסיף את התו , (שנכיר בהמשך)פעולות על מחרוזות
.המחרוזת-אחרי תווי' \0'
למשל אם נבקש להשתמש בפעולות על מחרוזות עבור המערך:
char word[ ]={‘H’,’E’,’L’,’L’,’O’,’\0’};
אחרי האות ' \0'אז נצטרך להוסיף את התו'O' ידי השמה-על:
word[5]=‘\0’;
28
word[0]
‘H’ ‘E’ ‘L’ ‘L’ ‘O’ ‘\0’
word[5]
Shayke Bilu PhD
28
מציאת אורך מחרוזת: דוגמא
על בהסתמך ,שלה האורך את ומחזירה מחרוזת מקבלת הבאה הפונקציה .המחרוזת בסוף '\0' תו שיש כך
int my_strlen(char str[ ]) { int cnt=0,i=0; while (str[i ++] != '0\' ) cnt++; return cnt; }
המשתנה i המשתנה ,הלולאה זקיף והוא 0 בערך מאותחל cnt מאותחל '\0' -ל שווה במחרוזת התו כאשר ,שבמילה התווים מונה והוא 0 -ב
.הלולאה גם וכך הסתיימה שהמחרוזת סימןשל ערכו את הראשית לתוכנית מחזירה הפונקציה cnt מספר שהוא
.במחרוזת התווים
29
SCE-Chapter-8-Strings
29
Shayke Bilu PhD
SCE-Chapter-8-Strings
הגדרת מחרוזת•
גבול מחרוזת•
אתחול מחרוזת•
' \0'סיום תו •
מציאת אורך מחרוזת•
מחרוזות -סיכום ביניים
Shayke Bilu PhD
30
SCE-Chapter-8-Strings
פלט של מחרוזות תו אחרי תו /קלט
בעזרת ,זה-אחר-בזה המחרוזת תווי את ולהדפיס לקלוט ניתן :c% -ב השימוש על להקפיד יש כאשר הפונקציות
scanf( ) , printf( )
באמצעות מחרוזת תווי של והדפסה קליטה לבצע גם ניתן לולאה מחייבות הן אך בודד תו הקולטות הבאות הפונקציות
:מתמשך לביצוע
getchar( ), putchar ) (
לכל תווים 200 באורך מחרוזת הקולטת תוכנית תוצג הבא בשקף .שורה-ירידת נקלטת אם ומפסיקה תו אחרי תו ,היותר
ל יש לזמן את ספריית ה"לשם השימוש בפונקציות הנ- string.h
32
Shayke Bilu PhD
32
SCE-Chapter-8-Strings
קלט של מחרוזות תו אחרי תו
#include <stdio.h>
#define SIZE 201
int main()
{
char sentence[SIZE], tav;
int i=0;
do {
scanf(“%c”, &tav);//tav=getchar();
if (tav != ‘\n’)
{
sentence[ i ] = tav;
i++;
}
} while (tav != ‘\n’) ;
33
שורה אז יש להוסיף -תו ירידתלא זה אם
ומקדמים את במחרוזתלמקום הבא אותו
הזקיף
התנאי להמשך הקלט
תו במסגרת הלולאהקולטים
ומשתנה לקליטת התותווים 200 -הגדרת גודל מערך
Shayke Bilu PhD
33
פלט של מחרוזות תו אחרי תו
sentence[ i ]=‘\0’;
i=0;
do
{
printf)“%c”, sentence[ i ] );
i++;
} while ( sentence[ i ] != ‘\0’) ;
return 0;
}
34
איפוס הזקיף לסימון התחלת המחרוזת
הדפסת התו במסך
קידום הזקיף לכתובת התא הבא במחרוזת
בדיקת אי קיום סוף מחרוזת להמשך ההדפסה
SCE-Chapter-8-Strings
34
סימון סיום המחרוזת
Shayke Bilu PhD
פלט של מחרוזת שלמה/קלט
בפונקציות שימוש ידי על אחת-בבת מחרוזות ולהדפיס לקלוט גם אפשר .”s%“ הקידוד באמצעות scanf(), printf )( :פלט הקלט
למשל:
char answer[SIZE];
scanf(“%s”, answer);
מילים לקליטת הדרך זו ,שורה-ירידת או רווח עד רק יהיה הקלט .משפטים ולא בלבד
ה י"ע אוטומטית מוכנס '\0' התו- )(scanf המחרוזת תווי אחרי .Enter -ה מקש על ההקלדה י"ע
ב & הסימן את רושמים שלא לב שימו- scanf מחרוזת של לכתובת מצביע הוא המערך שם כי & לרשום צורך אין .שלמה
.כולה המחרוזת של הראשון התו
35
SCE-Chapter-8-Strings
35
Shayke Bilu PhD
תווים' הגבלת מס –קלט של מחרוזת שלמה
התוכנית ,למערך שהגדרנו מהגודל יותר ארוכה מחרוזת כשתוכנס
.שהוגדר כפי המערך לגבול מעבר גלישה תהיה כי ,"לעוף" צפויה
לכן ,הסיום תו עבור נוסף אחד מקום להשאיר צריך כי לזכור יש
.בלבד רווח תו עד מחרוזת תקלוט scanf ( )הפונקציה
זאת להגדיר ניתן שיקלטו התווים מספר את להגביל ורוצים במידה
.scanf( ) -ב
למשל: scanf(“%40s”, answer);
ולקלוט לולאה לבצע היא הנקלטים התווים מספר להגבלת נוספת דרך
נקלט כאשר רק אלא לרווח כשמגיעים נפסק לא הקלט ,תו אחרי תו
."\n" השורה ירידת סימן
36
Shayke Bilu PhD SCE-Chapter-8-Strings
36
פלט של מחרוזת שלמה
המחרוזת תווי את תדפיס הבאה הפקודה answer 0' לתו עד\'.
printf(“%s”, answer)
HELLO
אז ,המחרוזת בסוף '\0' תו אין בטעות אם printf את גם תדפיס
.'\0' לתו במקרה שיגיע עד ,בזיכרון המחרוזת אחרי שיש מה
דיגיטלי זבל" -תווים של רצף המחרוזת אחרי יודפס בפועל".
למשל:
HELLO╠╠╠╠╠Z╠╠▲¢F╢+╪■$▲@#&^!
37
SCE-Chapter-8-Strings
37
Shayke Bilu PhD
38
אפשרות לקלט מחרוזות בשלמות
רווח כולל תווים מחרוזת שקולטת למחרוזות נוספת קלט פקודת:
gets(str);
כמו בדיוק פועלת הפונקציה scnaf(“%s”,str) , קולטת כלומר
.במחרוזת רווח תווי כולל מהמסך שלמה מחרוזת
מכך הנגזרת והנוחות יותר הקצרה הכתיבה ,המהירות - היתרון.
במידה ,הקלט מחרוזת אורך את להגביל ניתן לא - החיסרון
ניתן ."תעוף" התוכנית מידי ארוכה מחרוזת יכניס והמשתמש
.בלבד אחת מחרוזת רק לקלוט
38
SCE-Chapter-8-Strings Shayke Bilu PhD
39
אפשרות לפלט מחרוזות בשלמות
שורה וירידת הדפסה המבצעת תואמת פלט פקודת:
puts(str);
כמו בדיוק פועלת הפונקציה printf(“%s\n”,str), מדפיסה כלומר
.שורה ירידת מבצעת ולאחריה שלמה מחרוזת
מכך הנגזרת והנוחות יותר הקצרה הכתיבה ,המהירות - היתרון.
להציג ניתן לא .הפלט מחרוזת אורך את להגביל ניתן לא - החיסרון
להדפיס ניתן .אחת רק אלא נוספת טקסט מחרוזת גם פקודה באותה
.בלבד אחת מחרוזת רק
39
SCE-Chapter-8-Strings Shayke Bilu PhD
40
תו בלולאה-קלט תו •
שלמהקלט של מחרוזת •
קביעת אורך מחרוזת נקלטת•
קלט פלט מחרוזות באמצעות •
שימוש בפונקציות
של מחרוזותפלט /סיכום ביניים קלט
SCE-Chapter-8-Strings
40
Shayke Bilu PhD
פעולות על מחרוזות
שלמה מחרוזת על והשמה השוואה פעולות לבצע ניתן לא:
string1==string2
string1=string2
string1>=string2
המכיל מצביע הוא המחרוזת שם ,במערכים שכמו היא לכך הסיבה על יבוצעו אלה פעולות גם לכן ,בזיכרון שלה הכתובת את
.המחרוזת תוכן על ולא הכתובות
42
SCE-Chapter-8-Strings
42
Shayke Bilu PhD
פעולות על מחרוזות
לביצוע פעולות על מחרוזת שלמה יש צורך להשתמש בפונקציות string.h: הנמצאות בספריה
העתקת , הספריה כוללת פונקציות המשמשות להשוואת מחרוזות ....ועוד, "(שרשור)"הוספת מחרוזת למחרוזת אחרת , מחרוזות
יש לזכור כי כל מחרוזת היא מערך רגיל ההבדל הוא שהוא מערךולכן ניתן להפעיל על המחרוזת את אוסף הפונקציות charמטיפוס
.הספציפיות עבורה
נחלקות לשלושה סוגים עיקריים המחרזותיותהפונקציות :
כאלה המבצעות בדיקה ומחזירות תשובה של אמת או שקר קיים או לא 1. .קיים
.וכדומה 0או 1-או 1כאלה המחזירות תשובה מספרית קבועה כגון ערך או 2.
.כאלה המבצעות פעולה ומשנות בפועל את תוכן המחרוזת3.
43
SCE-Chapter-8-Strings
43
Shayke Bilu PhD
SCE-Chapter-8-Strings
פונקציות לדוגמא – string.hהספריה
:פונקציה המבצעת מציאת אורך מחרוזת
int strlen(char str[ ]); ' \0'האורך לא כולל את התו
ביצוע הפונקציה :strlen(str);
כלומר את מספר התווים , הפונקציה מחזירה את אורך המחרוזת .'\0' -במחרוזת עד תו ה
השימוש מתבצע כך:
len = strlen(my_string);
אל המשתנהlen יוחזר אורך המחרוזתmy_string
44
Shayke Bilu PhD
44
SCE-Chapter-8-Strings
פונקציות לדוגמא – string.hהספריה
פונקציה המבצעת השוואה בין מחרוזות:
int strcmp(char str1[ ], char str2[ ]);
ביצוע הפונקציה :result = strcmp(str1,str2);
הפונקציה בודקת את תווי שתי המחרוזות באופן מקביל אחת מולכלומר שוות , רק אם המחרוזות זהות 0השנייה ומחזירה את הערך
: 0-שונה מ' אחרת היא מחזירה מס ,'\0'לתו בכל תו עד
אם המחרוזת הראשונה גדולה יותר לפי ( 1)חיובי- ASCII .
לפי יותר קטנה המחרוזת הראשונה אם ( -1)שלילי- ASCII .
45
Shayke Bilu PhD
45
SCE-Chapter-8-Strings
?מה עושה התוכנית הבאה: דוגמא
#include <stdio.h>
#include <string.h>
#define SIZE 7
int main()
}
int Obama_votes = 0 , Romney_votes=0;
char vote[SIZE];
while(1)
}
printf(“Please enter your vote:)Obama or Romney)\n");
printf(“Enter Stop for exit program\n");
scanf("%s", vote);
46
Shayke Bilu PhD
46
?מה עושה התוכנית הבאה: דוגמא
if (strcmp(vote, "Obama")==0)
Obama_votes++;
else
if (strcmp(vote, "Romney")==0)
Romney_votes++;
else
if (strcmp(vote, "Stop")==0)
break;
else
printf("Wrong vote !!!\n");
{
printf("Obama received %d votes and Romney received %d
votes\n",Obama_votes, Romney_votes);
{
47
של בחירות קולטת התוכנית
ההצבעות את ומונה בוחרים
.ורומני לאובמה
מבקשים הקלדה טעות ויש במידה
.חדש קלט
stop המילה שנקלטת עד זה כל
.הקליטה את ועוצרת
התוצאות מודפסות העצירה אחרי
.הבחירות של
Shayke Bilu PhD
47
SCE-Chapter-8-Strings
atoi(str) –הפונקציה
פונקציה המבצעת הפיכה של מחרוזת למספר שלם:
הגדרה במחשב:
#include <stdlib.h>
int atoi(const char *str );
הפונקציה מקבלת משתנה מטיפוס תוויchar ומחזירה ערך שלםint אז נעצרת פעולתה, עד זיהוי תו.
int i;
i = atoi("512.035");
printf(“i=%d”,i);
512: על המסך נקבל את התוצאה
48
SCE-Chapter-8-Strings
48
Shayke Bilu PhD
atoi(str) –שימוש בפונקציה
הפונקציה המבצעת הפיכה של תו למספר שלם:
הגדרת הפונקציה במחשב: int atoi(const char &str[i]); הפונקציה .iהחל מהכתובת של intומחזירה ערך שלם charמקבלת משתנה תווי
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 81
void main()
{
int num, i=6;
char str[SIZE] = {"Shizaf218/2"};
num = atoi(&str[i]);
printf("Num = %d\n", num);
}
49
SCE-Chapter-8-Strings
49
Shayke Bilu PhD
Num = 218: את הפלט על המסך נקבל
atoi(str) –דוגמה לשימוש בפונקציה 50
Shayke Bilu PhD SCE-Chapter-8-Strings
50
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
}
char str1[]={'1','6','.','7','$','\0'};
char str2[]={“91.8FM”};
int mispar1,mispar2;
mispar1 = atoi(&str1[1]);
puts(str1);
printf("Mispar1=%d\n",mispar1);
mispar2 = atoi(str2);
puts(str2);
printf("Mispar2=%d\n",mispar2);
}
פונקציות לדוגמא – string.hהספריה
פונקציה המבצעת הפיכה של תווי המחרוזת לאותיות גדולות:
void strupr(char str[ ]);
ביצוע הפונקציה :strupr(str); יגרום לכך שבתוך המחרוזתstr .כל האותיות יהפכו לאותיות גדולות
במידה ובמחרוזת : לדוגמהstr קיים המשפט :"shalom friend "נקבל בתוך הפונקציה את strupr(str)לאחר ביצוע הפונקציה
"SHALOM FRIEND": המחרוזת
51
Shayke Bilu PhD
51
SCE-Chapter-8-Strings
פונקציות לדוגמא – string.hהספריה
פונקציה המבצעת הפיכה של תווי המחרוזת לאותיות קטנות:
void strlwr(char str[ ]);
ביצוע הפונקציה :strlwr(str); יגרום לכך שבתוך המחרוזתstr כל האותיות יהפכו לאותיות גדולות.
במידה ובמחרוזת : לדוגמהstr קיים המשפט:
"SHALOM FRIEND"
לאחר ביצוע הפונקציהstrlwr(str) נקבל בתוך הפונקציה את " shalom friend"המחרוזת
52
Shayke Bilu PhD
52
SCE-Chapter-8-Strings
פונקציות לדוגמא – string.hהספריה
פונקציה המבצעת הפיכה שכפול של המחרוזת:
char strdup(char str[ ]);
ביצוע הפונקציה :strdup(str); יגרום לכך שהכתובת של המחרוזתstr תועבר למשתנה המקבל את הפונקציה.
במידה ובמחרוזת : לדוגמהstr קיימת המילה"SHALOM"
לאחר ביצוע הפקודה ;p=strdup(str)*: ונבצע את הפקודה הבאה
"SHALOM"נקבל את p*במידה ונרצה להדפיס את תוכן המצביע
.p*הנמצאת עכשיו גם בתוך המצביע strשהוא התוכן של המחרוזת
53
Shayke Bilu PhD
53
SCE-Chapter-8-Strings
פונקציות לדוגמא – string.hהספריה
#include <stdio.h>
#include <string.h>
void main()
{
char *str = "This is a copy"; char *nstr;
// Make nstr point to a duplicate of string
nstr = strdup(str);
printf("The new string is: %s in %p\n", nstr,&nstr);
printf("The old string is: %s in %p\n", str,&str);
// Make nstr lower chars
nstr = strlwr(nstr);
printf("The new string is: %s\n", nstr);
// Make nstr uper chars
nstr = strupr(nstr);
printf("The new string is: %s\n", nstr);
}
54
Shayke Bilu PhD
54
SCE-Chapter-8-Strings
פונקציות לדוגמא – string.hהספריה
:על המסך נקבל את התצוגה הבאה
55
Shayke Bilu PhD
55
SCE-Chapter-8-Strings
The new string is: This is a copy in 0031F8A4
The old string is: This is a copy in 0031F8B0
The new string is: this is a copy
The new string is: THIS IS A COPY
פונקציות לדוגמא – string.hהספריה
המבצעת העתקת מחרוזת למחרוזת אחרתפונקציה:
void strcpy(char str1 [ ], char str2[ ]);
ביצוע הפונקציהstrcpy(str1,str2); יגרום לכך שלתוך המחרוזתstr1 יועתק תוכן המחרוזתstr2 .
במידה ובתוך המחרוזתstr1 היו תווים הם נדרסים.
במידה ובמחרוזת : לדוגמהstr1 קיימת המילה""shalom לאחר ביצוע הפונקציה " friend"קיימת המילה str2ובמחרוזת
:בשתי המחרוזות המילים תהינה זהות בתוכנן
"friend"
56
Shayke Bilu PhD
56
SCE-Chapter-8-Strings
פונקציות לדוגמא – string.hהספריה
מחרוזות אחת אחרי השנייההמבצעת שרשור פונקציה:
void strcat(char str1[ ], char str2[ ]);
הפונקציה ביצוע strcat(str1,str2); המחרוזת שבתוך לכך יגרום str1 המחרוזת תוכן יופיע str2 של התוכן לאחר ומיד בצמוד str1.
ובמחרוזת במידה :לדוגמה str1 המשפט קיים: ""shalom dear פונקציית ביצוע לאחר "friend" המילה קיימת str2 ובמחרוזת :המשפט את תכיל str1 המחרוזתstr1 אל השרשור
"shalom dear friend”
57
Shayke Bilu PhD
57
SCE-Chapter-8-Strings
פונקציות לדוגמא – string.hהספריה
פונקציה המבצעת הפיכה של מחרוזת מהסוף להתחלה:
void strrev(char str[ ]);
ביצוע הפונקציה :strrev(str); יגרום לכך שבתוך המחרוזתstr סדר התווים יתהפך מהסוף להתחלה.
במידה ובמחרוזת : לדוגמהstr קיים המשפט:
"The string reverse"
לאחר ביצוע הפונקציהstrrev(str) נקבל בתוך המחרוזת את :המשפט הפוך
"esrever gnirts ehT"
58
Shayke Bilu PhD
58
SCE-Chapter-8-Strings
פונקציות לדוגמא – string.hהספריה
#include <stdio.h>
#include <string.h>
#define SIZE 81
void main()
}
char str1[SIZE],str2[SIZE],str3[SIZE];
printf("Enter str1:\n");
gets(str1); strrev(str1);
printf("Str1:%s\n",str1);
printf("Enter str2:\n");
gets(str2); strcpy(str1,str2);
printf("Str1:%s, Str2:%s\n",str1,str2);
printf("Enter str3:\n");
gets(str3); strcat(str2,str3);
printf("Str2:%s, Str3:%s\n",str2,str3);
}
59
Shayke Bilu PhD
59
SCE-Chapter-8-Strings
SCE-Chapter-8-Strings
במחרוזת תו של הראשונה ההופעה של חיפוש המבצעת פונקציה :התו של הראשון מהמופע החל המחרוזת שאר את ומציגה
char strchr(char str[ ], char ch);
הפונקציה ביצוע strchr(str,ch); של חיפוש שיבוצע לכך יגרום הפונקציה מופיע והוא במידה str. במחרוזת chשבמשתנה התו
.התו כולל התו הופיע בו מהמקום המחרוזת המשך את תציג .שלה התצוגה רק אלא משתנה לא המקורית המחרוזת
ובמחרוזת במידה :לדוגמה str המשפט קיים:
"shalom dear friend"
:המחרוזת תוחזר הפונקציה ביצוע לאחר ’d‘ התו קיים ch ובמשתנה
"dear friend"
61
Shayke Bilu PhD
61
מחרוזתיותפונקציות - string.hהספריה
SCE-Chapter-8-Strings
פונקציה המבצעת חיפוש של המופע האחרון של תו במחרוזת :ומציגה את שאר המחרוזת מהמופע הראשון של התו
char strrchr(char str[ ], char ch);
ביצוע הפונקציהstrrchr(str,ch); שיבוצע חיפוש של יגרום לכךבמידה והוא מופיע תוצג str.במחרוזת chהתו שבמשתנה
.המחרוזת החל מהמקום האחרון בו מופיע התו הראשון כולל התו
.המקורית לא משתנה אלא רק התצוגה שלההמחרוזת
ובמחרוזת במידה :לדוגמה str המשפט קיים:
"shalom dear friend"
:המחרוזת תוחזר הפונקציה ביצוע לאחר ’ ‘ התו קיים ch ובמשתנה
"friend"
62
Shayke Bilu PhD
62
מחרוזתיותפונקציות - string.hהספריה
SCE-Chapter-8-Strings
פונקציה המבצעת חיפוש ההופעה הראשונה של מחרוזת בתוךמחרוזת אחרת ומציגה את שאר המחרוזת מהמופע הראשון של
:המחרוזת שנמצאה
char strstr(char str[ ], char find[ ]);
ביצוע הפונקציהstrstr(str,find); יגרום לכך שיבוצע חיפוש שלוהיא מופיעה במידה str.במחרוזת findהמחרוזת שבמשתנה
.findמופיעה המחרוזת בו החל מהמקום strתציג את הפונקציה
במידה ובמחרוזת : לדוגמהstr המשפט םקיי:
"shalom dear friend"
ובמשתנהfind קיימת המחרוזת"dear " לאחר ביצוע הפונקציה :תוחזר המחרוזת
"dear friend"
63
Shayke Bilu PhD
63
מחרוזתיותפונקציות - string.hהספריה
SCE-Chapter-8-Strings
מסוף מחרוזת של הראשונה ההופעה של חיפוש המבצעת פונקציה הראשון המופע נמצא בו מהמקום ומקצצת המחרוזת
char strtok(char str[ ], char find[ ]);
הפונקציה ביצוע strtok(str,find); של חיפוש שיבוצע לכך יגרום והיא במידה str. המחרוזת בתוך findבמשתנה הנמצאת המחרוזת
מופיע בו המקום ועד מהסוף המחרוזת את תחזיר הפונקציה מופיעה .find המחרוזת של הראשון התו
ובמחרוזת במידה :לדוגמה str המשפט קיים:
"shalom dear friend"
ובמשתנה find המחרוזת קיימת ""lom הפונקציה ביצוע לאחר ”sha“ :המחרוזת תוחזר
64
Shayke Bilu PhD
64
מחרוזתיותפונקציות - string.hהספריה
SCE-Chapter-8-Strings
המדגימה שימוש בפונקציות תוכנית65
Shayke Bilu PhD
65
#include <stdio.h>
#include <string.h>
#define SIZE 81
void main()
{
char str1[SIZE]={"Shalom on you "};
char str2[SIZE]={"Shalom on ISRAEL "};
printf("String str1 as: %d chars\n", strlen(str1));
printf("String str2 as: %d chars\n", strlen(str2));
SCE-Chapter-8-Strings
המדגימה שימוש בפונקציות תוכנית66
Shayke Bilu PhD
66
printf("String status is: %d\n", strcmp(str1,str2));
printf(“New cat String is: %s\n", strcat(str1,str2));
printf("str1 after cat as: %d chars\n", strlen(str1));
printf("New string is: %s\n", strchr(str1,'o'));
printf("New string is: %s\n", strchr(str2,‘Z'));
printf("New string is: %s\n", strrchr(str2,‘m'));
printf("New string is: %s\n", strstr(str1,"al"));
printf("New string is: %s\n", strstr(str2,"IS"));
SCE-Chapter-8-Strings
המדגימה שימוש בפונקציות תוכנית67
Shayke Bilu PhD
67
printf("Old str1 string is: \n", puts(str1));
printf("New string is: %s\n", strcpy(str1,str2));
printf("New str1 string is: \n”);
puts(str1);
printf("New str2 string is: \n”);
puts(str2);
puts(strrev(str1));
puts(strtok(str1,"on"));
}
פונקציית השוואה המחזירה תשובות כמוstrcmp:
int strcoll (char str1[ ], char str2[ ])
ביצוע הפונקציה :strcoll(str1,str2);
כלומר שוות בכל תו עד , אם המחרוזות זהות 0הפונקציה מחזירה
אם המחרוזת ( 1)חיובי :0-שונה מ' אחרת מוחזר מס, ' \0'לתו
סדר , לפי סדר מילוניכלומר –לקסיקוגרפית , יותר הראשונה גדולה
. יותרקטנה אם היא ( -1)ושלילי , ASCIIהמופיע בטבלת
68
Shayke Bilu PhD
68
SCE-Chapter-8-Strings
מחרוזתיותפונקציות - string.hהספריה
בכמות מוגבלת רק לראשונה שניה מחרוזת המעתיקה פונקציה
:num המשתנה י"ע הנקבעת להעתקה תאים
char strncpy(char str1[ ],char str2[ ],int num)
הפונקציה ביצוע: strncpy (str1,str2,num); שלתוך לכך יגרום
ובתוך במידה .str2 מהמחרוזת תווים num יועתקו str1 המחרוזת
.נדרסים הם תווים היו tar1 המחרוזתובמחרוזת במידה :לדוגמה str1 המשפט קיים:
" shalom dear friend " קיים num ובמשתנה "Fm is fine" המילה קיימת str2 ובמחרוזת
:המחרוזת את תכיל str1 המחרוזת הפונקציה ביצוע לאחר ,3 המספר" Fm lom dear friend "
.
69
Shayke Bilu PhD
69
SCE-Chapter-8-Strings
מחרוזתיותפונקציות - string.hהספריה
מסוים בתו מחרוזת מילוי המבצעת פונקציה:
char strset(char str[],char ch);
הפונקציה ביצוע: strset(str,ch); שהמחרוזת לכך יגרום str
.ch במשתנה שנמצא בתו תתמלא
ובמחרוזת במידה :לדוגמה str המשפט קיים:
"shalom dear friend"
str המחרוזת הפונקציה ביצוע לאחר ‘@‘ התו קיים ch ובמשתנה :הבאים התווים את תכיל
“@@@@@@@@@@@@@@@@@@”
70
מחרוזתיותפונקציות - string.hהספריה
Shayke Bilu PhD
70
SCE-Chapter-8-Strings
מסוים בתו מחרוזת מילוי המבצעת פונקציה n פעמים:
char strnset(char str[],char ch,int num);
הפונקציה ביצוע: strnset(str,ch,num); שהמחרוזת לכך יגרום
str במשתנה שנמצא בתו תתמלא chבמשתנה שיש בכמות num.
ובמחרוזת במידה :לדוגמה str המשפט קיים:
"shalom dear friend"
לאחר , 3 המספר קיים num ובמשתנה‘@‘ התו קיים ch ובמשתנה :הבאים התווים את תכיל str1 המחרוזת הפונקציה ביצוע
“@@@lom dear friend"
71
מחרוזתיותפונקציות - string.hהספריה
Shayke Bilu PhD
71
SCE-Chapter-8-Strings
שרשור המבצעת פונקציה n מ תווים-str2 בסיום str1:
char strncat(char str1[],char str2[],int num)
הפונקציה ביצוע: strncat(str1,str2,num); לכך יגרום
במשתנה שיש בכמות תווים ישורשרו 2str המחרוזת שמתוך
num המחרוזת בסוף str1.
1 ובמחרוזת במידה :לדוגמהstr המשפט קיים:
"shalom dear "
,3 קיים num ובמשתנה"friend" המילה קיימת str2 ובמחרוזת :המחרוזת את תכיל str1 המחרוזת הפונקציה ביצוע לאחר
"shalom dear fri"
72
מחרוזתיותפונקציות - string.hהספריה
Shayke Bilu PhD
72
SCE-Chapter-8-Strings
SCE-Chapter-8-Strings
המדגימה שימוש בפונקציות תוכנית
#include <stdio.h>
#include <string.h>
#define SIZE 81
void main()
{
char str1[SIZE]={“Shalom”};
char str2[SIZE]={“Shlomit”};
char ch='@', ch1='$';
int num=4;
74
Shayke Bilu PhD
74
SCE-Chapter-8-Strings
המדגימה שימוש בפונקציות תוכנית
printf(“String status is: %d\n”, strcoll (str1, str2));
printf(“New string is: %s\n”, strset(str1,ch));
printf(“New string is: %s\n”, strnset(str1,ch1,num));
printf(“New string is: %s\n”, strncat(str1,str2,num));
{
75
Shayke Bilu PhD
75
: לב-נקודה לתשומת
גרשיים -מחרוזת , גרש -תו בודד
כדי להתייחס לתו מסוים רושמים אותו בין גרש מימין לגרש
’a‘: למשל, משמאל
למשל, כדי להתייחס למחרוזת רושמים בתוך גרשיים כפולים :
“HELLO”
אם רושמים“a” המשמעות היא מחרוזת שיש בה את התו‘a’
.’a‘כלומר זה שונה מאשר לרשום . ’0\‘ואחריו את התו
משתמשים בפונקציות פנימיות, כשעושים פעולות על מחרוזות ,
: למשל, יש להקפיד על רישום גרשיים כפולים
strcmp(input,”a”)
ולא:
strcmp(input,’a’)
76
SCE-Chapter-8-Strings Shayke Bilu PhD
76
פונקציות על תווים ctype.h הספריה
הספריהctype.h שימושית מאד כאשר מטפלים בתווים בודדים .אם הבדיקה 0מחזירות מספר שאינו כל הפונקציות בספריה זו
.שלהן מחזירה אמת כלומר התשובה לבדיקה חיובית
בכל מקום בו נרשםch ניתן לרשום גם תו מתוך מחרוזת :str[i] .charהוגדר כמערך מחרוזתי strבמידה כמובן שהמשתנה
בכחול כל הפונקציות נכתבות בתוכנית ללא הטיפוסים!!!
אות קטנההבודקת האם במשתנה תווי יש הגדרת פונקציה:
int islower(char ch);
אות גדולההבודקת האם במשתנה תווי יש הגדרת פונקציה:
int isupper(char ch);
77
Shayke Bilu PhD
77
SCE-Chapter-8-Strings
פונקציות על תווים ctype.h הספריה
סיפרההגדרת פונקציה הבודקת האם במשתנה תווי יש:
int isdigit(char ch);
אלפא נומריהבודקת האם במשתנה תווי יש ערך הגדרת פונקציה:
int isalnum(char ch);
אלפא בתיהבודקת האם במשתנה תווי יש ערך הגדרת פונקציה:
int isalpha(char ch);
רווחהבודקת האם במשתנה תווי יש הגדרת פונקציה :
int isspace(char ch);
78
Shayke Bilu PhD
78
SCE-Chapter-8-Strings
מבצעותהפונקציות הבאות למשל:
הפיכת אות גדולה לקטנה char tolower(char ch);
הפיכת אות קטנה לגדולהchar toupper(char ch);
אםtolower וכך , לא מקבלת אות גדולה אז היא לא משנה אותה
.לא מקבלת אות קטנה toupperגם אם
שולפים מתוך המחרוזת , זה שימושי כאשר שעובדים עם מחרוזות
.תו ורוצים לבדוק להפוך אותו לאות גדולה או קטנה לפי הצורך
79
Shayke Bilu PhD
79
SCE-Chapter-8-Strings
פונקציות על תווים ctype.h הספריה
Shayke Bilu PhD
80
תרגיל כיתה
:הבאות המשימות את ומבצעת המגדירה תוכנית כתוב .1
לתוכו קלוט .char מטיפוס 30 בגודל מחרוזתי מערך תגדיר•
.שונים ותווים ספרות ,וגדולות קטנות אותיות הכוללת מחרוזת
.שנקלטה המקורית המחרוזת אורך מה ותציג תמצא•
.גיבוי למחרוזת המחרוזת את תעתיק•
גדולות אותיות כמה תמצא ,במחרוזת קטנות אותיות כמה תמצא•
.שונים תווים וכמה במחרוזת ספרות כמה תמצא ,המחרוזת
האותיות כל ואת לגדולות הקטנות האותיות כל את תחליף•
.לקטנות הגדולות
.והגיבוי המקורית ,המחרוזות שתי את תציג•
SCE-Chapter-8-Strings
Shayke Bilu PhD
81
תרגילי כיתה
:הבאות המשימות את ומבצעת המגדירה תוכנית כתוב .2
.char מטיפוס 10 בגודל מחרוזתי מערך תגדיר•
.מחרוזתי למערך תווים 10 לקליטת פונקציה ותפעיל תגדיר•
הם במחרוזת התווים כל כי הבודקת פונקציה ותפעיל תגדיר•
הפונקציות לשתי נמשיך חיובית התשובה אם רק ,אותיות
.הבאות
טבלת פי על) ביותר הגדול התו למציאת פונקציה ותפעיל תגדיר•
.הראשית לתוכנית ערכו ולהחזרת במערך (האסקי
טבלת פי על) ביותר הקטן התו למציאת פונקציה ותפעיל תגדיר•
.הראשית לתוכנית ערכו ולהחזרת במערך (האסקי
SCE-Chapter-8-Strings
Shayke Bilu PhD
82
תרגילי כיתה
:הבאות המשימות את המבצעת תוכנית כתוב .3
.char מטיפוס 10 בגודל מחרוזתיים מערכים שלושה תגדיר•
.הראשון למערך תווים 10 לקליטת פונקציה ותפעיל תגדיר•
אותיות שהם התווים כל למציאת פונקציה ותפעיל תגדיר•
.השני למערך אותם ותעתיק הראשון במערך גדולות
אותיות שהם התווים כל למציאת פונקציה ותפעיל תגדיר•
.השלישי למערך אותם ותעתיק הראשון במערך קטנות
לאחר המערכים שלושת את המדפיסה פונקציה ותפעיל תגדיר•
.הקודמות הפונקציות בשתי שנעשו השינויים
SCE-Chapter-8-Strings
Shayke Bilu PhD
83
תרגילי כיתה
,מהמשתמש תווים של מחרוזת קולטת אשר תוכנית כתוב .4
,נוספת עזר במחרוזת שימוש ללא ,להתחלה מהסוף ,אותה והופכת
.()strrev ללא כלומר
מהתו יתחיל האחד .בלולאה אינדקסים בשני להשתמש יש :רמז
שבתא נזכור) .האחרון מהתו יתחיל והשני ,במחרוזת הראשון
.('\0' יש האחרון
.קלט ממחרוזת רווחים למחוק שתפקידה תוכנית לכתוב יש .5
לא וכן במידה ,רווח הוא האם תו קליטת לאחר תבדוק התוכנית
ניתן .במערך תשבצו מרווח שונה והוא במידה במערך אותו תשבץ
.בלבד תווים 15 הוא המחרוזת אורך כי להניח
SCE-Chapter-8-Strings
Shayke Bilu PhD
84
תרגילי כיתה
:בשם פונקציה ומפעילה המגדירה תוכנית כתוב .6
strlen_without_ch ,את ובודקת עוברת ,תווים מחרוזת המקבלת
התווים מספר את ותדפיס תספור הפונקציה ,המחרוזת תווים
.’F‘ או 'f' האות שאינם במחרוזת
:בשם פונקציה ומפעילה המגדירה תוכנית כתוב .7
strcpy_without_ch ,העתקה ,לשנייה אחת מחרוזת המעתיקה
.’B‘ או ’b‘ אינם המועתקים התווים עוד כל תו אחרי תו מתבצעת
.שהתקבלה החדשה המחרוזת את הפונקציה תדפיס בסיום
SCE-Chapter-8-Strings
ומחרוזותממדים מערכים דו
G a d i \0
R a m i \0
D a n i \0
85
. שיכיל שמותממדי נגדיר מערך דו
:זה כל שורה במערך תהיה מחרוזת לצורך
char names[N][STR_SIZE];
STR_SIZE ? #define N 3-ו Nהערכים של מהם
#define STR_SIZE 5
Shayke Bilu PhD
85
SCE-Chapter-8-Strings
פונקציה למציאת –ממדים ומחרוזות מערכים דו
מחרוזת במערך דו ממדי86
. להלן פונקציה המקבלת מילה ומערך
:"*****"הוא יוחלף במילה במערך נמצא אם השם
void markName(char Names[ ][STR_SIZE],int size, char word[ ])
{
int i;
for ( i = 0; i < size; i++ )
if (strcmp(Names[i],word)==0)//השוואה בין המחרוזת למילה
{
strcpy(Names[i],“*****"); // המילה שנמצאההחלפת
return 0;
}
}
Shayke Bilu PhD
86
SCE-Chapter-8-Strings
פונקציה למציאת –ממדים ומחרוזות מערכים דו
מחרוזת במערך דו ממדי87
. להלן פונקציה המקבלת מילה ומערך
:"!!!Found"י המילה "הוא יסומן עבמערך נמצא אם השם
void markName(char Names[ ][STR_SIZE],int size, char word[ ])
{
int i;
for ( i = 0; i < size; i++ )
if (strcmp(Names[i],word)==0)//השוואה בין המחרוזת למילה
{
strcat(Names[i],"Found!!!”);// סימון המילה שנמצאה
return 0;
}
}
Shayke Bilu PhD
87
SCE-Chapter-8-Strings
תוכנית הכוללת מימוש חיפוש מחרוזת מילה
במערך דו ממדי נתון88
#include <stdio.h>
#include <string.h>
#define ROW 10
#define COL 30
#define WORDSIZE 10
int markName(char Names[][COL], char name[ ])
{
int i;
for ( i = 0; i < ROW; i++ )
if (strcmp(Names[i],name)==0)
strcat(Names[i],“\t<-Found it!!!");
return 0;
}
Shayke Bilu PhD
88
SCE-Chapter-8-Strings
89
int main()
}
int i;
char Names[ROW][COL]={{"Ravit"}, {"Danit"}, {"Rotem"},
{"Daniel"}, {"Galit"}, {"Reot"},
{"Daniela"}, {"Victoria"}, {"Rita"},
{"Gavriela"}};
char name[WORDSIZE]="Reot";
markName(Names,name);
for(i=0; i<ROW;i++)
puts(Names[i]);
{
התוכנית הראשית
Shayke Bilu PhD
89
SCE-Chapter-8-Strings
מימוש חיפוש מחרוזת –ממדים ומחרוזות דו מערכים
במערך דו ממדי90
#include <stdio.h>
#define ROW 5
#define COL 6
#define WORDSIZE 4
void main()
}
char matr[ROW][COL]={{'r','v','o','q','w',’\0’},{'a','h','s','x','l',’\0’},
{'n','k','s','d','m’,’\0’}, {'r','a','n','j','r',’\0’}, {'d','k','u','c','a',’\0’}};
char word[WORDSIZE]={‘r’,’a’,’n’,’\0’};
int i,j,k,l;
Shayke Bilu PhD
90
SCE-Chapter-8-Strings
SCE-Chapter-8-Strings
91
//Search for horizontal words (along the columns):
for(i=0; i<ROW; i++) //Scan the rows.
for(j=0; j<=COL-WORDSIZE; j++) //Scan the columns.
{
for(k=j, l=0; l<=WORDSIZE && matr[i][k]==word[l]; k++, l++);
if(l==WORDSIZE-1) //Check if the whole word was encountered.
printf("The word was found horizontally!!! \nIts
coordinates are: i=%d,j=%d,i=%d,j=%d\n", i, WORDSIZE,i,k);
{
מימוש חיפוש מחרוזת –ממדים ומחרוזות דו מערכים
במערך דו ממדי91
Shayke Bilu PhD
92
//Search for vertical words (along the columns):
for(i=0; i<COL; i++) //Scan the columns:
for(j=0; j<=ROW-WORDSIZE; j++) //Scan the rows:
}
for(k=j, l=0;l<=WORDSIZE && matr[k][i]==word[l];k++, l++);
if(l==WORDSIZE-1)
printf("The word was found vertically!!! \nIts coordinates are:
i=%d,j=%d,i=%d,j=%d\n", WORDSIZE-k-1,i,k,i);
{
}
מימוש חיפוש מחרוזת –ממדים ומחרוזות דו מערכים
במערך דו ממדי
Shayke Bilu PhD
92
SCE-Chapter-8-Strings
SCE-Chapter-8-Strings
סיכום
הגדרת מחרוזת.
אתחול מחרוזת וסימון סוף מחרוזת.
פלט של מחרוזות/קלט.
מחרוזותפעולות על.
מציאת אורך מחרוזת.
איתור תו במחרוזת.
פונקציות פנימיות על מחרוזות.
פונקציות פנימיות על תווים.
מערכים דו ממדיים ומחרוזות.
93
Shayke Bilu PhD
93
Shayke Bilu PhD
95
מחרוזות דו ממד –תרגיל כיתה
:הבאות המשימות את ומבצעת המגדירה תוכנית כתוב .8
.char מטיפוס 10X5 בגודל מחרוזתי ממדי דו מערך תגדיר•
.אותו ותדפיס ממדי הדו למערך תווים 9 בנות מילים 5 תקלוט•
.נוסף מחרוזתי למשתנה נוספת תווים 9 בת מילה תקלוט•
שורה באיזו ותציג במערך בנפרד שנקלטה המילה את תחפש•
הודעה תודפס נמצאת לא המילה אם ,במערך נמצאת היא
.מתאימה
@ תווי באוסף אותה להחליף יש במערך נמצאה והמילה במידה•
.שהוחלפה המילה בגודל
.העבודה בסיום ממדי הדו המערך את הדפס•
SCE-Chapter-8-Strings
Shayke Bilu PhD
96
:הבאות המשימות את ומבצעת המגדירה תוכנית כתוב .9
.char מטיפוס 30X10 בגודל מחרוזתי ממדי דו מערך תגדיר•
.אותו ותדפיס ממדי הדו למערך מילים 10 תקלוט•
ובאיזו למערך שנקלטה ביותר הארוכה המילה מהי ותציג תמצא•
.נמצאת היא שורה
בשורה למילה זהה הראשונה בשורה המילה האם תחפש•
.החמישית
שבשורה המילה עם שנייה בשורה המילה את תשרשר•
.השרשור את ותדפיס השלישית
SCE-Chapter-8-Strings
מחרוזות דו ממד –תרגיל כיתה
Shayke Bilu PhD
97
:הבאות המשימות את ומבצעת המגדירה תוכנית כתוב .10
.char מטיפוס 20X10 בגודל מחרוזתי ממדי דו מערך תגדיר•
.אותו ותדפיס ממדי הדו למערך משפטים 10 תקלוט•
הקטנות האותיות מספר את בו שיש המשפט מהו ותציג תמצא•
.במערך ביותר הגדול
אות תהיה שלו הראשונה שהאות כך שורה בכל משפט כל תשנה•
.קטנות האותיות שאר וכל גדולה
גדול האותיות מספר שבו במערך המשפט מהו ותציג תחפש•
.במשפט אחרים תווים או הרווחים ללא ביותר
SCE-Chapter-8-Strings
מחרוזות דו ממד –תרגיל כיתה
Shayke Bilu PhD
98
:הבאות המשימות את ומבצעת המגדירה תוכנית כתוב .11
.char מטיפוס 20X10 בגודל מחרוזתי ממדי דו מערך תגדיר•
.אותו ותדפיס ממדי הדו למערך משפטים 10 תקלוט•
במשפט אותו ותחליף במערך ביותר הארוך המשפט מהו תמצא•
Max String.
במשפט אותו ותחליף במערך ביותר הקצר המשפט מהו תמצא•
Min String.
.מיקומו ואת אותו ותדפיס אותיות רק יש בו המשפט את תמצא•
את ותדפיס מקסימלי ספרות מספר בו המשפט את תמצא•
.מיקומוSCE-Chapter-8-Strings
מחרוזות דו ממד –תרגיל כיתה
Shayke Bilu PhD
99
:הבאות המשימות את ומבצעת המגדירה תוכנית כתוב .12
מטיפוס 10X5 בגודל מחרוזתיים ממדים דו מערכים שני תגדיר•
char אחד כל.
.אותו ותדפיס הראשון ממדי הדו למערך משפטים 5 תקלוט•
.אותו ותדפיס השני ממדי הדו למערך משפטים 5 תקלוט•
למציאת המשפטים שני בין מקבילה מילה כל של בדיקה תבצע•
.מוחלטת זהות
המערכים משני המילים שתי כי לציין יש זהות ונמצאה במידה•
מתאימה הודעה לתת יש זהות נמצאה ולא במידה ,זהות
.הזהות נמצאה לא מילים ובאיזה מדובר שורה באיזו המציינת
SCE-Chapter-8-Strings
מחרוזות דו ממד –תרגיל כיתה