מבוא למדעי המחשב מערכים.

Slides:



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

מבוא למדעי המחשב לתעשייה וניהול דוגמאות ותרגול נוסף במערך חד ממדי הרצאה 12.
1 מבוא למדעי המחשב הקצאה דינאמית. 2 הקצאת זיכרון דינאמית  כאשר אנו משתמשים במערכים, אנו מקצים אוטומטית את הזיכרון המקסימלי שנצטרך.  בפועל, אנו משתמשים.
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
תכנות תרגול 6 שבוע : חישוב e זוהי הנוסחא לחישוב e נראה כיצד לתרגם אותה לפונקציה n n.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
מבוא כללי למדעי המחשב שיעור 4 מרצה: שי גוטנר. חזרה - משתנים מסוג char משתנים אלו מיצגים תווים. משתנים אלו מיצגים תווים. לכל תו יש קוד מספרי שמייצג אותו.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
תכנות תרגול 2 שבוע : שבוע שעבר כתבו תוכנית המגדירה שלושה משתנים מאתחלת אותם ל 1 2 ו 3 ומדפיסה את המכפלה שלהם את ההפרש שלהם ואת הסכום שלהם.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
11 Introduction to Programming in C תרגול
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מבוא למדעי המחשב © אריק פרידמן 1 מצביעים כמערכים דוגמה.
שיעור שישי: מערכים ופונקציות
1 מבוא למדעי המחשב מבנה של תכנית. 2 מבנה של תכנית – חלוקה לקבצים  תכנית בשפת C הינה אוסף של הגדרות של:  משתנים (חיצוניים)  פונקציות  ניתן לפרוש תכנית.
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
מבוא למדעי המחשב מחרוזות, מצביעים וכתובות
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
תכנות תרגול 6 שבוע : הגדרת פונקציות return-value-type function-name(parameter1, parameter2, …) הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציהרשימת.
תכנות תרגול 14 שבוע:
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
1 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
מערכים מבוא לתכנות למנע"ס - שבוע מספר 8 - מאיר קומר - סמסטר ב' - תשס"ו והנה בעיה כתוב תוכנית אשר תקלוט 36 מספרים ותדפיס כמה מתוכם גדולים יותר מהממוצע.
תכנות תרגול 14 שבוע : רשימות מקושרות ישנו מבנה נתונים אשר מאפשר ישנו מבנה נתונים אשר מאפשר לנו לבצע את הוספת האיברים בצורה נוחה יותר. מבנה זה.
מבוא כללי למדעי המחשב תרגול 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;
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
מבוא למדעי המחשב תרגול 9 – מערכים ומחרוזות, תרגילי חזרה שעת קבלה : יום שני 11:00-12:00 דוא " ל :
1 מבוא למדעי המחשב backtracking. 2 מוטיבציה בעיית n המלכות: נתון: לוח שחמט בגודל. המטרה: לסדר על הלוח n מלכות כך שאף אחת לא תאיים על השנייה. דוגמא: עבור.
מבוא למדעי המחשב תרגול 5 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
1 מבוא למדעי המחשב רקורסיה. 2 רקורסיה היא שיטה לפתרון בעיות המבוססת על העיקרון העומד ביסוד אינדוקציה מתמטית: אם ידועה הדרך לפתור בעיה עבור המקרים הבסיסיים.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
1 מבוא למחשב שפת C תרגילי חזרה. 2 תרגיל 1 : מחשבון קלט : תרגיל חשבוני המורכב ממספרים שלמים עם פעולות חשבוניות ביניהם. התרגיל מסתיים ב =. אפשריים רווחים.
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
מבנה נתונים ואלגוריתמים ) לשעבר - עיבוד מידע( ד"ר אבי רוזנפלד ד"ר אריאלה ריכרדסון.
Programming Pointers. נדגים היום בעזרת מצביעים העברת משתנים לפונקציה שמשנה אותם  פונקציה שמקבלת מצביעים לסמן תא בזיכרון  פונקציה שמחזירה מצביע מערך.
מחרוזות – הטיפוס String
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
מבוא למדעי המחשב לתעשייה וניהול
הרצאה 10 פונקציות עם מספר משתנה של פרמטרים
מבוא למדעי המחשב סיבוכיות.
מ- JAVA ל- C קרן כליף.
מיונים וחיפושים קרן כליף.
מבוא למדעי המחשב – סמסטר א' תשע"ב
שיעור חמישי: מערכים ומחרוזות
מצביעים קרן כליף.
מערכים קרן כליף.
הקצאות דינאמיות קרן כליף.
מבנים קרן כליף.
מצביעים קרן כליף.
ניתוח זמן ריצה (על קצה המזלג)
מבוא כללי למדעי המחשב תרגול 4
תרגול 8 תחומי הכרה פונקציות
מבוא למדעי המחשב – סמסטר א' תשע"ד
מחרוזות קרן כליף.
Programming in C תרגול Introduction to C - Fall Amir Menczel.
מבוא למדעי המחשב מצביעים.
תירגול 8:מצביעים והקצאה דינאמית
שיעור עשירי: מיונים, חיפושים, וקצת סיבוכיות חישוב
Presentation transcript:

מבוא למדעי המחשב מערכים

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

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

מערכים - דוגמא #include <stdio.h> #define NUM_GRADES 5 /* This program reads NUM_GRADES grades and prints the average grade. Then, it lists the above-average grades */ #include <stdio.h> #define NUM_GRADES 5 int main() { int grades[NUM_GRADES]; int i; double average=0; for (i=0; i<NUM_GRADES; i++) scanf("%d", &(grades[i])); average = average+grades[i]; average /= NUM_GRADES; printf("The following grades are above average:\n"); if (grades[i]>average) printf("%d\n", grades[i]); return 0; } מערכים - דוגמא הגדרת מערך בשם grades המכיל NUM_GRADES תאים, כל אחד מטיפוס int.

מערכים - הגדרה דוגמא: הפקודה int grades[5]; תגרום להקצאה רציפה של 5 תאים מטיפוס int. למשל אםsizeof(int)=2 , אזי המערך grades יתפוס 10 בתים רצופים בזיכרון. 4208 4209 4206 4207 4204 4205 4202 4203 4200 4201 address contents 4 3 2 1 index

מערכים - דוגמא #include <stdio.h> #define NUM_GRADES 5 /* This program reads NUM_GRADES grades and prints the average grade. Then, it lists the above-average grades */ #include <stdio.h> #define NUM_GRADES 5 int main() { int grades[NUM_GRADES]; int i; double average=0; for (i=0; i<NUM_GRADES; i++) scanf("%d", &(grades[i])); average = average+grades[i]; average /= NUM_GRADES; printf("The following grades are above average:\n"); if (grades[i]>average) printf("%d\n", grades[i]); return 0; } מערכים - דוגמא יש צורך להודיע לקומפיילר בדיוק מהו גודלו של המערך. גודל המערך חייב להיות קבוע. באופן כללי מערך מוגדר ע"י: type id[length]

מערכים – גישה לתאים דוגמא: עבור ההגדרה int grades[5] grades[0] מתייחס לתא הראשון (למשל: grades[0]=5) grades[1] מתייחס לתא השני. למשל: if (grades[0]<51) printf(“Fail\n”); : grades[4] מתייחס לתא החמישי. שימו לב: אינדקסים של מערכים ב- C מתחילים תמיד באפס. אינדקס יכול להיות כל ביטוי שערכו מספר שלם. הצבה לתא קריאה מתא

מערכים - דוגמא #include <stdio.h> #define NUM_GRADES 5 /* This program reads NUM_GRADES grades and prints the average grade. Then, it lists the above-average grades */ #include <stdio.h> #define NUM_GRADES 5 int main() { int grades[NUM_GRADES]; int i; double average=0; for (i=0; i<NUM_GRADES; i++) scanf("%d", &(grades[i])); average = average+grades[i]; average /= NUM_GRADES; printf("The following grades are above average:\n"); if (grades[i]>average) printf("%d\n", grades[i]); return 0; } מערכים - דוגמא קליטת נתונים לתוך המערך. בכל איטרציה נקלט מספר אחד לתוך התא ה- i (המשתנה i משמש כמונה "הרץ" על האינדקסים של המערך). סכימת אברי מערך. הדפסת התאים הרלוונטיים מן המערך.

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

מערכים – אתחול int days[]={31,28,31,30,31,30,31,31,30,31,30,31} אתחול של מערך נעשה ע"י כתיבת רשימת איבריו בתוך סוגריים מסולסלים. כאשר גודל המערך מושמט הקומפיילר יקצה מספר תאים לפי גודל סדרת המאתחלים. כאשר גודל המערך מצוין, ונתונים יותר מאתחלים מגודל המערך, תתקבל טעות בזמן קומפילציה. כאשר גודל המערך מצוין, ונתונים פחות מאתחלים מגודל המערך, יאותחלו אברי המערך הראשונים לפי הרשימה ושאר האיברים יאותחלו לאפסים.

פעולות על מערכים הערה חשובה: שפת C אינה מגדירה פעולות פרימיטיביות על מערכים. השוואה, העתקה, קליטה והדפסה של איברי מערך צריכה להיעשות ע"י שימוש בלולאה, איבר אחר איבר. דוגמא: for (i=0; i<NUM_GRADES; i++) { scanf("%d", &(grades[i])); }

מערכים – דוגמא נוספת /* This program counts the number of digits in its input and prints the count for each digit */ #include <stdio.h> int main () { int c, i; int ndigit[10]; for (i=0; i<10; i++) ndigit[i]=0; while ((c=getchar()) != EOF) { if (c >= '0' && c <= '9') ndigit[c-'0']++; } printf ("The digit %d occurs %d times.\n", i, ndigit[i]); return 0;

מערכים של תווים ← מחרוזות מערך הוא סדרה רציפה של איברים שווי טיפוס. בפרט, הטיפוס יכול להיות תו. מחרוזות הן מקרה פרטי של מערכים: התאים הם מטיפוס char, ובסופן התו ‘\0’. השוני היחיד – ניתן לאתחל מערך של תווים גם ע"י ציון מחרוזת מפורשת. למשל: char pattern[]=“hello”; char pattern[]={‘h’,’e’,’l’,’l’,’o’,’\0’};

מחרוזות – דוגמא /* This program reverses a string in place */ #include <stdio.h> #define MAXLINE 100 int main () { char s[MAXLINE]; int c, i, j, length; printf("Input string:\n"); for (length=0; length<MAXLINE-1 && (c=getchar()) != EOF && c != '\n'; length++) s[length] = c; s[length] = '\0'; printf("%s\n", s); for (i=0, j=length-1; i<j; i++, j--) { c=s[i]; s[i]=s[j]; s[j]=c; } return 0;

העברת מערכים לפונקציות בכותרת הפונקציה יש להצהיר על טיפוס המערך ושמו הפורמלי, ללא אורך. בסביבה הקוראת יצוין שם המערך. בתוך הפונקציה, הארגומנט הוא למעשה משתנה פנימי מאותחל. int mystrlen (char s[ ]) { int n=0; while (s[n]!=‘\0’) n++; return n; }

העברת מערכים לפונקציות #include<stdio.h> #define LEN 100 int mystrlen (char s[]); int main() { char array1[LEN]="hello" , array2[LEN], array3[LEN]={'h','i'}, array4[]="hi"; array2 [0]='a'; array2[1]='b'; array2[2]='c'; array2[3]='\0'; printf("The length of the string %s is %d.\n",array1,mystrlen(array1)); printf("The length of the string %s is %d.\n",array2,mystrlen(array2)); printf("The length of the string %s is %d.\n",array3,mystrlen(array3)); printf("The length of the string %s is %d.\n",array4,mystrlen(array4)); return 0; } int mystrlen (char s[]) int n=0; while (s[n]!='\0') n++; return n;

העברת מערכים לפונקציות הערה חשובה: עד כה למדנו כי בשפת C העברת פרמטרים היא by value בלבד, כלומר, הפונקציה הנקראת מקבלת העתק בלבד של המשתנים. לעומת זאת, כאשר מערך נשלח לפונקציה, הפונקציה מקבלת גישה למערך המקורי (ולא העתק של המערך!) למה? בהמשך...

העברת מערכים לפונקציות int main() { int i, a[10]={1,2,3,4,5,6,7,8,9,10}; for (i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); change(a); return 0; } void change (int a[]) { int i; for (i=0;i<10;i++) a[i]=i*i; return; }

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

מערכים ורקורסיות - דוגמא # include <stdio.h> # include <string.h> # define TRUE 1 #define FALSE 0 int IsPal (char str[]) { return IsPalRec (str, 0, strlen(str)) } int IsPalRec (char str[], int start, int len) if ( (len==0) || (len==1) ) return TRUE; else if (str[start]!=str[start+len-1]) return FALSE; else return IsPalRec (str, start+1, len-2);

רקורסיה – דוגמא (2) סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1) + fibonacci(n-2)); } החיסרון: חישובים חוזרים של תתי בעיות!

חישובים חוזרים של תתי בעיות - דוגמא פונקציה לא רקורסיבית: long fib (int n) { long tmp[LEN]={1,1}, i; for (i=2; i<n; i++) tmp[i]=tmp[i-1]+tmp[i-2]; return tmp[n-1]; }

מערכים דו-ממדיים מערך דו-ממדי הוא למעשה מערך של מערכים. לכן, צורת הכתיבה היא a[i][j] ולא a[i,j] . איברים נשמרים לפי שורות. לכן, מעבר על המערך כאשר האינדקס הימני משתנה מהר יותר הינו יעיל יותר. כשמעבירים מערך דו-ממדי לפונקציה יש להצהיר על גודל כל הממדים פרט לראשון. אתחול מערך דו-ממדי: int daytable[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };

מערכים דו-ממדיים – דוגמא (1) נרצה לכתוב תכנית המבצעת המרה מיום בחודש ליום בשנה ולהיפך. למשל: ה- 1 במרץ הוא היום ה- 60 בשנה רגילה והיום ה- 61 בשנה מעוברת. לכן, עבור הקלט: יום 60 בשנת 2005 נקבל את הפלט: 1 במרץ עבור הקלט: יום 60 בשנת 2000 נקבל את הפלט: 29 בפברואר (*) תזכורת: שנה היא מעוברת אם היא מתחלקת ב- 4 אך לא ב- 100, או לחלופין אם היא מתחלקת ב- 400.

מערכים דו-ממדיים – דוגמא (1) /* day_of_year.c -- K&R page 111 */ #include <stdio.h> int daytable[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; /* day_of_year: set day of year from month and day */ int day_of_year (int year, int month, int day) { int i, leap; leap = (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); for (i=1; i<month; i++) day += daytable[leap][i]; return day; }

מערכים דו-ממדיים – דוגמא (1) #include <stdio.h> int daytable[2][13] = { {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; /* month_day: set month, day from day of year */ void month_day (int year, int yearday) { int i, leap; leap = (((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0); for (i=1; yearday>daytable[leap][i]; i++) yearday -= daytable[leap][i]; return ??? }

מערכים דו-ממדיים – דוגמא (2) מטריצה הינה טבלה בגודל (m שורות ו- n עמודות) חיבור מטריצות מוגדר עבור מטריצות מאותו סדר ונעשה ע"י חיבור האיברים במקומות המתאימים. לדוגמא: נרצה לכתוב תכנית המבצעת חיבור מטריצות לא מוגדר

מערכים דו-ממדיים – חיבור מטריצות #include <stdio.h> #include <stdlib.h> #define SIZE 10 #define FALSE 0 #define TRUE 1 void ReadMatrix (int a[SIZE][SIZE], int row, int col); void CheckSize (int size); int add (int a[SIZE][SIZE], int row1, int col1, int b[SIZE][SIZE], int row2, int col2, int c[SIZE][SIZE]); void PrintMatrix (int a[SIZE][SIZE], int row, int col);

מערכים דו-ממדיים – חיבור מטריצות int main() { int a[SIZE][SIZE], b[SIZE][SIZE], c[SIZE][SIZE]; int row1, row2, col1, col2; printf("Enter the number of rows and columns of the first matrix and the second matrix\n"); if (scanf("%d%d%d%d",&row1, &col1, &row2, &col2)!=4){ printf("Input error\n"); return 1; } CheckSize(row1); CheckSize(col1); CheckSize(row2); CheckSize(col2); ReadMatrix(a,row1,col1); ReadMatrix(b,row2,col2); if (add(a,row1,col1,b,row2,col2,c)==FALSE) { printf("Matrices cannot be added\n"); return 0; else{ printf("The result matrix:\n"); PrintMatrix(c,row1,col1);

מערכים דו-ממדיים – חיבור מטריצות /* Check a matrix dimension*/ void CheckSize (int size) { if (size<0){ printf(“Matrix dimensions should be positive\n"); exit (1); } return;

מערכים דו-ממדיים – חיבור מטריצות /* read a matrix*/ void ReadMatrix (int a[SIZE][SIZE], int row, int col) { int i,j; printf("Please enter matrix [%d][%d]\n",row,col); for (i=0; i < row; i++) { for (j=0; j < col; j++) { if(scanf("%d", &(a[i][j]))!=1){ printf("Input error"); exit (1); } PrintMatrix(a, row, col); return;

מערכים דו-ממדיים – חיבור מטריצות /* print a matrix */ void PrintMatrix (int a[SIZE][SIZE], int row, int col) { int i,j; printf("Printing matrix [%d][%d]\n", row, col); for (i=0; i < row; i++) { for (j=0; j < col; j++) { printf("%6d", a[i][j]); } printf("\n");

מערכים דו-ממדיים – חיבור מטריצות /* add two matrices */ int add (int a[SIZE][SIZE], int row1, int col1, int b[SIZE][SIZE], int row2, int col2, int c[SIZE][SIZE]) { int i,j; if ( (col1!=col2) || (row1!=row2) ) return FALSE; for (i=0; i < row1; i++) for (j=0; j < col2; j++) c[i][j]=a[i][j]+b[i][j]; return TRUE; }