מבוא לתכנות ולמדעי המחשב בשפת 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;
}