أنت هنا:برمجها»اللغة س»حلول التمارين الجزء ج
حلول التمارين - الجزء ج حلول التمارين - الجزء ج
قيم الموضوع
(0 أصوات)

تجد هنا حلول جميع التمارين للدرس 9. هذا يمثل الجزء الثالث من سلسلة حلول التمارين.

 الدرس 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

ترجمة بتصرف: محمد عبد الرحمان


 

أضف تعليقا


إصنعها يريد أن يتأكد أنك لست روبوتا، لذلك أحسب ما يلي:

كود امني
تحديث