précédent suivant haut Contents Index

CORRECTION DES EXERCICES


BOUCLE

#include <stdio.h>;
void main(void)
 {
  float puiss,x,result;
  printf("entrez x ");
  scanf("%f",&x);
  result=2 -5*x +(puiss=x*x) -3*(puiss*=x) +2*puiss*x;
  printf("résultat : %f\n",result);
 }

TUSEXO_A

#include <stdio.h>
#include "base_tus.inc"
#define dim 10
void main(void)
 {
  int i,nb;
  composante v,t[dim],moy=0;
  init_tus(t,&nb,dim);
  do
   {
    printf("entrez la %dième note (fin si <0 ou >20) :",nb+1);
    scanf("%f",&v);
    if(v<0||v>20) break; /* on aurait pu le mettre dans la condition du while */
    moy+=v;
   }
  while (!ajoute_val_tus(t,&nb,dim,v));
  if(nb) moy/=nb;
  printf("moyenne des %d notes : %5.2f\n",nb,moy);
  for(i=0;i<nb;i++) printf("%2dième valeur : %5.2f (écart/moyenne %+5.2f)\n",i+1,t[i],t[i]-moy);
 }

TUSEXO_B

#include <stdio.h>
#include <conio.h>
#include "base_tus.inc"
#include "mani_tus.inc"
#define dim 10
void lecture(type_tus t,int *nb)
 {
  composante v;
  do
   {
    printf("entrez la %dième note (fin si <0 ou >20) :",(*nb)+1);
    scanf("%f",&v);
    if(v<0||v>20) break; /* on aurait pu le mettre dans la condition du while */
   }
  while (!ajoute_val_tus(t,nb,dim,v));
 }

void main(void)
 {
  int nb;
  composante t[dim];
  char rep;
  init_tus(t,&nb,dim);
  lecture(t,&nb);
  do
   {
    printf("0 fin, 1 affiche, 2 rot gauche, 3 rot droite, 4 suppr, 5 ins :");
    rep=getche()-'0';
    printf("\n");
    switch (rep)
     {
      case 0:puts("au revoir");break;
      case 1:affiche_tus(t,nb);break;
      case 2:rot_gauche_tus(t,nb);break;
      case 3:rot_droite_tus(t,nb);break;
      case 4:{int pos;
              printf("position de l'élément à supprimer ? ");
              scanf("%d",&pos);
              suppr_tus(t,&nb,pos);
              break;}
      case 5:{int pos;composante v;
              printf("position de l'élément à insérer ? ");
              scanf("%d",&pos);
              printf("valeur à insérer ? ");
              scanf("%f",&v);
              insert_tus(t,&nb,dim,pos,v);
              break;}
      default:puts("code erroné !");
     }
   }
  while (rep);
 }

GAUSS_MRD

#include <stdio.h>
#include <alloc.h>
#include <math.h> /* pour fabs */

#define composante float
typedef composante *mat_dyn;

#define adr_mrd(l,c,nbc) ((l)*(nbc)+(c))

mat_dyn alloc_mrd(int nbl,int nbc)
 {return((mat_dyn)malloc(nbl*nbc*sizeof(composante)));}

void affiche_mrd(mat_dyn tab,int nblig, int nbcol)
 {
  int l,c;
  printf("\n");
  for(l=0;l<nblig;l++)
   {
    printf("|");
    for(c=0;c<nbcol;c++)printf("%5.1f ",tab[adr_mrd(l,c,nbcol)]);
    printf(" |\n");
   }
 }

void autom_3_3(mat_dyn *t,int*nblig, int *nbcol)
 {
  composante ex[][3]={{1,1,-2},{1,3,-4},{-1,-2,6}};
  int l,c;
  *nblig=*nbcol=3;
  *t=alloc_mrd(*nblig,*nbcol);
  for(l=0;l<*nblig;l++) for(c=0;c<*nbcol;c++)
       (*t)[adr_mrd(l,c,*nbcol)]=ex[l][c];
 }
void autom_3_1(mat_dyn *t,int*nblig, int *nbcol)
 {
  composante ex[]={2,6,-1};
  int l,c;
  *nblig=3;*nbcol=1;
  *t=alloc_mrd(*nblig,*nbcol);
  for(l=0;l<*nblig;l++) for(c=0;c<*nbcol;c++)
        (*t)[adr_mrd(l,c,*nbcol)]=ex[l];
 }

void gauss_triangulation(mat_dyn A,mat_dyn B, int N)
 {
  int ce,l,c,lpivot;
  composante coef;
  for(ce=0;ce<N-1;ce++) /* ce=colonne à effacer */
   {
/* recherche du pivot le plus grand possible (dans les lignes qui restent)
*/
    lpivot=ce;
    for(l=ce+1;l<N;l++)
    if(fabs(A[adr_mrd(l,ce,N)])>fabs(A[adr_mrd(lpivot,ce,N)])) lpivot=l;
/* echange de la ligne du pivot et de la ligne ce (ne pas oublier B)*/
    for(c=ce;c<N;c++) /* tous les termes devant ce sont nuls */
     {
      coef=A[adr_mrd(ce,c,N)];
      A[adr_mrd(ce,c,N)]=A[adr_mrd(lpivot,c,N)];
      A[adr_mrd(lpivot,c,N)]=coef;
     }
    coef=B[ce];B[ce]=B[lpivot];B[lpivot]=coef; 
    for(l=ce+1;l<N;l++) /* pour chaque ligne au dessous */
     {
      coef=A[adr_mrd(l,ce,N)]/A[adr_mrd(ce,ce,N)];
      A[adr_mrd(l,ce,N)]=0; /* normalement pas besoin de le calculer*/
      for(c=ce+1;c<N;c++)
        A[adr_mrd(l,c,N)]-=coef*A[adr_mrd(ce,c,N)];
      B[l]-=coef*B[ce];
     }
   }
 }

void gauss_resolution(mat_dyn A,mat_dyn B,mat_dyn X,int N)
/* on pourait rendre le résultat dans B (si l'utilisateur
désirait le garder, il lui suffit de le copier avant). Ceci
économise le tableau X et le tampon */
 {
  int l,c;
  composante tampon;
  for(l=N-1;l>=0;l--)
   {
    tampon=B[l];
    for(c=l+1;c<N;c++) tampon-=A[adr_mrd(l,c,N)]*X[c];
    X[l]=tampon/A[adr_mrd(l,l,N)];
   }
 }

void main(void)
 {
  int nblA,nblB,nbcA,nbcB;
  mat_dyn A,B,X;
  autom_3_3(&A,&nblA,&nbcA);
  affiche_mrd(A,nblA,nbcA);
  autom_3_1(&B,&nblB,&nbcB);
  affiche_mrd(B,nblB,nbcB);

  if(nblA!=nbcA){puts("erreur fatale : matrice A non carrée");return;}
  if(nblB!=nblB){puts("erreur fatale : nb lignes du second membre incompatibles"); return;}
  if(nbcB!=1){puts("erreur fatale : le second membre doit avoir une seule colonne"); return;}

  gauss_triangulation(A,B,nblA); /*nblA=nbcA=nblB*/
  puts("résultat après triangulation : ");
  affiche_mrd(A,nblA,nbcA);
  affiche_mrd(B,nblB,nbcB);

  X=alloc_mrd(nblB,nbcB);
  gauss_resolution(A,B,X,nblA);
  puts("solution :");
  affiche_mrd(X,nblB,1);
 }

INSE_TTD

#include <stdio.h>
#include <alloc.h>
#include <string.h>
typedef char composante; 
typedef composante *ligne;
/* ou composante ligne []*/
typedef ligne *mat_ttd;
/* ou ligne mat_ttd[] */

void affiche(mat_ttd tab,int nblig)
 {
  int l;
  for(l=0;l<nblig;l++)printf("%s\n",tab[l]);
 }

void lecture(mat_ttd *tdl,int *nblig)
 {
  /* on se limite à 100 lignes de 1000 caractères, mais une
fois sorti de la fonction, seule la place nécessaire est
réservée (variables locales). On supprime ces limites par
utilisation (toujours temporaire) de listes chaînées */
  composante txt[1000];
  ligne tab_de_lignes[100];
  int longueur;
  *nblig=0;
  printf("entrez vos lignes (fin du texte par '@@@' en déb de ligne):\n");
  do
   {
    gets(txt);
    longueur=strlen(txt); /* \0 non compris */
    if(!strcmp(txt,"@@@"))break;
    tab_de_lignes[*nblig]=(ligne)malloc(longueur+1);
    strcpy(tab_de_lignes[*nblig],txt);
    (*nblig)++;
   }
  while (1);
  *tdl=(mat_ttd)malloc((*nblig)*sizeof(ligne));
  memcpy(*tdl,tab_de_lignes,(*nblig)*sizeof(ligne));
 }

void tri_insertion(mat_ttd tab, int N)
 {
  int pt,dpg; /* position testée,dernier plus grand */
  ligne tampon;
  for(pt=1;pt<N;pt++)
   {
    dpg=pt-1;
    tampon=tab[pt];
    while(strcmp(tab[dpg],tampon)>0 && dpg>=0)
           {tab[dpg+1]=tab[dpg];dpg--;}
    tab[dpg+1]=tampon;
   }
 }

void main(void)
 {
  int nbl;
  mat_ttd txt;
  lecture(&txt,&nbl);
  puts("avant tri :");
  affiche(txt,nbl);
  tri_insertion(txt,nbl);
  puts("après tri :");
  affiche(txt,nbl);
 }


précédent suivant haut Contents Index