IUP 2
#include <stdio.h> typedef char couleur[7]; couleur tab_coul[10]={"noir","brun","rouge","orange", "jaune","vert","bleu","violet","gris","blanc"};
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); }
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).
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); } */
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]); }
toute idée était envisageable. On pouvait se limiter à des combinaisons de deux résistances. Par exemple (en série) :
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 :
#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
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); }
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
#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); }
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); }
"hors correction"
retour au sujet (il est normalement déjà dans une autre fenêtre).
Patrick TRAU, ULP - IPST 6/5/99