הרצאה 4: מערכים ופונקציות

Slides:



Advertisements
Similar presentations
1 1-d Arrays. 2 Array Many applications require multiple data items that have common characteristics  In mathematics, we often express such groups of.
Advertisements

TK1913-C Programming1 TK1913-C Programming 1 C Library Functions C provides a collection of library functions for programmers If these library functions.
Declarations/Data Types/Statements. Assignments Due – Homework 1 Reading – Chapter 2 – Lab 1 – due Monday.
CMSC 104, Version 8/061L22Arrays1.ppt Arrays, Part 1 of 2 Topics Definition of a Data Structure Definition of an Array Array Declaration, Initialization,
Programming Variables. Named area in the computer memory, intended to contain values of a certain kind (integers, real numbers, characters etc.) They.
Computer Science 210 Computer Organization Introduction to C.
Chapter 6: Control Structures Computer Programming Skills Second Term Department of Computer Science Foundation Year Program Umm Alqura.
1 C Programming Week 2 Variables, flow control and the Debugger.
Lecture 4: Calculating by Iterating. The while Repetition Statement Repetition structure Programmer specifies an action to be repeated while some condition.
C Programming Lecture 7 : Control Structures. Control Structures Conditional statement : if, switch Determine a block of statements to execute depending.
Introduction to Programming
CECS 130 EXAM 1. To declare a constant (read only) value: const int x = 20; const float PI = 3.14; Can we do this? const int x;
USER DEFINED FUNCTIONS Computer Programming Asst. Prof. Dr. Choopan Rattanapoka and Asst. Prof. Dr. Suphot Chunwiphat.
Functions: Part 2 of /11/10: Lecture 16 CMSC 104, Section 0101 John Y. Park 1.
Sudeshna Sarkar, IIT Kharagpur 1 Functions Lecture
Sesi 0607EKT120/4 Computer Programming Week 5 – Repetition / Loops.
 Real numbers representation - Floating Point Notation  First C Program  Variables Declaration  Data Types in C ◦ char, short, int, long, float, double,
Week 3.  TO PRINT NUMBERS FROM 1 TO 20  TO PRINT EVEN NUMBERS FROM 1 TO 20 2.
EKT120: Computer Programming
CS1001 Programing Fundamental Lecture 5 Top-Down Design with Functions
Computer Science 210 Computer Organization
EKT120 COMPUTER PROGRAMMING
EKT150 INTRODUCTION TO COMPUTER PROGRAMMING
2008/11/19: Lecture 18 CMSC 104, Section 0101 John Y. Park
ICS103 Programming in C Lecture 10: Functions II
Functions, Part 2 of 2 Topics Functions That Return a Value
The Three Attributes of an Identifier
CS1010 Programming Methodology
Week 4 – Repetition Structures / Loops
Functions Department of Computer Science-BGU יום רביעי 12 ספטמבר 2018.
مبانی کامپیوتر و برنامه سازی
2008/11/10: Lecture 16 CMSC 104, Section 0101 John Y. Park
Control Structures Lecture 7.
Computer Science 210 Computer Organization
Looping.
Compiled and ready to run Memory Stack /*
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Functions Chapter 9 Copyright © 2008 W. W. Norton & Company. 1
הרצאה 6: כתובות ומצביעים הקצאה דינמית מחרוזות
EKT150 : Computer Programming
CSC215 Homework Homework 04 Due date: Oct 14, 2016.
Functions, Part 2 of 3 Topics Functions That Return a Value
Lecture4.
A function with one argument
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Dr Tripty Singh Tutorial for Fuctions
Week 2 Variables, flow control and the Debugger
Week 6 CPS125.
Computer Programming Techniques Semester 1, 1998
Arrays, Part 1 of 2 Topics Definition of a Data Structure
Week 6 CPS125.
Functions Extra Examples.
Functions Department of Computer Science-BGU יום שישי 26 אפריל 2019.
Recursion.
ICS103 Programming in C Lecture 10: Functions II
ICS103 Programming in C Lecture 11: Recursive Functions
2008/11/19: Lecture 18 CMSC 104, Section 0101 John Y. Park
Arrays, Part 1 of 2 Topics Definition of a Data Structure
ICS103 Programming in C Lecture 12: Arrays I
Arrays, Part 1 of 2 Topics Definition of a Data Structure
CSCE 206 Lab Structured Programming in C
Functions, Part 2 of 3 Topics Functions That Return a Value
FUNCTION ||.
ICS103 Programming in C Lecture 10: Functions II
Functions, Part 2 of 3 Topics Functions That Return a Value
Presentation transcript:

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

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

מבוא למדעי המחשב. כל הזכויות שמורות © מערכים, מוטיבציה משימה: נתונות 800 משכורות. יש לבצע עליהן מספר פעולות: קליטת הנתונים, חישוב הממוצע, חישוב מספר המשכורות שמעל הממוצע, ומציאת החציון. אבחנות: לא ניתן לבצע את כל הפעולות הללו תוך כדי קליטת הנתונים. לא נרצה להכריז על double sal1, sal2, …, sal800. גם אם נכריז על משתנים אלו, לא נוכל לבצע עליהם פעולות בלולאה. הפתרון – מערכים (arrays)! מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © מערכים מערך הינו סדרה (רשימה) של משתנים מאותו הטיפוס שניתן לפנות אליהם בעזרת אינדקס. לדוגמה - מערכים ב-C: איברי המערך מאוחסנים במקומות עוקבים בזיכרון. גודל המערך עליו מכריזים חייב להיות מספר קבוע. 99C מאפשרת הגדרת מערך בגודל משתנה – לשימוש במקרים מיוחדים. האינדקס של האיבר הראשון במערך הוא 0. הגדרת מערך: התייחסות לאיבר במערך: salaries[i] double salaries[800]; salaries[0] salaries[i] מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © אתחול מערך באמצעות לולאה: בזמן ההגדרה: קביעת גודל המערך ע"י אתחולו: 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}; שקולים מבוא למדעי המחשב. כל הזכויות שמורות ©

דוגמה: ניתוח ערכי משכורות #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 קלט: סדרת משכורות. פלט: ממוצע איברי הסדרה ומספר המשכורות שמעליו. מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא לסטטיסטיקה: ממוצע ממוצע של סדרת מספרים מוגדר ע"י: הממוצע ממזער את השגיאה הריבועית L2: מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא לסטטיסטיקה: ממוצע ממוצע של סדרת מספרים מוגדר ע"י: הממוצע ממזער את השגיאה הריבועית L2: מבוא למדעי המחשב. כל הזכויות שמורות © 8 8

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

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

מציאת חציון כשהנתונים תחומים בהינתן שהנתונים נמצאים בתוך תחום מוגדר, ניתן למצוא את החציון ע"י בניית היסטוגרמה (גרף שכיחויות) ומעבר על הערכים האפשריים באופן סדרתי עד לערך שחצי מהנתונים ערכם מתחתיו. לדוגמה, אם יש נתונים 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 מבוא למדעי המחשב. כל הזכויות שמורות ©

מציאת חציון כשהנתונים תחומים בהינתן שהנתונים נמצאים בתוך תחום מוגדר, ניתן למצוא את החציון ע"י בניית היסטוגרמה (גרף שכיחויות) ומעבר על הערכים האפשריים באופן סדרתי עד לערך שחצי מהנתונים ערכם מתחתיו. לדוגמה, אם יש נתונים 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

דוגמה: מציאת חציון ציונים #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", &current); ++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). הנחה: מספר א"ז של ערכים. פלט: הציון החציון. מבוא למדעי המחשב. כל הזכויות שמורות ©

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

מבוא למדעי המחשב. כל הזכויות שמורות © פירוק מספר שלם לגורמים המשפט היסודי של האלגברה: כל מספר שלם גדול מ-1 ניתן לכתיבה באופן יחיד כ- כאשר מספרים ראשוניים. הגדרת הבעיה: קלט: מספר שלם חיובי N. פלט: רשימת המספרים הראשוניים בתחום 2,3,…,n . פתרון אפשרי: לכל מספר בתחום נריץ את בדיקת הראשוניות שהכרנו. בעיה: בדיקת הראשוניות לפי מחלקים באופן נפרד לכל אחד מהמספרים היא פעולה יקרה (בזמן). אנו נציע שיטה יעילה הרבה יותר. מבוא למדעי המחשב. כל הזכויות שמורות ©

הנפה של ארטוסתנס (Sieve of Eratosthenes) אבחנה: כדי לבדוק האם m ראשוני, די אם ננסה לחלקו במספרים הראשוניים בתחום . הרעיון: (~200BC) נשמור במערך את המידע לגבי המספרים הראשוניים ועבור כל מספר בהמשך ניעזר במערך כדי לבדוק האם הוא ראשוני אם לאו. מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © נפה, תיאור האלגוריתם סמן את כל המספרים כראשוניים (כל מספר הוא ראשוני עד שיוכח אחרת). עבור סדרתית על המספרים . לכל מספר שמסומן ראשוני, סמן את כל הכפולות שלו כמספרים פריקים (מדוע אפשר להתחיל בכפולה * ?). דוגמא עבור 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 מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © נפה, פרטי מימוש נשתמש במערך prime[] אשר גודלו N+1 (בשל ההתחלה ב-0). prime[i] הוא דגל המציין האם המספר i הינו ראשוני. נסמן את כל המספרים כראשוניים – נאתחל את המערך ב-true . נעבור בלולאה על המספרים אם ראשוני (prime[p]==true), נסמן את כפולותיו כמספרים פריקים (השמת false ). לבסוף: נקבל ש- prime[i]==true אםם i מספר ראשוני. מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © נפה, קוד #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 } מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © נפה, קוד - המשך 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 מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © איך השניים משתווים? כתבנו תוכנית המריצה את שתי האפשרויות: הנפה של ארטוסתנס בדיקת ראשוניות לכל ערך בתחום 2 ועד N בשיטה היעילה. המטרה – לבחון כמה יעילה יותר שיטתו של ארטוסתנס. לשם כך: בחרנו N=600,000 (נדרש שינוי בהגדרת sieve להיות char). ההדפסות החוצה נוטרלו על מנת לא להשפיע (הן דומיננטיות) התהליך בוצע 100 פעמים לשם "ניפוח" זמן הביצוע לעשרות שניות. התוצאה: הנפה של ארטוסתנס – 4 שניות בדיקת ראשוניות לכל ערך – 45 שניות. מבוא למדעי המחשב. כל הזכויות שמורות ©

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

מבוא למדעי המחשב. כל הזכויות שמורות © Top-Down Design ככל שהבעיה מורכבת יותר, התוכנית הופכת להיות יותר ויותר גדולה: קשה לעקוב אחר מהלך התוכנית הענקית. קשה לפתח, להבין, לתקן או לשפר את התוכנית. קטעי קוד דומים חוזרים על עצמם במקומות שונים בתוכנית. נרצה מנגנון מודולארי שבעזרתו נוכל לבנות את התוכנית ע"י חלוקתה לחלקים קטנים, ובניית כל חלק בנפרד: יהיה קל לעקוב אחר מהלך כל חלק בנפרד. יהיה קל לפתח, להבין, לנפות, לתקן ולשפר את התוכנית. ניתן יהיה לעשות שימוש חוזר בקטעי קוד. עקרון חשוב לתכלית: SRP – The Single Responsibility Principle כל קטע קוד אחראי על ביצוע משימה יחידה (ובנוסף) אין שכפול קוד; כלומר, כל משימה מבוצעת ע"י קוד יחיד. מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © Top-Down Design פתרון בעיה מורכבת נעשה ע"י פירוק הבעיה לתת-בעיות קטנות ופשוטות (הדבר נכון בהוכחות מתמטיות, מתכון בישול, וכדומה). לדוגמה, הכנת ספגטי בולונז: void spaghetti_bolognese() { prepare_spaghetti(); prepare_sauce(SPICY); mix(); serve(); } void prepare_spaghetti () { boil_water(); add_spaghetti(); while(!ready()) wait(2); } מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © פונקציות כתיבת תוכנית C בשיטת top-down מבוססת על מנגנון הפונקציות. תוכנית C בנויה מאוסף של פונקציות. אחת מהפונקציות הינה main(), והיא הראשונה שמופעלת. פונקציה יכולה לקרוא לכל פונקציה בתכנית (כולל לעצמה!). חלוקה לפונקציות מונעת שכפול קוד, תורמת לקריאות התכנית ומאפשרת שיתוף חלקי קוד וחבילות תוכנה בין תכניות שונות. מבוא למדעי המחשב. כל הזכויות שמורות ©

דוגמה - 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). מבוא למדעי המחשב. כל הזכויות שמורות ©

דוגמה - 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; הכרזה קריאה קריאה מבוא למדעי המחשב. כל הזכויות שמורות ©

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

מבוא למדעי המחשב. כל הזכויות שמורות © הגדרת פונקציה return-type function-name(parameters-list) { variable definitions statements return statement } גוף הפונקציה שימו לב, לעיתים ייעשה שימוש במילת המפתח void. מילה זו משמשת לציון הדברים הבאים: רשימת פרמטרים ריקה, למשל: פונקציה שאינה מחזירה ערך, למשל: דוגמות: http://www.cs.technion.ac.il/users/yechiel/CS/C-Programs int getchar(void) void print_result(int) מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © קריאה לפונקציה עבור הפונקציה שהוכרזה: נניח כי הקריאה אליה בגוף התוכנית הינה: מה מתבצע בעת הקריאה לפונקציה? מוקצים תאי זיכרון עבור המשתנים הנמצאים בהגדרת הפונקציה. מחושבים הביטויים הנמצאים ברשימת הארגומנטים המופיעים בקריאה לפונקציה (פרמטרים אקטואליים). סדר החישוב אינו מוגדר. ערך כל ביטוי מוכנס למשתנה המתאים. להעברת פרמטרים כזו קוראים 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); מבוא למדעי המחשב. כל הזכויות שמורות ©

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

קריאה וחזרה מפונקציה - דוגמה 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 מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © הכרזה על פונקציה לפני קריאה לפונקציה צריכה להופיע בקובץ הגדרה שלה או הכרזה עליה. ההכרזה (declaration) מיידעת את הקומפיילר לגבי טיפוס החזרה, מספר הפרמטרים וטיפוסיהם. הכרזה זו מאפשרת לבצע המרות טיפוסים אוטומטיות במידת הצורך. ניתן לייבא הכרזה מקובץ בסיומת .h (בדומה לייבוא ההכרזות על printf ו-scanf מ-stdio.h). דוגמאות להכרזות: double sqrt(double); long power(int, int); long power(int base, int exponent); מה עדיף? מבוא למדעי המחשב. כל הזכויות שמורות ©

ארגון קובץ שבו מספר פונקציות בראש הקובץ מופיעות ההכרזות. לאחר מכן מוגדרות הפונקציות (מסודרות, למשל, לפי עקרון 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); ... } מבוא למדעי המחשב. כל הזכויות שמורות ©

מחסנית הקריאות והמשתנים מחסנית היא מבנה נתונים הפועל בצורה דומה לזו של מחסנית רובה: האיבר שנכנס ראשון למחסנית יוצא ממנה אחרון (תכונה זו מכונה LIFO - Last In First Out). מחסנית קריאות ומשתנים הינה מחסנית מיוחדת השומרת מידע אודות הפונקציות שמתבצעות כרגע ומשתניהם. כאשר פונקציה נקראת, דוחפים למחסנית את כתובת החזרה ואת הפרמטרים שנשלחים לפונקציה. הקצאת הזיכרון למשתנים המקומיים של הפונקציה הנקראת נעשית אף היא על המחסנית. ביציאה מהפונקציה, מוציאים את המידע הנ"ל מהמחסנית ומשתמשים בכתובת החזרה כדי לקפוץ לביצוע הפקודה הבאה בפונקציה הקוראת. תמיד מתקיים: הנתונים של הפונקציה הנוכחית בראש המחסנית. מבוא למדעי המחשב. כל הזכויות שמורות ©

התפתחות מחסנית הקריאות בדוגמה 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 מבוא למדעי המחשב. כל הזכויות שמורות ©

התפתחות מחסנית הקריאות בדוגמה 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

חזרה לאלגוריתם 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; מבוא למדעי המחשב. כל הזכויות שמורות ©

תוכנית דוגמה: המשולש הגדול ביותר נרצה לכתוב תוכנית המקבלת קואורדינאטות של משולשים, מדפיסה את השטח של כל משולש ולבסוף את השטח הגדול ביותר שנצפה. נניח כי אנו גם רוצים חישוב של סך החישובים שמבצעת התוכנית. a=d12 b=d13 c=d23 נוסחת הירון: x3,y3 x2,y2 x1,y1 מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © תוכנית דוגמה - המשך #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 הרצאה מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © תוכנית דוגמה - המשך 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 הרצאה מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © תוכנית דוגמה - המשך 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 הרצאה מבוא למדעי המחשב. כל הזכויות שמורות ©

מבוא למדעי המחשב. כל הזכויות שמורות © תוכנית דוגמה - המשך 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 הרצאה מבוא למדעי המחשב. כל הזכויות שמורות ©