Page 1

‫קורס מבוא למדעי המחשב‬ ‫סמסטר א' תשס"ח‬

:‫עשר‬-‫שיעור אחד‬ ‫קלט\פלט‬ http://online.shenkar.ac.il/moodle

C ‫תוכנית ראשונה בשפת‬ #include <stdio.h> int main() { printf("Hello World\n"); return 0; }

1


‫תוכנית ראשונה – שורה ‪1‬‬ ‫‪ – #include‬מאפשר‬ ‫שימוש בפעולות שנכתבו‬ ‫כבר ע"י מישהו אחר‬ ‫ונשמרו על‪-‬ידו בנפרד‬

‫>‪#include <stdio.h‬‬ ‫)(‪int main‬‬ ‫{‬ ‫;)"‪printf("Hello World\n‬‬ ‫;‪return 0‬‬ ‫}‬ ‫‪ stdio.h‬הוא קובץ )"ספריה"(‬ ‫של פעולות שמטפלות בקלט‪/‬פלט‬ ‫)‪(standard input/output‬‬

‫תוכנית ראשונה – שורה ‪4‬‬ ‫משתמשים‬ ‫בפעולה ‪printf‬‬ ‫מתוך ‪stdio.h‬‬ ‫היא מקבלת רצף של‬ ‫תווים בין גרשיים‬ ‫כפולים‪ ,‬ומדפיסה‬ ‫אותם על המסך‪.‬‬ ‫‪\n‬הוא סימון מיוחד‬ ‫שמסמן ירידת שורה‪.‬‬

‫‪2‬‬

‫>‪#include <stdio.h‬‬ ‫)(‪int main‬‬ ‫{‬ ‫;)"‪printf("Hello World\n‬‬ ‫;‪return 0‬‬ ‫}‬


‫נקודה לתשומת‪-‬לב‬ ‫• ‪ \n‬הוא תו מיוחד שמסמן ירידת‪-‬שורה‪ .‬כלומר‬ ‫"(‪ printf‬פשוט יורד שורה )ולא מדפיס ‪.(\n‬‬ ‫;)"‪printf("\\n‬‬ ‫•‬ ‫•‬

‫"(‪.printf‬‬ ‫כדי להדפיס ‪ \n‬צריך לכתוב ;)"‪printf("\\\n‬‬ ‫"(‪.printf‬‬ ‫באופן כללי כדי להדפיס \ צריך לכתוב ;)"\\\"(‪printf‬‬

‫תוכנית ראשונה – שאלות נוספות?‬ ‫מדפיסה ‪Hello World‬‬

‫>‪#include <stdio.h‬‬ ‫)(‪int main‬‬ ‫{‬ ‫;)"‪printf("Hello World\n‬‬ ‫;‪return 0‬‬ ‫}‬

‫‪3‬‬


‫ חישוב מספר השניות ביממה‬:‫תוכנית שניה‬ #include <stdio.h> int main() { int seconds, hours, minutes; hours = 24; minutes = 60; seconds = hours * minutes * 60 ; printf("Seconds in a day: %d\n", seconds); return 0; }

‫חישוב מספר השניות ביממה‬ #include <stdio.h> int main() { int seconds, hours, minutes; hours = 24; minutes = 60; seconds = hours * minutes * 60 ; printf("Seconds in a day: %d\n", seconds); return 0; }

4


‫תוכנית שנייה – שורה ‪ - 8‬פלט‬ ‫;)‪printf("Seconds in a day: %d\n", seconds‬‬ ‫• ניתן לכלול בהדפסה של ‪ printf‬תוכן של משתנים‪.‬‬ ‫• לצורך כך צריך לציין מהו סוג המשתנה באמצעות סימון‬ ‫מיוחד שלא מודפס‪.‬‬ ‫•‬

‫‪ %d‬אומר שהמשתנה מכיל מספר שלם‪.‬‬

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

‫חישוב מספר השניות ביממה‬ ‫>‪#include <stdio.h‬‬ ‫)(‪int main‬‬ ‫{‬ ‫;‪int seconds, hours, minutes‬‬ ‫;‪hours = 24‬‬ ‫;‪minutes = 60‬‬ ‫; ‪seconds = hours * minutes * 60‬‬ ‫;)‪printf("Seconds in a day: %d\n", seconds‬‬ ‫;‪return 0‬‬ ‫}‬

‫‪5‬‬


‫הדפסה(( של ערכי משתנים‬ ‫פלט ))הדפסה‬ ‫•‬

‫הכרנו את הפונקציה ‪ printf‬שמאפשרת הדפסה של ערך‬ ‫המשתנה למסך‪ .‬למשל‪:‬‬ ‫; )‪printf("The sum is %d", sum‬‬

‫•‬

‫הצירוף ‪ %d‬מציין שכאן יודפס תוכן של משתנה‪ ,‬ומתאים לסוג‬ ‫המשתנה שאותו מדפיסים )‪ %d‬מתאים ל‪.(int-‬‬ ‫•‬

‫ה‪ %d -‬עצמו לא מודפס‪.‬‬

‫•‬

‫שם המשתנה שיודפס כאן מופיע לאחר הגרשיים‪ ,‬מופרד בפסיק‪.‬‬

‫•‬

‫לכל סוג משתנה יש סימון הדפסה אחר‪ ,‬כמפורט בשקף הבא‪.‬‬

‫פורמטי הדפסה נפוצים‬ ‫•‬ ‫•‬ ‫•‬

‫‪) %d – int‬בבסיס ‪ 10‬כרגיל(‬ ‫‪%c - char‬‬ ‫‪) %f - float, double‬הצגה עם נקודה עשרונית ‪(21.54‬‬ ‫‪(2.154e+001‬‬ ‫‪) %e‬הצגה עם מעריך ‪e+001‬‬ ‫‪) %g‬נבחרת ההצגה היותר ברורה(‬

‫• כדי להדפיס את הסימן ‪ ,%‬נכתוב ;)"‪printf("%%‬‬

‫‪6‬‬


‫ כפל של שני מספרים ממשיים‬:‫דוגמא‬ #include <stdio.h> int main() { double a,b,c; a = 2.51; b = 2; c = a* a*b; %g\ \n", c); printf("The product is %g return 0; } The product is 5.02 :‫הפלט‬

‫הדפסת כמה משתנים באותה פקודה‬ #include <stdio.h> int main() { double a,b,c; a = 2.51; b = 2; c = a* a*b; printf("%g printf(" %g * %g = %g %g\ \n", a,b,c); return 0; } 2.51 * 2 = 5.02 :‫הפלט‬

7


‫מותרות פעולות בפקודת ההדפסה‬ #include <stdio.h> int main() { double a,b; a = 2.51; b = 2; printf("%g * %g = %g\ %g\n", a,b, a,b,a*b a*b); ); return 0; } 2.51 * 2 = 5.02 :‫הפלט‬

‫אפשר גם להדפיס כך מספרים‬ #include <stdio.h> int main() { printf("The product is %g %g\ \n", n",2 2.51 51* *2); return 0; } The product is 5.02 :‫הפלט‬

8


‫עיגול בהדפסת משתנים‬ ‫• כשמדפיסים מספר ממשי ניתן לציין את מספר‬ ‫‪.%.4‬‬ ‫הספרות שיודפסו אחרי הנקודה‪ .‬למשל‪%.4f :‬‬ ‫• במידת הצורך יתבצע עיגול‪ .‬למשל‪:‬‬ ‫‪123..46‬‬ ‫‪123‬‬

‫‪printf("%..2f", 123.‬‬ ‫‪printf("%‬‬ ‫;)‪123.456‬‬ ‫;)‪456‬‬

‫‬

‫פירוט על הטיפוס ‪char‬‬ ‫•‬

‫אמרנו שהמחשב מבין רק מספרים‪ .‬אז גם תווים נשמרים‬ ‫בזיכרון המחשב כמספרים‪.‬‬

‫•‬

‫יש לקומפיילר טבלה של ‪ 256‬תווים אפשריים )שנקראת‬ ‫"טבלת ‪ .("ASCII‬כדי לשמור תו‪ ,‬הוא שומר בזיכרון את‬ ‫המספר הסידורי של התו הזה בטבלה‪.‬‬ ‫•‬

‫‪9‬‬

‫כל תו נשמר בתא )"בית"( בודד‪.‬‬

‫•‬

‫למשל האותיות ‪ A-Z‬נמצאות בטבלה לפי הסדר במקומות‬ ‫‪,97‬‬‫‪ ,65‬האותיות ‪ a-z‬לפי הסדר במקומות ‪97-122‬‬‫‪65-90‬‬ ‫‪ 48‬בטבלה‪.‬‬‫והספרות לפי הסדר במקומות ‪48-57‬‬

‫•‬

‫‪char c=65‬‬ ‫למשל ;'‪ char c='A‬מתורגם ע"י הקומפיילר ל‪c=65;; -‬‬


‫תווים מיוצגים כמספרים ‪ -‬דוגמא‬ ‫פורמט ההדפסה קובע אם‬ ‫להדפיס כתו או כמספר‬ ‫זה כמו ;‪char i=65‬‬ ‫‪i as a character is: A‬‬ ‫‪i as an integer is: 65‬‬

‫>‪#include<stdio.h‬‬ ‫)(‪int main‬‬ ‫{‬ ‫;'‪char i = 'A‬‬

‫‪printf("i as a character is: %c‬‬ ‫;)‪%c\\n", i‬‬ ‫‪printf("i as an integer is: %d‬‬ ‫;)‪%d\\n", i‬‬ ‫;‪return 0‬‬ ‫}‬

‫פירוט על הטיפוס ‪char‬‬ ‫• כיוון שהתווים הם למעשה מספרים‪ ,‬אפשר גם‬ ‫לעשות עליהם פעולות חשבון‪.‬‬ ‫‪ 'a'+‬זה '‪.'b‬‬ ‫‪a'+1‬‬ ‫• למשל ‪1‬‬ ‫‪ '8'+1‬זה '‪.'9‬‬ ‫• ‪'+1‬‬ ‫• נדגים בשקף הבא‪.‬‬

‫‪10‬‬


‫ דוגמא‬- ‫תווים מיוצגים כמספרים‬ #include<stdio.h> int main() { char i = 'A';

char i=65; ‫זה כמו‬

printf("i as a character is: %c %c\\n", i); i as a character is: A %d\\n", i); i as an integer is: 65 printf("i as an integer is: %d printf("The character after %c is: %c %c\\n", i, i+1 i+1); return 0;

The character after A is: B

}

‫ פלט התוכנית‬- ‫תווים כמספרים‬ i as a character is: A i as an integer is: 65 The character after A is: B

11


‫פלט של משתנים‬ ‫•‬

‫פורמטי פלט‬

‫•‬

‫תווים כמספרים‬

‫•‬

‫שאלות?‬

‫קלט של ערכי משתנים‬ ‫•‬

‫בד"כ נרצה שהתוכנית תעבוד על קלט שמכניס המשתמש‪.‬‬

‫•‬

‫בדומה לפונקציה ‪ ,printf‬קיימת הפונקציה ‪ scanf‬שקולטת‬ ‫ערך מהמשתמש לתוך משתנה‪ .‬למשל קלט של שלם וממשי‪:‬‬ ‫‪scanf("%‬‬ ‫‪scanf‬‬ ‫‪("%d‬‬ ‫;)‪d %g", &student_num, &average‬‬

‫•‬

‫המחשב ממתין לקלט‪ ,‬ומכניס אותו למשתנה שצויין‪.‬‬ ‫•‬

‫•‬

‫‪12‬‬

‫אחרי הקשת הקלט על המשתמש להקיש ‪.Enter‬‬

‫סימוני הקלט זהים לסימוני ההדפסה ב‪ , printf -‬למעט זה‬ ‫שב‪ double -‬צריך לכתוב‪%lf :‬‬


‫ סכום של מספרים מהקלט‬:‫דוגמא‬ #include <stdio.h> int main() { int a, b, sum; printf("Enter an integer\n"); scanf("%d", &a); printf("Enter an integer\n"); scanf("%d", &b); sum = a + b; printf("Answer: %d + %d = %d\n", a, b, sum); return 0; }

‫ריצת התוכנית‬ Enter an integer 5 Enter an integer 7 Answer: 5 + 7 = 12

(Enter ‫)אחרי הכנסת ערך הקלט מקישים‬

13


‫ תרגום מפרנהייט לצלזיוס‬:‫דוגמא‬ #include <stdio.h> int main() { double cels, fahr;

‫הגדרת המשתנים‬

printf("Please enter a fahrenheit temperature:\ temperature:\n"); %lf", ",& &fahr); scanf("%lf scanf(" ‫קליטת ערך למשתנה‬ ‫חישוב והדפסת התוצאה‬ cels = 5*(fahr *(fahr--32 32)/ )/9 9; printf("This is equal to %g degrees celsius\ celsius\n", cels);

return 0; }

‫סיכום ביניים‬ ‫פלט של משתנים‬/‫• קלט‬ .%d, %f, %g, %c, %u, %lf (for scanf) :‫ פורמטים‬.scanf,printf

printf("%g", average); scanf("%d", &hours);

14


‫קלט‪/‬פלט של משתנים‬

‫שאלות נוספות?‬

‫למה בעצם צריך & ב‪scanf -‬‬ ‫‪-‬‬

‫למדנו שכשרושמים שם של משתנה בתוכנית‪ ,‬המשמעות היא‬ ‫שמתייחסים לערך שהמשתנה הזה מכיל‪.‬‬ ‫‪-‬‬

‫‪-‬‬

‫הסימון & אומר שמתייחסים לכתובת של המשתנה בזיכרון‪,‬‬ ‫כלומר זה המקום שאליו הקלט צריך להיכנס‪.‬‬

‫‪-‬‬

‫אם לא נכתוב &‪ ,‬המשמעות היא שמתייחסים לערך שיש‬ ‫במשתנה כאילו הוא כתובת בזיכרון ורושמים לשם את הקלט‪.‬‬ ‫‪-‬‬

‫‪15‬‬

‫‪ scanf‬צריך לדעת לאן להכניס את הקלט‪ ,‬ולא מה ערך המשתנה‪.‬‬

‫זה עשוי לדרוך במקום ששייך לתוכנה אחרת ולגרום לתעופה של‬ ‫התוכנית שלנו‪.‬‬ ‫‪1760 85‬‬ ‫‪fahr‬‬


‫למה בעצם צריך & ב‪scanf-‬‬ ‫•‬

‫השתמשנו בהעברת כתובת בפונקציה ‪ ,scanf‬שמקבלת את כתובת‬ ‫המשתנה שאליו יוכנס הקלט‪ .‬למשל‪:‬‬ ‫;‪int grade‬‬ ‫;)‪scanf("%d", &grade‬‬

‫•‬

‫המשתנה ‪ grade‬לא מוגדר בפונקציה ‪ scanf‬והיא גם לא מחזירה לתוכו‬ ‫ערך‪.‬‬

‫•‬

‫הפונקציה ‪ scanf‬מקבלת את הכתובת של המשתנה בזיכרון‪ ,‬וזה מאפשר‬ ‫לה לכתוב לתוכו את הקלט )בעזרת הפעולה * שהכרנו קודם(‪.‬‬

‫•‬

‫קידוד הקלט )למשל ‪ (%d‬אומר ל‪ scanf -‬גם מה גודל המשתנה הזה‬ ‫בזיכרון‪ ,‬כלומר לכמה תאים הקלט אמור להיכנס‪.‬‬

‫כמה נקודות נוספות לגבי ‪scanf‬‬ ‫•‬

‫מה שמופיע בין המרכאות ב‪ scanf -‬הוא מה ש‪ scanf -‬מצפה‬ ‫לקרוא‪.‬‬ ‫•‬

‫•‬

‫‪16‬‬

‫‪ scanf("%d‬ואז המחשב יצפה לשני‬ ‫אפשר למשל לרשום ;)"‪scanf("%d,,%d‬‬ ‫מספרים מופרדים ע"י פסיק‪.‬‬

‫כשקולטים מספרים‪ ,‬המחשב מצפה לרווח או ירידת שורה‬ ‫ביניהם ויודע לדלג על רווחים וירידות שורה ולקרוא את המספר‬ ‫הבא‪ .‬כשקולטים תו‪ ,‬אם נקליד רווח התו שיקלט הוא תו הרווח‪.‬‬


‫דוגמאות לקלט תקין‬ 

 

 

scanf("%d,%d scanf("% d,%d", ", &i,&j);

12, 12, 34

scanf("%d%d", scanf("%d%d ", &i,&j); scanf("%d scanf("% d %d", %d", &i,&j);

12 34 12 34

scanf("%c%c", scanf("%c%c ", &tav1 &tav1, &tav2 &tav2); scanf("%c scanf("% c %c", %c", &tav1 &tav1, &tav2 &tav2);

ab a b

scanf ‫עוד תכונה של‬ ‫ אז המשך‬,‫אם מקלידים יותר קלט ממה שהפונקציה ציפתה לו‬ .‫ הבאה‬scanf -‫הקלט יקרא ע"י פקודת ה‬ 

scanf("%d", &i); scanf("%d scanf("%d scanf("% d", &j);

12 34

‫ התו השני‬,‫ בין שתי פקודות קלט של תווים‬Enter ‫לכן אם נקיש‬ .('\n') ‫השורה‬-‫שיקרא הוא תו ירידת‬  scanf("% scanf("%c c", &tav1 &tav1); a scanf("%c scanf("% c", &tav2 &tav2); b .'\n' ‫ מכיל‬tav tav2 2 -‫' ו‬a' ‫ מכיל‬tav tav1 1 ‫עכשיו‬

17


‫עוד תכונה של ‪scanf‬‬ ‫•‬

‫אז אם רוצים לקלוט כמה תווים רצופים‪ ,‬אפשר לכתוב את הכל‬ ‫בשורה אחת ורק אחריה להקיש ‪:Enter‬‬

‫‪ab‬‬

‫•‬

‫‪scanf("%c", &tav1‬‬ ‫;)‪&tav1‬‬ ‫‪scanf("%c", &tav2‬‬ ‫;)‪&tav2‬‬

‫‬

‫או לחליפין לגרום ל‪ scanf-‬לדלג על ירידת‪-‬השורה‪:‬‬

‫‪a‬‬ ‫‪b‬‬ ‫•‬

‫‪scanf("%c\n", &tav1‬‬ ‫‪scanf("%c‬‬ ‫;)‪&tav1‬‬ ‫‪scanf("%c‬‬ ‫‪scanf("%‬‬ ‫‪c", &tav2‬‬ ‫;)‪&tav2‬‬

‫‬

‫‪ tav‬מכיל '‪.'b‬‬ ‫‪tav2‬‬ ‫‪ tav‬מכיל '‪ 'a‬ו‪2 -‬‬ ‫‪tav1‬‬ ‫עכשיו ‪1‬‬

‫‪/‬פלט של תווים‬ ‫אפשרות נוספת לקלט‪/‬פלט‬ ‫•‬ ‫•‬ ‫•‬ ‫•‬

‫‪18‬‬

‫יש שתי פונקציות נוספות לקלט‪/‬פלט של תווים שכדאי‬ ‫להכיר‪.getchar, putchar :‬‬ ‫עבור משתנה ‪ ,char c‬השימוש בהן שקול לשימוש ב‪printf -‬‬ ‫ו‪.scanf-‬‬ ‫;)‪ putchar(c‬שקול ל‪.printf("%c",c); -‬‬ ‫;)(‪ c=getchar‬שקול ל‪.scanf("%c",&c); -‬‬


‫‪/‬פלט של מחרוזות‬ ‫קלט‪/‬פלט‬ ‫•‬

‫אפשר לקלוט ולהדפיס את תווי המחרוזת בזה אחר זה בעזרת ‪,scanf‬‬ ‫‪ printf‬של תווים )או בעזרת ‪.(getchar,putchar‬‬

‫•‬

‫לדוגמא‪ ,‬הקטע הבא קולט משפט באורך ‪ 200‬תווים לכל היותר‪ ,‬ומפסיק אם‬ ‫נקלטת ירידת‪-‬שורה )כאן ירידת השורה נכללת במחרוזת(‪:‬‬ ‫)צריך מקום גם ל‪('\0' -‬‬

‫התנאי להמשך הקלט‬ ‫סימון סיום המחרוזת‬

‫‪char answer[2‬‬ ‫;]‪answer[201‬‬ ‫;]‪01‬‬ ‫‪int i=0‬‬ ‫;‪i=0‬‬ ‫‪do‬‬ ‫{‬ ‫;)]‪scanf("%c", &answer[i‬‬ ‫;‪i++‬‬ ‫‪} while ((answer[i‬‬‫'=!]‪((answer[i-1‬‬ ‫‪]!='\\n') && (i<2‬‬ ‫))‪(i<200‬‬ ‫))‪00‬‬ ‫;'‪answer[i]='\\0‬‬ ‫'=]‪answer[i‬‬

‫‪/‬פלט של מחרוזות‬ ‫קלט‪/‬פלט‬ ‫•‬

‫אפשר לקלוט ולהדפיס את תווי המחרוזת בזה אחר זה בעזרת ‪,scanf‬‬ ‫‪ printf‬של תווים )או בעזרת ‪.(getchar,putchar‬‬

‫•‬

‫לדוגמא‪ ,‬הקטע הבא קולט משפט באורך ‪ 200‬תווים לכל היותר‪ ,‬ומפסיק אם‬ ‫נקלטת ירידת‪-‬שורה )כאן ירידת השורה נכללת במחרוזת(‪:‬‬ ‫)צריך מקום גם ל‪('\0' -‬‬

‫התנאי להמשך הקלט‬ ‫סימון סיום המחרוזת‬

‫‪19‬‬

‫‪char answer[2‬‬ ‫;]‪answer[201‬‬ ‫;]‪01‬‬ ‫‪int i=0‬‬ ‫;‪i=0‬‬ ‫‪do‬‬ ‫{‬ ‫;)(‪answer[i] = getchar‬‬ ‫;‪i++‬‬ ‫‪} while ((answer[i‬‬‫'=!]‪((answer[i-1‬‬ ‫‪]!='\\n') && (i<2‬‬ ‫;))‪(i<200‬‬ ‫;))‪00‬‬ ‫;'‪answer[i]='\\0‬‬ ‫'=]‪answer[i‬‬


‫‪/‬פלט של מחרוזת שלמה‬ ‫קלט‪/‬פלט‬ ‫•‬

‫אפשר גם לקלוט ולהדפיס מחרוזות בבת‪-‬אחת ב‪scanf, printf -‬‬ ‫באמצעות הקידוד ‪ .%s‬למשל‪:‬‬ ‫‪char answer[100‬‬ ‫;]‪answer[100‬‬ ‫;]‬ ‫;)‪scanf("%s", answer‬‬ ‫•‬ ‫•‬ ‫•‬

‫הקלט יהיה רק עד רווח או ירידת‪-‬שורה )כלומר זו דרך לקלוט מילים(‪.‬‬ ‫התו '‪ '\0‬מוכנס אוטומטית ע"י ה‪ scanf -‬אחרי תווי המחרוזת שנקלטה‪.‬‬ ‫שימו לב שלא רושמים את הסימן & ב‪ scanf -‬של מחרוזת שלמה‪.‬‬

‫קלט של מחרוזת שלמה – מס' התווים‬ ‫•‬

‫אם תוכנס כקלט מחרוזת ארוכה יותר מהמקום שהגדרנו למערך‪ ,‬אז‬ ‫התוכנית צפויה "לעוף"‪ ,‬כי תהיה גישה למערך מעבר לגבולות שהוגדרו לו‪.‬‬ ‫)זיכרו גם שצריך להשאיר מקום אחד לתו הסיום(‪.‬‬

‫•‬

‫אם רוצים להגביל את מספר התווים שיקלטו אז אפשר לכתוב את זה ב‪-‬‬ ‫‪ .scanf‬למשל‪:‬‬ ‫‪scanf("%40‬‬ ‫‪scanf("%‬‬ ‫‪40s",‬‬ ‫;)‪s", answer‬‬ ‫•‬

‫‪20‬‬

‫דרך אחרת להגבלת מספר התווים היא לעשות לולאה ולקלוט תו‪-‬תו כמו‬ ‫שראינו קודם )אז הקלט לא נפסק כשמגיעים לרווח(‪.‬‬


‫פלט של מחרוזת שלמה‬ ‫•‬

‫)‪ printf("%s", answer‬מדפיס את תווי המחרוזת ‪ answer‬עד לתו '‪.'\0‬‬ ‫‪HELLO‬‬

‫•‬

‫אם בטעות אין תו '‪ '\0‬בסוף המחרוזת‪ ,‬אז ‪ printf‬ידפיס גם את מה שיש‬ ‫אחרי המחרוזת בזיכרון‪ ,‬עד שיגיע במקרה לתו '‪) '\0‬כלומר יודפס אחרי‬ ‫המחרוזת רצף סתמי ארוך של תווים(‪ .‬למשל‪:‬‬ ‫‪HELLO3894‬‬ ‫‪HELLO‬‬ ‫‪3894o‬‬ ‫‪o9fhsdughw‬‬ ‫‪fhsdughw34‬‬ ‫‪34oruvhjnxuioghyw‬‬ ‫‪oruvhjnxuioghyw89‬‬ ‫‪89tpcvj‬‬ ‫‪tpcvj‬‬

‫עוד אפשרות לקלט‪/‬פלט של מחרוזות‬

‫‪21‬‬

‫•‬

‫יש פקודת קלט נוספת למחרוזות‪ gets(str); :‬שקורא גם רווחים‪.‬‬

‫•‬

‫אבל בפקודה הזאת לא ניתן להגביל את אורך הקלט‪ ,‬אז אם‬ ‫המשתמש יכניס יותר מידי תווים התוכנית "תעוף"‪.‬‬

‫•‬

‫יש גם פקודת פלט נוספת‪ puts(str); :‬שפועלת כמו‬ ‫‪) printf("%s‬מדפיסה ירידת שורה אחרי המחרוזת(‪.‬‬ ‫)‪printf("%s\\n",str‬‬


‫ תוכנית שמרווחת מילה‬:‫דוגמא‬ ‫שמה רווחים בין האותיות של‬ #include<stdio.h> ‫ ומדפיסה את התוצאה‬,‫מילה‬ int main() { HELLO ‫ עבור הקלט‬,‫לדוגמא‬ char word[30 word[30], ], spaced_word[60 spaced_word[60]; ]; HELLO :‫הפלט יהיה‬ int i=0 i=0; scanf("%29 scanf("% 29s", s", word); 'H' 'E' 'L' 'L' 'O' '\0' . . . . while (word[i] != '\'\0') { spaced_word[ i* i*2 2 ] = word[i]; spaced_word[ i* i*2 2+1 ] = ' '; '; i++; } spaced_word[i*2 spaced_word[i* 2-1] = '\0' ; printf("The word after spacing: %s\ %s\n", spaced_word); } 'H' ' ' 'E' ' ' 'L' ' ' 'L' ' ' 'O' '\0'

‫מצביעים‬ ‫ למשל‬,"%p" ‫ הוא‬printf -‫קידוד ההדפסה עבור מצביע ב‬ .printf("%p", &i) ‫ נכתוב‬i ‫להדפסת כתובת המשתנה‬

22


‫מבוא למדעי המחשב – שיעור אחד‪-‬עשר‬

‫שאלות נוספות?‬

‫‪23‬‬

11 קלט פלט  

C LAN, C LANG

Advertisement