1. while_puiss
2. while_err
3. do_while
4. for
5. jeu
6. calcul
7. moyenne
8. rotation
9. classer
10. chaînes
11. matrices
12. déterminant
13. tel
14. liste et insertion
15. agenda
#include <stdio.h> void main(void) { int puissance=1,max; puts("nombre maximal désiré (ne pas dépasser 16000) ?"); scanf("%d",&max); while (puissance<max) printf("%d\n",puissance*=2); }retour au sujet de cet exercice
retour au sujet de cet exercice
#include <stdio.h> #include <stdlib.h> /* pour rand() */ #include <time.h> /* pour trouver l'heure pour srand */ void main(void) { int solution,reponse,nb_essais=0; {time_t t;srand((unsigned) time(&t)); } /* initialiser le générateur à partir du compteur de temps, pour qu'il soit plus aléatoire */ solution=rand()%11; /* reste sera toujours entre 0 et 10 */ do { nb_essais++; puts("proposez votre nombre entre 0 et 10"); scanf("%d",&reponse); } while (reponse!=solution); printf("trouvé en %d essais\n",nb_essais); }retour au sujet de cet exercice
#include <stdio.h> void main(void) { int i,N; float note,somme=0,moyenne; puts("nombre de notes ? "); scanf("%d",&N); for(i=0;i<N;i++) { printf("entrez votre %dième note",i+1); scanf("%f",¬e); somme+=note; } moyenne=somme/N; printf("moyenne calculée :%5.2f\n",moyenne); }retour au sujet de cet exercice
#include <stdio.h> #include <stdlib.h> /* pour rand() */ #include <time.h> /* pour trouver l'heure pour srand */ void main(void) { int solution,reponse,nb_essais=0; { time_t t;srand((unsigned) time(&t)); } /* initialiser le générateur*/ solution=rand()%11; /* reste sera toujours entre 0 et 10 */ do { nb_essais++; puts("proposez votre nombre entre 0 et 10"); scanf("%d",&reponse); if (reponse>solution) puts("trop grand"); else if (reponse!=solution) puts("trop petit"); } while (reponse!=solution); printf("trouvé en %d essais\n",nb_essais); if (nb_essais==1) puts("vous avez eu un peu de chance"); else if (nb_essais<4) puts("bravo"); else if (nb_essais>6) puts("ce score me semble bien minable"); }retour au sujet de cet exercice
#include <stdio.h> void main(void) { float val1,val2,res; char op; int fin=0; do { puts("calcul à effectuer (par ex 5*2), ou 1=1 pour finir ? "); scanf("%f%c%f",&val1,&op,&val2); switch (op) { case '*':res=val1*val2;break; case '/':res=val1/val2;break; case '+':res=val1+val2;break; case '-':res=val1-val2;break; case '=':fin++; /* pas besoin de break, je suis déjà au } */ } if (!fin) printf("%f%c%f=%f\n",val1,op,val2,res); } while (!fin); }retour au sujet de cet exercice
#include <stdio.h> #define max 100 typedef float tableau[max]; tableau tab; int Nb; void lecture(void) { int i; puts("entrez le nombre de notes à traiter :"); do scanf("%d",&Nb); while ((Nb<=0)||(Nb>max)); for(i=0;i<Nb;i++) { printf("valeur n° %d ? ",i+1); scanf("%f",&tab[i]); } } float moyenne(void) { int i; float somme=0; for (i=0;i<Nb;i++) somme+=tab[i]; return(somme/Nb); } void affichage(float moy) { int i; printf("la moyenne des %d notes est %f\n",Nb,moy); for(i=0;i<Nb;i++) printf("%dième note : écart : %f\n",i+1,tab[i]-moy); } void main(void) { lecture(); affichage(moyenne()); }retour au sujet de cet exercice
#include <stdio.h> typedef int composante; void lecture(composante *t,int *nb) { int i; puts("nombre de valeurs à entrer ? "); scanf("%d",nb); for(i=1;i<=*nb;i++) { printf("%dième valeur : ",i); scanf("%d",t++); } } void affiche(composante *t, int max) { int i; for(i=0;i<max;i++) printf("%d ",*t++); puts(" "); } void decale_bas(composante *deb, int max) { composante c,*t; t=deb+(max-1); c=*t; while (t>deb) {*t=*(t-1);t--;} *t=c; } void decale_haut(composante *t, int nb) { composante c;int i; c=*t; for (i=1;i<nb;i++) {*t=*(t+1);t++;} *t=c; } void main(void) { composante tableau[100]; int nombre; lecture(tableau,&nombre); puts("tableau initial :"); affiche(tableau,nombre); decale_haut(tableau,nombre); puts("décalage vers le haut :"); affiche(tableau,nombre); decale_bas(tableau,nombre); puts("décalage vers le bas :"); affiche(tableau,nombre); }retour au sujet de cet exercice
#include <stdio.h> #define dim 100 typedef int composante; void lecture(composante *t,int *nb) { int i; puts("nombre de valeurs à entrer ? "); scanf("%d",nb); for(i=1;i<=*nb;i++) { printf("%dième valeur : ",i); scanf("%d",t++); } } void affiche(composante *t, int max) { int i; for(i=0;i<max;i++) printf("%d ",*t++); puts(" "); } int indice_min(composante t[],int indice_dep, int nb_indices) /* cherche l'indice de la valeur du tableau : * -soit égale à t[indice_dep], mais d'indice > à indice_dep; * -soit la plus petite mais >t[indice_deb] */ { int i,indice_resultat=-1; for(i=indice_dep+1;i<nb_indices;i++) if (t[i]==t[indice_dep]) return(i); /* si on est encore là c'est qu'il n'y en pas d'égal */ for(i=0;i<nb_indices;i++) if ((t[i]>t[indice_dep]) && ((indice_resultat<0) || (t[i]<t[indice_resultat]))) indice_resultat=i; return(indice_resultat); } void copier(composante *source, composante *dest, int nb) /* copie le tableau source dans le tableau dest */ { int i; for(i=0;i<nb;i++) *(dest++)=*(source++); } void classe(composante tab[], int nb) { composante tempo[dim]; /* un malloc(sizeof(composante)*nb) aurait été mieux mais on n'en a pas encore parlé en cours */ int i,ind_faits,indice; /* 1er : recherche du plus petit, le 1er si ex aequo */ indice=0; for(i=1;i<nb;i++) if(tab[i]<tab[indice]) indice=i; tempo[ind_faits=0]=tab[indice]; /* les suivants : recherche le + petit mais > au précédent */ for(ind_faits=1;ind_faits<nb;ind_faits++) { indice=indice_min(tab,indice,nb); tempo[ind_faits]=tab[indice]; } copier(tempo,tab,nb); } void main(void) { composante tableau[dim]; int nombre; lecture(tableau,&nombre); puts("tableau initial :"); affiche(tableau,nombre); classe(tableau,nombre); puts("tableau classé :"); affiche(tableau,nombre); }retour au sujet de cet exercice
#include <stdio.h> #define taille 255 int debut_egal(char *ch,char *sch) /* répond si sch est exactement le début de ch */ { while (*sch && *ch) { if (*sch!=*ch) return(0); else {ch++;sch++;} } return(!(*sch)); } void recherche(char *ch,char *sch) { int pos=0; while (*ch) { if (debut_egal(ch,sch)) printf("trouvé en position %d\n",pos); ch++;pos++; } } void main(void) { char ch[taille],sch[taille]; puts("chaîne à tester ? "); gets(ch); puts("sous-chaîne à trouver ?"); gets(sch); recherche(ch,sch); }retour au sujet de cet exercice
#include <stdio.h> #define DIM 10 typedef float ligne[DIM]; typedef ligne matrice[DIM]; typedef float *pointeur; void lecture(matrice t,int *lig,int *col) /* lit à l'écran une matrice */ { int l,c; float f; puts("nombre de lignes de la matrice ?"); scanf("%d",lig); puts("nombre de colonnes de la matrice ?"); scanf("%d",col); for (l=0;l<*lig;l++) for(c=0;c<*col;c++) { printf("élément [%d,%d] ? ",l,c); scanf("%f",&f); t[l][c]=f; } } void zero(float *t) /* met toute la matrice à 0 */ { int i; for(i=0;i<DIM*DIM;i++) *t++=0; } void unit(matrice t) /* remplit la matrice unité (1 diagonale, 0 autre) */ { int i; zero(t); for(i=0;i<DIM;i++) t[i][i]=1; } void init(matrice t) /* initialisation de matrice à numlig.numcol */ { int i,j; for(i=0;i<DIM;i++) for(j=0;j<DIM;j++) t[i][j]=i+j/10.0; } void affiche(matrice t,int l,int c) /* puts("affichage du tableau ligne par ligne :"); */ { int i,j; for(i=0;i<l;i++) { printf("ligne %d : ",i); for(j=0;j<c;j++) printf("%3.1f ",t[i][j]); printf("\n"); } } void produit(matrice a,matrice b,matrice c,int m,int l,int n) /* calcul du produit */ { int im,il,in; zero(c); for(im=0;im<m;im++) for(in=0;in<n;in++) for(il=0;il<l;il++) c[im][in]+=a[im][il]*b[il][in]; } void main(void) { int m,l,n,i; matrice a,b,c; lecture(a,&m,&l); lecture(b,&i,&n); if(i!=l) puts("calcul impossible : dimensions incompatibles"); affiche(a,m,l); puts("--- FOIS ---"); affiche(b,l,n); puts("--- FAIT ---"); produit(a,b,c,m,l,n); affiche(c,m,n); }retour au sujet de cet exercice
#include <stdio.h> #include <stdlib.h> #define DIM 10 typedef float ligne[DIM]; typedef ligne matrice[DIM]; typedef float *pointeur; long nb_appels; void lecture(matrice t,int *lig) /* lit une matrice (au clavier) */ { int l,c; float f; puts("dimension de la matrice ?"); scanf("%d",lig); for (l=0;l<*lig;l++) for(c=0;c<*lig;c++) { printf("élément [%d,%d] ? ",l,c); scanf("%f",&f); t[l][c]=f; } } void zero(matrice t,int dim) /* met toute la matrice à 0 */ { int i,j; for(i=0;i<dim;i++)for(j=0;j<dim;j++) t[i][j]=0; } void unit(matrice t, int dim) /* remplit la matrice unité (1 diagonale, 0 autre) */ { int i; zero(t,dim); for(i=0;i<dim;i++) t[i][i]=1; } void affiche(matrice t,int l) /* puts("affichage du tableau ligne par ligne :"); */ { int i,j; for(i=0;i<l;i++) { printf("ligne %d : ",i); for(j=0;j<l;j++) printf("%3.1f ",t[i][j]); printf("\n"); } } void copiesauflc(matrice source,matrice dest,int dim,int ligavirer) { int l,c,ld=0; for (l=0;l<dim;l++) if (l!=ligavirer) { for (c=1;c<dim;c++) dest[ld][c-1]=source[l][c]; ld++; } } float determinant(matrice m,int dim) { matrice sous_m; int l,signe=1; float det=0; nb_appels++; if (dim==1) return(m[0][0]); for(l=0;l<dim;l++) { copiesauflc(m,sous_m,dim,l); det+=signe*m[l][0]*determinant(sous_m,dim-1); signe=-signe; } return(det); } void produit(matrice a,matrice b,matrice c,int dim) /* calcul du produit */ { int im,il,in; zero(c,dim); for(im=0;im<dim;im++) for(in=0;in<dim;in++) for(il=0;il<dim;il++) c[im][in]+=a[im][il]*b[il][in]; } void main(int argc,char *argv[]) { int taille; matrice mat; /* lecture(mat,&taille); */ taille=atoi(argv[1]); /* test avec matrice unité, */ unit(mat,taille); /* au moins je connais le résultat*/ affiche(mat,taille); printf("déterminant : %20.17f ",determinant(mat,taille)); printf(" en %ld appels\n",nb_appels); }retour au sujet de cet exercice
#include <stdio.h> #include <string.h> #include <stdlib.h> #define DIM 100 enum champs {nom,prenom,num,rue,cp,ville,tel}; char *nomchamp[7]={"Nom", "Prénom", "Numéro", "Rue", "Code Postal", "Ville", "Tel"}; typedef struct { char nom[15]; char prenom[20]; int num; char rue[60]; long codepostal; char ville[20]; char tel[15]; } fiche; fiche *rech_nom(fiche *,char *); fiche *rech_prenom(fiche *,char *); fiche *rech_num(fiche *,char *); fiche *rech_rue(fiche *,char *); fiche *rech_cp(fiche *,char *); fiche *rech_ville(fiche *,char *); fiche *rech_tel(fiche *,char *); fiche *rech_nom(fiche *,char *); typedef fiche *ptrfiche; typedef ptrfiche (*ptrfonction)(ptrfiche,char*); ptrfonction tabfonction[7]={rech_nom, rech_prenom, rech_num, rech_rue, rech_cp, rech_ville, rech_tel}; void affiche(fiche *f) { if(f->nom[0]) printf("%s %s\n%d, %s\n%ld %s\nTel : %s\n", f->nom, f->prenom, f->num, f->rue, f->codepostal, f->ville, f->tel); else printf("fiche inconnue\n"); } int idem(char *s1,char *s2) /* compare deux chaines, dit si elles sont égales (1), ou non (0). On pourrait supposer égalité quand la chaine s2 est incluse dans s1 */ { return(strcmp(s1,s2)?0:1); } fiche *rech_nom(fiche *pf,char *n) {while ((pf->nom[0])&&(!idem(pf->nom,n)))pf++; return(pf);} fiche *rech_prenom(fiche *pf,char *n) {while ((pf->nom[0])&&(!idem(pf->prenom,n)))pf++; return(pf);} fiche *rech_num(fiche *pf,char *n) {while ((pf->nom[0])&&(pf->num!=atoi(n)))pf++; return(pf);} fiche *rech_rue(fiche *pf,char *n) {while ((pf->nom[0])&&(!idem(pf->rue,n)))pf++; return(pf);} fiche *rech_cp(fiche *pf,char *n) {while ((pf->nom[0])&&(pf->codepostal!=atoi(n)))pf++; return(pf);} fiche *rech_ville(fiche *pf,char *n) {while ((pf->nom[0])&&(!idem(pf->ville,n)))pf++; return(pf);} fiche *rech_tel(fiche *pf,char *n) {while ((pf->nom[0])&&(!idem(pf->tel,n)))pf++; return(pf);} int choix(void) { char lig[40]; enum champs i,rep; for (i=nom;i<=tel;i++) printf("%d:%s ",i,nomchamp[i]); printf("\nou -1 pour quitter. Type de recherche désirée ? "); gets(lig); sscanf(lig,"%d",&rep); return(rep); } void lecture(fiche *tab) { char lig[40]; do { printf("nom (rien pour finir) ?"); gets(tab->nom); if(tab->nom[0]) { printf(" prénom ? "); gets(tab->prenom); printf(" N° ? "); gets(lig); sscanf(lig,"%d",&(tab->num)); printf(" rue ? "); gets(tab->rue); printf(" code postal ? "); gets(lig); sscanf(lig,"%ld",&(tab->codepostal)); printf(" ville ? "); gets(tab->ville); printf("n° de téléphone ? "); gets(tab->tel); } } while ((tab++)->nom[0]); } void main(void) { enum champs c; char clef[40]; fiche tab[DIM]; lecture(tab); do { if (((c=choix())<0)||(c>6)) break; printf("quel(le) %s recherche-t'on ? ",nomchamp[c]); gets(clef); affiche(tabfonction[c](tab,clef)); } while (c>=0); }retour au sujet de cet exercice
#include <stdio.h> #include <conio.h> #include <ctype.h> #include <alloc.h> struct page {int val; struct page *suivant; }; struct page *premier; int encore(void) /* demande si on en veut encore*/ { printf("encore (O/N) ? "); return(toupper(getche())=='O'); } void lecture(void) { struct page *precedent,*nouveau; premier=(struct page *)malloc(sizeof(struct page)); puts("entrez votre premier entier"); scanf("%d",&premier->val); precedent=premier; while (encore()) { nouveau=(struct page *)malloc(sizeof(struct page)); precedent->suivant=nouveau; precedent=nouveau; puts("\nentrez votre entier"); scanf("%d",&nouveau->val); } precedent->suivant=NULL; } void affiche(struct page *debut) { printf("\nliste : "); while(debut!=NULL) { printf("%d ",debut->val); debut=debut->suivant; } printf("\n"); } void suppression(void) { struct page *actu,*prec; actu=premier; while (actu!=NULL) { printf("\nvaleur : %d - supprimer celui-ci (O/N) ? ",actu->val); if (toupper(getche())=='O') { if(actu==premier)premier=actu->suivant; else prec->suivant=actu->suivant; free(actu); break; } else { prec=actu; actu=prec->suivant; } } } void ajouter(void) { struct page *nouveau,*prec; printf("\najouter en premier (O/N) ? "); if (toupper(getche())=='O') { nouveau=(struct page *)malloc(sizeof(struct page)); nouveau->suivant=premier; premier=nouveau; printf("\nnouvelle valeur ? "); scanf("%d",&(nouveau->val)); } else { prec=premier; while(prec!=NULL) { printf("\nvaleur : %d - insérer après celui_ci (O/N) ? ", prec->val); if (toupper(getche())=='O') { nouveau=(struct page *)malloc(sizeof(struct page)); nouveau->suivant=prec->suivant; prec->suivant=nouveau; printf("\nnouvelle valeur ? "); scanf("%d",&(nouveau->val)); break; } else prec=prec->suivant; } } } void main(void) { lecture(); affiche(premier); do { suppression(); affiche(premier); } while(encore()); do { ajouter(); affiche(premier); } while(encore()); }retour au sujet de cet exercice
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <conio.h> /* définitions des types et variables associées */ enum champs {nom,prenom,num,rue,cp,ville,tel}; char *nomchamp[7]={"Nom","Prénom","Numéro","Rue", "Code Postal","Ville","Tel"}; typedef struct { char nom[15]; char prenom[20]; int num; char rue[60]; long codepostal; char ville[20]; char tel[15]; } fiche; #define taille sizeof(fiche) typedef fiche *ptrfiche; /* définitions des fonctions de recherche, regroupées dans un tableau */ fiche *rech_nom(fiche *,char *); fiche *rech_prenom(fiche *,char *); fiche *rech_num(fiche *,char *); fiche *rech_rue(fiche *,char *); fiche *rech_cp(fiche *,char *); fiche *rech_ville(fiche *,char *); fiche *rech_tel(fiche *,char *); fiche *rech_nom(fiche *,char *); typedef ptrfiche (*ptrfonction)(ptrfiche,char*); ptrfonction tabfonction[7]= {rech_nom, rech_prenom, rech_num, rech_rue, rech_cp, rech_ville, rech_tel}; /* variables globales */ FILE *fic; /* fichier de données */ char *nomfic="agenda.dat"; int nb; /* nb de fiches dans le fichier */ void init(void) /* ouvre le fichier, détermine le nb de fiches de fic */ { if ((fic=fopen(nomfic,"a+b"))==NULL) { puts("ouverture impossible du fichier de données"); exit(1); } fseek(fic,0,2); nb=(int)ftell(fic)/taille; printf("%d fiches présentes dans l'agenda\n",nb); } void ajouter(void) { char lig[40]; fiche f; printf("nom ? "); gets(f.nom); printf(" prénom ? "); gets(f.prenom); printf(" Numero ? "); gets(lig); sscanf(lig,"%d",&(f.num)); printf(" rue ? "); gets(f.rue); printf(" code postal ? "); gets(lig); sscanf(lig,"%ld",&(f.codepostal)); printf(" ville ? "); gets(f.ville); printf("n° de téléphone ? "); gets(f.tel); fseek(fic,0L,2); if(fwrite(&f,taille,1,fic)!=1) { puts("impossible d'ajouter cette fiche au fichier "); exit(0); } nb++; } void affiche(fiche *f) { if((f!=NULL)&&(f->nom[0])) printf("%s %s\n%d, %s\n%ld %s\nTel : %s\n",f->nom, f-> prenom, f->num, f->rue,f->codepostal,f->ville,f->tel); else printf("fiche inconnue\n"); } int idem(char *s1,char *s2) /* compare deux chaines, dit si elles sont égales (1), ou non (0). On considère égales majuscules et minuscules. Une des chaines peut se terminer par *, on supposera identique si tout ce qui précède l'* était identique */ { for(;;) { if (((!*s1)&&(!*s2))||(*s1=='*')||(*s2=='*')) return(1); if ((toupper(*s1)!=toupper(*s2))||(!*s1)||(!*s2)) return(0); s1++;s2++; } } fiche *rech_nom(fiche *pf,char *n) { int nblu; fseek(fic,0L,0); do nblu=fread(pf,taille,1,fic); while ((nblu==1)&&(!idem(pf->nom,n))); if (nblu==1) return(pf); else return(NULL); } /* les autres recherches sont à continuer */ int choix(void) { char lig[40]; enum champs i,rep; for (i=nom;i<=tel;i++) printf("%d:%s ",i,nomchamp[i]); printf("\nou -1 pour quitter. Type de recherche désirée ? "); gets(lig); sscanf(lig,"%d",&rep); return(rep); } void recherche(void) { enum champs c; char clef[40]; fiche f; do { if (((c=choix())<0)||(c>6)) break; printf("quel(le) %s recherche-t'on ? ",nomchamp[c]); gets(clef); affiche(tabfonction[c](&f,clef)); } while (c>=0); } void main(void) { char rep; init(); do { puts("Ajouter une fiche, Recherche d'une fiche, Quitter le prog ? "); switch (rep=toupper(getch())) { case 'A':ajouter();break; case 'R':recherche();break; case 'Q':fclose(fic);puts("Au revoir");break; default :puts("option non prévue"); } } while (rep!='Q'); }retour au sujet de cet exercice