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 :
2 3 3 5 6 7 2 8 9 8 7 0
T 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;
BEGIN
WRITELN ('Donner la dimension du tableau');
REPEAT READLN (D);
UNTIL D IN [1...20];
FOR I: =1 TO D DO REPEAT
WRITELN ('T[',I,']=');
READLN (V[I]);
UNTIL V[I] IN [0..9];
END;
PROCEDURE AFFICHE (D:INTEGER; V:TAB);
VAR K:INTEGER;
BEGIN
WRITELN('Les entiers sont : ');
IF V[1]=V[2]-1 THEN
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]) THEN
WRITE(V[K]:4);
IF V[D]=V[D-1]+1 THEN
WRITE(V[D]:4);
END;
{Le corps du programme principal}
BEGIN
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 :
23 11 72 80 15 24 2 48 16 T
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;
BEGIN
WRITELN('Donner votre dimension ');
REPEAT READLN(D);
UNTIL D in [5..19] ;
WRITELN('Donner vos entiers');
FOR I:= 1 TO D DO
READLN (V[I]);
WRITELN('Donner vos positions ');
REPEAT
READLN(D1,D2);
UNTIL (0<D1) AND (D1<D2) AND (D2<D);
END;
FUNCTION MIN (V:TAB; D1,D2:INTEGER):INTEGER;
VAR M,K:INTEGER;
BEGIN M:=D1;
FOR K:=D1+1 TO D2 DO IF V[M]>V[K]
THEN M:=K;
MIN:=M;
END;
PROCEDURE AFFICHE(V:TAB;D1,D2:INTEGER);
VAR K,M :INTEGER;
BEGIN
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) THEN
WRITE(V[K]:4);
END;
{Le corps du programme principal}
BEGIN
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, Var
I:integer;
ch,chc: string,
begin
ch:="
For i:=l to 8 do begin
Str(d MOD 2, chc) d:=d DIV 2, ch:= chc + ch;
end,
convert:=ch;
end;
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;
Var
n,X:Integer;
T:Tab;
Tcr:vect;
Procedure Lecture(Var n:Integer);
Begin Repeat
Write('Entrer n ');
Readln(n);
Until n in [3..19];
End;
Procedure Saisie(n:Integer;Var T:Tab);
Var
i:Integer;
Begin
For i:=1 To n Do Begin
Write('Entrer T[',i,'] ');
Readln(T[i]);
End;
End;
Procedure Lire_rot(Var X:Integer);
Begin Repeat
Write('Entrer X ');
Readln(X);
Until X in [1..7];
End;
Function Convert(d:Integer):String;
Var
i:Integer;
Ch,Chc:String;
Begin Ch:='';
For i:=1 To 8 Do
Begin
Str(d Mod 2,Chc);
d:=d Div 2;
Ch:=Chc+Ch;
End;
Convert:=Ch;
End;
Procedure Crypter(n,x:Integer;T:tab;Var Tcr:Vect);
Var
i:Integer;
Ch,Ch1:String;
Begin
For i:=1 To n Do Begin
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);
End;
End;
Procedure Affichage(n:Integer;T:Tab;Tcr:Vect);
Var
i:Integer;
Begin
For i:=1 To n Do
Writeln('le caractère ',T[i],' sera crypté en ',Tcr[i]);
End;
Begin
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.
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;
BEGIN R:=TRUE;
REPEAT I:=I+1;
UNTIL NOT(UPCASE(MOT[I]) IN['A'..'Z']) OR (I=LENGTH(MOT)) ; IF NOT(UPCASE(MOT[I]) IN['A'..'Z'])
THEN R:=FALSE;
VERIF:=R;
END;
PROCEDURE SAISIE(VAR MOT:STRING);
BEGIN
WRITELN('Donner votre Mot');
REPEAT
READLN(MOT);
UNTIL (VERIF(MOT) AND (LENGTH(MOT) IN [4..9]));
END;
PROCEDURE COMPTE (MOT:STRING; VAR NB:INTEGER);
VAR K: INTEGER;
BEGIN NB: =0;
FOR K:=1 TO LENGTH(MOT) DO BEGIN
CASE UPCASE (MOT [K]) OF
'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;
END;
END;
END;
BEGIN
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;
Var
a,b:Integer;
Procedure Saisie_int(Var a,b:Integer);
Begin Repeat
Write('Entrer a ');
Readln(a);
Write('Entrer b ');
Readln(b);
Until (a in [11..b-1]) and (b<200);
End;
Function Div_chif(x:Integer):Boolean;
Var
C,D,U:Integer;
Begin
C:=x Div 100;
D:=x Mod 100 Div 10;
U:=x Mod 10;
If C<>0 Then
If (D<>0) And (U<>0) Then
If (x Mod C =0) And (x Mod D=0) And (x Mod U=0) Then
Div_chif:=True Else
Div_chif:=False Else
Div_chif:=False Else
If U<>0 Then
If (x Mod D=0) and (x Mod U=0) Then
Div_chif:=True Else
Div_chif:=False Else
Div_chif:=False;
End;
Procedure Affichage(a,b:Integer);
Var
i:Integer;
Begin
For i:=a To b Do If Div_chif(i) Then
Writeln(i);
End;
Begin
Saisie_int(a,b);
Affichage(a,b);
End.
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 :
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;
begin test:=true;
i:=1;
while(i<=length(ch1))and(test) do begin
if(ch1[i]in['0','1']) then i:=i+1 else
test:=false;
end;
verif:=test;
Sens de lecture des restes
end;
begin repeat write('n=');
readln(n);
str(n,ch2);
until(verif(ch2));
end;
function puiss2(z:integer):integer;
var
y,i:integer;
begin y:=1;
for i:=1 to z do begin
y:=y*2;
end;
puiss2:=y;
end;
function conv(n:integer):integer;
var
e,x,a,i:integer;
sh:string;
begin str(n,sh);
a:=0;
for i:=length(sh) downto 1 do begin
val(sh[i],x,e);
a:=a+x*puiss2(length(sh)-i);
end;
conv:=a;
end;
begin saisie(n);
write(conv(n));
end.