המצגת נטענת. אנא המתן

המצגת נטענת. אנא המתן

תרגול 5 1 1 Introduction to C - Fall 2010 - Amir Menczel.

מצגות קשורות


מצגת בנושא: "תרגול 5 1 1 Introduction to C - Fall 2010 - Amir Menczel."— תמליל מצגת:

1 תרגול 5 1 1 Introduction to C - Fall Amir Menczel

2 היום בתרגול מה הן פונקציות הגדרת פונקציה, קריאה לפונקציה
העברת ארגומנטים, החזרת ערך או void דוגמאות

3 מוטיבציה לעיתים, אנו נזקקים לבצע פעולה מסוימת או לעשות חישוב מסוים מס' רב של פעמים. במקום לשוב ולכתוב את הקוד מס' רב של פעמים, ניתן לכתוב פונקציה שעושה את הפעולה הרצויה ולקרוא לפונקציה זו בכל פעם שרוצים להשתמש בה. כבר ראינו את השימוש בפונקציה Math.abs()

4 מבנה של פונקציה public static <return type> <func name> (<arg1_type> <arg1>, <arg2_type> <arg2>, …) { <function body> } חתימה של פונקציה מורכבת משם הפונקציה ומרשימת טיפוסי הארגומנטים שהפונקציה מקבלת (מספר, סוגי טיפוסים וסדר). הערך המוחזר וכן מאפיינים נוספים של פונקציה )כגון public ו- static ) אינם נכללים בחתימה של הפונקציה. לכל שתי פונקציות בתכנית חתימה שונה public static int foo(int num){…} public static int foo(int num1, double num2){…} public static int foo(double num){…} public static double foo(int num){…} X

5 ערך החזרה של פונקציה יש פונקציות שלא צריכות להחזיר ערך, אלא רק לבצע משהו (למשל פונקציה שמדפיסה מערך). במצב כזה נכתוב מילה void בתור <return value type>. פונקציה שמחזירה ערך חייבת להכיל את הפקודה <value>” “return )פעם אחת או יותר).

6 דוגמא להגדרה ושימוש בפונקציות:
6

7 end int sum int lastInd int i int 1 sum int sum int
public class Sum { public static void main(String[] args) { int lastInd = 10; int sum = sumNums(lastInd ); System.out.println(“The sum of numbers from 1 to “+ lastInd + “ = “ + sum); System.out.println(“The sum of numbers from 1 to “+ 8 + “ = “ + sumNums(8)); } // returns the sum of numbers from 1 to end public static int sumNums(int end) { int sum = 0; for(int i = 1; i <= end; i = i+1) sum = sum + i; return sum; sumNums(10) end int 10 main sum int 1 55 lastInd int 10 i int 1 sum int 55 sum int

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

9 תרגיל 1 - פתרון public static void printArray(int[] arr) {
for(int i=0; i < arr.length; i=i+1) { System.out.print(arr[i]+” ”); } System.out.println();

10 תרגיל 2 חישוב המקדם הבינומי המציין את מספר תתי הקבוצות בגודל k , של קבוצה בגודל n. עליכם לכתוב את הפונקציה nChooseK: public class BinCoeff { public static void main(String[] args) { int n = 5 , k = 3; System.out.print("The number of different subsets of size " + k + " in a set of size " + n + " is: "); System.out.println(nChooseK(n,k)) ; } /* output : The number of different subsets of size 3 in a set of size 5 is: 10 */

11 תרגיל 2 - פתרון // Assumes that n>=0
public static int factorial(int n) { int result = 1; for(int i=2; i <= n; i = i+1) { result = result * i; } return result; public static int nChooseK(int n, int k) { int ans = 0; if (n>=k && k>=0) { ans = factorial(n) / (factorial(k) * factorial(n-k)); return ans;

12 תרגיל 3 כתבו פונקציה המקבלת מחרוזת s, מספר שלם i, ומחרוזת sub, הפונקציה מחזירה מחרוזת שבה "מושתלת" המחרוזת sub בתוך s החל מהאינדקס i. public static String insertSubstring(String s, int i, String sub) { { 12

13 תרגיל 3 - פתרון public static String insertSubstring(String s, int i, String sub) { if (s == null || sub == null || i < 0 || i >= s.length()) return null; String ans = s.substring(0,i) + sub + s.substring(i); return ans; { 13

14 תרגיל 4 מערך דו-ממדי נקרא מטריצה אם אינו ריק ואם כל שורותיו שוות באורכן ואורך זה גדול מאפס. השלימו את הגדרת השיטה הסטטית checkMatrix(int[][] m), אשר בודקת אם מערך דו-מימדי, m, הינו מטריצה ומחזירה ערך בוליאני בהתאם. הערה: אם קוראים לשיטה עם פרמטר שערכו null, על השיטה להחזיר את הערך false. בכל ריבוע ריק יש להשלים הוראה יחידה )כלומר לא יופיע בו (";". && 14

15 תדפיס: true false לשם הבהרה, השיטה :main
public static void main (String[] args){ int[] line1 = {1,2,3,4}; int[] line2 = {5,6,7,8}; int[] line3 = {9}; int[] line4 = new int[0]; int[][] m1 = {line1,line2}; int[][] m2 = {line1,line2,line3}; int[][] m3 = null; int[][] m4 = {null,null}; int[][] m5 = {line4,line4}; int[][] m6 = {line2,null}; int[][] m7 = new int[0][0]; System.out.println(checkMatrix(m1)); System.out.println(checkMatrix(m2)); System.out.println(checkMatrix(m3)); System.out.println(checkMatrix(m4)); System.out.println(checkMatrix(m5)); System.out.println(checkMatrix(m6)); System.out.println(checkMatrix(m7)); } תדפיס: true false

16 (m[i]!=null && m[0].length==m[i].length)
תרגיל 4 - פתרון (m!=null && m.length>0 && m[0]!=null && m[0].length>0); tmp && i<m.length && (m[i]!=null && m[0].length==m[i].length) 16

17 תרגיל 5 נתונה הפונקציה public static int oddGCD(int m, int n) לחישוב המחלק המשותף המקסימלי (gcd) של שני מספרים שלמים m ו- n .שיטה זו פועלת נכון רק במקרה ולפחות אחד המספרים הינו אי-זוגי. השלימו את הגדרת השיטה הבאה, תוך שימוש בשיטה oddGCD הנתונה, כך שתחשב את המחלק המשותף המקסימאלי עבור כל שני שלמים אי-שליליים (הניחו כי לפחות אחד המספרים אינו אפס.( בפתרון שתציעו אין לבצע כל בדיקה על ערכו של משתנה פרט לבדיקה האם הוא זוגי או לא. כמובן שניתן גם להשתמש בפעולות לוגיות כמו (!, &&, ||). ניתן להניח שהקלט הינו חוקי (כלומר ש- n ו- m אי-שליליים ולפחות אחד מהם חיובי ממש). public static int generalGCD(int m, int n) { // השלימו } רמז: gcd(x∙y, x∙z) = x∙gcd(y,z) 17

18 תרגיל 5 - פתרון public static int generalGCD(int m, int n) {
int multiply = 1; while( (m % 2 == 0) && (n % 2 == 0) { multiply = multiply * 2; m = m / 2; n = n / 2; } return multiply * oddGCD(m, n);

19 תרגיל 6 נאמר ששני מספרים טבעיים חיוביים הם זרים אם אין להם מחלק משותף (פרט ל- 1). נתונה לכם שיטה סטטית public static int gcd (int m, int n) אשר מחזירה את המחלק המשותף הגדול ביותר של שני מספרים טבעיים חיוביים. השלימו את השיטה checkGCD(int[] a) אשר מחזירה ערך בוליאני המציין האם מערך a מקיים אחת משתי התכונות הבאות: א. כל שני מספרים שונים ב- a זרים. ב. כל שני מספרים שונים ב-a אינם זרים. למשל: האוסף 4,7,25 מקיים את תכונה א' האוסף 6,10,15 מקיים את תכונה ב', למרות שאין שום מספר גדול מ- 1 המחלק את שלושת המספרים. האוסף20,7,20 מקיים את תכונה א' כי רק 7 ו- 20 שונים והם זרים. האוסף4,7,28 אינו מקיים אף אחת משתי התכונות. הפעלתcheckGCD על שלושת המערכים הראשונים מחזירה true. ואילו על הרביעי false -. יש להניח שבמערך יש לפחות שני מספרים שונים זה מזה. תוכלו גם להניח שכל המספרים הנתונים הם חיוביים, אך שימו לב שיתכן ואינם שונים זה מזה. 19

20 תרגיל 6 - פתרון public static boolean checkGCD(int[] a){
boolean aliens = true; // each 2 are aliens boolean notAliens = true; // each 2 are not aliens for (int i = 0; i < a.length – 1 && (aliens || notAliens); i=i+1){ for (int j = i+1; j < a.length && (aliens || notAliens); j=j+1){ if (a[i] != a[j]) { if (gcd(a[i], a[j]) == 1) notAliens = false; else aliens = false; } return aliens || notAliens;

21 תרגיל 7 כתבו פונקציה המקבלת מערך של מחרוזות המייצגות קבצים files, מחרוזת extension, ומחרוזת נוספת newExtension, על הפונקציה לשנות את כל הסיומות של הקבצים המסתיימות ב-extension ל-newExtension ולהחזיר מערך של הקבצים לאחר השינוי. לדוגמא: עבור הקבצים: a.txt b.rar c.rar d.txt e.rar המחרוזת: “rar” והמחרוזת להחלפה: “zip” נקבל מערך: a.txt b.zip c.zip d.txt e.zip הערה: הניחו כי בשם הקובץ מופיע נקודה אחת בלבד. 21

22 תרגיל 7 - פתרון public static String[] replaceExtensions(String[] files, String extension, String newExtension) { String [] ans = new String[files.length]; for (int i = 0; i < files.length; i++) ans[i] = files[i].replaceAll("."+extension, "."+newExtension); return ans;


הורד את "ppt "תרגול 5 1 1 Introduction to C - Fall 2010 - Amir Menczel.

מצגות קשורות


מודעות Google