מבוא לתכנות ולמדעי המחשב בשפת C/תרגיל 5

מתוך ויקיספר, אוסף הספרים והמדריכים החופשי

לדף הקורס

תרגיל 5 -מבוא למצביעים


q1.txt[עריכה]

נתון הקוד הבא:

    float a = 10; 
    float *p = &a; 
    float **p2 = &p;

בטבלה הבאה יש להשלים את הטיפוס של כל ביטוי. שני הביטויים הראשונים נתונים כדוגמה.

 
Expression		Type 

a			float 
p2			float** 
*p2
**p2
&p2
*&p2
&*p2
***&p2

העתיקו את הטבלה לקובץ בשם q1.txt ומלאו את הטיפוסים החסרים בה.

q2.c[עריכה]

נתון הקוד הבא:

#include <stdio.h>

int main() {

  double arr[10]; 
  arr[2] = 12222; 
  arr[3] = 13333; 
  arr[7] = 17777; 
  arr[8] = 18888; 

  double *p1, *p2; 

  p1 = arr+3; 
  p2 = &arr[7]; 

  //  your code here...
  

  return 0;
}

עליכם להשלים את הקוד במקום המסומן בהערה על מנת שיודפסו ארבעת הערכים של המערך להם הושם ערך. כל ההדפסות אמורות להיות תוך שימוש רק ב p1 ו p2. אין להשתמש ב arr.

פלט רצוי:

12222.000000 13333.000000 17777.000000 18888.000000

את הקוד השלם יש לכתוב בקובץ q2.c.

q3.c[עריכה]

נתון הקוד הבא

#include <stdio.h> 
#include <stdlib.h> 

int main() {
    int N=10; 
    int arr[N]; 
    int *arr1 = (int*)malloc(sizeof(int)*N); 
    
    int *arrPtr[N]; 
    int **arrPtr1 = (int**)malloc(sizeof(int*)*N);

    int i; 
    for(i=0; i<N; ++i) {
	arr[i] = i+1;
	arr1[i] = i+1; 

	arrPtr[i] = arr1+i; 
	arrPtr1[i] = arr+(N-1-i); 
    }

    for(i=0; i<N; ++i) {
	// delete either STACK or HEAP from the next line 
	printf("The value %d is stored on the STACK/HEAP \n",*(arrPtr[i]) );
    }
    printf("\n\n"); 

    for(i=0; i<N; ++i) {
	// delete either STACK or HEAP from the next line 
	printf("The value %d is stored on the STACK/HEAP \n",*(arrPtr1[i]) );
    }
				  
    free(arr1);
    free(arrPtr1); 
    
    return 0; 
}

נסו להבין איך הוא עובד ואז לשנות את פקודות ההדפסה כך שהפלט יטען טענות נכונות. בכל הדפסה מודפס ערך שאוכסן במחסנית (STACK) או בערמה (HEAP). אתם צריכים למחוק את אחד מהם בכדי שההדפסה תהיה נכונה. לדוגמה, אם אחרי ששיניתם, קיימת שורת פלט:

The value 4 is stored on the HEAP

אז באמת הערך 4 שהודפס, היה שמור על הערמה. את הקוד אחרי השינוי הגישו כקובץ q3.c.

q4.c[עריכה]

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

הוסיפו אותה לקוד הנתון והגישו כ q4.c:

#include <stdio.h> 
#include <stdlib.h> 

int main() {
    int n; 
    while(1) {
	printf("Please enter the last index of the desired fibonacci sequence: ");
	scanf("%d",&n);
	if(n>1)
	    break;
	printf("Your number must be bigger than 1\n"); 
    }

    int *fib; 
    fib = fibonacci(n); 

    int i; 
    for(i=0; i<=n; ++i)
	printf("%d, ",fib[i]); 
    printf("\n"); 

    free(fib); 
    return 0; 
}

הנה קובץ הרצה שמגדיר את ההתנהגות הנדרשת.

q5.c[עריכה]

נתון הקוד הבא:

#include <stdio.h>
#include <stdlib.h>

int main() {
  int SIZE =  25; 
  int *arr = (int*) malloc(SIZE*sizeof(int)); 
  int *begin = & arr[0], *end = & arr[SIZE],*p1,*p2;
  p1 = p2 = NULL; 

  for(p1=begin; p1 != end; ++p1) {
    *p1 = rand()%SIZE+1; 
  }

  // your code here...
 
  for(p1=begin; p1 != end; ++p1)
    printf("%d, ",*p1);

  printf("\n");
  free(arr); 


  return 0;
}

כפי שהקוד כתוב, הוא מדפיס סידרה של מספרים אקראיים. אתם מתבקשים להוסיף קוד במקום המסומן שימיין את הערכים מגדול לקטן. הקוד שלכם אמור להשתמש רק במצביעים p1, p2, begin ו - end. אסור לו להזכיר את arr באופן מפורש. אין דרישה שהמיון יהיה יעיל.

את הקובץ לאחר ההוספה, הגישו כ q5.c.

הגשה[עריכה]

מועד הגשה: יום שלישי ה - 20.12.11, עד סוף היום.

יש להגיש ב"תרגיל חמישי" במודל, קובץ ex5.tgz המכיל את ,q1.txt, q2.c, q3.c q4.c ואת q5.c. אל תשכחו לבדוק את ex5.tgz לפני ההגשה ולוודא שהוא מכיל את כל מה שהוא אמור להכיל.


בהצלחה!

פתרון[עריכה]

q1.txt[עריכה]

Expression		Type 

a			float 
p2			float** 
*p2			float* 
**p2			float 
&p2			float*** 
*&p2			float**
&*p2			float** 
***&p2			float

q2.c[עריכה]

#include <stdio.h>
#include <stdlib.h>

int main() {

  double arr[10]; 
  arr[2] = 12222; 
  arr[3] = 13333; 
  arr[7] = 17777; 
  arr[8] = 18888; 

  double *p1, *p2; 

  p1 = arr+3; 
  p2 = &arr[7]; 

  // missed code
  printf("%lf %lf %lf %lf\n",*(p1-1),*p1,*p2,*(p2+1)); 
  // ----------

  return 0;
}

q3.c[עריכה]

#include <stdio.h> 
#include <stdlib.h> 

int main() {
    int N=10; 
    int arr[N]; 
    int *arr1 = (int*)malloc(sizeof(int)*N); 
    
    int *arrPtr[N]; 
    int **arrPtr1 = (int**)malloc(sizeof(int*)*N);

    int i; 
    for(i=0; i<N; ++i) {
	arr[i] = i+1;
	arr1[i] = i+1; 

	arrPtr[i] = arr1+i; 
	arrPtr1[i] = arr+(N-1-i); 
    }

    for(i=0; i<N; ++i) {
	// delete either STACK or HEAP from the next line 
	printf("The value %d is stored on the HEAP \n",*(arrPtr[i]) );
    }
    printf("\n\n"); 

    for(i=0; i<N; ++i) {
	// delete either STACK or HEAP from the next line 
	printf("The value %d is stored on the STACK \n",*(arrPtr1[i]) );
    }
				  
    free(arr1);
    free(arrPtr1); 
    
    return 0; 
}

q4.c[עריכה]

#include <stdio.h> 
#include <stdlib.h> 
int* fibonacci(int n) {
    int *p = (int*)malloc((n+1)*sizeof(int)); 
    int i; 
    p[0] = 0; 
    p[1] = 1; 
    for(i=2; i<=n; ++i)
	p[i] = p[i-1]+p[i-2]; 
    return p; 
}

int main() {
    int n; 
    while(1) {
	printf("Please enter the last index of the desired fibonacci sequence: ");
	scanf("%d",&n);
	if(n>1)
	    break;
	printf("Your number must be bigger than 1\n"); 
    }

    int *fib; 
    fib = fibonacci(n); 

    int i; 
    for(i=0; i<=n; ++i)
	printf("%d, ",fib[i]); 
    printf("\n"); 

    free(fib); 
    return 0; 
}

q5.c[עריכה]

#include <stdio.h>
#include <stdlib.h>

int main() {
  int SIZE =  25; 
  int *arr = (int*) malloc(SIZE*sizeof(int)); 
  int *begin = & arr[0], *end = & arr[SIZE],*p1,*p2;
  p1 = p2 = NULL; 

  for(p1=begin; p1 != end; ++p1) {
    *p1 = rand()%SIZE+1; 
  }

  // --- question code -- 
  for(p1 = begin; p1 != end; ++p1) {
    p2 = p1; 
    p2++;
    while(p2 != end) {
      if(*p1 > *p2) {
	int tmp = *p1; 
	*p1 = *p2; 
	*p2 = tmp; 
      }
      ++p2;
    } 
  }
  // -- end of question code --- 

  for(p1=begin; p1 != end; ++p1)
    printf("%d, ",*p1);

  printf("\n");
  free(arr); 


  return 0;
}



לדף הקורס