יום חמישי, 27 באפריל 2017
יום רביעי, 26 באפריל 2017
מהו CLASS
class - מחלקה
ה class מתנהג כמו ה struct של שפת C. אבל עם תחביר מעט שונה והרבה תכונות נוספות.הדוגמה הפשוטה:
class Item{ public: // נסביר בהמשך מה משמעות השורה הזאת, כרגע פשוט נכתוב אותה int a; int b; char c; }; void main(){ Item q1; q1.a = 5; q1.b = 10; q1.c = 'A'; cout <<q1.a<<"\n"<<q1.b<<"\n"<<q1.c<<"\n"; }כפי שרואים, בניגוד ל struct כאן אין צורך לכתוב את המילה "class" כל פעם שמכריזים על משתנה.
יום שלישי, 25 באפריל 2017
מ C אל ++C
ההבדלים בין C ל ++C
אחרי שלמדנו שפת C, נתחיל ללמוד ++C.ישנם מספר הבדלים בין C ל ++C. חלקם רק בשמות הפונקציות והספריות, וחלקם בכך ששפת ++C
היא שפה מונחת עצמים (Object Oriented).
הבדלים חשובים:
Cעל מנת ליצור ב Visual Studio תוכנית היה עלינו להשמיט את ה "pp" מסיומת הקובץ ("Source.c" במקום "Source.cpp").
++C
ב ++C לא נשמיט.
יום ראשון, 26 בפברואר 2017
שפת C - מצביע לפונקציה, qsort , bsearch ומשתנה const
מצביע לפונקציה
כפי שאפשר ליצור מצביע לכתובת בזיכרון של משתנה, כך אפשר גם ליצור מצביע לפונקציה בקוד שלנו.-מצביע לפונקציה יכול להצביע רק על פונקציות שיש להן את אותם ארגומנטים ואת אותו סוג ערך מוחזר.
-אפשר להשתמש במצביע לפונקציה בדיוק כמו בפונקציה שהוא מצביע עליה.
-שם של פונקציה הוא מצביע בעצמו.
מבנה כללי:
; (הארגומנטים שהפונקציה מקבלת) (שם_המצביע *) סוג הערך שהפונקציה מחזירה
לדוגמה אם יש פונקציה בשם "F":
double F(int a, int b, char c) { ...... }
אז כדי שמצביע "p" יוכל להצביע עליה, צריך להגדיר אותו כך:
double (*p) (int a, int b, char c);
ואז נוכל להכניס אליו את הכתובת של הפונקציה:
p = F ;
-שימו לב שבניגוד למשתנים, כאן לא צריך את התו &. משום ששם פונקציה הוא מצביע בעצמו.יום שני, 20 בפברואר 2017
יום שני, 13 בפברואר 2017
שפת C - משחק בול פגיעה
עוד תרגילים וחזרות על חומר ישן
ננסה ליצור את המשחק "בול פגיעה" (Bulls and Cows)למי שלא מכיר כך עובד המשחק:
*המחשב בוחר רצף של 4 ספרות שונות בסדר אקראי.
*השחקו מנסה לנחש מה הספרות (בסדר הנכון)
אחרי ה"קלט" מהשחקן, המחשב מדפיס:
"בול" - עבור כל ספרה שקיימת ברצף וגם נמצאת באותו מיקום.
"פגיעה" - עבור כל ספרה שקיימת ברצף אבל לא נמצאת במיקום הנכון.
~משחק חשיבה נחמד ומומלץ לכולם~
ראו גם: וויקיפדיה
יום רביעי, 8 בפברואר 2017
שפת C - עוד על define ו enum
define מתקדם
כפי שלמדנו כבר, define מגדיר קבוע. לאורך כל התוכנית כשהקבוע יופיע הקומפיילר יתייחס אליו כרצף התווים שבחרנו.-השם הרשמי להגדרות כאלו הוא "מאקרו" (macro).
-נראה היום שאפשר לעשות פעולות מתקדמות יותר עם define. בדומה לפונקציות:
#include <stdio.h> #define p(a) printf("%d\n",a) void main(){ int x=3,y=8; p(x); p(y); }
כאן הגדרנו את p כישות שדומה לקבוע. כל מקום שיש בתוכנית: (מספר או תווים כלשהם)p
זה יוחלף ל:
printf("%d\n",מספר)
גם תווים:
#include <stdio.h> #define p(a) printf("%c\n",a+1) void main(){ p('e'); p('E'); }
שפת C - הגדרת טיפוס typedef
הגדרת טיפוס - typedef
התפקיד של typedef זה להקל על מתכנתים ע"י הגדרת שם לטיפוס (סוג) חדש, או ע"י הגדרת שם נוסף לטיפוס קיים.השימוש ב typedef הופך את התוכנית ליותר קריאה, ולעיתים גם ליותר קצרה.
הפקודה נכתבת מחוץ לכל הפונקציות. בדומה לinclude ולמשתנים גלובאלים.
מבנה כללי:
typedef שם_חדש שם ישן ;
לדוגמה:
p1 ו p2 הם מסוג int בשתי התוכניות הבאות:
#include <stdio.h> void main(){ int p1 , p2; . . . }
////#include <stdio.h> typedef int phone; void main(){ phone p1 , p2; . . . }
יום שלישי, 7 בפברואר 2017
שפת C - חזרה עם גידי
שאלות חזרה על מערכים:
1. קלוט מהמשתמש 6 תווים למערך והדפס אותם בסדר הפוך, תו תחת תו.
2. קלוט סדרת מספרים מהמשתמש, סדר אותם במערך מהקטן לגדול, והדפס מהו התו הגדול והקטן ביותר מבניהם.
3. קלוט מהמשמש מערך דו ממדי של מספרים חיוביים, וענה האם קיבלנו "ריבוע קסם".
ריבוע קסם הוא מערך דו ממדי של X על X מספרים, בו סכום כל השורות שווה. סכום כל העמודות שווה. סכום שני האלכסונים הכי גדולים שווה, וסכום כל שורה שווה לסכום כל עמודה ושווה גם לסכום כל אלכסון.
לדוגמה:
8 1 6
3 5 7
4 9 2
הוא ריבוע קסם.
שיעורים Solaris - סיכום מבחן על יוניקס
מבחן יוניקס
יום ראשון, 5 בפברואר 2017
שפת C - קבצים בינארים וקריאה לא סדרתית
קבצים בינארים
כפי שלמדנו בשיעור הקודם, כדי לכתוב/לקרוא מקובץ צריך לפתוח אותו ובסוף גם לסגור אותו:
void main( ) {
FILE fp ;
fp = fopen ("name_of_file","mode") ;
.
.
.
fclose(fp);
}
למדנו בקצרה שעבור קבצים בינארים יש ב mode את האות b.
פעולות בסיסיות על קובץ בינארי:
fwrite( מצביע קובץ , מספר המשתנים , גודל המשתנה בבתים , כתובת המשתנה ממנו מעתיקים )
fwrite( void *p , int size , int num , FILE *fp ) :ניסוח באנגלית
קולטת מהמשתנה עליו מצביע p , על פי הגודל של size (שהוא הסוג של המשתנה p), כפול num פעמים. (num יהיה 1עבור משתנה יחיד, או יותר עבור כל איבר שרוצים להעתיק (אם p הוא מערך)) ו"מדפיסה" את כל זה באופן בינארי לקובץ
עליו מצביע fp .
יום רביעי, 1 בפברואר 2017
שפת C - טיפול בקבצים
טיפול בקבצים
- תוכנית יכולה לגשת לקבצים אחרים במחשב. לקרוא, ליצור או לשנות אותם.
- כל הפונקציות והקבועים הנוגעים לטיפול בקבצים כלולים בספריית הקלט פלט, הלא היא ספריית stdio.h .
- כל קובץ הוא מבחינתנו struct מסוג FILE (חשוב להקפיד על האותיות הגדולות). לא נפרט מהם שדותיו.
כדי לטפל או ליצור קובץ נצטרך קודם להצביע על הכתובת שלו בזיכרון. כמו כל המצביעים גם המצביע הזה
צריך להיות מאותו הסוג של הקובץ עליו הוא אמור להצביע, היינו מסוג FILE.
(ולא מסוג "struct FILE", משום ש"FILE" הוא טיפוס שהוגדר כבר כ "struct FILE" ע"י typedef בספריה stdio.h. -נלמד בהמשך.)
כדי לעבוד עם קובץ, צריך קודם לפתוח אותו. (כך שהוא ירוץ ב RAM של המחשב)
לשם כך משתמשים בפונקציה:
fopen ( __ שם או נתיב__ , __mode__ );
באופן הבא:
#include <stdio.h>
void main( ) {
FILE *fp ;
fp = fopen ( __שם או נתיב__ , __mode__ );
if (fp == NULL) { // NULL אם פתיחת הקובץ נכשלה המצביע יקבל
if (fp == NULL) { // NULL אם פתיחת הקובץ נכשלה המצביע יקבל
printf ("Can't open file");
exit (0); // stdlib.h בחלק מהמקרים על מנת להשתמש בפקודה הזאת יש להוסיף את הספרייה
}
.
.
.
.
}
יום שלישי, 31 בינואר 2017
יום רביעי, 25 בינואר 2017
שפת C - רקורסיה - תרגילים וכללים
רקורסיה - שיטה לבנייה נכונה
פתרונות מהשיעור הקודם:
תשובה 1: (לא רשמי)
#include <stdio.h> int f1(int x,int y) { if (x<y||(x==y&&x%2==1)) // הפונקציה מחזירה את סכום המספרים הזוגיים בין שני מספרים כשהשמאלי גדול או שווה לימיני return 0; if (y%2==1) y++; return 1 + f1(x, y+2); } void main() { int x,y; printf("Enter 2 numbers: "); scanf("%d %d",&x,&y); printf("Zugi: %d \n",f1(x,y)); }
יום שלישי, 24 בינואר 2017
שיעורים Solaris - בעיות אופטימיזציה עם מספר נעלמים - השיטה הקצרה
יום שני, 23 בינואר 2017
יום ראשון, 22 בינואר 2017
שפת C - רקורסיה
רקורסיה - recursion
רקורסיה הוא תהליך בו הפונקציה קוראת לעצמה.
מתכנתים מתקשים להבין את תהליך הרקורסיה ומופתעים מתוצאותיו.
זהו כלי חשוב מאוד וישנן בעיות שהפיתרון הטבעי להן הוא רקורסיה.
לדוגמה נתבונן בפונקציה רקורסיבית שמחזירה סכום המספרים מ0 ועד למספר שהיא מקבלת.
עבור 5 הפונקציה תחזיר סכום: 1+2+3+4+5
עבור 5 הפונקציה תחזיר סכום: 1+2+3+4+5
#include<stdio.h> int f(int n){ if(n==0) return 0; return n+f(n-1); } void main(){ int n; printf("Enter number: "); scanf("%d",&n); printf("%d\n",f(n)); }
יום ראשון, 15 בינואר 2017
שפת C - עבודה עם רשימות מקושרת שמכילות גם מצביעים לרשימות אחרות (יום ראשון)
עבודה מורכבת עם רשימות מקושרות
נוכל להגדיר שאיברי רשימה מקושרת מכילים גם מצביע ל head של רשימה מקושרת אחרת.כך למעשה ניצור דבר הדומה למערכים דו ממדיים, רק בצורה דינאמית ומקושרת (לא רציפה בזיכרון).
התרגיל היום זה ליצור פונקציה שיוצרת רשימה מקושרת של סטודנטים ( ) CreateStudentList
ופונקציה שיוצרת רשימה מקושרת של קורסים ( ) CreateCourseList
כל סטודנט מכיל את השדות הבאים:
שם סטודנט
גיל
תעודת זהות (ID)
מערך של ציונים בקורס הנוכחי (עדיף מערך דינאמי אבל אפשר להסתפק במצב קבוע של בדיוק 4 מבחנים במערך)
כל קורס מכיל את השדות הבאים:
שם הקורס
ממוצע ציונים (של כל הסטודנטים שלומדים בקורס)
מצביע לראש (= head) רשימה מקושרת של כל הסטודנטים שלומדים בקורס (sh)
next לקורס הבא
יום חמישי, 12 בינואר 2017
הירשם ל-
תגובות (Atom)

