Professional Documents
Culture Documents
01 - C Building Blocks
01 - C Building Blocks
2
© Keren Kalif
ביחידה זו נלמד:
בסיסי מספרים:
• בינארי ( ,)2אוקטאלי ( ,)8הקסה-דצימאלי ()16
הדפסה למסך
קבלת נתונים מהמשתמש
מבנה זיכרון התוכנית
הגדרת משתנים
טיפוסי משתנים
השמת ערך למשתנים
קבועים
הפקודה flushall
הפקודה system
בסיס עשרוני (דצימלי)
בסיס הינו שיטת ספירה
בבסיס בייצוג עשרוני (השיטה הטבעית לנו) קיימות 10ספרות 0 :עד 9
לכן אנו אומרים שהן מיוצגות בבסיס 10
• נקרא גם בסיס דצימלי
4
© Keren Kalif
ייצוג מספרים בבסיס בינארי -
הגדרות
בבסיס הבינארי קיימות 2ספרות בלבד :הספרות 0ו1-
• לכן גם נקרא בסיס 2
דוגמאות למספרים בבסיס בינארי1110010 ,1010 :
נמספר את מיקום הספרות מימין לשמאל
• מספר הספרה הימנית ביותר יהיה 0
• מספר הספרה השמאלית ביותר במספר בן nספרות יהיה n-1
0 1 2 3 4 5
דוגמא101011 :
הספרות במיקום 0,1,3,5הן 1והספרות במיקום 2,4הן 0
5
© Keren Kalif
ייצוג מספרים בבסיס בינארי – חישוב ערך
עשרוני של מספר בינארי (מבסיס 2ל)10 -
ערכו של מספר המיוצג בבסיס עשרוני הוא סכום חזקות של :10
102 101 100
הביט הכי ימני נקרא LSBמשום שהוא הכי פחות משמעותי לסכום 6
© Keren Kalif
ייצוג מספרים בבסיס בינארי – חישוב ערך
בינארי של מספר עשרוני (מבסיס 10ל)2 -
ראינו כיצד בהינתן מספר בייצוג בינארי ניתן להמירו לייצוגו
העשרוני
כעת נראה כיצד בהינתן מספר בייצוג עשרוני ניתן להמירו לייצוגו
הבינרי (כפי שהמחשב מכיר)
כל עוד המספר אינו 0נחלקו ב 2 -ואת השארית נשרשר לתוצאה
משמאל:
• דוגמא עבור :23
1 0111
• )23/2 = 11 (1
• )11/2 = 5 (1
בקרה:
• )5/2 = 2 (1 24 23 22 21 20
• )2/2 = 1 (0 =1 0 1 1 1
• )1/2 = 0 (1 1*24 + 0*23 + 1*22 + 1*21 + 1*20 =23
7
© Keren Kalif
ייצוג מספרים בבסיס בינארי – חישוב
ערך בינארי של מספר עשרוני ()2
• דוגמא עבור :26
• )26/2 = 13 (0 1 1010
• )13/2 = 6 (1
בקרה:
• )6/2 = 3 (0 24 23 22 21 20
• )3/2 = 1 (1 =1 1 0 1 0
• )1/2 = 0 (1 1*24 + 1*23 + 0*22 + 1*21 + 0*20 =26
8
© Keren Kalif
טווח המספרים שניתן לייצג ע"י ספרות
בינאריות – מספרים חיוביים
ע"י מספר עשרוני בעל 3ספרות ניתן לייצג )103=( 1000מספרים שונים
()999...0
ובאופן כללי ,מספר עשרוני בעל kספרות יכול לייצג 10kמספרים שונים (10k-...0
)1
ובדומה ,ע"י מספר בינארי בעל kספרות ניתן לייצג 2kמספרים שונים (,)2k-1…0
• 000 = 0*22 + 0*21 + 0*20 = 0
• 001 = 0*22 + 0*21 + 1*20 = 1 למשל עבור :k=3
• 010 = 0*22 + 1*21 + 0*20 = 2
• 011 = 0*22 + 1*21 + 1*20 = 3
• 100 = 1*22 + 0*21 + 0*20 = 4
• 101 = 1*22 + 0*21 + 1*20 = 5
• 110 = 1*22 + 1*21 + 0*20 = 6
• 111 = 1*22 + 1*21 + 1*20 = 7
9
© Keren Kalif
טווח המספרים שניתן לייצג ע"י ספרות
בינאריות – מספרים שליליים
ניתן לייצג 2kמספרים ע"י Kספרות בינאריות
בייצוג מספרים שלמים חיוביים ייוצגו המספרים 2k-1…0
בייצוג מספרים שלמים חיוביים ושליליים ייוצגו המספרים
-2k-1….2k-1-1
• למשל עבור k=3: -23-1…23-1-1
22-1…22-
3…4-
סה"כ )23( 8מספרים
10
© Keren Kalif
טווח המספרים שניתן לייצג ע"י ספרות
בינאריות – מספרים שליליים
מאחר והמחשב מכיר רק 0ו ,1-ואינו מכיר את הסימן ,-
צריך אינדיקציה לכך שהמספר שלילי .אינדיקציה זו היא
שהספרה הכי שמאלית תהייה תמיד ,1ואז נותרו לנו k-1
ספרות לייצוג המספר
• דוגמא :עבור ייצוג מספר עם 4סיביות:
• 3בבינארית זה 0011
• -3בבינארית זה 1101
11
© Keren Kalif
יצוג מספר שלילי בבינארי
נשתמש בשיטת המשלים ל:2 -
http://rlv.zcache.com/binary_joke_sticker-
r52fa63b95dac463787549589a29f5366_v9waf_8byvr_324.jpg
13
Keren Kalif ©
סיכום בסיס בינארי
14
© Keren Kalif
ייצוג מספרים בבסיס - 8הגדרות
בבסיס ( 8אוקטאלי) משתמשים ב 8 -ספרות כדי לספור:
הספרות 0-7
דוגמאות למספרים בבסיס 7502 ,12536 :8
נמספר את מיקום הספרות מימין לשמאל
מספר הספרה הימנית ביותר יהיה 0
מספר הספרה השמאלית ביותר במספר בן nספרות יהיה
n-1
0 1 2 3 4 5
דוגמא121604 :
15
© Keren Kalif
ייצוג מספרים בבסיס – 8חישוב ערך
עשרוני של מספר אוקטאלי (מ 8 -ל)10 -
ראינו כי ערכו של מספר המיוצג בבסיס עשרוני הוא סכום חזקות של :10
102 101 100
16
© Keren Kalif
ייצוג מספרים בבסיס – 8חישוב ערך
אוקטאלי של מספר עשרוני (מ 10 -ל)8 -
17
© Keren Kalif
ייצוג מספרים בבסיס - 16
הגדרות
בבסיס ( 16הקסה-דצימלי) משתמשים ב 16 -תווים כדי
לספור :הספרות 0-9והאותיות A-F
דוגמאות למספרים בבסיס 1DE2510, ABCDEF :16
נמספר את מיקום הספרות מימין לשמאל
מספר הספרה הימנית ביותר יהיה 0
מספר הספרה השמאלית ביותר במספר בן nספרות יהיה
n-1
0 1 2 3 4 5
דוגמא1B19F4 :
18
© Keren Kalif
ייצוג מספרים בבסיס – 16חישוב ערך
עשרוני של מספר הקסה-דצימאלי (מ16 -
ל)10 -
ראינו כי ,ערכו של מספר המיוצג בבסיס עשרוני הוא סכום חזקות של :10
102 101 100
19
© Keren Kalif
ייצוג מספרים בבסיס – 16חישוב ערך
הקסה-דצימאלי של מספר עשרוני (מ10 -
ל)16 -
20
© Keren Kalif
לוח שנה של מתכנתים
7DA = 2010
21
http://bokov.net/pics/img/programmer_calendar.png Keren Kalif ©
ובאופן כללי :מעבר מבסיס Nלבסיס 10
מעבר מבסיס ( 2בינארי) לבסיס ( 10עשרוני):
1310 = 20*1 + 21*0 + 22*1 + 23*1 = 11012
22
© Keren Kalif
ובאופו כללי :מעבר מבסיס 10לבסיס N
יהיה Xמספר עשרוני.
יהיה nהבסיס אליו רוצים להעביר את .X
23
© Keren Kalif
המרה מבסיס 2ל16 -
כל 4סיביות (מה LSB -ל )MSB -ייצגו ספרה בבסיס :16
24
© Keren Kalif
המרה מבסיס 16ל2 -
כל ספרה תיוצג ע"י 4סיביות:
3 5 A למשל ,עבור:
25
© Keren Kalif
השוואה בין ערכים בבסיסים
שונים
30E16 = 78210 = 14168 = 11000011102
ניתן לראות שככל שיש יותר ספרות בבסיס ,כך צריך פחות
ספרות על-מנת לייצג ערך של מספר מסויים
הסיבה היא כי כל מיקום תורם יותר לסכום
26
© Keren Kalif
כתיבת תוכנית ראשונה בC -
ספריה המכילה פקודות
בסיסיות אשר המחשב מכיר כל תוכנית ב C -תראה כך:
>#include <stdio.h
)(void main
במקום 3נקודות נשים
{ את אוסף הפקודות שנרצה
… שהתוכנית תבצע
}
mainהיא פונקציה המורצת עם הרצת התוכנית
• בכל תוכנית תהייה פונקצית mainאחת בדיוק
27
© Keren Kalif
הדפסה למסך
אחת הפקודות שהמחשב מכיר היא הדפסה למסך
>#include <stdio.h
28
© Keren Kalif
הדפסה למסך ()2
>#include <stdio.h
הרצה של תוכנית זו תדפיס
)(void main למסך את המחרוזת
{ 6 is a number
;)”printf(“6 is a number
} דרך נוספת לכתוב תוכנית זו:
>#include <stdio.h
מציין שבחלק זה
במחרוזת יהיה מספר
)(void main דצימלי ,במקרה זה 6
{
;)printf(“%d is a number”, 6
} 29
© Keren Kalif
קבלת קלט מהמשתמש
30
© Keren Kalif
קבלת קלט מהמשתמש ()2
פקודה נוספת שהמחשב מכיר היא קריאת נתון מהשתמש
>#include <stdio.h
1004
)(void main
1008
{
1012
;int x
1016
;)scanf(“%d”, &x
} 1020
33
© Keren Kalif
הדפסת ערכו של משתנה
>#include <stdio.h int:x
4 1000
1004
{ 1012
34
© Keren Kalif
טיפוסי משתנים
בתוכנית הקודמת ראינו כיצד קולטים מהמשתמש מספר שלם
ניתן לקלוט גם מספר עשרוני ,מספר שלילי או תו
אבל צריך לידע את המחשב עם איזה סוג של נתונים אנחנו רוצים לעבוד
בתוכנית הגדרנו:
>#include <stdio.h
)(void main
{
;int x
;)scanf(“%d”, &x
}
35
© Keren Kalif
טיפוסי משתנים DATA
TYPES
שימו לב:
• טווח הערכים של טיפוסים מסוימים יכול להיות שונה ממערכת הפעלה
אחת לאחרת
36
© Keren Kalif
C -טיפוסי נתונים ב
Definition Size Range
char byte 1 -27…27-1
(-128..127)
)’!’,’a’, ‘A’, ‘6‘( תו
int bytes 4 231-1…231-
37
Keren Kalif ©
C (2) -טיפוסי נתונים ב
Definition Size Range
short bytes 2 215-1 …215-
מספר שלם (-32,768…32,767)
int n1 = 4; char: ch
‘f’ 1012
double n2 = 5.2;
short: n3
7
char ch = ‘f’; 1013
:הגדרת משתנים
<type> <var name>[=init value][,<var name2>…]; 40
Keren Kalif ©
אתחול והשמת משתנים
)(void main כאשר מגדירים משתנה ערכו הוא זבל,
{ אלא אם הוא אותחל עם הגדרתו
;int x, y
פעולת השמה היא נתינת ערך למשתנה:
;int z = 9
<>variable> = <expression
;x = 5
; y = x*3 נקרא גם:
;x = y = 17 L-Value = R-Value
} • ראשית מתבצע חישוב הביטוי שמימין ואז ערכו
מושם לתוך המשתנה שמשמאל
int:
int: xx 17
5int: x
??? 5
1000
1000 1000
int:
int: yy 15int: y
17
??? ???
1004
1004 1004
int:
int: zz 9int: z 9 41
1008
1008 1008
© Keren Kalif
ייצוג בינארי
אבל מחשב מכיר רק את 0ו( 1 -יש חשמל או אין חשמל) .לכן הזיכרון לא
באמת נראה כך..
• בכל תא זיכרון יש קומבינציה של 0ו 1-המייצגות את הערך הנמצא בתוך
התא
00000100
00000000
4
int: n1
00000000
00000000 1000 • כל byteמורכב מ 8-יחידות
00011000
00000000
בסיסיות הנקראות ( bitסיבית)
24
int: n2 00000000
00000000 1004
1004
• bitמכיל 0או 1
10101011
11111111
-85
11111111
int : n3
11111111 1008
1008
1012
1012
42
© Keren Kalif
אז כאשר המחשב רואה 111איך הוא
יודע אם הכוונה ל 7 -או ל?-8 -
לפי הטיפוס שהמשתנה הוגדר :אם הוגדר כ unsigned -כל הסיביות
משמשות לערכים
אם הוגדר כ( signed -לא צריך לציין) אז הסיבית השמאלית תמיד תוקצה
לטובת הסימן ( 0חיובי 1 ,שלילי ,ולכן יש לנו סיבית אחת פחות לייצוג
ערכים)
44
© Keren Kalif
הגדרת קבועים
#include <stdio.h>
void main()
{
float price;
float totalPrice;
45
Keren Kalif ©
הגדרת קבועים ()2
>#include <stdio.h
)(void main
{
;float price
;float totalPrice ע"י שימוש במשתנה התוכנית יותר
;float TAXES = 0.17 קריאה ,ברורה מה משמעות המספר גם
למי שלא יודע מהו ערכו של המע"מ
;)" printf("Please enter the product’s price:
;)scanf("%f", &price
כדי להדפיס רק 2ספרות
;)totalPrice = price + (price*TAXES
אחרי הנקודה העשרונית
printf("Total price including %.2f%% taxes is %.2f\n",
;)TAXES*100, totalPrice
} %כדי להדפיס
,שינוי בערך המע"מ יגרור שינוי במקום אחד בלבד בתוכנית
מה שחוסך עבודה ובעיות בעתיד (אם שכחנו לתקן במקום כלשהו).. 46
© Keren Kalif
קבועים
קבוע הוא משתנה שלא ניתן לשנות את ערכו .הערך נכתב ע"י
המתכנת בשורה בה מוגדר הקבוע ,ונרשם בזמן קומפילציה.
לא ניתן לשנות את הערך במהלך ריצת התוכנית .רק
המתכנת יכול לשנות את הערך (שינוי בזמן כתיבת התוכנית)
ולקמפל מחדש עם הערך החדש.
יתרונות:
• תוכנית קריאה יותר
• תחזוקה
בשפת Cקיימות שתי שיטות להגדרת קבוע :
• באמצעות הפקודה define#
• באמצעות הפקודה const
47
© Keren Kalif
DEFINE#
אפשר להגדיר קבוע באופן הבא:
#define TAXES 0.17 שורה זו אינה מסתיימת ב; -
את הפקודה define#רצוי לכתוב בתחילת התוכנית ,לפני הפונקציה
mainובכך לקבוע לו תחום הכרה ציבורי
אפשר לכתוב את הפקודה בכל מקום בתוכנית .הקבוע יהיה מוכר מאותו
מקום ועד לסוף התוכנית.
בכל פעם שהקומפיילר יפגוש את השם )TAXESבדוגמא) הוא יחליפו
בערך ()0.17
48
© Keren Kalif
DEFINE הגדרת קבועים ע"י
#include <stdio.h> float: price
1000
float:
#define TAXES 0.17 totalPrice 1004
1008
void main()
{
float price;
float totalPrice;
49
Keren Kalif ©
CONST
ניתן להגדיר משתנה קבוע באמצעות הפקודה constבאופן הבא :
;const float TAXES = 0.17
תבנית הפקודה :
;const [variable type] variable name = value
50
© Keren Kalif
CONST הגדרת קבועים ע"י
#include <stdio.h> הוא משתנה ולכן יש לו תאTAXES
אבל זהו משתנה שלא ניתן.בזיכרון
const float TAXES = 0.17; לשנות את ערכו בזמן ריצה
float: 0.17
void main() TAXES 1000
{ float:
price 1004
float price;
float:
float totalPrice; totalPrice 1008
51
Keren Kalif ©
שמות משתנים
שמות המשתנים יכולים להכיל אותיות גדולות וקטנות ,מספרים וקו תחתון בלבד
לא ניתן להתחיל שם משתנה במספר
יש לתת שמות משמעותיים!!!
שם משתנה לא יכיל רווחים
יש הבדל בין אותיות גדולות לקטנות
אין להשתמש המילים שמורות של השפה
דוגמאות:
;• int x, _y, _average, avg, x1,x2
!• int 5, 1x, #x, !!2; // error
52
© Keren Kalif
טבלת ASCII
http://www.asciitable.com/
עד כה ראינו ייצוג של מספרים ,אבל איך מייצגים אותיות ע"י קומבינציה של 0ו-
?1
• לכל תו יש קוד מספרי הנקרא "קוד "ASCII
• ניתן לראות את הקוד של כל תו ב"טבלת :"ASCII
53
© Keren Kalif
ייצוג תווים
טבלאת :ASCII
American Standard for Code Information Interchange
54
© Keren Kalif
טבלת -ASCIIדגשים
http://www.asciitable.com/
56
© Keren Kalif
הגדרת משתנים מטיפוס CHAR
)(2
ערכו של ch1הוא ' - '8התו ולא המספר (בגלל שהוא בתוך ' ')
• לכן הערך שנשמר בזכרון הוא ערך ה ASCII -של התו ')56( '8
לעומתו ,ערכו של ch2הוא המספר 8
}
57
© Keren Kalif
וההיפךINT - כCHAR הצגת
: ניתן להדפיסו או כתו או כמספר,מאחר ותו מיוצג כמספר
void main()
{
int num1 = 97;
int num2 = 'a';
char ch1 = 'a';
char ch2 = 97;
printf(“%d”, num1);
printf(“%c”, num1);
97
printf(“%d”, num2);
printf(“%c”, num2);
a
printf(“%c”, ch1);
97
printf(“%d”, ch1); a
printf(“%c”, ch2); a
printf(“%d”, ch2);
}
97
a
97 58
Keren Kalif ©
מעבר תו המייצג ספרה למספר
בהינתן תו המכיל ספרה ,יש למצוא את ערך הספרה
דוגמא :עבור התו ‘ ,’8שערך האסקיי שלו הוא ,56יש לשמור
את הערך 8בint -
• כל הספרות נמצאות בטבלת האסקיי ברצף החל ממספר ( 48ערך האסקיי של
התו ')'0
• החסרת הערך 48מתו המכיל ספרה יביא לנו את ערך המספר
)(void main
{
;'char ch = '8
;'int num = ch - '0
;)printf("ch as char: %c, as int: %d\n", ch, ch
;)printf("num is %d\n", num
} 59
© Keren Kalif
הדפסת וקליטת משתנים
מטיפוסים שונים
עד כה ראינו:
• הגדרת משתנים מטיפוסים שונים
• הדפסה וקליטה של משתנה מטיפוס int
>#include <stdio.h
void main()
{
int n1;
double n2;
char ch;
62
Keren Kalif ©
הדפסת תווים מיוחדים
#include <stdio.h> n\ ירידת שורה
void main()
\" "
{ \t tab
printf("Hello World!");
\\ \
printf("Hello World!\n");
printf("\"Hello World!\"\n"); a\ צלצול
printf("Hello\tWorld!\n");
printf("\\Hello World!\\\n")
printf("\a\a\a");
}
63
Keren Kalif ©
– השמות בין טיפוסים שונים
דוגמא
#include <stdio.h>
void main()
{
int n = 3; כל פעם כשיש השמה מטיפוס המכיל יותר בתים
double d = 97.2; :warning -לטיפוס המכיל פחות בתים נקבל את ה
long l = 20; possible lost of data
char ch = ‘d’;
n = ch; // n= 100
n = l; // n=20, warning: possible lost of data!
ch = d; // ch = ‘a’ , warning: possible lost of data!
n = d; // n=97 , warning: possible lost of data!
ch = 353; // ch=‘a’ , from int to char reduces 256, until value is less than 256
}
64
Keren Kalif ©
TYPEDEF
: זוהי דרך להגדיר שמות חדשים לטיפוסיםtypedef
void main()
}
uint n1 = 9, n2 = -3;
printf("n1=%u n2=%u\n", n1, n2);
{
65
Keren Kalif ©
BUFFER קליטת נתונים לתוך
#include <stdio.h>
void main()
{
int n1, n2;
66
Keren Kalif ©
בעיה :התוכנית "מדלגת" על פקודת הקלט
)(void main
}
;int n1
;char c1
68
Keren Kalif ©
דוגמא לשימוש מיוחד עם
SCANF
: בין רכיבי התאריך השונים/ נרצה שהמשתמש יקליד תאריך כך שיהיה
#include <stdio.h>
void main()
{
int day, month, year;
69
Keren Kalif ©
SCANF -דגשים ל
כל תו שאינו חלק:scanf -נשים לב לתוכן בתוך הגרשיים בפקודת ה
חייב להיות מוקלד ע"י המשתמש,מנתון
void main()
{ :buffer -ה
הקומפיילר קרא את הרווח בתור תו 5<<רווחf
89 enter
int num;
char ch;
int: num
5
7 1000
printf("Please enter a number and char: "); char: ch
‘m’
‘’
scanf("%d%c", &num, &ch); 1004
71
Keren Kalif ©
ביחידה זו למדנו:
בסיסי מספרים:
• בינארי ( ,)2אוקטאלי ( ,)8הקסה-דצימאלי ()16
הדפסה למסך
קבלת נתונים מהמשתמש
מבנה זיכרון התוכנית
הגדרת משתנים
טיפוסי משתנים
השמת ערך למשתנים
קבועים
הפקודה flushall
הפקודה system
72
© Keren Kalif
תרגיל :1קלט מסוגים שונים
כתוב תוכנית המקבלת מהמשתמש את שנת הלידה שלו ,ת.ז ,.גובה ותו
המייצג האם המשתמש זכר או נקבה ()F/M
התוכנית תדפיס את פרטי המשתמש ,אך במקום שנת הלידה תדפיס את
גילו
יש לראות בדיבגר את ערכי המשתנים
73
© Keren Kalif
תרגיל :2עבודה עם תווים שהם
ספרות
כתוב תוכנית הקוראת מהמשתמש 3תווים (מטיפוס )charשהם ספרות
התוכנית תייצר משתנה מטיפוס intשיכיל את הספרות שהתקבלו כמספר
לבסוף התוכנית תדפיס את המספר
דוגמה :אם הוכנסו התווים ' '7' '3' '1יווצר ויודפס המספר .731
74
© Keren Kalif
תרגיל :3טבלאת האסקיי
כתוב תוכנית (קצרצרה!) המדפיסה את מספר האותיות ABבאנגלית
(בהנחה שאינך יודע כמה יש )
75
© Keren Kalif
תרגיל :4מחיר נסיעה במונית
מחיר נסיעה במונית משוקלל מהרכיבים הבאים:
• מחיר התחלתי 10.20 :ש"ח
• מחיר עבור כל ק"מ 1.30 :ש"ח
• מחיר עבור כל מזוודה 2.00 :ש"ח
76
© Keren Kalif
תרגיל :5זמן נסיעה במעלית
נרצה לחשב את הזמן מהרגע שזימנו את המעלית עד אשר נגיע לקומת
היעד
בכל קומה בה המעלית עוצרת היא מתעכבת 5שניות
זמן הנסיעה בין קומה לקומה הינו 3שניות
ניתן להניח שהמעלית נוסעת ללא עצירות ,פרט לעצירה בקומה ממנה
נאסף הנוסע
לצורך הפשטות ,ניתן להניח כי קומת המקור נמוכה מקומת היעד
• בפתרון אראה כיצד ניתן לוותר על הנחה זו
77
© Keren Kalif