slide1
Download
Skip this Video
Download Presentation
מבוא למדעי המחשב

Loading in 2 Seconds...

play fullscreen
1 / 15

. . C , , ... - PowerPoint PPT Presentation


  • 145 Views
  • Uploaded on

מבוא למדעי המחשב. תרגול מס\' 7 - מערכים. מערכים. מערכים הם משתנים אשר מכילים מספר איברים מאותו טיפוס. לכל מערך יש שם וניתן לגשת לכל איבר במערך. בשפת C קיימים מערכים עבור תווים, שלמים, ממשיים וכו\'. מערכים. תכונות חשובות: כל האיברים במערך בעלי אותו טיפוס.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' . . C , , ...' - lev


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

מבוא למדעי המחשב

תרגול מס\' 7 - מערכים

slide2
מערכים
  • מערכים הם משתנים אשר מכילים מספר איברים מאותו טיפוס.
  • לכל מערך יש שם וניתן לגשת לכל איבר במערך.
  • בשפת C קיימים מערכים עבור תווים, שלמים, ממשיים וכו\'...
slide3
מערכים

תכונות חשובות:

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

(פניה לאיבר הראשון במערך ששמו נניח Arr ע"י הסימון : Arr[0] , לאיבר השני ע"י Arr[1] וכך הלאה...).

  • שם המערך הוא כתובת תחילת המערך .שם זה הוא קבוע שאינו ניתן לשינוי.
slide4
מערכים – הגדרה ואתחול
  • הגדרת מערך

<טיפוס> <שם המערך> [<מספר איברים>];

לדוגמא:

int Arr[10];

  • פקודה זו מקצה 10 משתנים עוקבים בזכרון, למערך בשם Arr .
  • ע"י הגדרה זו עדיין לא אתחלנו את המערך. אם כן, אילו ערכים נמצאים בו ? ערכים אקראיים חסרי משמעות מבחינתנו - זבל !

חייב להיות קבוע

slide5
מערכים - איתחול
  • עם הגדרת המערך ניתן לאתחל אותו באופנים הבאים:
  • 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

slide6
מערכים
  • איתחול שלא בשורת ההגדרה מתבצע בעזרת לולאה
  • לדוג\' איתחול באפסים:

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;

}

}

slide7
העברת מערך כפרמטר לפונקציה
  • כאשר מעבירים מערך לפונקציה מה שמועבר זוהי, למעשה, כתובת המערך
  • שינוי בערכי המערך בתוך הפונקציה ישנה את ערכם גם מחוץ לה
  • כותרת הפונקציה תהיה:

void f (int arr[]);

  • והקריאה לה תתבצע כך:

f(arr);

strings
מחרוזות Strings
  • בשפת C אין טיפוס מסוג מחרוזת
  • מחרוזת היא, למעשה, מערך של תווים
  • בסוף מחרוזת נמצא תו מיוחד – ‘\0’ שהערך ה-ascii שלו הוא אפס.
  • קבוע מסוג מחרוזת מיוצג ע"י מרכאות כפולות (למשל “abc”)
  • שימו לב להבדל בין קבוע מסוג מחרוזת לקבוע מסוג תו:
    • מה ההבדל בין “s” ל-‘s’ ?
strings9
מחרוזות Strings
  • הגדרת מחרוזת דומה להגדרת מערך char str[10];
  • איתחול מחרוזת בזמן הגדרתה יכול להתבצע בשני אופנים:
  • char str[ ] = “abc”;
  • char str[ ] = {‘a’,’b’,’c’,’\0’};
  • בשתי צורות האתחול הנ"ל התוצאה שווה: מוגדרת מחרוזת בשם str שנראית כך:
    • מה יקרה אם נאתחל את המחרוזת כך char str[10] = “abc”; ?
  • הצבת ערכים אחרים לתוך המחרוזת בזמן אחר בתוכנית יתבצע כמו במערך רגיל – גישה לכל אינדקס בנפרד
  • אך ישנה גם אפשרות לקלוט מהמשתמש מחרוזת בפעם אחת (ללא שימוש בלולאה) לתוך המערך בעזרת %s (בשקף הבא).
  • כזכור, אפשרות זו לא קיימת במערכים מטיפוס אחר
strings10
מחרוזות Strings
  • הדפסה או קליטה של מחרוזת בשלמותה נעשית בעזרת תו הבקרה %s
  • קליטת מחרוזת בעזרת %s גורמת להכנסה של תו אחר תו מהקלט לתוך המערך, ולבסוף הכנסת התו ‘\0’
  • הדפסת מחרוזת בעזרת %s גורמת להדפסת התווים במערך עד התו ‘\0’
slide11
הבדלים בין מחרוזת למערך רגיל

למה לא מוסיפים & ?

  • קלט

char str[10];

scanf(“%s”,str);

ואיך נקלוט מערך רגיל (למשל של מס\' שלמים)?

int arr[10];

int i;

for(i = 0; i < 10; i++)

{

scanf(“%d”,&arr[i]);

}

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

במקרה של מערך – שם המערך הוא כתובת התחלתו

לא לשכוח בדיקות קלט ל-scanf()

!

slide12
הבדלים בין מחרוזת למערך רגיל
  • לולאות
    • כיצד נכתוב לולאה שניגשת לכל איבר במערך רגיל (למשל מסוג int) ?

for (i=0; i<n; i++)

arr[i] …

    • וכיצד נעשה את אותו דבר עבור מחרוזת?

for (i=0; str[i] != ‘\0’; i++)

str[i] …

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

היינו חייבים לדעת את גודל המערך (n)

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

int func(int arr[], int n);

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

void func(char str[]);

slide14
תרגיל
  • תוכנית אשר קולטת מהמשתמש מחרוזת תווים ומדפיסה כמה פעמים הופיעה במחרוזת כל אות (אותיות לטיניות)

למשל: אם נקלטה המחרוזת “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

...

slide15
#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;

}

ad