vendredi 11 mars 2011

Exercices et Corriges : Les Fonctions dans le Langage C++

LES FONCTIONS
FONCTIONS SANS PASSAGE D'ARGUMENTS ET NE RENVOYANT RIEN AU PROGRAMME.

Exercice 1:
Un programme contient la déclaration suivante:
int tab[10] = {1,2,4,8,16,32,64,128,256,512};  /* variable globale */
Écrire une fonction de prototype void affiche(void) qui affiche les Éléments du tableau, et leur
adresse; la mettre en œuvre dans main().
Actualiser le fichier d'en-tête en conséquence.
FONCTION RENVOYANT UNE VALEUR AU PROGRAMME ET SANS PASSAGE D'ARGUMENTS
Exercice 2:
Un programme contient la déclaration suivante:
float liste[8] = {1.6,-6,9.67,5.90,345,-23.6,78,34.6};/* variable globale */
Écrire une fonction de prototype float min(void) qui renvoie le minimum de la liste.
Écrire une fonction de prototype float max(void ) qui renvoie le maximum de la liste.
Les mettre en œuvre dans main().
Actualiser le fichier d'en-tête en conséquence.

FONCTIONS AVEC PASSAGE D'ARGUMENTS
Exercice 3:
Écrire une fonction de prototype int puissance(int a, int b) qui calcule ab,  a et b sont des entiers
(cette fonction n'existe pas en bibliothèque). La mettre en oeuvre dans main().
Actualiser le fichier d'en-tête en conséquence.
Exercice 4:
tab1 et tab2 sont des variables locales à main:
int tab1[10] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
int tab2[10] = {-19,18,-17,16,-15,14,-13,12,-11,10,-9,8,-7,6,-5,4,-3,2,-1,0};
Écrire une fonction de prototype  void affiche(int *tab) qui permet d'afficher les 20 nombres suivant un tableau 4x5.
La mettre en œuvre dans main() pour afficher tab1 et tab2.
Il faut ici ajouter la ligne void affiche(int *) ; dans le fichier d'en-tête.
On dit, dans ce cas, que l'on a passé le paramètre PAR ADRESSE.
LE PASSAGE DE PARAMETRES ENTRE FONCTIONS OU ENTRE FONCTIONS ET PROGRAMME PRINCIPAL

Exercice 5:
Saisir les 3 couleurs d'une résistance, afficher sa valeur.
Une fonction de prototype  float conversion(char *couleur) calcule le nombre associé à chaque couleur.

Exercice 6:
Calculer et afficher les racines de ax2+bx+c=0.
Une fonction de prototype  void saisie(float *aa,float *bb,float *cc) permet de saisir a,b,c.
Une fonction de prototype  void calcul(float aa,float bb,float cc) exécute les calculs et affiche les résultats.
a, b, c sont des variables locales à main();
main() se contente d'appeler saisie(&a,&b,&c) et calcul(a,b,c).
Exercice 7:
Écrire une fonction de prototype  void saisie(int *tx) qui saisie des entiers (au maximum 20), le dernier est 13. Cette fonction renvoie au programme principal adr_debut et adr_fin, les adresses respectives du 1er nombre et du dernier nombre saisis.
- adr_debut et adr_fin sont des variables globales à tout le programme.
- Le programme principal appelle saisie(tab) et affiche la valeur de adr_debut et adr_fin en hexadécimal; tab est une variable locale à main().

Exercice 8:
Modifier la fonction de prototype  void affiche(int *tx) de l'exercice 4 de sorte d'afficher les nombres en tableau 4x5 mais en s'arrêtant à adr_fin.
Compléter le programme principal de l'exercice 7 par un appel à affiche(tab).
-------------------------------------------------------------------------------------------------------
Correction
-------------------------------------------------------------------------------------------------------

Exercice 1:

#include <stdio.h>
#include <conio.h>
#include "c:\bc5\courc_C\teach_c\chap7\chap7.h"   /* fichier d'en-tete */
tab[10]={1,2,4,8,16,32,64,128,256,512};
void affiche()
{
int i;
printf("VOICI LES ELEMENTS DU TABLEAU ET LEURS ADRESSES:\n\n");
for(i=0;i<10;i++)
      printf("ELEMENT Nø%1d: %3d    ADRESSE: %p\n",i,tab[i],tab+i);
}

void main()
{
affiche();
printf("\nPOUR SORTIR FRAPPER UNE TOUCHE: ");
getch();
}

Exercice 2:

#include <stdio.h>
#include <conio.h>
#include "c:\bc5\courc_C\teach_c\chap7\chap7.h"   /* fichier d'en-tete */
float liste[8] = {1.6,-6,9.67,5.90,345,-23.6,78,34.6};
float max()
{
float maxi;
int i;
maxi = *liste;
for(i=0;i<8;i++)      if(*(liste+i)>maxi)            maxi = *(liste+i);
return(maxi);
}
float min()
{
float mini;
int i;
mini = *liste;
for(i=0;i<8;i++)      if(*(liste+i)<mini)            mini = *(liste+i);
return(mini);
}

void main()
{
float rmin, rmax;
rmax = max();
rmin = min();
printf("LE MAXIMUM VAUT: %f\n",rmax);
printf("LE MINIMUM VAUT: %f\n",rmin);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE");
getch();
}

Exercice 3:

#include <stdio.h>
#include <conio.h>
#include "c:\bc5\courc_C\teach_c\chap7\chap7.h"   /* fichier d'en-tete */
int puissance(int x,int y)
{
int i,p=1;
for(i=1;i<=y;i++) p=x*p;
return(p);
}
void main()
{
int a,b,res;
printf("\nENTRER A: ");scanf("%d",&a);
printf("\nENTRER B: ");scanf("%d",&b);
res = puissance(a,b);
printf("\A PUISS B = %d\n",res);
printf("\n POUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}

Exercice 4:

 #include <stdio.h>
#include <conio.h>
#include "c:\bc5\courc_C\teach_c\chap7\chap7.h"   /* fichier d'en-tete */
void affiche(int *tab)
{
int i;
for(i=0;i<20;i++)      if((i+1)%5==0) printf("%3d\n",tab[i]);      else printf("%3d ",tab[i]);
printf("\n\n");
}
void main()
{
int tab1[20]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
int tab2[20]={-19,18,-17,16,-15,14,-13,12,-11,10,-9,8,-7,6,-5,4,-3,2,-1,0};
affiche(tab1);
affiche(tab2);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}
Exercice 5:

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <alloc.h>
#include <conio.h>
#include "c:\bc5\courc_C\teach_c\chap7\chap7.h"   /* fichier d'en-tete */
float conversion(char *couleur)
{
float x=10;
couleur = strupr(couleur);  /* convertit en majuscules */
/* stricmp permet d'eviter l'utilisation de strupr */
if (strcmp("NOIR",couleur)==0) x=0;
if (strcmp("MARRON",couleur)==0) x=1;
if (strcmp("ROUGE",couleur)==0) x=2;
if (strcmp("ORANGE",couleur)==0) x=3;
if (strcmp("JAUNE",couleur)==0) x=4;
if (strcmp("VERT",couleur)==0) x=5;
if (strcmp("BLEU",couleur)==0) x=6;
return(x); /* x permet d'ajouter ‚ventuellement un contr“le d'erreur */
}

void main()
{
float r,c1,c2,c3;
char *coul1,*coul2,*coul3;
coul1 = (char*)malloc(8);
coul2 = (char*)malloc(8);
coul3 = (char*)malloc(8);
printf("\nENTRER LES 3 COULEURS DE LA RESISTANCE:\n");
printf("COULEUR1: ");gets(coul1);
printf("COULEUR2: ");gets(coul2);
printf("COULEUR3: ");gets(coul3);
c1=conversion(coul1);
c2=conversion(coul2);
c3=conversion(coul3);
r = (c1*10 + c2)*pow(10,c3);
if(r<1000) printf("\nVALEUR DE R: %4.0f KOHM\n",r);
if((r>=1000)&&(r<999999))             
      {            
      r=r/1000;            
      printf("\nVALEUR DE R: %7.0f KOHM\n",r);             
      }
if(r>=999999)            
     {            
     r=r/1e6;             
     printf("\nVALEUR DE R: %4.0f MOHM\n",r);            
     }
free(coul1);
free(coul2);
free(coul3);
printf("\nPOUR SORTIR FRAPPER UNE TOUCHE ");
getch();
}

Exercice 6:

#include <stdio.h>
#include <math.h>
#include <conio.h>
#include "c:\bc5\courc_C\teach_c\chap7\chap7.h"   /* fichier d'en-tete */
void saisie(float *aa,float *bb,float *cc)
{
printf("\nENTRER A: ");scanf("%f",aa);
printf("\nENTRER B: ");scanf("%f",bb);
printf("\nENTRER C: ");scanf("%f",cc);
printf("\n");
}
void calcul(float aa,float bb,float cc)
{
float delta,x1,x2;
printf("\nA= %f B= %f C=%f\n",aa,bb,cc);
delta = bb*bb-4*cc*aa;
printf("\nDELTA = %f\n",delta);
if (delta<0) printf("\nPAS DE SOLUTION");
if (delta == 0)
{
x1=-(bb/aa/2);
printf("\UNE SOLUTION: X= %f\n",x1);
}
if (delta > 0)
{
x1=(-bb+sqrt(delta))/2/aa;
x2=(-bb-sqrt(delta))/2/aa;
printf("\DEUX SOLUTIONS: X1 = %f  X2 = %f\n",x1,x2);
}
}
void main()
{
float a,b,c;
saisie(&a,&b,&c);
calcul(a,b,c);
printf("\n\nPOUR SORTIR FRAPPER UNE TOUCHE ");
getch();
}
Exercice 7:

#include <stdio.h>
#include <conio.h>
#include "c:\bc5\courc_C\teach_c\chap7\chap7.h"   /* fichier d'en-tete */
int *adr_deb,*adr_fin;
void saisie(int *tx)
{
int i=0;
printf("SAISIE DES NOMBRES SEPARES PAR RETURN (dernier =13)\n");
do
{
printf("NOMBRE: ");
scanf("%d",tx+i);
i++;
}
while(*(tx-1+i)!=13);
adr_fin= (int*)(tx+i-1);
adr_deb=(int*)tx;
}
void main()
{
int tab[20];
saisie(tab);
printf("\nADR_DEB = %p  ADR_FIN = %p\n",adr_deb,adr_fin);
printf("\nPOUR SORTIR FRAPPER UNE TOUCHE ");
getch();
}

Exercice 8:

#include <stdio.h>
#include <conio.h>
#include "c:\bc5\courc_C\teach_c\chap7\chap7.h"   /* fichier d'en-tete */
int *adr_deb,*adr_fin;
void saisie(int *tx)
{
int i=0;
printf("SAISIE DES NOMBRES SEPARES PAR RETURN (dernier =13)\n");
do
{
printf("NOMBRE: ");
scanf("%d",tx+i);
i++;
}
while(*(tx-1+i)!=13);
adr_fin= (int*)(tx+i-1);
adr_deb= (int*)tx;
}
void affiche(int *tx)
{
int i;
printf("\n");
for(i=0;(tx+i)!=(adr_fin+1);i++)
if((i+1)%5==0)printf("%5d\n",tx[i]);
else printf("%5d  ",tx[i]);
}
void main()
{
int tab[20];
saisie(tab);
affiche(tab);
printf("\n\nADR_DEB = %p  ADR_FIN = %p\n",adr_deb,adr_fin);
printf("\nPOUR SORTIR FRAPPER UNE TOUCHE ");
getch();
}

0 commentaires:

Enregistrer un commentaire

Share

Twitter Delicious Facebook Digg Stumbleupon Favorites

 

IP