1 / 19

Engineering Programming A

Engineering Programming A. תרגול 5. מערכים חד-מימדיים (תזכורת). לדוגמא : מערך בשם Arr בגודל 8 שאיבריו מטיפוס int ב - arr [0] יושב ערך שהוא המספר השלם 3 ב - arr [1] יושב ערך שהוא המספר השלם 7 ב - arr [7] יושב ערך שהוא המספר השלם 16. הגדרה ואתחול. מבנה הפקודה:

shelley
Download Presentation

Engineering Programming A

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Engineering Programming A תרגול 5

  2. מערכים חד-מימדיים (תזכורת) • לדוגמא: מערך בשם Arrבגודל 8 שאיבריו מטיפוסint ב -arr[0] יושב ערך שהוא המספר השלם 3 ב - arr[1] יושב ערך שהוא המספר השלם 7 ב - arr[7] יושב ערך שהוא המספר השלם 16

  3. הגדרה ואתחול • מבנה הפקודה: ;[<מספר איברים>] <שם המערך> <טיפוס> • דוגמאות להגדרת מערך: int ids[7]; char name[12]; intarr[10] = { 1, 4, 6, 7, 8, 0 , 5, 5 , 1, 2 }; intarr[10] = { 1, 4 }; intarr[10] = {0}; intarr[ ] = {1, 4, 7};

  4. מערכים רב-מימדיים • מערך דו מימדי הוא מערך של מערכים , כלומר מטריצה. • הגדרתו תתבצע כך:int mat[N][M]; • כאשר N הוא מספר השורות ו-M הוא מספר העמודות. • ניתן לאתחל מערך דו-מימדי עם הגדרתו בדרכים הבאות: • הצבת הנתונים לפי שורות (בכל שורה 3 עמודות, כלומר 3 נתונים): intmat[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; • הצבת שני נתונים בכל שורה, ואיפוס שאר התאים שבשורה: int table[4][3] = {{1,2},{4,5},{7,8},{10,11}}; • הצבת הנתונים במערך אחד אחרי השני (לפי סדר השורות) ואיפוס השאר (אם ישנם תאים נוספים): int mat[4][3]={1,2,3,…,12}; • ניתן לא להגדיר את מספר השורות, אך חובה להגדיר את מספר העמודות: int mat[][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};  intmat[][]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}}; 

  5. סריקה של מערכים סריקה של מערכים מתבצעת בעזרת לולאות מקוננות, כאשר כלל האצבע הוא שכל מימד של המערך דורש לולאה אחת. דוגמא: כתוב תכנית, אשר עבור כל המספרים מ-0 ועד 10, שומרת לתוך מערך את 10 החזקות הראשונות של כל מספר (מ-0 ועד 9). לאחר מכן, התכנית תקלוט שני מספרים x ו-y (בטווח הרלוונטי לתרגיל), ותדפיס את x בחזקת y. #include <stdio.h> #define NUMS 11 #define NPOWERS 10 void main() { intpowers[NUMS][NPOWERS],i,j,k,res,x,y; for (i=0;i<NUMS;i++){ powers[i][0]=1; for (j=1;j<NPOWERS;j++) { powers[i][j]= powers[i][j-1] * i; } } scanf("%d%d",&x,&y); printf("%d",powers[x][y]); }

  6. שאלה • יש לממש את התוכנית הבאה: • קלט: מערך דו-ממדי המכיל תווים (chars), ומילה המורכבת מתווים ואורכה קצר משני ממדי המערך. • הקלט נתון (Hardcoded), אין צורך לקלוט אותו ממשתמש. • פלט: הדפסת כל המופעים של המילה במערך הדו-ממדי, כאשר המילה יכולה להופיע בשורה (horizontally) או בעמודה (vertically)

  7. #include<stdio.h> • #define ROW 5 • #define COL 5 • #define WORDSIZE 3 • void main() • { • char matr[ROW][COL]={{'r','v','o','q','w'}, • {'a','h','s','x','l'}, {'n','k','s','d','m'}, • {'r','a','n','j','r'}, • {'d','k','u','c','a'}}; • char word[WORDSIZE]= {'r','a','n‘}; • int i,j,k,l;

  8. // Search for horizontal words (along the rows): • for(i=0; i<ROW; i++) //Scan the rows. • for(j=0; j<=COL-WORDSIZE; j++) //Scan the columns. • { • for(k=j, l=0; l<WORDSIZE && matr[i][k]==word[l]; k++, l++);//Scan the word if it is there. • if(l==WORDSIZE) //Check if the whole word was encountered. printf("The word was found horizontally!!! Its coordinates are: x1=%d, y1=%d, x2=%d, y2=%d\n", i, k-WORDSIZE,i,k-1); • }

  9. //Search for vertical words (along the columns): • for(i=0; i<COL; i++) //Scan the columns: • for(j=0; j<=ROW-WORDSIZE; j++) //Scan the rows: • { • for(k=j, l=0;l<WORDSIZE && matr[k][i]==word[l]; k++, l++); • if(l==WORDSIZE) • printf("The word was found vertically!!! Its coordinates are: x1=%d, y1=%d, x2=%d, y2=%d\n", k-WORDSIZE,i,k-1,i); • } • }

  10. טבלתascii -

  11. מחרוזות • מחרוזת היא מערך של תווים (chars), שבסופם התו ‘\0’ (התו בעל ערך ה- ascii0). • מחרוזת קבועה, היא אוסף של תווים בין מרכאות כפולות. • דוגמא: המחרוזת “hello” היא מערך של 6 תווים, שנראים בזיכרון כך: • יש הבדל בין “a” לבין ‘a’: ‘a’ הוא תו יחיד (המייצג את הערך 97), ו- “a” היא מחרוזת המורכבת משני תווים: • אל התווים השונים במחרוזת ניגש כפי שניגשים לאברי מערך. • אם נרצה להדפיס מחרוזת בשלמותה (עד ה ‘\0’), או לקלוט מחרוזת שלמה נשתמש בסימן “%s”.

  12. הגדרה ואתחול • ההגדרה בדומה למערך: char name[10]; • אתחול: char name[]="sapir"; char name[]={'s','a','p','i','r','\0'}; • בשני המקרים ששת תווי המחרוזת נמצאים בזיכרון באופן רציף, ו- name הוא שם המחרוזת (המערך). • ניתן גם לאתחל את המחרוזת עם גודל מוכרז. במקרה זה ערך שאר התוים יהיה '\0': char name[10]="sapir";

  13. תרגיל 1 כתוב תכנית הקולטת מהמשתמש את השם שלו, ומדפיסה אותו למסך עם אות ראשונה גדולה (uppercase), ושאר האותיות קטנות (lowercase). #include <stdio.h> void main() { char name[10]; int I; scanf("%s",name); if (name[0]>='a' && name[0]<='z') name[0]=name[0]-('a'-'A'); for (i=1;name[i]!='\0';i++) if (name[i]>='A' && name[i]<='Z') name[i]=name[i]+('a'-'A'); printf("%s",name); }

  14. gets & puts • לפקודה scanf עם %s יש מגבלה – היא מפסיקה את קליטת המחרוזת כשמוקלד רווח או TAB, ולכן לא יכולה לקלוט יותר ממילה אחת. • הפקודה gets מתגברת על כך - קולטת עד שמוקלד enter. • הפקודה puts מדפיסה את המחרוזת כמו printf, ולאחר מכן מדפיסה ירידת שורה. • char str[50]; • gets(str); • puts(str);

  15. תרגיל 2 כתוב תכנית הקולטת משפט שהמילים בו מכילות אותיות קטנות בלבד. על התכנית לספור כמה פעמים מופיעה כל אות, ולהדפיס זאת. מגבלה: אסור להשתמש בלולאות מקוננות. #include <stdio.h> void main() { char words[100]; inti, counters[26]={0}; gets(words); for (i=0; words[i]!='\0'; i++) if (words[i]!=' ') counters[words[i]-'a']++; for (i=0;i<26;i++) if (counters[i]>0) printf("%c appeared %d times\n",'a'+i, counters[i]); }

  16. פקודות לעבודה עם מחרוזות מהספריה <string.h> strcmp: • intstrcmp(const char *s1, const char *s2); • The function compares successive elements from two strings, s1 and s2, until it finds elements that are not equal. • If all elements are equal, the function returns zero. • If the differing element from s1 is greater than the element from s2 (both taken as unsigned char), the function returns a positive number. • Otherwise, the function returns a negative number. strlen: • size_tstrlen(const char *s); • The function returns the number of characters in the string s, not including its terminating null character.

  17. פקודות לעבודה עם מחרוזות מהספריה <string.h> strcpy: • char *strcpy(char *s1, const char *s2); • The function copies the string s2, including its terminating null character, to successive elements of the array of char whose first element has the address s1. It returns s1. strcat: • char *strcat(char *s1, const char *s2); • The function works like strcpy(), only that it copies the string s2 to the END of the string s1, meaning that the functions ADDS s2 to the end of s1. The function finds the end of s1 according to the character ‘\0’. gets: • char *gets(char *s1); • The function works like scanf(“%s”,...), only that it terminates the input via the key ENTER only. Unlike scanf, it can read the characters SPACE & TAB from the user and insert them to the char array s1.

  18. דוגמא כיצד משתנות המחרוזות בקוד הבא? #include <stdio.h> #include <string.h> void main() { char str1[10]; char str2[]="abcdefg"; int result; unsigned int i; strcpy(str1, str2); result=strcmp(str1, str2); result=strlen(str2); str2[4]='\0'; result=strlen(str2); strcat(str2,"cba"); result=strcmp(str1, str2); } ? Stands for unknown/uninitialized memory

  19. תרגיל 3 כתוב תכנית אשר קולטת מילים (אחת אחרי השנייה) מהמשתמש עד אשר מוקלדת המילה EXIT, ולאחר מכן מדפיסה למסך את המילה הארוכה ביותר שהוקלדה (לא כולל EXIT). אם ישנן כמה מילים באותו האורך, על התוכנית להדפיס רק את המילה שמופיעה ראשונה לפי סדר אלפא-ביתי. לדוגמא עבור הקלט: this is a test תודפס המילה: test #include <stdio.h> #include <string.h> #define MAXLEN 1000 void main() { char word[MAXLEN]; char longest[MAXLEN]=""; scanf("%s",word); while (strcmp(word,"EXIT")!=0) { if (strlen(word)>strlen(longest) || (strlen(word)==strlen(longest) && strcmp(word,longest)<0)) strcpy(longest, word); scanf("%s",word); } printf("%s\n", longest); }

More Related