290 likes | 508 Views
מבוא כללי למדעי המחשב תרגול 4. לולאות for. שבוע שעבר. שם המשתנה שבאמצעותו נשלוט בלולאה. קידום משתנה הלולאה. הערך שבו נאתחל אותו. for (counter=1 ;counter<=7 ; counter++ ) { loop body }. התנאי שכל עוד הוא מתקיים נמשכת הלולאה. מה ערכו של המשתנה כ אן ?. מערכים .
E N D
לולאות for שבוע שעבר שם המשתנה שבאמצעותו נשלוט בלולאה קידום משתנה הלולאה הערך שבו נאתחל אותו for (counter=1 ;counter<=7 ; counter++ ) { loop body } התנאי שכל עוד הוא מתקיים נמשכת הלולאה מה ערכו של המשתנה כאן ?
מערכים • עד היום התוכניות שלנו לא ידעו לשמור כמות גדולה של מידע ללא הגדרת כמות גדולה של משתנים. • אתגר: כתוב תוכנית שקולטת 100 מספרים שלמים ומדפיסה אותם מהאחרון שנקלט לראשון. קלט: 1 2 3 4 5 , ... , 99 100 פלט: 100 99 , ... , 5 4 3 2 1
פתרון (בלי מערכים) void main() { int a1,a2,a3,…,a100; scanf(“%d%d%d …”,&a1,&a2,&a3,…); printf(“%d %d %d …”,a100,a99,a98,…); } אל תנסו בבית !!!
מערכים int a; a=5; int a[10]; a[2] = 5; 5 a משתנה בודד a[0] מערך a[1] גישה למשתנה השלישי במערך 5 a[2] a[9]
int main() { int i=0; int a[100]; for (i=0;i<100;i++) scanf (“%d”,&a[i]); for (i=99;i>=0;i--) printf (“%d ”,a[i]); return 0; } קלט פלט
תרגיל 1 כתוב תוכנית הקולטת 10 איברים לתוך מערך ומדפיסה תחילה את כל האיברים הזוגיים ואחר כך את כל האיברים האי זוגיים Enter numbers 91 32 23 14 65 46 57 18 39 510 Even: 32 14 46 18 510 Odd: 91 23 65 57 39
קלט #include <stdio.h> int main() { int i,arr[10]; printf("Enter numbers\n"); for (i=0;i<10;i++) scanf("%d",&arr[i]); printf("Even:\n"); for (i=0;i<10;i++) if (arr[i] % 2 == 0) printf("%d ",arr[i]); printf("\nOdd:\n"); for (i=0;i<10;i++) if (arr[i] % 2 != 0) printf("%d ",arr[i]); printf("\n"); return 0; } פלט
מערכים - אתחול a[0] 1 2 a[1] 3 a[2] int a[10] = {1,2,3}; int a[10] = {0}; 0 a[9] a[0] 0 0 a[1] 0 a[2] 0 a[9]
הגדרת פונקציות הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציה רשימת הערכים שהפונקציה מקבלת return-value-type function-name(parameter1, parameter2, …) { Function body return-value } דוגמא:נממש את הפונקציה f(x) = x^2 double sqr(double x) { return x*x; } הגדרת הפונקציה גוף הפונקציה
פונקציות- דוגמא נוספת נממש את הפונקציה שמוצאת את המינימום בין שלושה מספרים: int minimum( int x, int y, int z ) { int min = x; if ( y < min ) min = y; if ( z < min ) min = z; return min; } משתנה מקומי שמוכר רק בתוך הפונקציה x y z
שימוש בפונקציות int main() { int a, b, c; printf( "Enter three integers: " ); scanf( "%d%d%d", &a, &b, &c ); printf( "Min is: %d\n", minimum( a, b, c ) ); return 0; }
שימוש בפונקציות int main() { int a, b, c, min; printf( "Enter three integers: " ); scanf( "%d%d%d", &a, &b, &c ); min = minimum( a, b, c ); printf( "Min is: %d\n", min); return 0; }
העברת הערכים main minimum x a משתמש y b z c
הכרזה על פונקציות הגדרת סוג הערכים שהפונקציה מחזירה שם הפונקציה רשימתסוגיהערכים שהפונקציה מקבלת return-value-type function-name(parameter1, parameter2, …); הכרזה על פונקציה בצורה כזו מעל לקטע הקוד הראשי של התוכנית מאפשרת לנו להשתמש בפונקציה בכל מקום. double sqr( double ); int minimum( int, int, int ); int main() { }
תרגיל 2 כתוב פונקציה המקבלת מספר שלם ומחזירה 0 אם הוא לא ראשוני ו- 1 אם כן. הדרכה: int main() { if (IsPrime(7) == 1) printf(“7 is prime”); } int IsPrime(int p) { } תוכנית שמשתמשת בפונקציה הפונקציה (השלימו את הגוף) ?
תרגיל 2- המשך קלוט מספר והדפס את כל המספרים הראשונים עד אליו תוך שימוש בפונקציה שכתבת.
תרגיל 2- פתרון הפונקציה int IsPrime(int num) { int k; for(k = 2 ; k*k <= num; k++) { if (num % k == 0) return 0; } return 1; } לולאה למציאת מחלקים בדיקה למציאת מספר שמחלק את הקלט לפונקציה במידה ונמצא אז להחזיר 0 אם הגענו לכאן אז אף מחלק לא נמצא והמספר ראשוני
תרגיל 2- פתרון התוכנית הראשית int main() { int num, last; printf(“Enter a number\n"); scanf("%d", &last); for (num = 2; num <= last; num++) if (IsPrime(num) == 1) printf("%d is prime\n", num); return 0; } לולאה להדפסת כל הראשונים עד למספר שנקלט בדיקת ראשוניות
חישוב ערכים באמצעות לולאות נתון הסכום הבא: n (-1)i+1 4 2i -1 i = 1 נכתוב פונקציה שמחשבת אותו
חישוב הסכום הפונקציה double calc_something(int n) { int i,key=1; double result = 0; for (i=1; i<=n ;i++) { result = result + key*(4.0/(2*i-1)); key *= -1; } return result; } החישוב עצמו
תרגיל 3 כתוב פונקציה המקבלת כקלט את הדיוק המבוקש של החישוב. הדרכה: זוהי הכרזת הפונקציה: double calc_something(double eps) { } (-1)i+1 4 הפונקציה תרוץ עד שיתקיים < eps 2i -1
תרגיל 3- פתרון double calc_something(double eps) { int i=1,key=1; double result = 0,expr; do { expr = 4.00/(2*i-1); result = result + key*expr; i++; key *= -1; } while (expr >= eps); return result; } הפונקציה הדיוק
הקשר בין מערכים לפונקציות כיצד נכתוב פונקציה אשר תקבל כפרמטר מערך ? הפונקציה תקבל מערך (את כתובתו) ותדפיס אותו: void PrintArray(int a[ ],int size) { int i; for (i=0;i<size;i++) printf(“%d”,a[i]); }
הקשר בין מערכים לפונקציות הפונקציה תקלוט איברים לתוך מערך void GetArray(int a[ ],int size) { int i; for (i=0;i<size;i++) scanf(“%d”,&a[i]); }
void GetArray(int a[ ],int size); void PrintArray(int a[ ],int size); int main() { int a[10]; GetArray(a,10); PrintArray(a,10); return 0; }
מחרוזות מחרוזת – מחרוזת זה מערך של תווים אשר מסתיים ב ‘\0’. ‘S’ 5000 a[0] char a[6] = “Shai”; printf(“%s”,a); a[1] ‘h’ 5001 a[2] ‘a’ 5002 5003 a[3] ‘i’ a[4] 5004 ‘\0’ a[5] 5005 הדפסה באמצעות %s
מחרוזות הסיום ב‘\0’ מאפשר לנו להעביר מחרוזות לפונקציות מבלי לציין את גודלם!!! פונקציה טיפוסית של מחרוזות תראה כך: void string_func(char s[ ]) { int k; … while (s[k] != ’\0’) … {
#include <stdio.h> int strlen(char str[ ]) { int k = 0; while ( str[k] != ’\0’ ) k++; return k; } int main() { char str[ ]=“LINUX"; printf("%d",strlen(str)); return 0; } מה קורה פה ? 100 101 102 103 104 105 106 L I N U X ‘\0’ str str[k]