Slide1 l.jpg
This presentation is the property of its rightful owner.
Sponsored Links
1 / 15

מבוא למדעי המחשב PowerPoint PPT Presentation


  • 94 Views
  • Uploaded on
  • Presentation posted in: General

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

Download Presentation

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

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 l.jpg

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

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


Slide2 l.jpg

מערכים

  • מערכים הם משתנים אשר מכילים מספר איברים מאותו טיפוס.

  • לכל מערך יש שם וניתן לגשת לכל איבר במערך.

  • בשפת C קיימים מערכים עבור תווים, שלמים, ממשיים וכו'...


Slide3 l.jpg

מערכים

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

  • כל האיברים במערך בעלי אותו טיפוס.

  • האיברים מאוחסנים באופן רציף בזיכרון המחשב.

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

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

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


Slide4 l.jpg

מערכים – הגדרה ואתחול

  • הגדרת מערך

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

    לדוגמא:

    int Arr[10];

  • פקודה זו מקצה 10 משתנים עוקבים בזכרון, למערך בשם Arr .

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

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


Slide5 l.jpg

מערכים - איתחול

  • עם הגדרת המערך ניתן לאתחל אותו באופנים הבאים:

  • 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 l.jpg

מערכים

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

  • לדוג' איתחול באפסים:

    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 l.jpg

העברת מערך כפרמטר לפונקציה

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

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

  • כותרת הפונקציה תהיה:

    void f (int arr[]);

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

    f(arr);


Strings l.jpg

מחרוזות Strings

  • בשפת C אין טיפוס מסוג מחרוזת

  • מחרוזת היא, למעשה, מערך של תווים

  • בסוף מחרוזת נמצא תו מיוחד – ‘\0’ שהערך ה-ascii שלו הוא אפס.

  • קבוע מסוג מחרוזת מיוצג ע"י מרכאות כפולות (למשל “abc”)

  • שימו לב להבדל בין קבוע מסוג מחרוזת לקבוע מסוג תו:

    • מה ההבדל בין “s” ל-‘s’ ?


Strings9 l.jpg

מחרוזות Strings

  • הגדרת מחרוזת דומה להגדרת מערך char str[10];

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

  • char str[ ] = “abc”;

  • char str[ ] = {‘a’,’b’,’c’,’\0’};

  • בשתי צורות האתחול הנ"ל התוצאה שווה: מוגדרת מחרוזת בשם str שנראית כך:

    • מה יקרה אם נאתחל את המחרוזת כך char str[10] = “abc”; ?

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

  • אך ישנה גם אפשרות לקלוט מהמשתמש מחרוזת בפעם אחת (ללא שימוש בלולאה) לתוך המערך בעזרת %s (בשקף הבא).

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


Strings10 l.jpg

מחרוזות Strings

  • הדפסה או קליטה של מחרוזת בשלמותה נעשית בעזרת תו הבקרה %s

  • קליטת מחרוזת בעזרת %s גורמת להכנסה של תו אחר תו מהקלט לתוך המערך, ולבסוף הכנסת התו ‘\0’

  • הדפסת מחרוזת בעזרת %s גורמת להדפסת התווים במערך עד התו ‘\0’


Slide11 l.jpg

הבדלים בין מחרוזת למערך רגיל

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

  • קלט

    char str[10];

    scanf(“%s”,str);

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

    int arr[10];

    int i;

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

    {

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

    }

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

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

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

!


Slide12 l.jpg

הבדלים בין מחרוזת למערך רגיל

  • לולאות

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

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

      arr[i] …

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

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

      str[i] …

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

    • מה שמוביל אותנו להבדל הבא...

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


Slide13 l.jpg

הבדלים בין מחרוזת למערך רגיל

  • פרמטרים לפונקציה

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

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

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

      void func(char str[]);


Slide14 l.jpg

תרגיל

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

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

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

}


  • Login