Introduction to
Download
1 / 28

Introduction to Programming in C - PowerPoint PPT Presentation


  • 69 Views
  • Uploaded on

Introduction to Programming in C. תרגול 5. 22.03.2011. 1. מטרת התרגול. מיון בועות מערכים דו-ממדיים ומחרוזות. תזכורת מערכים. הגדרת מערך עם שלושה תאים: int nums[ 3 ]; פנייה לתא במערך ע"י האינדקס של התא: nums[0]=1; nums[1]=3; nums[2]=nums[1]+nums[0];. מיון בועות.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' Introduction to Programming in C' - lynna


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

Introduction to Programming in C

תרגול 5

22.03.2011

1


מטרת התרגול

  • מיון בועות

  • מערכים דו-ממדיים ומחרוזות.


תזכורת מערכים

  • הגדרת מערך עם שלושה תאים:

    int nums[3];

  • פנייה לתא במערך ע"י האינדקס של התא:

    nums[0]=1;

    nums[1]=3;

    nums[2]=nums[1]+nums[0];


מיון בועות

  • כתבו תוכנית אשר קולטת מערך של עד LEN מספרים וממיינת אותו בעזרת מיון בועות. באופן הבא:

    • Nums קלוט LEN מספרים

    • i  LEN - 1

    • כל עודi > 1, בצע:

      • j  0

      • כל עוד j < i , בצע:

        • אם Nums[J] > Nums[J+1] אז:

          החלף Num[j]  Num[j+1]

        • jj + 1

      • ii - 1


int i, j, len = 0, a[LEN], isLastValue = 0;

// Get number until -1 is entered

printf(“Enter numbers (-1 to finish): “);

while ( (len < LEN) && (!isLastValue) )

{

scanf(“%d”, &a[len]);

if (a[len] == -1)

isLastValue = 1;

len++;

}

// Sort array using bubble sort

for (i = len - 1; i > 1; i--)

for (j = 0; j < i; j++)

if (a[j] > a[j + 1])

{

int temp = a[j];

a[j] = a[j + 1];

a[j + 1] = temp;

}

// Print sorted array

for (i = 0; i < len; i++)

printf(“%d, “, a[i]);



תרגיל 1- מערכים דו-ממדיים

  • צריך לממש את התוכנית הבאה:

    • קלט: מערך דו-ממדי המכיל תווים (chars), ומילה המורכבת מתווים אשר אורכה קצר משני ממדי המערך.

      • הקלט נתון (Hardcoded), אין צורך לקלוט אותו ממשתמש.

    • פלט: הדפסת כל המופעים של המילה במערך הדו-ממדי, כאשר המילה יכולה להופיע בשורה (horizontally) או בעמודה (vertically)

  • חלוקת עבודה לשלבים:

    • נבין כיצד למצוא את כל המופעים בשורות.

    • נבין כיצד למצוא את כל המופעים בעמודות.

      • האם יש דמיון למציאה עבור שורות.


פתרון תרגיל 1

#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+1]="ran"; //Leave room for the ‘\0’ character.

int i,j,k,l;


פתרון תרגיל 1 - שורות

// 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.

{

//Scan the word if it is there.

for(k=j, l=0; l<WORDSIZE && matr[i][k]==word[l]; k++, l++);if(l==WORDSIZE)

printf("The word was found horizontally!!! Its coordinates are: x1=%d, y1=%d, x2=%d, y2=%d\n", i, k-WORDSIZE,i,k-1);

}


פתרון תרגיל 1 - עמודות

//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);

}

}


פתרון תרגיל 1 - פלט

  • The word was found horizontally!!! Its coordinates are: x1=0, y1=0, x2=0, y2=2“

  • The word was found vertically!!! Its coordinates are: x1=3, y1=0, x2=3, y2=2


תרגיל 2

הדפסת ערכי מטריצה (מערך דו-מימדי) בצורה מעגלית

כתבו תוכנית שנתונה לה מטריצה בגודל מסוים (4 על 3), ועליה להדפיס אותה בצורה מעגלית. לדוגמה, אם נתון המערך הבא:

char matrix[4][3]= { {'1','2','3'} , {'4','5','6'} , {'7','8','9'} , {'a','b','c'}};

היא תדפיס:

1 2 3 6 9 c b a 7 4 5 8


פתרון תרגיל 2

#include <stdio.h>

#define UP 0

#define RIGHT 1

#define DOWN 2

#define LEFT 3

int main() {

int dir; //direction

intx,y; //posiotion

intu,r,d,l; //limits: up, right, down, left

int count; //just counts the cells that printed

char arr[4][3]= { {'1','2','3'} , {'4','5','6'} , {'7','8','9'} , {'a','b','c'}};

//at first, direction set to be right

dir=RIGHT;

//we start at this corner

x=0; y=0;

//at first, limits are edges of array

u=1; r=3-1; d=4-1; l=0;


פתרון תרגיל 2

for(count=0;count<3*4;count++) {

printf("%c ", arr[x][y]);

switch(dir){

case UP: //move to direction

x--; //if we are on the limit: move limit one step to center & change direction

if(x==u) {

u++;

dir=(dir+1)%4;

}

break;


פתרון תרגיל 2

case RIGHT: //move to direction

y++; //if we are on the limit: move limit one step to center & change direction

if(y==r) {

r--;

dir=(dir+1)%4;

}

break;

case DOWN: //move to direction

x++; //if we are on the limit: move limit one step to center & change direction

if(x==d) {

d--;

dir=(dir+1)%4;

}

break;


פתרון תרגיל 2

case LEFT: //move to direction

y--; //if we are on the limit: move limit one step to center & change direction

if(y==l) {

l++;

dir=(dir+1)%4;

}

break;

}

}

return 0;

}


תרגיל 3

  • להלן אלג' פסודו-קוד עבור מחרוזת W:

    • עבורעלכלאינדקס iמ-0 עד אורך מחרוזת נתונה W

    • עבורעלכלאינדקס j מ-0 עד אורך מחרוזת נתונה W

    • אם W[i] = W[j] הדפס את W[i].

  • מה עושה האלג'?

  • מוצא אותיות שמופיעות במילה יותר מפעם אחת.

  • מה יודפס בהינתן המלה “abc” ?

  • תשובה “abc”

    • כיצד נתקן את האלג' ?

  • מה יודפס בהינתן המילה “koshka” ?

  • תשובה"kk”

    • כיצד נתקן את האלג' ?


Ascii codes
ASCII codes

  • הייצוג של תווים כ- char-ים הוא ע"י תווי ascii.

    • לדוגמא, ייצוג ascii של ‘a’ הוא 97, ועל כן (int) ‘a’ == 97.

  • כל האותיות באנגלית מופיעות באופן עוקב ב- ascii.

    • ערך ‘b’ הוא 98, ערך ‘c’ הוא 99 וכן הלאה.

  • נוכל לנצל תכונה זו על מנת לבצע השוואות ואריתמטיקה של תווים.

  • דוגמא:

    if (c >= ‘a’ && c <= ‘z’)

    printf(“%c is an alphabetic character\n”, c);

  • דוגמא שקולה:

    If (c – ‘a’ >= 0 && c – ‘z’ <= 0)

    printf(“%c is an alphabetic character\n”, c);


תרגיל 4 - פולינדרום

  • פלינדרום הוא מילה שנקראת באופן זהה כאשר קוראים אותה מן הסוף להתחלה.

  • דוגמאות לפלינדרומים:

    • “a”

    • “aba”

    • “a man, a plan, a canal – panama” (בהתעלם מסימני פיסוק ורווחים)

  • צריך לממש את התוכנית הבאה:

    • קלט: מחרוזת מן המשתמש.

    • פלט: הודעה האם המחרוזת היא פלינדרום או לא.


פתרון תרגיל 4

#include<stdio.h>

#include<string.h>

void main(){

int i,len=-1;

char w1[256];

printf(“Enter String: ”);

scanf(“%s”, w1);

// Calc length

while (w1[++len] != ‘\0’);

for (i=0 ; i < len/2 && w1[i] == w1[len-i-1] ; i ++);

if (i==len/2)printf("The word is a palindrome! \n");

elseprintf("The word isn't a palindrome! \n");

}


תרגיל 5 – השוואה לקסיקוגרפית

  • השוואה לקסיקוגרפית (מילונית) היא כזו שמשווה מילים לפי סדר הופעתם במילון.

  • צריך לממש את התוכנית הבאה:

    • קלטים:2 מחרוזות מהמשתמש.

    • פלט: הודעה שמבהירה איזו משתי המחרוזות גדולה יותר לקסיקוגרפית.


פתרון תרגיל 5

#include<stdio.h>

#define MAX_WORD_LEN 256

void main(){

int i;

char w1[MAX_WORD_LEN], w2[MAX_WORD_LEN];

printf("Please enter first word:");

scanf(“%s”, w1);

printf("Please enter second word:");

scanf(“%s”, w2);

for (i=0 ; w2[i] && w1[i] == w2[i] ; i++);

if (!w1[i] && !w2[i])printf("equal\n");

elseif (w1[i] > w2[i])printf("first bigger\n");

elseprintf("last bigger\n");

}


תרגיל 6

  • צריך לממש את התוכנית הבאה:

    • קלט: מחרוזת שמייצגת משפט.

    • פלט:אותה מחרוזת, כאשר כל מילה מתחילה באות גדולה.

  • זכרו- ניתן לנצל את התכונות האריתמטיות של התווים. ההפרש בין כל אות גדולה ואות קטנה בקוד ascii הוא קבוע.


פתרון תרגיל 6

#include<stdio.h>

void main(){

int i,len;

char w1[256];

printf("Please enter a sentence:\n");

scanf(“%s”, w1);

for (i=0; w1[i] ; i++)

if (!i || w1[i-1]==' ')

if (w1[i] >='a' && w1[i]<='z')

w1[i] += 'A' - 'a';//This is actually subtracting 32 from w1[i].

printf("%s\n",w1);

}


תרגיל 7

  • צריך לממש את התוכנית הבאה:

    • קלט: מחרוזת שמייצגת משפט המכיל 5 מילים.

    • פלט: המילה הארוכה ביותר במשפט.

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


פתרון תרגיל 7

#include<stdio.h>

void main(){

int i=0,len,maxWordLoc, maxWordLen=0, curWordLen=0;

char w1[256];

printf("Please enter a sentence consisting of 5 words:\n");

scanf(“%s”, w1);

do{

if (w1[i] == ' ' || w1[i] =='\0'){

if (curWordLen>maxWordLen){

maxWordLen = curWordLen;

maxWordLoc = i;

}

curWordLen = 0;

}else

curWordLen++;

}while(w1[i++]);


פתרון תרגיל 7

while (maxWordLoc && w1[maxWordLoc-1] !=' ')

maxWordLoc--;

while (w1[maxWordLoc] && w1[maxWordLoc]!=' ')

putchar(w1[maxWordLoc++]);

}


  • #define BUFF_SIZE 256

  • void main()

  • {

  • int i = -1, x = 0;

  • char s[BUFF_SIZE];

  • printf(“Enter a string: ”);

  • gets(s);

  • while (s[++i] != '\0')

  • if (s[i] >= '0' && s[i] <= '9')

  • {

  • x *= 10;

  • x += s[i] - '0';

  • }

  • i = -1;

  • while (s[++i] != '\0')

  • if (s[i] >= '0' && s[i] <= '9')

  • {

  • s[i] = x % 10 + '0';

  • x /= 10;

  • }

  • puts(s);

  • }

תרגיל 8: מעקב


ad