Sujet 3:13/05/2005 :14 h Ecrire un programme Pascal intitulé Predsucc permettant de remplir un tableau T par N chiffres compris entre 0 et 9 et d'afficher les éléments de T qui sont encadrés par leurs prédécesseurs et leurs successeurs. (1=<N<=20) N. B : Le premier élément sera affiché s'il est seulement succédé par son successeur. Le dernier élément sera affiché s'il est précédé par son prédécesseur. Exemple : Pour le tableau T suivant : T 2 3 3 5 6 7 2 8 9 8 7 0 1 2 3 4 5 6 7 8 9 10 12 13 Le programme affiche les valeurs 2, 6 Corrigé : PROGRAM SUJET3; {Vendredi : 13/05/05 : Après midi : Séance 1} USES WINCRT; TYPE TAB=ARRAY [1...20] OF INTEGER; VAR N:INTEGER;T:TAB; PROCEDURE LECTURE (VAR D: INTEGER; VAR V: TAB); VAR I:INTEGER; WRITELN ('Donner la dimension du tableau'); READLN (D); UNTIL D IN [1...20]; FOR I: =1 TO D DO WRITELN ('T[',I,']='); READLN (V[I]); UNTIL V[I] IN [0..9]; PROCEDURE AFFICHE (D:INTEGER; V:TAB); VAR K:INTEGER; WRITELN('Les entiers sont : '); IF V[1]=V[2]-1 WRITE(V[1]:4); FOR K:=2 TO D-1 DO IF (V[K-1]+1=V[K]) AND (V[K+1]-1=V[K]) 1
WRITE(V[K]:4); IF V[D]=V[D-1]+1 WRITE(V[D]:4); {Le corps du programme principal} LECTURE(N,T); AFFICHE(N,T); END. Sujet 3:14/05/2005 :14 h Écrire un programme Pascal intitulé Minimum qui permet d'effectuer sur un tableau T de N éléments de type entier (5<N<20) les opérations suivantes : Saisir deux entiers positifs Ind_i et Ind_j avec (0 < Ind_i < Ind_j N) Déterminer et afficher la valeur minimale (Min) de la partie du tableau T comprise entre les indices Ind_i et Ind_j. Déterminer et afficher tous les multiples de la valeur Min sauf lui-même dans le tableau T. Exemple : T 23 11 72 80 15 24 2 48 16 1 2 3 4 5 6 7 8 9 Ind_i Ind_j Pour Ind_i = 2, Ind_j = 7 Le programme affichera : - La valeur Min est : 2 Les multiples de Min sont : 72 80 24 PROGRAM SUJET7; {Samedi 14/05/2005: Après midi :Séance 1} USES WINCRT; TYPE TAB =ARRAY[1..19] OF INTEGER; VAR T :TAB; IND_I,N,IND_J:INTEGER ; PROCEDURE LECTURE (VAR D,D1,D2:INTEGER;VAR V :TAB); VAR I:INTEGER; WRITELN('Donner votre dimension '); READLN(D); UNTIL D in [5..19] ; WRITELN('Donner vos entiers'); FOR I:= 1 TO D DO 2
READLN (V[I]); WRITELN('Donner vos positions '); READLN(D1,D2); UNTIL (0<D1) AND (D1<D2) AND (D2<D); FUNCTION MIN (V:TAB; D1,D2:INTEGER):INTEGER; VAR M,K:INTEGER; M:=D1; FOR K:=D1+1 TO D2 DO IF V[M]>V[K] M:=K; MIN:=M; PROCEDURE AFFICHE(V:TAB;D1,D2:INTEGER); VAR K,M :INTEGER; M:=MIN(V,D1,D2); WRITELN('LA valeur Min est : ',V[M]); WRITELN('Les multiples sont '); FOR K:= D1 TO D2 DO IF (V[K]<>V[M]) AND (V[K] MOD V[M]= 0) WRITE(V[K]:4); {Le corps du programme principal} LECTURE (N,IND_I,IND_J,T); AFFICHE(T,IND_I,IND_J); END. Sujet n 18(19 mai 2004 10h30) Soit T un tableau de N caractères (2<N<20). On veut écrire un programme Pascal permettant de crypter les données figurant dans le tableau T comme suit : 1. Saisir un entier X (0< X <8) 2. Convertir chaque élément de T( code ASCII) en une chaîne correspondante à sa représentation binaire sur 8 bits 3. Effectuer une rotation des chiffres binaires à droite, obtenus dans l'étape N 2, de X position(s). 4. Stocker chaque valeur obtenue suite au cryptage dans l'étape N 3 dans un tableau Tcr. 5. Afficher le contenu du tableau Tcr. On propose d'utiliser la fonction Convert permettant de convertir une valeur décimale en une valeur binaire représentée sous forme de chaîne de 8 caractères. Function convert( d:integer);string, I:integer; ch,chc: string, 3
ch:=" For i:=l to 8 do Str(d MOD 2, chc) d:=d DIV 2, ch:= chc + ch; end, convert:=ch; Exemple : Le caractère "A" a une représentation binaire égale à "0100000l". Si X==2, Alors la représentation binaire de "A" après une rotation de deux positions à droite sera : "01010000", cette valeur sera stockée dans le tableau Ter. Corrigé : {Sujet18 19 mai 2004 à 10h30} Program Cryptage; Uses Wincrt; Type Tab=Array[1..19] Of Char; Vect=Array[1..19] Of String; n,x:integer; T:Tab; Tcr:vect; Procedure Lecture( n:integer); Repeat Write('Entrer n '); Readln(n); Until n in [3..19]; Procedure Saisie(n:Integer; T:Tab); i:integer; For i:=1 To n Do Write('Entrer T[',i,'] '); Readln(T[i]); Procedure Lire_rot( X:Integer); Repeat Write('Entrer X '); Readln(X); Until X in [1..7]; Function Convert(d:Integer):String; i:integer; Ch,Chc:String; Ch:=''; For i:=1 To 8 Do 4
Str(d Mod 2,Chc); d:=d Div 2; Ch:=Chc+Ch; Convert:=Ch; Procedure Crypter(n,x:Integer;T:tab; Tcr:Vect); i:integer; Ch,Ch1:String; For i:=1 To n Do Ch:=Convert(Ord(T[i])); Ch1:=Copy(Ch,Length(Ch)-x+1,x); Delete(Ch,Length(Ch)-x+1,x); Tcr[i]:=Concat(ch1,ch); Procedure Affichage(n:Integer;T:Tab;Tcr:Vect); i:integer; For i:=1 To n Do Writeln('le caractère ',T[i],' sera crypté en ',Tcr[i]); Lecture(n); Saisie(n,T); Lire_rot(X); Crypter(n,x,T,Tcr); Affichage(n,T,Tcr); End. DATE : Lundi 16 mai 2005 (Heure : 15h30) Sur les touches (2, 3, 4, 5, 6, 7, 8 et 9) du clavier d'un téléphone portable, sont inscrites des lettres pour écrire des messages en plus des chiffres. Par exemple, sur la touche 5 sont inscrites les lettres J, K et L. - Pour taper la lettre J on appuie une seule fois. - Pour taper la lettre K on appuie deux fois. - Pour taper la lettre L on appuie trois fois. Ecrire un programme Pascal permettant de déterminer et d'afficher le nombre total d'appuies sur les touches du clavier d'un téléphone portable pour saisir un mot donné de N lettres, supposées non accentuées, (4 N 9). Indication : La figure suivante donne la répartition des lettres sur les touches du clavier d'un téléphone portable. 5
1 2 3 ABC DEF 4 5 6 GHI JKL MNO 7 8 9 PQRS TUV WXYZ 0 * + # Corrigé ; PROGRAM SUJET12; {Lundi 16/05/2005 : Après midi : Séance 2 } USES WINCRT ; VAR N:INTEGER; CH:STRING; FUNCTION VERIF (MOT:STRING):BOOLEAN; VAR S:REAL;I:INTEGER; R:BOOLEAN; R:=TRUE; I:=I+1; UNTIL NOT(UPCASE(MOT[I]) IN['A'..'Z']) OR (I=LENGTH(MOT)) ; IF NOT(UPCASE(MOT[I]) IN['A'..'Z']) R:=FALSE; VERIF:=R; PROCEDURE SAISIE(VAR MOT:STRING); WRITELN('Donner votre Mot'); READLN(MOT); UNTIL (VERIF(MOT) AND (LENGTH(MOT) IN [4..9])); PROCEDURE COMPTE (MOT:STRING; VAR NB:INTEGER); VAR K: INTEGER; NB: =0; FOR K:=1 TO LENGTH(MOT) DO CASE UPCASE (MOT [K]) OF 6
'A','D','G','J','M','P','T','W' : NB:=NB+1; 'B','E','H','K','N','Q','U', X : NB: =NB+2; 'C','F','I','L','O','R','V', Y : NB: =NB+3; 'S','Z': NB: =NB+4; SAISIE(CH); COMPTE(CH,N); WRITELN(CH); WRITELN('Somme :', N); END. Sujet n 2(14 mai 2004 10h30) Ecrire un programme Pascal permettant de saisir deux entiers X et Y (0 < X 9 et 0 < Y 9) et d afficher le tableau de multiplication selon le modèle suivant : Exemples : X=4 et Y=5, le programme affiche : 1 2 3 4 5 1 1 2 3 4 5 2 2 4 6 8 10 3 3 6 9 12 15 4 4 8 12 16 20 Corrigé : {Sujet2 14 mai 2004 à 10h30} Program Insertion; Uses wincrt; a,b:integer; Procedure Saisie_int( a,b:integer); Repeat Write('Entrer a '); Readln(a); Write('Entrer b '); Readln(b); Until (a in [11..b-1]) and (b<200); 7
Function Div_chif(x:Integer):Boolean; C,D,U:Integer; C:=x Div 100; D:=x Mod 100 Div 10; U:=x Mod 10; If C<>0 If (D<>0) And (U<>0) If (x Mod C =0) And (x Mod D=0) And (x Mod U=0) Div_chif:=True Else Div_chif:=False Else Div_chif:=False Else If U<>0 If (x Mod D=0) and (x Mod U=0) Div_chif:=True Else Div_chif:=False Else Div_chif:=False; Procedure Affichage(a,b:Integer); i:integer; For i:=a To b Do If Div_chif(i) Writeln(i); Saisie_int(a,b); Affichage(a,b); End. 8
Sujet n 16(18 mai 2004 15h30) CAS 1 : On propose par la suite, l'une des méthodes de la conversion d'un entier décimai (X) en son équivalent binaire (base 2) 1. On divise (division entière) le nombre X par 2 2. On sauvegarde le reste de la division 3. On refait les deux étapes précédentes avec le quotient de la division, jusqu'à avoir un quotient nul. 4. Le regroupement des restes en sens inverse de leurs apparitions donne la valeur du nombre X en binaire. Exemple : Si X = 13 alors - La division entière de 13 par 2 donne un quotient = 6 et un reste = 1 - La division entière de 6 par 2 donne un quotient = 3 et un reste = 0 - La division entière de 3 par 2 donne un quotient = 1 et un reste = 1 - La division entière de 1 par 2 donne un quotient = 0 et un reste = 1 Donc le nombre décimal 13 vaut 1101 en Binaire Question : Sens de lecture des restes Ecrire un programme Pascal permettant de saisir un entier naturel X 100, de déterminer et d'afficher sa valeur en Binaire, selon le format suivant : Le nombre décimal X vaut... En binaire. N.B: La solution doit comporter au moins une procédure et une fonction. CAS 2 : Conversion de la base 2 à la base 10 Exemple Si n =111 alors l entier résultat est 7 Voici la methode il suffit de donner a chaque chiffr Un poid de droite à gauche allant de 0 à Nb-chiff-1 PUIS multiplier chaque chiffre par 2 a la puissance poid et fair la somme Voici le Pascal : program convb2b10; uses wincrt; var n:integer; ch,ch1,ch2:string; procedure saisie(var n:integer); function verif(ch1:string):boolean; var i:integer; test:boolean; test:=true; i:=1; while(i<=length(ch1))and(test) do if(ch1[i]in['0','1']) then i:=i+1 else test:=false; verif:=test; 9
repeat write('n='); readln(n); str(n,ch2); until(verif(ch2)); function puiss2(z:integer):integer; var y,i:integer; y:=1; for i:=1 to z do y:=y*2; puiss2:=y; function conv(n:integer):integer; var e,x,a,i:integer; sh:string; str(n,sh); a:=0; for i:=length(sh) downto 1 do val(sh[i],x,e); a:=a+x*puiss2(length(sh)-i); conv:=a; saisie(n); write(conv(n)); end. BON COURAGE 10