150 likes | 429 Views
מבוא למדעי המחשב. תרגול מס' 7 - מערכים. מערכים. מערכים הם משתנים אשר מכילים מספר איברים מאותו טיפוס. לכל מערך יש שם וניתן לגשת לכל איבר במערך. בשפת C קיימים מערכים עבור תווים, שלמים, ממשיים וכו'. מערכים. תכונות חשובות: כל האיברים במערך בעלי אותו טיפוס.
E N D
מבוא למדעי המחשב תרגול מס' 7 - מערכים
מערכים • מערכים הם משתנים אשר מכילים מספר איברים מאותו טיפוס. • לכל מערך יש שם וניתן לגשת לכל איבר במערך. • בשפת C קיימים מערכים עבור תווים, שלמים, ממשיים וכו'...
מערכים תכונות חשובות: • כל האיברים במערך בעלי אותו טיפוס. • האיברים מאוחסנים באופן רציף בזיכרון המחשב. • האיבר הראשון במערך ממוספר כאיבר מספר 0 , והאיבר האחרון כגודל המערך פחות 1. (פניה לאיבר הראשון במערך ששמו נניח Arr ע"י הסימון : Arr[0] , לאיבר השני ע"י Arr[1] וכך הלאה...). • שם המערך הוא כתובת תחילת המערך .שם זה הוא קבוע שאינו ניתן לשינוי.
מערכים – הגדרה ואתחול • הגדרת מערך <טיפוס> <שם המערך> [<מספר איברים>]; לדוגמא: int Arr[10]; • פקודה זו מקצה 10 משתנים עוקבים בזכרון, למערך בשם Arr . • ע"י הגדרה זו עדיין לא אתחלנו את המערך. אם כן, אילו ערכים נמצאים בו ? ערכים אקראיים חסרי משמעות מבחינתנו - זבל ! חייב להיות קבוע
מערכים - איתחול • עם הגדרת המערך ניתן לאתחל אותו באופנים הבאים: • int Arr[10] = { 1, 4, 6, 7, 8, 0 , 5, 5 , 1, 2 }; • int Arr[10] = {1,2,3}; • int Arr[10] = {0}; • int Arr[ ] = {1,2,3,4}; יתר האיברים מאותחלים לאפס דרך לאיפוס מערך מאותחל מערך בגודל 4
מערכים • איתחול שלא בשורת ההגדרה מתבצע בעזרת לולאה • לדוג' איתחול באפסים: intArr[SIZE] ,i; for( i = 0 ; i < SIZE ; i++) Arr[i] = 0; • ואיתחול בערכים מהמשתמש: intArr[SIZE] ,i; for( i = 0 ; i < SIZE ; i++) { if (scanf("%d",&Arr[i] )!= 1) { printf(“\nINPUT ERROR !”); return 1; } }
העברת מערך כפרמטר לפונקציה • כאשר מעבירים מערך לפונקציה מה שמועבר זוהי, למעשה, כתובת המערך • שינוי בערכי המערך בתוך הפונקציה ישנה את ערכם גם מחוץ לה • כותרת הפונקציה תהיה: void f (int arr[]); • והקריאה לה תתבצע כך: f(arr);
מחרוזות Strings • בשפת C אין טיפוס מסוג מחרוזת • מחרוזת היא, למעשה, מערך של תווים • בסוף מחרוזת נמצא תו מיוחד – ‘\0’ שהערך ה-ascii שלו הוא אפס. • קבוע מסוג מחרוזת מיוצג ע"י מרכאות כפולות (למשל “abc”) • שימו לב להבדל בין קבוע מסוג מחרוזת לקבוע מסוג תו: • מה ההבדל בין “s” ל-‘s’ ?
מחרוזות Strings • הגדרת מחרוזת דומה להגדרת מערך char str[10]; • איתחול מחרוזת בזמן הגדרתה יכול להתבצע בשני אופנים: • char str[ ] = “abc”; • char str[ ] = {‘a’,’b’,’c’,’\0’}; • בשתי צורות האתחול הנ"ל התוצאה שווה: מוגדרת מחרוזת בשם str שנראית כך: • מה יקרה אם נאתחל את המחרוזת כך char str[10] = “abc”; ? • הצבת ערכים אחרים לתוך המחרוזת בזמן אחר בתוכנית יתבצע כמו במערך רגיל – גישה לכל אינדקס בנפרד • אך ישנה גם אפשרות לקלוט מהמשתמש מחרוזת בפעם אחת (ללא שימוש בלולאה) לתוך המערך בעזרת %s (בשקף הבא). • כזכור, אפשרות זו לא קיימת במערכים מטיפוס אחר
מחרוזות Strings • הדפסה או קליטה של מחרוזת בשלמותה נעשית בעזרת תו הבקרה %s • קליטת מחרוזת בעזרת %s גורמת להכנסה של תו אחר תו מהקלט לתוך המערך, ולבסוף הכנסת התו ‘\0’ • הדפסת מחרוזת בעזרת %s גורמת להדפסת התווים במערך עד התו ‘\0’
הבדלים בין מחרוזת למערך רגיל למה לא מוסיפים & ? • קלט char str[10]; scanf(“%s”,str); ואיך נקלוט מערך רגיל (למשל של מס' שלמים)? int arr[10]; int i; for(i = 0; i < 10; i++) { scanf(“%d”,&arr[i]); } הפרמטר השני ש-scanf מקבלת צריך להיות הכתובת בזכרון בה אנו רוצים לשמור את הערך הנקלט. במקרה של מערך – שם המערך הוא כתובת התחלתו לא לשכוח בדיקות קלט ל-scanf() !
הבדלים בין מחרוזת למערך רגיל • לולאות • כיצד נכתוב לולאה שניגשת לכל איבר במערך רגיל (למשל מסוג int) ? for (i=0; i<n; i++) arr[i] … • וכיצד נעשה את אותו דבר עבור מחרוזת? for (i=0; str[i] != ‘\0’; i++) str[i] … • שימו לב שלא היינו צריכים לדעת מראש את גודל המחרוזת • מה שמוביל אותנו להבדל הבא... היינו חייבים לדעת את גודל המערך (n)
הבדלים בין מחרוזת למערך רגיל • פרמטרים לפונקציה • כשאנחנו מעבירים מערך רגיל לפונקציה אנחנו בדרך כלל נעביר מלבד המערך גם את גודלו int func(int arr[], int n); • כשנעביר מחרוזת לפונקציה לא תמיד נצטרך להעביר גם את גודלה, מאחר ואפשר לדעת תמיד מתי היא מסתיימת ובכך להימנע מגישה לכתובת לא חוקית void func(char str[]);
תרגיל • תוכנית אשר קולטת מהמשתמש מחרוזת תווים ומדפיסה כמה פעמים הופיעה במחרוזת כל אות (אותיות לטיניות) למשל: אם נקלטה המחרוזת “strings” אז הפלט יהיה: A appears 0 times in the string B appears 0 times in the string ... G appears 1 times in the string I appears 1 times in the string ... S appears 2 times in the string ...
#include <stdio.h> #define ABC 26 int main() { char s[100], ch; int a[ABC], i; printf("\nPlease enter the string\n"); if(scanf("%s", s) != 1) { printf("Input error\n"); return 1; } for (i=0; i<ABC; i++) /* initialization */ a[i] = 0; i = 0; ch = s[0]; while (ch != '\0') { if (ch >= 'A' && ch <= 'Z') a[ch – 'A'] ++; else if (ch >= 'a' && ch <= 'z') a[ch – 'a'] ++; i++; ch = s[i]; } for (i=0; i<ABC; i++) /* output */ printf("%c appears %d times in the string\n", i+'A', a[i]); return 0; }