الدرس 9: المؤشرات »» »» |
التمرين 9.1 |
التمرين 9.2 |
التمرين 9.3 |
التمرين 9.4 |
التمرين 9.5 |
التمرين 9.6 |
التمرين 9.7 |
التمرين 9.8 |
التمرين 9.9 |
التمرين 9.10 |
التمرين 9.11 |
التمرين 9.12 |
التمرين 9.13 |
التمرين 9.14 |
التمرين 9.15 |
التمرين 9.16 |
التمرين 9.17 |
التمرين 9.18 |
التمرين 9.19 |
التمرين 9.20 |
التمرين 9.21 |
التمرين 9.22 |
التمرين 9.23 |
التمرين 9.1
A |
B | C | P1 | P2 | |
الحالة البدئية | 1 | 2 | 3 | / | / |
P1=&A | 1 | 2 | 3 | &A | / |
P2=&C | 1 | 2 | 3 | &A | &C |
*P1=(*P2)++ | 3 | 2 | 4 | &A | &C |
P1=P2 | 3 | 2 | 4 | &C | &C |
P2=&B | 3 | 2 | 4 | &C | &B |
*P1-=*P2 | 3 | 2 | 2 | &C | &B |
++*P2 | 3 | 3 | 2 | &C | &B |
*P1*=*P2 | 3 | 3 | 6 | &C | &B |
A=++*P2**P1 | 24 | 4 | 6 | &C | &B |
P1=&A | 24 | 4 | 6 | &A | &B |
*P2=*P1/=*P2 | 6 | 6 | 6 | &A | &B |
التمرين 9.2
#include <stdio.h>
main() { int A[100], B[50]; int N, M; int I; printf("Dimension of the array A (max.50) : "); scanf("%d", &N ); for (I=0; I<N; I++) { printf("Element %d : ", I); scanf("%d", A+I); } printf("Dimension of the array B (max.50) : "); scanf("%d", &M ); for (I=0; I<M; I++) { printf("Element %d : ", I); scanf("%d", B+I); } printf("Given array A :\n"); for (I=0; I<N; I++) printf("%d ", *(A+I)); printf("\n"); printf("Given array B :\n"); for (I=0; I<M; I++) printf("%d ", *(B+I)); printf("\n"); for (I=0; I<M; I++) *(A+N+I) = *(B+I); N += M; printf("Resulted array A :\n"); for (I=0; I<N; I++) printf("%d ", *(A+I)); printf("\n"); return 0; }
التمرين 9.3
الحل: عند التعامل أو معالجة الجداول نستعمل أحيانا المؤشرات، وهذين التعبيرين التاليين متكافئين
for (P=A ; P<A+N ; P++) |
أو | for (P=CH ; *P ; P++) |
{ | { | |
... | ... | |
} | } |
مثال:
#include <stdio.h>
main() { int A[10]; int *P;
printf("Give 10 Integers : \n"); for (P=A; P<A+10; P++) scanf("%d", P); printf("Given array A :\n"); for (P=A; P<A+10; P++) printf("%d ", *P); printf("\n"); return 0; }
التمرين 9.4
ليكن P مؤشرا يشير إلى الجدول A:
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;
1) |
*P+2 | => | القيمة 14 |
2) | *(P+2) | => | القيمة 34 |
3) | &P+1 | => | عنوان المؤشر في الأمامP |
(نادرا فيما تستعمل) | |||
4) | &A[4]-3 | => | عنوان العنصر A[1] |
5) | A+3 | => | عنوان العنصر A[3] |
6) | &A[7]-P | => | القيمة (للموقع) 7 |
7) | P+(*P-10) | => | عنوان العنصر A[2] |
8) | *(P+*(P+8)-A[7]) | => | القيمة 23 |
التمرين 9.5
#include <stdio.h>
main() { int A[50]; int N; int X; int *P1, *P2;
printf("Dimension of the array (max.50) : "); scanf("%d", &N ); for (P1=A; P1<A+N; P1++) { printf("Element %d : ", P1-A); scanf("%d", P1); } printf("Give the element X to be removed from the array : "); scanf("%d", &X ); for (P1=A; P1<A+N; P1++) printf("%d ", *P1); printf("\n"); for (P1=P2=A; P1<A+N; P1++) { *P2 = *P1; if (*P2 != X) P2++; } N = P2-A; for (P1=A; P1<A+N; P1++) printf("%d ", *P1); printf("\n"); return 0; }
التمرين 9.6
#include <stdio.h>
main() { int A[50]; int N; int AIDE; int *P1, *P2; printf("Dimension of the array (max.50) : "); scanf("%d", &N ); for (P1=A; P1<A+N; P1++) { printf("Element %d : ", P1-A); scanf("%d", P1); } for (P1=A; P1<A+N; P1++) printf("%d ", *P1); printf("\n"); for (P1=A,P2=A+(N-1); P1<P2; P1++,P2--) { AIDE = *P1; *P1 = *P2; *P2 = AIDE; } for (P1=A; P1<A+N; P1++) printf("%d ", *P1); printf("\n"); return 0; }
التمرين 9.7
#include <stdio.h>
main() { int A[100], B[50]; int N, M; int *PA,*PB; printf("Dimension of the array A (max.50) : "); scanf("%d", &N ); for (PA=A; PA<A+N; PA++) { printf("Element %d : ", PA-A); scanf("%d", PA); } printf("Dimension of the array B (max.50) : "); scanf("%d", &M ); for (PB=B; PB<B+M; PB++) { printf("Element %d : ", PB-B); scanf("%d", PB); } printf("Given array A :\n"); for (PA=A; PA<A+N; PA++) printf("%d ", *PA); printf("\n"); printf("Given array B :\n"); for (PB=B; PB<B+M; PB++) printf("%d ", *PB); printf("\n"); for (PA=A+N,PB=B ; PB<B+M ; PA++,PB++) *PA = *PB; N += M; printf("Resulted array A :\n"); for (PA=A; PA<A+N; PA++) printf("%d ", *PA); printf("\n"); return 0; }
التمرين 9.8
أ) استعمال الجدول
#include <stdio.h>
main()
{
char CH[101];
int I,J;
int PALI;
printf("Write a line of text (max.100 characters) :\n");
gets(CH);
for(J=0; CH[J]; J++)
;
J--;
PALI=1;
for (I=0 ; PALI && I<J ; I++,J--)
if (CH[I] != CH[J])
PALI=0;
if (PALI)
printf("The string \"%s\" is a palindrome.\n", CH);
else
printf("The string \"%s\" is not a palindrome.\n", CH);
return 0;
}
ب) استعمال المؤشر
#include <stdio.h>
main() { char CH[101]; char *P1,*P2; int PALI; printf("Write a line of text (max.100 characters) :\n"); gets(CH); for (P2=CH; *P2; P2++) ; P2--; PALI=1; for (P1=CH ; PALI && P1<P2 ; P1++,P2--) if (*P1 != *P2) PALI=0; if (PALI) printf("The string \"%s\" is a palindrome.\n", CH); else printf("The string \"%s\" is not a palindrome.\n", CH); return 0; }
التمرين 9.9
#include <stdio.h>
main() { char CH[101]; char *P; printf("Write a line of text (max.100 characters) :\n"); gets(CH); for (P=CH; *P; P++) ; printf("The string \"%s\" is composed od %d characters.\n", CH, P-CH); return 0; }
التمرين 9.10
#include <stdio.h> #include <ctype.h>
main() { char CH[101]; char *P; int N; int DANS_MOT; printf("Write a line of text (max.100 characters) :\n"); gets(CH); /* Compter les mots */ N=0; DANS_MOT=0; for (P=CH; *P; P++) if (isspace(*P)) DANS_MOT=0; else if (!DANS_MOT) { DANS_MOT=1; N++; } printf("The string \"%s\" \nis composed of %d words%c.\n", CH, N, (N==1)?' ':'s'); return 0; }
التمرين 9.11
#include <stdio.h>
main() { char CH[101]; char *PCH; int ABC[26]; int *PABC; printf("Write a line of text (max.100 characters) :\n"); gets(CH); for (PABC=ABC; PABC<ABC+26; PABC++) *PABC=0; for (PCH=CH; *PCH; PCH++) { if (*PCH>='A' && *PCH<='Z') (*(ABC+(*PCH-'A')))++; if (*PCH>='a' && *PCH<='z') (*(ABC+(*PCH-'a')))++; } printf("The string \"%s\" has :\n", CH); for (PABC=ABC; PABC<ABC+26; PABC++) if (*PABC) printf(" %d\ttimes the alphabet '%c' \n", *PABC, 'A'+(PABC-ABC)); return 0; }
التمرين 9.12
#include <stdio.h> #include <string.h>
main() { char CH[101]; char C; char *P; printf("Write a line of text (max.100 characters) :\n");
gets(CH); printf("Write an alphabet to be removed (then press Enter) : "); C=getchar(); /* strcpy بمساعدة الدالة*/ P=CH; while (*P) { if (*P==C) strcpy(P, P+1); else P++; } printf("Resulted string : \"%s\"\n", CH); return 0; }
التمرين 9.13
#include <stdio.h> #include <string.h>
main() { char CH1[101], CH2[101]; char *P1, *P2; int TROUVE; printf("Write the first string (max.100 characters) :\n"); gets(CH1); printf("Write the second string (max.100 characters) :\n"); gets(CH2); for (P2=CH2; *P2; P2++) { TROUVE = 0; for (P1=CH1 ; *P1 && !TROUVE ; P1++) if (*P2==*P1) { TROUVE = 1; strcpy(P1, P1+1); } } printf("Resulted string : \"%s\" \n", CH1); return 0; }
التمرين 9.14
#include <stdio.h> #include <string.h>
main() { char CH1[101], CH2[101]; char *P1, *P2; int TROUVE; printf("Write the string to transform (max.100 characters) :\n"); gets(CH1); printf("Write The string to delete (max.100 characters) :\n"); gets(CH2);
TROUVE=0;
for (P1=CH1 ; *P1 && !TROUVE ; P1++)
{
for (P2=CH2 ; *P2 == *(P1+(P2-CH2)) ; P2++)
;
if (!*P2)
TROUVE = 1;
}
P1--;
if (TROUVE)
strcpy(P1, P1+(P2-CH2));
printf("Resulted string : \"%s\" \n", CH1);
return 0;
}
التمرين 9.15
#include <stdio.h>
main() { int A[50][50]; int N, M; int I, J; printf("Number of rows (max.50) : "); scanf("%d", &N ); printf("Number of columns (max.50) : "); scanf("%d", &M ); /* قراءة المصفوفة من لوحة المفاتيح */ for (I=0; I<N; I++) for (J=0; J<M; J++) { printf("Element[%d][%d] : ",I,J); scanf("%d", (int *)A+I*50+J); } /*A أ) إظهار المصفوفة */ printf("Given matrix :\n"); for (I=0; I<N; I++) { for (J=0; J<M; J++) printf("%7d", *((int *)A+I*50+J)); printf("\n"); } /*A ب) إظهار مقلوب */ printf("Transposed Matrix :\n"); for (J=0; J<M; J++) { for (I=0; I<N; I++) printf("%7d ", *((int *)A+I*50+J)); printf("\n"); } /* ج) مناقشة المصفوفة كأنها متجهة */ printf("Matrix is displayed as a vector :\n"); for (I=0; I<N; I++) for (J=0; J<M; J++) printf(" %d ", *((int *)A+I*50+J)); printf("\n"); return 0; }
التمرين 9.16
#include <stdio.h> main() { int A[50][50]; int B[50][50]; int C[50][50]; int N, M, P; int I, J, K; printf("*** Matrix A ***\n"); printf("Number of rows de A (max.50) : "); scanf("%d", &N ); printf("Number of columns de A (max.50) : "); scanf("%d", &M ); for (I=0; I<N; I++) for (J=0; J<M; J++) { printf("Element[%d][%d] : ",I,J); scanf("%d", (int *)A+I*50+J); } printf("*** Matrix B ***\n"); printf("Number of rows de B : %d\n", M); printf("Number of columns de B (max.50) : "); scanf("%d", &P ); for (I=0; I<M; I++) for (J=0; J<P; J++) { printf("Element[%d][%d] : ",I,J); scanf("%d", (int *)B+I*50+J); } printf("Given matrix A :\n"); for (I=0; I<N; I++) { for (J=0; J<M; J++) printf("%7d", *((int *)A+I*50+J)); printf("\n"); } printf("Given matrix B :\n"); for (I=0; I<M; I++) { for (J=0; J<P; J++) printf("%7d", *((int *)B+I*50+J)); printf("\n"); } for (I=0; I<N; I++) for (J=0; J<P; J++) { *((int *)C+I*50+J)=0; for (K=0; K<M; K++) *((int*)C+I*50+J) += *((int*)A+I*50+K) * *((int*)B+K*50+J); }
printf("Resulted Matrix C :\n");
for (I=0; I<N; I++)
{
for (J=0; J<P; J++)
printf("%7d", *((int *)C+I*50+J));
printf("\n");
}
return 0;
}
التمرين 9.17
#include <stdio.h>
main() { char TABCH[5][51]; char AIDE; char *P1, *P2; int I; printf("Give 5 words :\n"); for (I=0; I<5; I++) { printf("Word %d (max.50 characters) : ", I); gets((char *)(TABCH+I)); } for (I=0; I<5; I++) { P1 = P2 = (char *)(TABCH+I); while (*P2) P2++; P2--; while (P1<P2) { AIDE = *P1; *P1 = *P2; *P2 = AIDE; P1++; P2--; } } for (I=0; I<5; I++) puts((char *)(TABCH+I)); return 0; }
التمرين 9.18
أ) التمثيل الخطاطي للمتغيرين NOM1 و NOM2.
التمرين 9.19
#include <stdio.h>
main() { char *MFRAN[] = {"\aErreur d'entrée !", "janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"}; char *MDEUT[] = {"\aEingabefehler !", "Januar", "Februar", "M?rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"}; int JOUR, MOIS, ANNEE; int CORRECT;
do
{
printf("Give the day, month and year : ");
scanf("%d %d %d", &JOUR, &MOIS, &ANNEE);
CORRECT=1;
if (JOUR<0||JOUR>31||MOIS<0||MOIS>12||ANNEE<0||ANNEE>3000)
{
CORRECT=0;
puts(MFRAN[0]);
puts(MDEUT[0]);
}
}
while (!CORRECT);
printf("Luxembourg, le %d%s %s %d \n",
JOUR, (JOUR==1)?"er":"", MFRAN[MOIS], ANNEE);
printf("Luxemburg, den %d. %s %d \n",JOUR, MDEUT[MOIS], ANNEE);
return 0;
}
التمرين 9.20
#include <stdio.h> #include <string.h> #include <stdlib.h>
main() { char INTRO[500]; char *TEXTE[10]; char *PAIDE; int I,J; puts("Give 10 phrases terminated by a new line :"); for (I=0; I<10; I++) { printf("Phrase %d : ",I); gets(INTRO); TEXTE[I] = malloc(strlen(INTRO)+1); if (TEXTE[I]) strcpy(TEXTE[I], INTRO); else { printf("\aNo enough memory space \n"); exit(-1); } } puts("Content of the given array :"); for (I=0; I<10; I++) puts(TEXTE[I]); for (I=0,J=9 ; I<J ; I++,J--) { PAIDE = TEXTE[I]; TEXTE[I] = TEXTE[J]; TEXTE[J] = PAIDE; } puts("Content of the resulted array :"); for (I=0; I<10; I++) puts(TEXTE[I]); return 0; }
التمرين 9.21
#include <stdio.h> #include <string.h> #include <stdlib.h>
main() { char INTRO[51]; char *MOT[10]; int MAX; int I,J;
puts("Give 10 phrases terminated by a new line everytime :"); for (I=0; I<10; I++) { printf("Phrase %d : ",I); gets(INTRO); MOT[I] = malloc(strlen(INTRO)+1); if (MOT[I]) strcpy(MOT[I], INTRO); else { printf("\aNo enough memory space \n"); exit(-1); } } for (I=0; I<10; I++) { for (MAX=0 ; !MOT[MAX] ; MAX++) ; for (J=MAX; J<10; J++) if (MOT[J] && strcmp(MOT[MAX], MOT[J])>0) MAX=J; free(MOT[MAX]); MOT[MAX]=0; printf("Passage No.%d :\n", I); for (J=0; J<10; J++) if (MOT[J]) puts(MOT[J]); printf("Press Enter to continue ...\n"); getchar(); } return 0; }
التمرين 9.22
#include <stdio.h> #include <string.h> #include <stdlib.h>
main() { char INTRO[51]; char *MOT[10]; char *PHRASE; int MAX; int I,J; int L;
puts("Give 10 phrases terminated by a new line everytime :"); for (I=0; I<10; I++) { printf("Phrase %d : ",I); gets(INTRO); MOT[I] = malloc(strlen(INTRO)+1); if (MOT[I]) strcpy(MOT[I], INTRO); else { printf("\aNo enough memory space \n"); exit(-1); } } L=11; for (I=0; I<10; I++) L += (strlen(MOT[I])+1); PHRASE = malloc(L); if (!PHRASE) { printf("\aNo enough memory space.\n"); exit(-1); } PHRASE[0]='\0'; for (I=0; I<10; I++) { for (MAX=0 ; !MOT[MAX] ; MAX++) ; for (J=MAX; J<10; J++) if (MOT[J] && strcmp(MOT[MAX], MOT[J])>0) MAX=J; strcat(PHRASE,MOT[MAX]); strcat(PHRASE," "); free(MOT[MAX]); MOT[MAX]=0; } puts("Result :"); puts(PHRASE); return 0; }
التمرين 9.23
#include <stdio.h> #include <string.h> #include <stdlib.h>
main() { char INTRO[51]; char *MOT[10]; int I; int J; char *AIDE; int FIN; puts("Give 10 phrases terminated by a new line everytime :"); for (I=0; I<10; I++) { printf("Phrase %d : ",I); gets(INTRO); MOT[I] = malloc(strlen(INTRO)+1); if (MOT[I]) strcpy(MOT[I], INTRO); else { printf("\aNo enough memory space \n"); exit(-1); } } for (I=9 ; I>0 ; I=FIN) { FIN=0; for (J=0; J<I; J++) if (strcmp(MOT[J],MOT[J+1])>0) { FIN=J; AIDE = MOT[J]; MOT[J] = MOT[J+1]; MOT[J+1] = AIDE; } } puts("Sorted array :"); for (I=0; I<10; I++) puts(MOT[I]); return 0; }
تأليف
المؤلف الأصلي: فرديريك فابر (Frédéric FABER)
البريد الإلكتروني: عنوان البريد الإلكتروني هذا محمي من روبوتات السبام. يجب عليك تفعيل الجافاسكربت لرؤيته.
الموقع الإلكتروني: http://www.ltam.lu/cours-c
ترجمة بتصرف: محمد عبد الرحمان