Universit´e Cadi Ayyad Ann´ee 2019−2020
Facult´e polydisciplinaire Langage C et Matlab
Safi SMC (S4)
S´ erie 3
Exercice 1
1◦) ´Ecrire un programme qui lit deux variables au clavier et les affiche dans l’ordre croissant, quitte `a les modifier.
2◦) ´Ecrire un programme qui lit trois variables au clavier et affiche le maximum des trois.
3◦) Soit une ´equation du second degr´e ax2+bx+c= 0. ´Ecrire un programme qui lit a, b, c au clavier et affiche les ´eventuelles solutions.
4◦) ´Ecrire un programme qui lit deux nombres entiers a et b et donne le choix `a l’utilisateur :
• de savoir si la sommea+best paire ;
• de savoir si le produita·best pair ;
• de connaˆıtre le signe de la somme a+b ;
• de connaˆıtre le signe du produita·b.
Exercice 2
Ecrire un programme qui lit N nombres entiers au clavier et qui affiche leur somme, leur produit et leur moyenne. Choisissez un type appropri´e pour les valeurs `a afficher. Le nombre N est `a entrer au clavier. R´esolvez ce probl`eme,
a) en utilisant while, b) en utilisant do - while, c) en utilisant for.
d) Laquelle des trois variantes est la plus naturelle pour ce probl`eme?
Exercice 3
Ecrire un programme qui calculez la factorielleN! = 1·2·3· · ·(N−1)·N d’un entier naturel N en respectant que 0!=1. Le nombre N est `a entrer au clavier.
a) Utilisez while, b) Utilisez for.
Exercice 4
1◦) ´Ecrire un programme qui calcule parXN de deux entiers naturels X et N entr´es au clavier.
2◦) ´Ecrire un programme qui calcule la somme des N premiers termes de la s´erie harmonique : 1 +1
2 +1
3 +· · ·+ 1 N Le nombre N est `a entrer au clavier.
3◦) ´Ecrire un programme qui calcule la somme :
1 + 23+ 33+·+N3 Le nombre N est `a entrer au clavier.
4◦) Une suite (un)n∈Nest d´efinie par r´ecurrence : u0 = 2 et un+1= 2·√
un+ 1−1 pourn≥0
Ecrire un programme pour calculer´ un, le nombre n ´etant saisi au clavier.
Exercice 5
1◦) ´Ecrire un programme qui permet d’afficher `a l’´ecran un triangle isoc`ele form´e d’´etoiles de N lignes (N est fourni au clavier). Par exemple pour N=8 on affichera:
2◦) ´Ecrire un programme qui permet d’afficher la table de multiplication pour N variant de 1 `a 10 :
Correction
Rappel : Le corrig´ e n’a d’int´ erˆ et que si l’exercice a ´ et´ e cherch´ e.
Exercice 1 1◦)
#include<stdio.h>
main() {
int n1, n2, temp; printf(”Entrez deux nombres entiers : ”);
scanf(”%d %d”, &n1, &n2);
if (n1>n2) {
temp = n1;
n1 = n2;
n2 = temp;
}
printf(”Plus petit : %d ; plus grand : %d\n”, n1, n2);
} 2◦)
#include<stdio.h>
main() {
float a, b, c, max;
printf(”Entrez trois nombres r´eels : ”);
scanf(”%f %f %f”, &a, &b, &c);
if (a<b) max = b;
else max = a;
if (max<c) max = c;
printf(”Le maximum des trois nombres est %f\n”, max);
} 3◦)
#include<stdio.h>
main() {
float a, b, c, delta, racine1, racine2;
printf(”Entrez a, b et c (ax2+bx+c) : ”);
scanf(”%f %f %f”, &a, &b, &c);
delta = b * b - 4 * a * c;
if (delta == 0.0)
{racine1 = -b / (2 * a);
printf(”Ce polynˆome poss`ede une unique racine x = %f\n”, racine1);
}
if (delta>0.0) {
racine1 = (−b−sqrt(delta))/(2∗a);
racine2 = (−b+sqrt(delta))/(2∗a);
printf(”Ce polynˆome poss`ede deux racines x1 = %f et x2 = %f\n”, racine1, racine2);
}
if (delta<0.0)
printf(”Ce polynˆome ne poss`ede pas de racine r´eelle\n”);
}
4◦)
#include<stdio.h>
main() { int a, b;
char choix;
printf(”Entrez deux nombres entiers : ”);
scanf(”%d %d”, &a, &b);
printf(”Tapez\n”);
printf(”1 pour savoir si la somme est paire\n”);
printf(”2 pour savoir si le produit est pair\n”);
printf(”3 pour connaˆıtre le signe de la somme\n”);
printf(”4 pour connaˆıtre le signe du produit\n”);
getchar();
choix = (char) getchar();
switch (choix) {
case ’1’:
if ((a + b) % 2 == 0)
printf(”La somme est paire\n”);
else
printf(”La somme est impaire\n”);
break;
case ’2’:
if ((a * b) % 2 == 0)
printf(”Le produit est pair\n”);
else
printf(”Le produit est impair\n”);
break;
case ’3’:
if (a + b >= 0)
printf(”La somme est positive\n”);
else
printf(”La somme est strictement n´egative\n”);
break;
case ’4’:
if (a * b>= 0)
printf(”Le produit est positif\n”);
else
printf(”Le produit est strictement n´egatif\n”);
break;
default:
printf(”Choix non conforme...\n”);
} }
Exercice 2
a) en utilisant while,
#include<stdio.h>
main() {
int N; // nombre de donn´ees int NOMB; // nombre courant int I; // compteur
long SOM; // la somme des nombres entr´es
double PROD; // le produit des nombres entr´es printf(”Nombre de donn´ees : ”);
scanf(”%d”, &N);
SOM=0;
PROD=1;
I=1;
while(I<=N)
{ printf(”%d. nombre : ”, I);
scanf(”%d”, &NOMB);
SOM += NOMB;
PROD *= NOMB;
I++;
}
printf(”La somme des %d nombres est %ld\n”, N, SOM);
printf(”Le produit des %d nombres est %.0f\n”, N, PROD);
printf(”La moyenne des %d nombres est %.4f\n”, N, (float)SOM/N);
}
b) en utilisant do - while,
#include<stdio.h>
main() {
int N; // nombre de donn´ees int NOMB; // nombre courant int I; // compteur
long SOM; // la somme des nombres entr´es double PROD; // le produit des nombres entr´es printf(”Nombre de donn´ees : ”);
scanf(”%d”, &N);
SOM=0;
PROD=1;
I=1;
do
{printf(”%d. nombre : ”, I);
scanf(”%d”, &NOMB);
SOM += NOMB;
PROD *= NOMB;
I++;
}
while(I<=N);
printf(”La somme des %d nombres est %ld\n”, N, SOM);
printf(”Le produit des %d nombres est %.0f\n”, N, PROD);
printf(”La moyenne des %d nombres est %.4f\n”, N, (float)SOM/N);
}
c) en utilisant for: remplacez le bloc de traitement do - while de la question pr´ec´edente par : for (I=1 ; I<=N ; I++)
{
printf(”%d. nombre : ”, I);
scanf(”%d”, &NOMB);
SOM += NOMB;
PROD *= NOMB;
}
d) Laquelle des trois variantes est la plus naturelle pour ce probl`eme?
La structure for est la plus compacte et celle qui exprime le mieux l’id´ee de l’algorithme. D’autre part, elle permet d’int´egrer tr`es confortablement l’initialisation et l’incr´ementation des variables dans la structure.
Exercice 3
#include<stdio.h>
main() {
int N; /* La donn´ee */
int I; /* Le compteur */
double FACT;
/* La factorielle N! - Type double */
/* cause de la grandeur du r´esultat. */
do {
printf(”Entrez un entier naturel : ”);
scanf(”%d”, &N);
}
while (N<0);
/* question a */
/* Pour N=0, le r´esultat sera automatiquement 0!=1 */
I=1;
FACT=1;
while (I<=N) {
FACT∗=I;
I++;
}
/* question b */
/* Si on veut utiliser la boucle for: */
/* Pour N=0, le r´esultat sera automatiquement 0!=1 */
/*
for (I=1 ; I<=N ; I++) FACT∗=I;
*/
printf (”%d! = %.0f\n”, N, FACT);
}
Exercice 4 1◦)
#include<stdio.h>
main() {
int X, N; /* Les donn´ees */
int I; /* Le compteur */
double RESU; /* Type double `a cause de la */
/* grandeur du r´esultat. */
do {
printf(”Entrez l’entier naturel X : ”);
scanf(”%d”, &X);
}
while (X<0);
do {
printf(”Entrez l’exposant N : ”);
scanf(”%d”, &N);
}
while (N<0);
/* Pour N=0, le r´esultat sera automatiquement Xˆ0=1 */
RESU=1.0;
for ( I=1 ; I<=N ; I++) RESU*=X;
/* Attention: Pour X=0 et N=0 , 0ˆ0 n’est pas d´efini */
if (N==0 && X==0)
printf(”z´ero exposant z´ero n’est pas d´efini !\n”);
else
printf(”R´esultat : %dˆ%d = %.0f\n”, X, N, RESU);
} 2◦)
#include<stdio.h>
main() {
int N; /* nombre de termes `a calculer */
int I; /* compteur pour la boucle */
float SOM; /* Type float `a cause de la pr´ecision du r´esultat. */
do {
printf (”Nombre de termes: ”);
scanf (”%d”, &N);
}
while (N<1);
SOM=0.0;
for (I=1 ; I<=N ; I++) SOM += (float)1/I;
printf(”La somme des %d premiers termes est %f \n”, N, SOM);
} 3◦)
#include<stdio.h>
main() {
int s = 0;
int n;
printf(”Entrez l’entier naturel n : ”);
scanf(”%d”, &n);
while (n >0) {
s = s + n * n * n;
n = n - 1;
}
printf(”La somme des termes positives<=nˆ3 est %d\n”, s);
}
4◦)
#include<stdio.h>
main() {
float u = 1.0;
int i;
printf(”Entrez l’entier naturel n : ”);
scanf(”%d”, &n);
for (i = 1; i <= n; i++) u = 2 * sqrt(u + 1) - 1;
printf(”Le terme de rang %d de la suite est ´egale `a %f”, n, u);
}
Exercice 5 1◦)
#include<stdio.h>
main() {
int LIG; /* nombre de lignes */
int L; /* compteur des lignes */
int ESP; /* nombre d’espaces */
int I; /* compteur des caract`eres */
do {
printf(”Nombres de lignes : ”);
scanf(”%d”, &LIG);
}
while (LIG<1|| LIG>20);
for (L=0 ; L<LIG ; L++) {
ESP = LIG-L-1;
for (I=0 ; I<ESP ; I++) printf(” ”);
for (I=0 ; I<2*L+1 ; I++) printf(”*”);
printf(”\n”);
} }
2◦)
#include<stdio.h>
main() {
const int MAX = 10; /* nombre de lignes et de colonnes */
int I; /* compteur des lignes */
int J; /* compteur des colonnes */
/* Affichage de l’en-tˆete */
printf(” X*Y I”);
for (J=0 ; J<=MAX ; J++) printf(”%4d”, J);
printf(”\n”);
printf(”− − − − −−”);
for (J=0 ; J<=MAX ; J++) printf(”− − −−”);
printf(”\n”);
/* Affichage du tableau */
for (I=0 ; I<=MAX ; I++) {
printf(”%3d I”, I);
for (J=0 ; J<=MAX ; J++) printf(”%4d”, I*J);
printf(”\n”);
} }