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

Slides:



Advertisements
Similar presentations
A C++ Crash Course Part II UW Association for Computing Machinery Questions & Feedback.
Advertisements

C workshop #3 flow control / strings.
Introduction to Computers and Programming Class 15 Introduction to C Professor Avi Rosenfeld.
Declarations/Data Types/Statements. Assignments Due – Homework 1 Reading – Chapter 2 – Lab 1 – due Monday.
1 CSE1301 Computer Programming: Lecture 9 Input/Output.
A simple C program: Printing a line of text #include main() { printf(“hello, world\n”); } Program output: hello, world.
CS 161 Introduction to Programming and Problem Solving Chapter 13 Console IO Herbert G. Mayer, PSU Status 9/8/2014 Initial content copied verbatim from.
Lecture No: 16. The scanf() function In C programming language, the scanf() function is used to read information from standard input device (keyboard).
Programming Variables. Named area in the computer memory, intended to contain values of a certain kind (integers, real numbers, characters etc.) They.
Strings in C. Strings are Character Arrays Strings in C are simply arrays of characters. – Example:char s [10]; This is a ten (10) element array that.
CS140: Intro to CS An Overview of Programming in C by Erin Chambers.
CECS 121 EXAM 1. /* C Programming for the Absolute Beginner */ // by Michael Vine #include main() { printf(“\nC you later\n”); system(“pause”); }
Chapter 5: Data Input and Output Department of Computer Science Foundation Year Program Umm Alqura University, Makkah Computer Programming Skills
CP104 Introduction to Programming File I/O Lecture 33 __ 1 File Input/Output Text file and binary files File Input/output File input / output functions.
C programming for Engineers Lcc compiler – a free C compiler available on the web. Some instructions.
Adv. UNIX:io/91 Advanced UNIX v Objectives of these slides: –look in some detail at standard input and output in C Special Topics in Comp.
1 C Programming Week 2 Variables, flow control and the Debugger.
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;
Khalid Rasheed Shaikh Computer Programming Theory 1.
CSE1301 Computer Programming: Lecture 6 Input/Output.
Introduction to Programming Lecture 5: Interaction.
Chapter 1 slides1 What is C? A high-level language that is extremely useful for engineering computations. A computer language that has endured for almost.
Data Types and Input Output in C. Size of a Character in C #include int main() { char ch; ch = 'A'; printf("ch = %c\n",ch); printf("size of char = %d.
Introduction to C Programming II & Formatted Input/Output Subject: T0016 – ALGORITHM AND PROGRAMMING Year: 2013.
C language--Introduction. History 1970: B by Ken Thompson at AT&T Bell Lab 1972: C by Dennis Ritchie and Ken Tompson at At&T Bell Lab for UNIX 1978: “The.
Introduction to Computing Lecture 03: Basic input / output operations Introduction to Computing Lecture 03: Basic input / output operations Assist.Prof.Dr.
Lecture 3: Getting Started & Input / Output (I/O)
Chapter 9 - Formatted Input/Output
Tutorial #4 Summer 2005.
Arithmetic Expressions
Formatted Input and Output
Zhang Hongyi CSCI2100B Data Structures Tutorial 3
Formatted Input/Output
Standard Input - Output
Input/output.
C Programming Tutorial – Part I
Chapter 2 Overview of C.
INC 161 , CPE 100 Computer Programming
Introduction to C CSE 2031 Fall /3/ :33 AM.
Plan for the Day: I/O (beyond scanf and printf)
Module 2 Arrays and strings – example programs.
Formatted Input/Output
Plan of the Day: More on type conversions scanf printf format strings
مبانی کامپیوتر و برنامه سازی
מחרוזות קרן כליף.
Visit for more Learning Resources
מבוא כללי למדעי המחשב תרגול 2
Input/Output Input/Output operations are performed using input/output functions Common input/output functions are provided as part of C’s standard input/output.
CSI 121 Structured Programming Language Lecture 7: Input/Output
توابع ورودي-خروجي.
Nhập và Xuất trong C Chương 4 Input and Output in C.
Introduction to CS Your First C Programs
אבני היסוד של תוכנית ב- C
אבני היסוד של תוכנית ב- C++
אבני היסוד של תוכנית ב- C++
תכנות מכוון עצמים ו- C++ יחידה 01 מ- C ל- C++
Chapter 9 - Formatted Input/Output
Introduction to C Topics Compilation Using the gcc Compiler
Incremental operators
Week 2 Variables, flow control and the Debugger
Chapter 4 Managing Input and Output Operations
C Input / Output Prabhat Kumar Padhy
Introduction to C Topics Compilation Using the gcc Compiler
EECE.2160 ECE Application Programming
Character Arrays char string1[] = “first”;
Introduction to C EECS May 2019.
Course Outcomes of Programming In C (PIC) (17212, C203):
EECE.2160 ECE Application Programming
Introduction to C CSE 2031 Fall /15/2019 8:26 AM.
Chapter 18 I/O in C.
Presentation transcript:

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

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

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

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

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

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

שימוש ב- typedef

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

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

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

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

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

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

תווי המרה להדפסה (ולקליטה) לטיפוסים השונים 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

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

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

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

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

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

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

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

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

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

הפתרון: הפקודה 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.

דוגמא לשימוש מיוחד עם 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);

דגשים ל- 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 נשים לב שיש פה רווח ולכן הקומפיילר מחכה שנקיש רווח, ולכן הוא תקוע

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

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

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

ישור הטקסט כאשר משתמשים בפקודה 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); יישור הטקסט לימין יישור הטקסט לשמאל

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 תווים, מה שעלול ליצור בעיה עבור לוח הכפל שערכיו יכללו גם אלפים...

יישור בגודל משתנה ניתן גם שמספר התווים שכל חלק יתפוס בהדפסה ילקח ממשתנה לאחר ה- % נשים *, וברשימת הפרמטרים נשים עבורה את הערך המבוקש 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);

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

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

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

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

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

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

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

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

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

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

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

הפונקציה 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);

הפונקציה sscanf מאפשרת לקרוא קלט מתוך משתנה, במקום מהמקלדת void main() { char classesAverage[] = "92.3 87.5 100"; 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");

קריאת המילה בתחילת הטקסט דילוג על כל התווים עד אשר מגיעה ל- %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 כלשהו

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

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

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

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

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

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

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