IUP 2

Correction Examen d'informatique

Première session 1999


Première Partie


#include <stdio.h>

typedef char couleur[7];
couleur tab_coul[10]={"noir","brun","rouge","orange",
	"jaune","vert","bleu","violet","gris","blanc"};

Question 1

int dem_coul(void)
 {
  int i,choix;
  for(i=0;i<10;i++) printf(" %d=%s",i,tab_coul[i]);
  do
   {
    printf(". Quelle couleur (entre 0 et 9 ?");
    scanf("%d",&choix);
   }
  while(choix<0||choix>9); //ce test n'était pas demandé
  return(choix);
 }

Question 2

float multiplicateur(int n)
 {
  int i;
  float mult=1;;
  for(i=0;i<n;i++)mult*=10;
  return(mult);
 }

Un entier aurait posé un problème : il est limité à 32k ce qui est incompatible avec notre problème. Les flottants, bien que moins précis que les entiers, sont largement suffisant puisque nous n'envisageons dans le sujet que des valeurs à deux chiffres significatifs (il y en a au moins 7 sur les flottants).

Question 3

void main(void)
 {
  float result;
  int dizaine,unite;
  printf("entrez vos trois couleurs :");
  dizaine=dem_coul();
  unite=dem_coul();
  result=multiplicateur(dem_coul());
  result*=(dizaine*10+unite);
  printf("votre résistance fait %0.0f Ohms\n",result);
 }
*/

Question 4

void main(void)
 {
  float val;
  int diz,unit,mult=0;
  printf("quelle est la valeur de la résistance (en Ohms) ? ");
  scanf("%f",&val);
  while (val>=100) {val/=10;mult++;}
  diz=(int)val/10;  //division entière
  unit=(int)val%10; //reste de la division
  printf("couleurs correspondantes : %s %s %s\n",
	  tab_coul[diz],tab_coul[unit],tab_coul[mult]);
 }

Question 5

toute idée était envisageable. On pouvait se limiter à des combinaisons de deux résistances. Par exemple (en série) :

  1. demander la valeur désirée
  2. pour chaque résistance disponible (boucle sur i)
  3.   tester TOUTES les autres (boucle sur j) :
  4.     si écart (val recherchée - (valeur[i]+valeur[j]) plus petit que tout ce qu'on a déjà testé, mémoriser i et j
  5. en sortie de boucle, i et j donnent le "couple optimal"

Pour deux résistances en parallèle, l'algorithme est le même, seul le calcul de l'écart diffère.

Pour accélérer (je me limite au cas en série), à condition d'avoir trié le tableau des valeurs disponibles, on a deux possibilités :


Seconde Partie



#include <stdio.h>
#include <stdlib.h>
//pour ceux qui utilisent Turbo/Borland C, décommentez la ligne suivante
//void bidon(void) {float x;scanf("%f",&x);}

#define NMax 200

Question 1


typedef struct segment
 {
  float V;
  float R;
 }segment;

typedef segment tableau[NMax];
/* pour la question 2 on mettrait : typedef segment *tableau; */

// je suppose que N est initialisé dans main
void saisie(tableau t,int N)
 {
  int i;
  for(i=0;i<N;i++)
   {
    printf("segment %d : R=?",i);
    scanf("%f",&(t[i].R));
    printf("V=?");
    scanf("%f",&(t[i].V));
   }
 }
void affiche(tableau t,int N)
 {
  int i;
  for(i=0;i<N;i++)
    printf("segment %d : R=%f, V=%f\n",i,t[i].R,t[i].V);
 }

void main(void)  //la fonction main n'était pas demandée
 {
  int N;
  tableau tab;
  printf("combien y a-t-il de segments ? ");
  scanf("%d",&N);
/* question 2 : on rajouterait :  tab=(tableau)malloc(N*sizeof(segment)); */
  saisie(tab,N);
  affiche(tab,N);
 }

Question 2

il faut déclarer différement le type tableau :

  typedef segment *tableau;

dans la fonction main, il suffira de rajouter (après avoir demandé N mais avant de se servir du tableau) :

  tab=(tableau)malloc(N*sizeof(segment));

on pourrait également, dès que l'on n'a plus besoin du tableau, appeler :

  free(tab);

mais les fonctions saisie et affiche ne sont pas modifiées

Question 3

#define MMax 150
typedef int ligne[NMax];
typedef ligne matrice[MMax];

void saisie_mat(matrice mat,int N,int M)
 {
  int noeud,segment;
  for(noeud=0;noeud<N;noeud++)
   {
    printf("noeud n° %d : ",noeud);
    for(segment=0;segment<M;segment++)mat[segment][noeud]=0;
    do
     {
      printf("entrez un numéro de segment relié à ce noeud (-1 pour finir)");
      scanf("%d",&segment);
      if(segment>=0&&segment<M)mat[segment][noeud]=1;
     }
    while(segment>=0);
   }
 }
void affiche_mat(matrice mat,int N,int M)
 {
  int noeud,segment;
  for(noeud=0;noeud<N;noeud++)
   {
    printf("le noeud n° %d est relié aux segments :",noeud);
    for(segment=0;segment<M;segment++)
      if(mat[segment][noeud]) printf (" %d",segment);
    printf(".\n");

   }
 }


void main(void)
 {
  int N,M;
  matrice connexion;
  printf("nb de noeuds ? ");
  scanf("%d",&N);
  printf("nb de segments ? ");
  scanf("%d",&M);
  saisie_mat(connexion,N,M);
  affiche_mat(connexion,N,M);
}

Question 4

void affiche_tout(matrice mat,tableau tab,int N,int M)
 {
  int noeud,segment,nb;
  for(noeud=0;noeud<N;noeud++)
   {
    nb=0;
    for(segment=0;segment<M;segment++)nb+=mat[segment][noeud];
    printf("Noeud %d : %d segment : ",noeud,nb);
    for(segment=0;segment<M;segment++)
      if(mat[segment][noeud])printf("R=%f V=%f / ",tab[segment].R,tab[segment].V);
    printf(".\n");
   }
 }


void main(void)
 {
  int N,M;
  matrice connexion;
  tableau segments;
  printf("nb de noeuds ? ");
  scanf("%d",&N);
  printf("nb de segments ? ");
  scanf("%d",&M);
  saisie(segments,M);
  saisie_mat(connexion,N,M);
  affiche_tout(connexion,segments,N,M);

}

Question 5

"hors correction"


retour au sujet (il est normalement déjà dans une autre fenêtre).


Patrick TRAU, ULP - IPST 6/5/99