Presentation is loading. Please wait.

Presentation is loading. Please wait.

מ- C++ ל- C קרן כליף.

Similar presentations


Presentation on theme: "מ- C++ ל- C קרן כליף."— Presentation transcript:

1 מ- C++ ל- C קרן כליף

2 ביחידה זו נלמד: מ- C++ ל- C פקודות פלט פקודות קלט פורמטי הדפסה
printf, putchar, puts, sprintf פקודות קלט scanf, gets, getchar, getch, getche, sscanf פורמטי הדפסה הצמדה לימין, הצמדה לשמאל, הצמדה ברוחב משתנה, 0 מוביל redirection

3 מ- C++ ל- C אין את הטיפוס bool ניתן להגדיר משתנים אך ורק בתחילת בלוק
הגדרת struct דורשת ציון מלא של השם המקוצר הגדרת קבועים באמצעות define אין את מנגנון העברת הפרמטרים by reference, אלא רק by value ו- by pointer ספריות שונות המכילות את פקודות הקלט והפלט פקודות שונות להקצאות דינאמיות ולשחרור זכרון פקודות שונות עבור קלט ופלט סיומת שונה לקבצים

4 מ- C++ ל- C (1) אין את הטיפוס bool
נשתמש בערך 1 או 0, או נגדיר קבוע ניתן להגדיר משתנים אך ורק בתחילת בלוק קטע קוד זה מתקמפל ב- C++ אך נותן שגיאת קומפילציה מאוד לא ברורה ב- C!

5 מ- C++ ל- C (2) הגדרת struct דורשת ציון מלא של השם המקוצר
הקומפיילר אינו מכיר את הטיפוס Point, אלא רק בשמו המלא:

6 הפקודה typedef הפקודה typedef מאפשרת מתן שם נוסף לטיפוס
תחביר הפקודה: typedef <שם קיים> <שם חדש> דוגמא: typedef unsigned long ulong כעת נוכל להגדיר משתנה מטיפוס זה באחת משתי הדרכים: unsigned long id; ulong id; ניתן לקצר את שם המבנה ע"י שימוש בפקודה typedef

7 שימוש ב- typedef

8 מ- C++ ל- C | הגדרת קבועים
בשפת C++ הגדרנו משתנה const כדי לייצג קבוע, ומשתנה זה תפס מקום בזכרון בשפת C מגדירים קבוע באמצעות פקודת define, שהיא פקודת קדם-מעבד (pre-compile): הסבר על פקודות pre-compile בפרק על פעולות קדם-מעבד

9 מ- C++ ל- C (5) אין את מנגנון העברת הפרמטרים by reference, אלא רק by value ו- by pointer בשפת C++ העברנו משתנה by ref באמצעות הסימן &, וכל שינוי של המשתנה בפונקציה, היה משפיע על המשתנה המקורי: בשפת C הסימן & אינו מתקמפל עבור העברה by ref ולכן נשתמש במצביע (הסבר על מצביעים בהמשך) הערך של num הוא 5 הערך של num הוא 5

10 מ- C++ ל- C (6) הספריות המכילות את פקודות הקלט/פלט:
בשפת C++ עושים include ל- iostream בשפת C עושים include ל- stdio.h (Standart Input/Output) פקודות שונות להקצאות דינאמיות ולשחרור זכרון (בהמשך) פקודות שונות עבור קלט ופלט (בהמשך) בשפת C++ הגדרנו פרוייקט עם קובץ שסיומתו הייתה cpp, כעת נדאג שהקבצים יווצרו עם קובץ בסיומת c ההבדל הוא בקומפיילר ומכאן גם בשגיאות הקומפילציה המתקבלות

11 המרה מייצוג פנימי לטקסטואלי
הייצוג הפנימי של המשתנים במחשב הוא בבינארית כל פקודות הקלט מעבירות מידע מייצוג טקסטואלי לייצוג בינארי כל פקודות הפלט מעבירות מידע מייצוג בינארי לייצוג טקסטואלי פלט מידע בייצוג טקסטואלי מידע בייצוג פנימי (בינארי) קלט

12 פקודת פלט (1) בשפת C++ יש את פקודת הפלט cout
באמצעות פקודה זו ניתן להדפיס משתנה מכל סוג בשפת C קיימת הפונקציה printf שתפקידה להדפיס מחרוזת בפורמט המוגדר ע"י המתכנת למסך (נקראית "מחרוזת בקרה") דוגמא: printf(“Hello World!”) הפונקציה printf מקבלת בתוך פרמטר ראשון מחרוזת המייצגת את התוכן שנרצה להציג למסך ("מחרוזת הבקרה"), שתכלול בתוכה טקסט ואת טיפוסי המשתנים שנרצה להציג, ולאחר מכן את המשתנים להצגה דוגמא: במקום %d (תו המרה) יוצג למסך ערכו של המשתנה שמצוין אחרי המחרוזת, כלומר ערכו של המשתנה x

13 %d נועד להדפסת משתנים מטיפוס int. לכל טיפוס יש תו המרה שונה.
פקודת פלט (2) בדוגמא הבאה יש הדפסה של 2 משתנים: ערכו של המשתנה x יוצג במקום ה- %d הראשון ערכו של המשתנה y יוצג במקום ה- %d השני %d נועד להדפסת משתנים מטיפוס int. לכל טיפוס יש תו המרה שונה.

14 תווי המרה להדפסה (ולקליטה) לטיפוסים השונים
Data Type Format Explaination int/short %d Decimal long %ld Long Decimal char %c Character char* %s String float %f Float double %lf Long Float unsigned %u Unsigned pointer %p Address

15 דוגמא אתחול משתנה כ- float לעומת double. בלי ה- f יתקבל warning.
תזכורת: אופרטור & לקבלת כתובת של משתנה ,

16 הצגת מספר עשרוני ניתן להגביל את מספר הספרות אחרי הנקודה עבור מספרים עשרוניים (double/float): הוספת התווים נקודה ומספר בין ה- % לתו המייצג האם יש להדפיס float או double , אומר לקומפיילר כמה ספרות אחרי הנקודה להציג עבור המשתנה העשרוני

17 אופני הדפסה שונים לאותו משתנה
כאשר מדפיסים עם %d תמיד יוצג הערך המספרי של המשתנה, וכאשר מדפיסים עם %c יודפס התו המוצג ע"י הערך אסקיי. הדבר אפשרי מאחר והייצוג הבינארי של תווים ושל מספרים שלמים זהה.

18 אופני הדפסה שונים לאותו משתנה (2)
מאחר והייצוג הבינארי של עשרוניים ושלמים שונה, הקומפיילר מציג ערך שונה ממה שהיינו מצפים כאשר משתמשים בפורמט המרה שאינו תואם לטיפוס

19 הדפסת מספר בבסיסים שונים
הדפסת מספר באמצעות כל אחד מהפורמטים הנ"ל מציגה אותו בבסיס 10 ניתן להדפיס משתנה בבסיס 16 (הקסה) ע"י שימוש ב- %x ניתן להדפיס משתנה בבסיס 8 (אוקטאלי) ע"י שימוש ב- %o

20 הגדרת משתנים מטיפוס char (2)
לכן ערך ה- ASCII של התו '8' (56) נשמר, ולא 8 בבינארית לעומתו, ב- ch2 נשמר המספר 8 char: ch1 1000 char: ch2 1001

21 פקודת קלט בשפת C++ יש את פקודת הקלט cin
באמצעות פקודה זו ניתן לקלוט משתנה מכל סוג בשפת C קיימת הפונקציה scanf שתפקידה לקלוט רצף משתנים בסדר המוגדר ע"י המתכנת מהמקלדת עד תו לבן כלשהו הפונקציה scanf מקבלת כפרמטר ראשון מחרוזת בקרה המכילה תווי המרה, המייצגים את רצף הטיפוסים שנרצה לקלוט, ולאחר מכן את כתובות המשתנים שלתוכם נקרא את הנתונים

22 בפקודת scanf, אם שוכחים לשים & לפני המשתנה התוכנית עפה!!
פקודת קלט - דוגמא בפקודת scanf, אם שוכחים לשים & לפני המשתנה התוכנית עפה!!

23 בעיה: התוכנית "מדלגת" על פקודת הקלט
כאשר מכניסים כמה נתונים ברצף (בלי ENTER בין אחד לשני, אלא רק עם רווח), הם נמצאים ב- buffer זמני עד אשר תבוצע פעולת קליטה void main() } int n1; char ch1; printf("Please enter a number a char: "); scanf("%d", &n1); scanf("%c", &ch1); printf("n1= |%d| c1=|%c|\n", n1, ch1); { הקלדתי 7 ואז ENTER. לתוך n1 נכנס 7, ולתוך ch1 נכנס האנטר. כאשר אנחנו קולטים נתונים בפקודות נפרדות, נרצה לנקות את ה- buffer בין הפעולות השונות.

24 הפתרון: הפקודה flushall
בסנריו מסויים הקוד יעבוד גם בלעדיה, אך אם אתם נתקלים בתופעה שהתוכנת "מדלגת" על פקודת הקלט זה משום שיש נתון קודם ב- buffer וכדאי לנקותו. void main() } int n1; char ch1; printf("Please enter a number and a char: "); scanf("%d", &n1); flushall(); scanf("%c", &ch1); printf("n1= |%d| c1=|%c|\n", n1, ch1); { הקלדתי 7, ENTER ו- f. לתוך n1 נכנס 7, ואז ניקיתי את האנטר מה- buffer. התו f נכנס לתוך ch1.

25 דוגמא לשימוש מיוחד עם scanf
נרצה שהמשתמש יקליד תאריך כך שיהיה / בין רכיבי התאריך השונים: #include <stdio.h> void main() { int day, month, year; printf(“Enter your birth-date (dd/MM/yyyy): "); scanf("%d/%d/%d", &day, &month, &year); printf("Your birth-date is %d/%d/%d\n", day, month, year);

26 דגשים ל- scanf נשים לב לתוכן בתוך הגרשיים בפקודת ה- scanf: כל תו שאינו חלק מנתון, חייב להיות מוקלד ע"י המשתמש void main() { int num; char ch; printf("Please enter a number and char: "); scanf("%d%c", &num, &ch); printf("num=|%d| ch=|%c|\n", num, ch); flushall(); printf("Please enter a number: "); scanf("%d ", &num); printf("num=|%d|\n", num); } הקומפיילר קרא את הרווח בתור תו ה- buffer: 5<<רווחf ה- buffer: 89 enter int: num 7 1000 char: ch ‘m’ 1004 int: num 1000 char: ch 1004 int: num 5 1000 char: ch ‘ ’ 1004 מנקה את ה- f שנשאר ב- buffer נשים לב שיש פה רווח ולכן הקומפיילר מחכה שנקיש רווח, ולכן הוא תקוע

27 הפקודה system פקודה המאפשרת לנו להריץ פקודות דוס void main() {
char ch; printf("Hello World!\n"); printf("Press any key to continue...\n"); scanf("%c", &ch); system("cls"); system("dir"); פקודה המאפשרת לנו להריץ פקודות דוס

28 מה יהיו ערכי המשתנים? תלוי בקלט..

29 הערך המוחזר של printf ו- scanf

30 ישור הטקסט כאשר משתמשים בפקודה printf לצורך הדפסה ניתן לשלוט על מספר התווים שכל חלק יתפוס, וכן על כיוון היישור שלו: לאחר ה- % נכתוב מספר המציין כמה מקומות ערך המשתנה יתפוס בתצוגה ברירת המחדל היא הצמדת הטקסט לימין כדי להצמיד לשמאל נוסיף מינוס void main() { int n; printf("Please enter a number: "); scanf("%d", &n); printf("The number is: |%d|\n", n); printf("The number is: |%5d|\n", n); printf("The number is: |%-5d|\n", n); יישור הטקסט לימין יישור הטקסט לשמאל

31 void main() } int rows, cols, i, j, res; printf("Enter rows and cols for multiplication-board: "); scanf("%d %d", &rows, &cols); // print first line printf("\n%4c|", ' '); for (i=1 ; i <= cols ; i++) printf("%4d|", i); printf("\n"); for (i=1 ; i <= (cols+1)*5 ; i++) printf("-"); for (i=1 ; i <= rows ; i++) // print the left column for (j=1 ; j <= cols ; j++) printf("%4d|", i*j); { דוגמא: לוח הכפל דוגמא זו תומכת ברוחב עמודה של 4 תווים, מה שעלול ליצור בעיה עבור לוח הכפל שערכיו יכללו גם אלפים...

32 יישור בגודל משתנה ניתן גם שמספר התווים שכל חלק יתפוס בהדפסה ילקח ממשתנה לאחר ה- % נשים *, וברשימת הפרמטרים נשים עבורה את הערך המבוקש void main() } int n, space; printf("Please enter a number and number of spaces: "); scanf("%d %d", &n, &space); printf("The number is: |%d|\n", n); printf("The number is: |%*d|\n", space, n); printf("The number is: |%-*d|\n", space, n);

33 הדפסת 0 מוביל ניתן להדפיס נתונים עם הדפסת 0 מוביל
נוסיף 0 לאחר ה- % למשל לצורך הדפסת ת.ז. תמיד עם 9 ספרות void main() } int id; printf("Please enter your id: "); scanf("%d", &id); printf("Your id is %09d\n", id); {

34 הגבלת מספר התווים הנקלטים לתוך משתנה
ניתן להגביל את מספר התווים הנקלטים לתוך משתנה בפקודת ה- scanf לאחר ה- % נגביל את מספר התווים למשל: קליטת מספר קטן מ- 1000 void main() { int num; printf("Please enter a number less than 1000: "); scanf("%3d", &num); printf("The number is %d\n", num);

35 קליטת נתונים תוך הפרדתם
ניתן לקלוט מהמשתמש ערך (בד"כ מספר או מחרוזת) ובפועל לקלוט את הערך ליותר ממשתנה אחד void main() } int departmentId, innerCourseId; printf("Please enter a 5 digits course code: "); scanf("%2d%3d", &departmentId, &innerCourseId); printf("Department: %d Course: %d\n", departmentId, innerCourseId);

36 בעיה בקליטה: scanf עם %s קולט מחרוזת רק עד תו לבן כלשהו...
הדפסת וקליטת מחרוזות עבור קליטת מחרוזת לא צריך & מאחר ושם מחרוזת כבר נותן את כתובת ההתחלה שלה... בעיה בקליטה: scanf עם %s קולט מחרוזת רק עד תו לבן כלשהו...

37 הפקודה gets פקודה זו קולטת מחרוזת עד ENTER
באמצעותה ניתן לקלוט משפט לתוך מחרוזת מחזירה את כתובת ההתחלה של המחרוזת, או NULL אם הוקלד ctrl +Z

38 הפקודה gets: דוגמא נוספת
מדוע צריך את המשתנה ret ולא ניתן לדרוס את הערך של str? משום שלא ניתן לשנות כתובת התחלה של המערך...

39 הפקודה puts פקודה זו מקבלת משתנה שהינו מחרוזת ומדפיסה אותו למסך, ולבסוף יורדת שורה פקודה זו שקולה ל- printf שבסופו \n

40 הפקודה putchar מקבלת כפרמטר תו ומציגה אותו למסך (ללא ירידת שורה בסוף)
מקבלת כפרמטר תו ומציגה אותו למסך (ללא ירידת שורה בסוף) שקולה ל- printf עם %c

41 הפקודה getchar קולטת תו מהמקלדת לתוך משתנה שקולה ל- scanf עם %c
בניגוד לכל פקודה אחרת לקליטת תו, יודעת לזהות את ctrl+Z

42 הפקודות getch ו- getche
שתי פקודות אלו קוראות נתון מהמקלדת ומיד מחזירות את השליטה לתוכנית, כלומר: לא אוגרות נתון בתוך ה- buffer / לא מחכות ל- ENTER ההבדל בינהן: getch לא מציגה את התו המוקלד למסך getche כן מציגה את התו המוקלד למסך כדי להשתמש בהן יש לבצע: #include <conio.h>

43 הפקודות getch ו- getche - דוגמא
#include <stdio.h> #include <conio.h> void main() { char ch; printf("Please enter a char: "); ch = getche(); printf("\nThe printed char is %c\n", ch); ch = getch(); רואים את התו שהוקלד על המסך. מיד לאחר ההקלדה השליטה חזרה לתוכנית לא רואים את התו שהוקלד על המסך. מיד לאחר ההקלדה השליטה חזרה לתוכנית

44 הפונקציה sprintf מאפשרת לייצר פלט לתוך משתנה, במקום למסך
void main() { char str[30]; printf("%d is odd number\n", 5); sprintf(str, "%d is odd number", 5); printf("str=|%s|\n", str);

45 הפונקציה sscanf מאפשרת לקרוא קלט מתוך משתנה, במקום מהמקלדת
void main() { char classesAverage[] = " "; float avg[3]; int i; sscanf(classesAverage, "%f%f%f", &avg[0], &avg[1], &avg[2]); printf("My classes average: "); for (i=0 ; i < 3 ; i++) printf("%.2f ", avg[i]); printf("\n");

46 קריאת המילה בתחילת הטקסט דילוג על כל התווים עד אשר מגיעה ל- %d כלשהו
הפונקציה sscanf (2) השימוש בפונקציה גם מאפשר לדלג על מספר תווים כלשהו בעת קריאת המחרוזת, ע"י שימוש ב- %*s void main() { char str[30] = "Anna is 2 years old"; char name[10]; int age; sscanf(str, "%s %*s %d", name, &age); printf("My dog's name is %s and she is %d years old\n", name, age); קריאת המילה בתחילת הטקסט דילוג על כל התווים עד אשר מגיעה ל- %d כלשהו

47 redirection: הפניית קלט
יתכנו תוכניות שבהן נצטרך להקליד קלט רב כל פעם, ונרצה להכין קובץ עם הנתונים להקלדה, ושהתוכנית תשתמש בקובץ זה כדי להשתמש בקובץ נתונים יש ללכת לתפריט: Project  Properties  Configuration Properties  Debugging  Command arguments ובשדה זה להפנות לקובץ המכיל את הנתונים באמצעות > קובץ זה צריך להיות קיים בספריית הפרוייקט

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

49 redirection: הפניית הפלט
יתכן ובתוכנית נרצה להפנות את הפלט לתוך קובץ באותו מיקום של קונפיגורציה נשתמש בסימן < כדי להראות מהו קובץ הפלט קובץ זה יווצר בספריית הפרוייקט

50 כל התוכן שהוצג ע"י printf נכתב לקובץ המסך מציג אך ורק סמן המחכה לפלט
דוגמא להפניית הפלט כל התוכן שהוצג ע"י printf נכתב לקובץ המסך מציג אך ורק סמן המחכה לפלט

51 redirection: הפניית הקלט והפלט
פלטי ההרצה פלטי ההרצה

52 ביחידה זו למדנו: מ- C++ ל- C פקודות פלט פקודות קלט פורמטי הדפסה
printf, putchar, puts, sprintf פקודות קלט scanf, gets, getchar, getch, getche, sscanf פורמטי הדפסה הצמדה לימין, הצמדה לשמאל, הצמדה ברוחב משתנה, 0 מוביל redirection

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


Download ppt "מ- C++ ל- C קרן כליף."

Similar presentations


Ads by Google