Download presentation
Presentation is loading. Please wait.
1
הרצאה 4: מערכים ופונקציות
מבוא למדעי המחשב הרצאה 4: מערכים ופונקציות מבוסס על שקפים שנערכו ע"י שי ארצי, גיתית רוקנשטיין ז"ל, איתן אביאור, סאהר אסמיר,מיכאל אלעד, רון קימל ודן רביב. עדכון אחרון: יחיאל קמחי ,נובמבר 2014
2
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנייה מערכים חישובים סטטיסטיים הנפה של ארטוסתנס תכנות מבני פונקציות תחומי הכרה מבוא למדעי המחשב. כל הזכויות שמורות ©
3
מבוא למדעי המחשב. כל הזכויות שמורות ©
מערכים, מוטיבציה משימה: נתונות 800 משכורות. יש לבצע עליהן מספר פעולות: קליטת הנתונים, חישוב הממוצע, חישוב מספר המשכורות שמעל הממוצע, ומציאת החציון. אבחנות: לא ניתן לבצע את כל הפעולות הללו תוך כדי קליטת הנתונים. לא נרצה להכריז על double sal1, sal2, …, sal800. גם אם נכריז על משתנים אלו, לא נוכל לבצע עליהם פעולות בלולאה. הפתרון – מערכים (arrays)! מבוא למדעי המחשב. כל הזכויות שמורות ©
4
מבוא למדעי המחשב. כל הזכויות שמורות ©
מערכים מערך הינו סדרה (רשימה) של משתנים מאותו הטיפוס שניתן לפנות אליהם בעזרת אינדקס. לדוגמה - מערכים ב-C: איברי המערך מאוחסנים במקומות עוקבים בזיכרון. גודל המערך עליו מכריזים חייב להיות מספר קבוע. 99C מאפשרת הגדרת מערך בגודל משתנה – לשימוש במקרים מיוחדים. האינדקס של האיבר הראשון במערך הוא 0. הגדרת מערך: התייחסות לאיבר במערך: salaries[i] double salaries[800]; salaries[0] salaries[i] מבוא למדעי המחשב. כל הזכויות שמורות ©
5
מבוא למדעי המחשב. כל הזכויות שמורות ©
אתחול מערך באמצעות לולאה: בזמן ההגדרה: קביעת גודל המערך ע"י אתחולו: for (i = 0; i < 800; ++i) scanf("%lf", &salaries[i]); for (i = 0; i < 800; ++i) salaries[i] = 3.5 * i; double prices[3] = {7.49, 9.99, 1.49}; int grades[5] = {100, 97, 79, 0, 0}; int grades[5] = {100, 97, 79}; שקולים int grades[5] = {100, 97, 79, 0, 0}; int grades[] = {100, 97, 79, 0, 0}; שקולים מבוא למדעי המחשב. כל הזכויות שמורות ©
6
דוגמה: ניתוח ערכי משכורות
#include <stdio.h> #define EMPLOYEES_NUM 10 int main() { double salaries[EMPLOYEES_NUM], sum = 0.0; for (int i = 0; i < EMPLOYEES_NUM; ++i) scanf("%lf", &salaries[i]); // Must test success! sum += salaries[i]; double average = sum/EMPLOYEES_NUM; int above_average = 0; above_average += (salaries[i] > average); printf("The average is: %f\n", average); printf("There are %d salaries above the average\n", above_average); return 0; } RUN קלט: סדרת משכורות. פלט: ממוצע איברי הסדרה ומספר המשכורות שמעליו. מבוא למדעי המחשב. כל הזכויות שמורות ©
7
מבוא לסטטיסטיקה: ממוצע
ממוצע של סדרת מספרים מוגדר ע"י: הממוצע ממזער את השגיאה הריבועית L2: מבוא למדעי המחשב. כל הזכויות שמורות ©
8
מבוא לסטטיסטיקה: ממוצע
ממוצע של סדרת מספרים מוגדר ע"י: הממוצע ממזער את השגיאה הריבועית L2: מבוא למדעי המחשב. כל הזכויות שמורות © 8 8
9
מבוא לסטטיסטיקה: חציון
חציון של סדרת מספרים הינו: האיבר בסדרה כך שמספר האיברים בסדרה הגדולים או שווים לו שווה למספר האיברים בסדרה הקטנים או שווים לו. אם מספר האיברים בסדרה הוא זוגי נהוג להגדיר את החציון כממוצע שני האיברים האמצעיים. החציון ממזער את השגיאה בערך מוחלט L1: מבוא למדעי המחשב. כל הזכויות שמורות ©
10
מבוא לסטטיסטיקה: חציון
חציון של סדרת מספרים הינו: האיבר בסדרה כך שמספר האיברים בסדרה הגדולים או שווים לו שווה למספר האיברים בסדרה הקטנים או שווים לו. אם מספר האיברים בסדרה הוא זוגי נהוג להגדיר את החציון כממוצע שני האיברים האמצעיים. החציון ממזער את השגיאה בערך מוחלט L1: מבוא למדעי המחשב. כל הזכויות שמורות © 10 10
11
מציאת חציון כשהנתונים תחומים
בהינתן שהנתונים נמצאים בתוך תחום מוגדר, ניתן למצוא את החציון ע"י בניית היסטוגרמה (גרף שכיחויות) ומעבר על הערכים האפשריים באופן סדרתי עד לערך שחצי מהנתונים ערכם מתחתיו. לדוגמה, אם יש נתונים 11 ציונים בתחום 0-10: 1 2 5 6 3 7 9 4 5 5 5 10 9 7 6 5 5 7 9 3 4 5 6 7 9 10 1 2 3 4 5 6 7 8 9 10 מבוא למדעי המחשב. כל הזכויות שמורות ©
12
מציאת חציון כשהנתונים תחומים
בהינתן שהנתונים נמצאים בתוך תחום מוגדר, ניתן למצוא את החציון ע"י בניית היסטוגרמה (גרף שכיחויות) ומעבר על הערכים האפשריים באופן סדרתי עד לערך שחצי מהנתונים ערכם מתחתיו. לדוגמה, אם יש נתונים 11 ציונים בתחום 0-10: 6 5 5 7 9 3 4 5 6 7 9 10 1 2 3 4 5 6 7 8 9 10 מבוא למדעי המחשב. כל הזכויות שמורות © 12 12
13
דוגמה: מציאת חציון ציונים
#include <stdio.h> #define GRADES_NUM 11 #define MAX_GRADE 100 #define MIN_GRADE 0 int main() { int histogram[MAX_GRADE - MIN_GRADE + 1] = {0}; for (int i = 0; i < GRADES_NUM; ++i) { int current; scanf("%d", ¤t); ++histogram[current – MIN_GRADE]; } int i = 0 , median = -1; while (i <= GRADES_NUM/2) { ++median; i += histogram[median]; printf("The median is: %d", median + MIN_GRADE); ... RUN קלט: סדרת ציונים (0-100). הנחה: מספר א"ז של ערכים. פלט: הציון החציון. מבוא למדעי המחשב. כל הזכויות שמורות ©
14
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנייה מערכים חישובים סטטיסטיים הנפה של ארטוסתנס תכנות מבני פונקציות תחומי הכרה מבוא למדעי המחשב. כל הזכויות שמורות ©
15
מבוא למדעי המחשב. כל הזכויות שמורות ©
פירוק מספר שלם לגורמים המשפט היסודי של האלגברה: כל מספר שלם גדול מ-1 ניתן לכתיבה באופן יחיד כ כאשר מספרים ראשוניים. הגדרת הבעיה: קלט: מספר שלם חיובי N. פלט: רשימת המספרים הראשוניים בתחום 2,3,…,n . פתרון אפשרי: לכל מספר בתחום נריץ את בדיקת הראשוניות שהכרנו. בעיה: בדיקת הראשוניות לפי מחלקים באופן נפרד לכל אחד מהמספרים היא פעולה יקרה (בזמן). אנו נציע שיטה יעילה הרבה יותר. מבוא למדעי המחשב. כל הזכויות שמורות ©
16
הנפה של ארטוסתנס (Sieve of Eratosthenes)
אבחנה: כדי לבדוק האם m ראשוני, די אם ננסה לחלקו במספרים הראשוניים בתחום הרעיון: (~200BC) נשמור במערך את המידע לגבי המספרים הראשוניים ועבור כל מספר בהמשך ניעזר במערך כדי לבדוק האם הוא ראשוני אם לאו. מבוא למדעי המחשב. כל הזכויות שמורות ©
17
מבוא למדעי המחשב. כל הזכויות שמורות ©
נפה, תיאור האלגוריתם סמן את כל המספרים כראשוניים (כל מספר הוא ראשוני עד שיוכח אחרת). עבור סדרתית על המספרים לכל מספר שמסומן ראשוני, סמן את כל הכפולות שלו כמספרים פריקים (מדוע אפשר להתחיל בכפולה * ?). דוגמא עבור N=37: 2 3 4 4 4 5 6 6 6 7 7 8 8 8 9 9 9 10 10 10 11 11 12 12 12 12 12 12 13 13 14 14 14 14 14 14 15 16 16 16 16 17 18 18 19 19 20 20 20 21 21 21 22 22 22 23 23 24 24 24 24 24 24 25 25 26 26 26 26 26 26 27 28 28 28 28 29 29 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 32 32 33 33 33 34 34 34 35 35 36 36 36 36 36 37 מבוא למדעי המחשב. כל הזכויות שמורות ©
18
מבוא למדעי המחשב. כל הזכויות שמורות ©
נפה, פרטי מימוש נשתמש במערך prime[] אשר גודלו N+1 (בשל ההתחלה ב-0). prime[i] הוא דגל המציין האם המספר i הינו ראשוני. נסמן את כל המספרים כראשוניים – נאתחל את המערך ב-true . נעבור בלולאה על המספרים אם ראשוני (prime[p]==true), נסמן את כפולותיו כמספרים פריקים (השמת false ). לבסוף: נקבל ש- prime[i]==true אםם i מספר ראשוני. מבוא למדעי המחשב. כל הזכויות שמורות ©
19
מבוא למדעי המחשב. כל הזכויות שמורות ©
נפה, קוד #include <stdio.h> #include <math.h> #include <stdbool.h> // C99 #define N 37 int main() { int sqrt_N = (int)(sqrt(N) +.5); bool prime[N+1]; // C99 for (int i = 0; i < N+1; ++i){ // C99 prime[i] = true; // C99 } מבוא למדעי המחשב. כל הזכויות שמורות ©
20
מבוא למדעי המחשב. כל הזכויות שמורות ©
נפה, קוד - המשך for (int p = 2; p <= sqrt_N; ++p) { if (prime[p]) { for (int i = p; i <= N/p; ++i) { prime[i*p] = false; // C99 } printf("The prime integers between 2 and %d are\n", N); for (int i = 2; i <= N; ++i) { if (prime[i]) { printf("%d\n", i); return 0; RUN מבוא למדעי המחשב. כל הזכויות שמורות ©
21
מבוא למדעי המחשב. כל הזכויות שמורות ©
איך השניים משתווים? כתבנו תוכנית המריצה את שתי האפשרויות: הנפה של ארטוסתנס בדיקת ראשוניות לכל ערך בתחום 2 ועד N בשיטה היעילה. המטרה – לבחון כמה יעילה יותר שיטתו של ארטוסתנס. לשם כך: בחרנו N=600,000 (נדרש שינוי בהגדרת sieve להיות char). ההדפסות החוצה נוטרלו על מנת לא להשפיע (הן דומיננטיות) התהליך בוצע 100 פעמים לשם "ניפוח" זמן הביצוע לעשרות שניות. התוצאה: הנפה של ארטוסתנס – 4 שניות בדיקת ראשוניות לכל ערך – 45 שניות. מבוא למדעי המחשב. כל הזכויות שמורות ©
22
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנייה מערכים חישובים סטטיסטיים הנפה של ארטוסתנס תכנות מבני פונקציות מבוא למדעי המחשב. כל הזכויות שמורות ©
23
מבוא למדעי המחשב. כל הזכויות שמורות ©
Top-Down Design ככל שהבעיה מורכבת יותר, התוכנית הופכת להיות יותר ויותר גדולה: קשה לעקוב אחר מהלך התוכנית הענקית. קשה לפתח, להבין, לתקן או לשפר את התוכנית. קטעי קוד דומים חוזרים על עצמם במקומות שונים בתוכנית. נרצה מנגנון מודולארי שבעזרתו נוכל לבנות את התוכנית ע"י חלוקתה לחלקים קטנים, ובניית כל חלק בנפרד: יהיה קל לעקוב אחר מהלך כל חלק בנפרד. יהיה קל לפתח, להבין, לנפות, לתקן ולשפר את התוכנית. ניתן יהיה לעשות שימוש חוזר בקטעי קוד. עקרון חשוב לתכלית: SRP – The Single Responsibility Principle כל קטע קוד אחראי על ביצוע משימה יחידה (ובנוסף) אין שכפול קוד; כלומר, כל משימה מבוצעת ע"י קוד יחיד. מבוא למדעי המחשב. כל הזכויות שמורות ©
24
מבוא למדעי המחשב. כל הזכויות שמורות ©
Top-Down Design פתרון בעיה מורכבת נעשה ע"י פירוק הבעיה לתת-בעיות קטנות ופשוטות (הדבר נכון בהוכחות מתמטיות, מתכון בישול, וכדומה). לדוגמה, הכנת ספגטי בולונז: void spaghetti_bolognese() { prepare_spaghetti(); prepare_sauce(SPICY); mix(); serve(); } void prepare_spaghetti () { boil_water(); add_spaghetti(); while(!ready()) wait(2); } מבוא למדעי המחשב. כל הזכויות שמורות ©
25
מבוא למדעי המחשב. כל הזכויות שמורות ©
פונקציות כתיבת תוכנית C בשיטת top-down מבוססת על מנגנון הפונקציות. תוכנית C בנויה מאוסף של פונקציות. אחת מהפונקציות הינה main(), והיא הראשונה שמופעלת. פונקציה יכולה לקרוא לכל פונקציה בתכנית (כולל לעצמה!). חלוקה לפונקציות מונעת שכפול קוד, תורמת לקריאות התכנית ומאפשרת שיתוף חלקי קוד וחבילות תוכנה בין תכניות שונות. מבוא למדעי המחשב. כל הזכויות שמורות ©
26
דוגמה - GCDלשלושה מספרים
להזכירכם – אנו יודעים לפתור בעיה זו ביעילות לצמדים. כיצד נכליל זאת לשלשות? דוגמה: מהו ה- GCD של המספרים {840, 462, 2926}? דרך הפתרון (להבנה מתמטית ולא ליישום אלגוריתמי בהכרח) הינה פירוק כל אחד מהמספרים למכפלת ראשוניים a = 840 = 2 * 2 * 2 * 3 * 5 * 7 b = 462 = 2 * 3 * 7 * 11 c = 2926 = 2 * 7 * 11 * 19 2. מציאת החיתוך בגורמים הראשוניים הללו – 2 ו-7 – כלומר 14. חיתוך בין השלושה ניתן לביצוע בשני שלבים: חישוב חיתוך בין שני הראשונים - למעשה gcd(a,b) - אשר ייתן את התוצאה 2 * 3 * 7 כלומר – 42. חישוב חיתוך בין תוצאת הסעיף הקודם לאיבר השלישי, דהיינו, gcd(gcd(a,b),c). מבוא למדעי המחשב. כל הזכויות שמורות ©
27
דוגמה - GCDלשלושה מספרים
.gcd(a,b,c)=gcd(gcd(a,b),c))נשתמש בתכונה הגדרה #include <stdio.h> int gcd(int, int); int main(void) { int a, b, c; scanf("%d%d%d", &a, &b, &c); int g_ab = gcd(a, b); int g_abc = gcd(g_ab, c); printf("gcd: %d",g_abc); return 0; } int gcd(int m, int n) { if (m < 0) m = -m; if (n < 0) n = -n; while (n != 0) { int tmp = n; n = m % n; m = tmp; } return m; הכרזה קריאה קריאה מבוא למדעי המחשב. כל הזכויות שמורות ©
28
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנייה מערכים חישובים סטטיסטיים הנפה של ארטוסתנס תכנות מבני פונקציות מבוא למדעי המחשב. כל הזכויות שמורות ©
29
מבוא למדעי המחשב. כל הזכויות שמורות ©
הגדרת פונקציה return-type function-name(parameters-list) { variable definitions statements return statement } גוף הפונקציה שימו לב, לעיתים ייעשה שימוש במילת המפתח void. מילה זו משמשת לציון הדברים הבאים: רשימת פרמטרים ריקה, למשל: פונקציה שאינה מחזירה ערך, למשל: דוגמות: int getchar(void) void print_result(int) מבוא למדעי המחשב. כל הזכויות שמורות ©
30
מבוא למדעי המחשב. כל הזכויות שמורות ©
קריאה לפונקציה עבור הפונקציה שהוכרזה: נניח כי הקריאה אליה בגוף התוכנית הינה: מה מתבצע בעת הקריאה לפונקציה? מוקצים תאי זיכרון עבור המשתנים הנמצאים בהגדרת הפונקציה. מחושבים הביטויים הנמצאים ברשימת הארגומנטים המופיעים בקריאה לפונקציה (פרמטרים אקטואליים). סדר החישוב אינו מוגדר. ערך כל ביטוי מוכנס למשתנה המתאים. להעברת פרמטרים כזו קוראים call by value. לדוגמה, הקריאה לא תשנה את ערכי המשתנים x,y (המוגדרים ב-main) בתוכנית אלא תעתיקם למשתני הפונקציה. מוקצים המשתנים המוגדרים בגוף הפונקציה ומתבצע קוד הפונקציה. double evaluate_func(double x, double y); z = evaluate_func(99.9*a, 2*lambda); z=evaluate_func(x,y); מבוא למדעי המחשב. כל הזכויות שמורות ©
31
מבוא למדעי המחשב. כל הזכויות שמורות ©
חזרה מפונקציה כיצד מתבצעת החזרה מפונקציה? ניתן להחזיר ערך לסביבה הקוראת באמצעות משפט return. לאחר ביצוע המשפט return או בסוף הפונקציה, משוחרר הזיכרון שהוקצה עבור משתני הפונקציה וחוזרים לבצע את קוד הפונקציה הקוראת, מהמקום בו הופסק. במידת הצורך מתבצעת המרת טיפוסים אוטומטית: ייצוג הערך המוחזר מומר בהתאם לטיפוס ההחזרה המצוין בהגדרת הפונקציה. מבוא למדעי המחשב. כל הזכויות שמורות ©
32
קריאה וחזרה מפונקציה - דוגמה
m n int gcd(int m, int n) { ... return m; } int foo(void) d = gcd(9-1, 2); return gcd(5 , d); 2 5 ? 8 1 2 ? 2 d ? 2 2 8 1 2 מבוא למדעי המחשב. כל הזכויות שמורות ©
33
מבוא למדעי המחשב. כל הזכויות שמורות ©
הכרזה על פונקציה לפני קריאה לפונקציה צריכה להופיע בקובץ הגדרה שלה או הכרזה עליה. ההכרזה (declaration) מיידעת את הקומפיילר לגבי טיפוס החזרה, מספר הפרמטרים וטיפוסיהם. הכרזה זו מאפשרת לבצע המרות טיפוסים אוטומטיות במידת הצורך. ניתן לייבא הכרזה מקובץ בסיומת .h (בדומה לייבוא ההכרזות על printf ו-scanf מ-stdio.h). דוגמאות להכרזות: double sqrt(double); long power(int, int); long power(int base, int exponent); מה עדיף? מבוא למדעי המחשב. כל הזכויות שמורות ©
34
ארגון קובץ שבו מספר פונקציות
בראש הקובץ מופיעות ההכרזות. לאחר מכן מוגדרות הפונקציות (מסודרות, למשל, לפי עקרון top-down design) . מיקום ההכרזות וההגדרות בקובץ נפרד בעל סיומת .h והכללתו בתכנית באמצעות הוראת include# מתאימה (שימו לב לשוני המותר ב-include). אם ניתן, מותר לארגן את הקובץ כך שכל פונקציה תוגדר לפני השימוש בה (לא מומלץ). #include <...> int max(int a, int b); int min(int a, int b); int main(void) { max(x,y); ... } int max(int a, int b) { ... } int min(int a, int b) { ... } #include <...> #include "minmax.h" int main(void) { max(x,y); ... } #include <...> int max(int a, int b) { ... } int min(int a, int b) { ... } int main(void) { max(x,y); ... } מבוא למדעי המחשב. כל הזכויות שמורות ©
35
מחסנית הקריאות והמשתנים
מחסנית היא מבנה נתונים הפועל בצורה דומה לזו של מחסנית רובה: האיבר שנכנס ראשון למחסנית יוצא ממנה אחרון (תכונה זו מכונה LIFO - Last In First Out). מחסנית קריאות ומשתנים הינה מחסנית מיוחדת השומרת מידע אודות הפונקציות שמתבצעות כרגע ומשתניהם. כאשר פונקציה נקראת, דוחפים למחסנית את כתובת החזרה ואת הפרמטרים שנשלחים לפונקציה. הקצאת הזיכרון למשתנים המקומיים של הפונקציה הנקראת נעשית אף היא על המחסנית. ביציאה מהפונקציה, מוציאים את המידע הנ"ל מהמחסנית ומשתמשים בכתובת החזרה כדי לקפוץ לביצוע הפקודה הבאה בפונקציה הקוראת. תמיד מתקיים: הנתונים של הפונקציה הנוכחית בראש המחסנית. מבוא למדעי המחשב. כל הזכויות שמורות ©
36
התפתחות מחסנית הקריאות בדוגמה
3 IsPrime() n = 8 i, sqrt_n main() num = 8 sqrt() 2 IsPrime() n = 8 i, sqrt_n main() num = 8 4 IsPrime() n = 8 i, sqrt_n main() num = 8 1 main() num = 8 bool IsPrime(int n) { if (n < 0) n = -n; if (n == 2) return true; if (n % 2 == 0 || n < 2) return false; int sqrt_n = Round2Whole(sqrt(n)); for (int i = 3; i <= sqrt_n; i += 2) { if(n % i == 0) return false; } return true; 6 IsPrime() n = 8 i, sqrt_n floor() main() num = 8 Round2Whole() frac = 2.8 sign 5 IsPrime() n = 8 i, sqrt_n main() num = 8 Round2Whole() frac = 2.8 sign מבוא למדעי המחשב. כל הזכויות שמורות ©
37
התפתחות מחסנית הקריאות בדוגמה
3 IsPrime() n = 8 i, sqrt_n main() num = 8 sqrt() 2 IsPrime() n = 8 i, sqrt_n main() num = 8 4 IsPrime() n = 8 i, sqrt_n main() num = 8 1 main() num = 8 bool IsPrime(int n) { if (n < 0) n = -n; if (n == 2) return true; if (n % 2 == 0 || n < 2) return false; int sqrt_n = Round2Whole(sqrt(n)); for (int i = 3; i <= sqrt_n; i += 2) { if(n % i == 0) return false; } return true; 6 IsPrime() n = 8 i, sqrt_n floor() main() num = 8 Round2Whole() frac = 2.8 sign 5 IsPrime() n = 8 i, sqrt_n main() num = 8 Round2Whole() frac = 2.8 sign 7 IsPrime() n = 8 i, sqrt_n main() num = 8 Round2Whole() frac = 2.8 sign 8 IsPrime() n = 8, i sqrt_n = 3 main() num = 8 מבוא למדעי המחשב. כל הזכויות שמורות © 42 42
38
חזרה לאלגוריתם Newton-Raphson
#include <stdio.h> #define MAX_ITERATIONS 10 double f(double x); double fd(double x); int main() { double a; scanf("%lf", &a); double fa = f(a); for (int i = 0; i < MAX_ITERATIONS && (fa != 0); ++i) { fa = f(a); double fda = fd(a); a = a - fa/fda; printf("Iteration: %d, Solution: %.12f\n", i, a); } printf("Solution is: %.12f\n", a); return 0; double f(double x) { return x*x-9; } double fd(double x) return 2*x; מבוא למדעי המחשב. כל הזכויות שמורות ©
39
תוכנית דוגמה: המשולש הגדול ביותר
נרצה לכתוב תוכנית המקבלת קואורדינאטות של משולשים, מדפיסה את השטח של כל משולש ולבסוף את השטח הגדול ביותר שנצפה. נניח כי אנו גם רוצים חישוב של סך החישובים שמבצעת התוכנית. a=d12 b=d13 c=d23 נוסחת הירון: x3,y3 x2,y2 x1,y1 מבוא למדעי המחשב. כל הזכויות שמורות ©
40
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנית דוגמה - המשך #include <stdio.h> #include <math.h> double distance (double x1, double y1, double x2, double y2); double heron (double a, double b, double c); double tri_area (double x1, double y1, double x2, double y2, double x3, double y3); int cnt = 0; /* counter of computations */ 6 הרצאה מבוא למדעי המחשב. כל הזכויות שמורות ©
41
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנית דוגמה - המשך int main ( void ) { double x1, x2, x3, y1, y2, y3, max_area = 0; printf("\nEnter coordinates of triangle vertices: "); while (6==scanf("%lf%lf%lf%l …",&x1,&y1,&x2,&y2,&x3,&y3)){ double area = tri_area(x1, y1, x2, y2, x3, y3); cnt++ ; if (area > max_area) max_area = area; printf("\nThe area of the triangle is %lf\n", area); printf("\nThe number of ops. so far is %d\n", cnt); } printf("\nThe maximum triangle area is %lf", max_area); return 0; 6 הרצאה מבוא למדעי המחשב. כל הזכויות שמורות ©
42
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנית דוגמה - המשך double distance(double x1, double y1, double x2, double y2) { cnt += 8; return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); } double heron(double a, double b, double c) //Should we check that the input is valid? double p = (a + b + c) / 2; cnt += 10; return sqrt(p * (p-a) * (p-b) * (p-c)); 6 הרצאה מבוא למדעי המחשב. כל הזכויות שמורות ©
43
מבוא למדעי המחשב. כל הזכויות שמורות ©
תוכנית דוגמה - המשך double tri_area (double x1, double y1, double x2, double y2, double x3, double y3) { double d12, d13, d23; d12 = distance(x1, y1, x2, y2); d13 = distance(x1, y1, x3, y3); d23 = distance(x2, y2, x3, y3); return heron(d12, d23, d13); } RUN 6 הרצאה מבוא למדעי המחשב. כל הזכויות שמורות ©
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.