PARTIEL MIAS S1  du  18 novembre 2000  :  une solution

Exercice 1

1.)

nmax est une constante indiquant le nombre maximal de cases dans les tableaux x et y.
nmax<=2 (test de saisie de n)<
nmax<=32816 (indice de type entier)
nmax<=32816 si les tableaux sont des tableaux d'entiers
mais la borne sup est beaucoup plus petite si on a un tableau de réels.

m est un réel car issu d'une division : m:=s/n;

x et y sont des tableaux de mêmes indices car on a une affectation y[]:=x[]-m
y est un tableau de réels (intervention du réel m dans le calcul).
x est un tableau d'entiers (toutes les valeurs x[] sont ajoutées à s qui est un entier).

Conclusion :

const nmax = 1000 (* par exemple *)
var n, compte, s : integer ;
m : real ;
x : array[1..nmax] of integer ;
y : array[1..max] of real ;

2.)

Combien de nombres entre (2 et 1000) a considerer ?5
x[1]=4
x[2]=8
x[3]=12
x[4]=17
x[5]=19
le resultat de m est : 12.00 (* :8:2 *)
x(1)=4, y[1]= -8 (* :8 *)
x(2)=8, y[2]= -4
x(3)=12, y[3]= 0
x(4)=17, y[4]= 5
x(5)=19, y[5]= 7

3.)

compte:=1;
while compte<=n do
    begin
    ...
    compte:=compte+1 ;
    end ;

Exercice 2

1.)

PROGRAM joueurs ;

VAR nom : string ;
    saut, tmp, i : integer ;

BEGIN
randomize ;
nom:='' ;
repeat
  write('nom du sauteur (vide pour terminer) ? ') ;
  readln(nom) ;
  if nom<>'' then
    begin
    saut:=400 ;
    for i:=1 to 3 do
      begin
      tmp:=400+random(401) ;
      if tmp>saut then saut:=tmp ;
      end ;
    end ;
  writeln('Le meilleur saut de ',nom,' est ',saut) ;
  until nom='' ;
END.

2.)

PROGRAM equipe ;

VAR nom : string ;
    saut, tmp, i : integer ;
    numero, meilleursaut : integer ;
    meilleurnom : string ;

BEGIN
WRITELN('numero de l'equipe ? ') ; READLN(NUMERO) ;
MEILLEURNOM:='' ; MEILLEURSAUT:=399 ;
randomize ;
nom:='' ;
repeat
  write('nom du sauteur (vide pour terminer) ? ') ;
  readln(nom) ;
  if nom<>'' then
    begin
    saut:=400 ;
    for i:=1 to 3 do
      begin
      tmp:=400+random(401) ;
      if tmp>saut then saut:=tmp ;
      IF SAUT>MEILLEURSAUT THEN
        BEGIN
        MEILLEURNOM:=NOM ;
        MEILLEURSAUT:=SAUT ;
        END ;
      end ;
    end ;
  writeln('Le meilleur saut de ',nom,' est ',saut) ;
  until nom='' ;
WRITE('Le meilleur saut de l'équipe ',NUMERO,' est ')
WRITELN(MEILLEURSAUT,' par ',MEILLEURNOM) ;
END.

3.)

PROGRAM plusieursequipes ;

VAR nom : string ;
    saut, tmp, i : integer ;
    numero, meilleursaut : integer ;
    meilleurnom : string ;
    equipegagnante, sautgagnant, nmax : integer ;
    nomgagnant : string ;

BEGIN
randomize ;
MEILLEURNOM:='' ; MEILLEURSAUT:=399 ;
NOMGAGNANT:='' ; SAUTGAGNANT:=399 ;
EQUIPEGAGNANTE:=0 ;
REPEAT
  WRITE('Combien d'équipes ? ') ; READLN(NMAX) ;
  UNTIL NMAX>0 ;
FOR NUMERO:=1 to NMAX DO
  BEGIN
  WRITELN('Equipe : ',NUMERO) ;
  repeat
    nom:='' ;
    write('nom du sauteur (vide pour terminer) ? ') ;
    readln(nom) ;
    if nom<>'' then
      begin
      saut:=400 ;
      for i:=1 to 3 do
        begin
        tmp:=400+random(401) ;
        if tmp>saut then saut:=tmp ;
        if saut>meillleursaut then
          begin
          meilleurnom:=nom ;
          meilleursaut:=saut ;
          IF SAUT>SAUTGAGNANT THEN
            BEGIN
            SAUTGAGNANT:=SAUT ;
            NOMGAGNANT:=NOM ;
            EQUIPEGAGNANTE:=NUMERO ;
            END ;
          end ;
        end ;
      end ;
    writeln('Le meilleur saut de ',nom,' est ',saut) ;
    until nom='' ;
  write('Le meilleur saut de l'équipe ',numero,' est ')
  writeln(meilleursaut,' par ',meilleurnom) ;
  END ;
WRITELN('Le meilleur saut au final est de ',sautgagnant) ;
WRITELN('par ',nomgagnant,' de l'equipe numero ',equipegagnante) ;
END.
 

Exercice 3
 

PROGRAM pieces ;

VAR N, i, a, b : integer ;
    P : array[1..100] of integer ;
    choix : char ;
    proportion, moyenne, ecart_type, mediane : real ;
    continuer, recommencer : char ;
 

PROCEDURE ORDONNER ;
Var i, j, tmp : integer ;
Begin
for i:=1 to N-1 do
  for j:=i+1 to N do
    if p[j]<p[i] then
      begin tmp:=p[i] ; p[i]:=p[j] ; p[j]:=tmp ; end ;
End ;
 

PROCEDURE SAISIES ;
Begin
(* 1. Saisie de la valeur de N avec contrôle *)
repeat
  write('Combien de jours (2 à 100) ? ') ; readln(N) ;
  until (N>=2) and (N<=100) ;
(* 2. Saisie de la production quotidienne de pièces *)
Writeln('Productions quotidiennes :') ;
  for i:=1 to N do
  begin
  write('jour ',i,' ? ') ; readln(p[i]) ;
  end ;
End ;
 

PROCEDURE CHOIX ;
Begin
(* 3. Choix de l'utilisateur puis traitement *)
writeln('Que voulez-vous faire :') ;
writeln(' 1 : Proportion de jours où la production est entre a et b') ;
writeln(' 2 : Moyenne arithmétique et écart-type') ;
writeln(' 3 : Médiane') ;
case choix of
    1 : begin
        (* saisies de a et b *)
        repeat
         write('Valeur de a ? ') ; readln(a) ;
         write('Valeur de b (b>a)? ') ; readln(b) ;
         until (a>=0) and (b>=a) ;
        (* calcul de la proportion puis affichage *)
        proportion:=0 ;
        for i:=1 to N do
          if (p[i]>=a) and (p[i]<=b) then proportion:=proportion+p[i] ;
        proportion:=proportion*100/N ;
        writeln(proportion:1:2,'% de jours entre ',a,' et ',b) ;
        end ;
    2 : begin
        (* calcul et affichage de la moyenne arithmétique *)
        moyenne:=0 ;
        for i:=1 to N do moyenne:=moyenne+p[i] ;
        moyenne:=moyenne/N ;
        writeln('moyenne : ',moyenne:1:3) ;
        (* calcul et affichage de l'écart-type *)
        ecart_type:=0 ;
        for i:=1 to N do
          ecart_type:=ecart_type+(p[i]-moyenne)*(p[i]-moyenne) ;
        ecart_type:=ecart_type/N ;
        ecart_type:=sqrt(ecart_type) ;
        writeln('écart-type : ',ecart_type:1:3) ;
        end ;
    3 : begin
        (* classement de p *)
        ORDONNER ;
        (* calcul et affichage de la médiane *)
        if (N mod 2)=0
          then mediane:=(p[N div 2]+p[1+N div 2])/2
          else mediane:=p[(N+1) div 2] ;
        writeln('médiane : ',mediane:1:1) ;
        end ;
  (* else ; *)
  end ;
End ;

BEGIN
repeat (* question 5. *)
  SAISIES ;
  repeat (* question 4. *)
    CHOIX ;
    write('Nouveau traitement avec les mêmes données (o/n) ? ') ;
    readln(continuer) ;
    until (continuer='n') ;
  write('Recommencer avec d'autres valeurs (o/n) ?') ;
  readln(recommencer) ;
  until (recommencer='n') ;
END.