Najib Tounsi
NB. On pourra se référer avec profit au cours Langage
C
#include <stdio.h>
main() {
printf("Hello,world\n");
}
Indication : Si vous travaillez avec un environnement comme Dev-C++, il se peut que vous ayez besoin de rajouter la ligne :
#include <conio.h>
en début du fichier source et l'instruction getch(); en fin de programme.
#include <stdio.h>- Améliorer le programme pour inviter l'utilisateur à rentrer une donnée, température en fahrenait. (Rajouter printf("Rentrer une temperature en fahrenait: ");)
/* Convertir une température fahrenait en Celcius */
main() {
int fahrenait;
float celcius;
printf("Rentrer une temperature en fahrenait: ");
scanf("%d", &fahrenait);
celcius = (5.0/9)*(fahrenait-32);
printf("En Celcius = %f\n", celcius);
}
- Améliorer et écrire : Fahrenait 100 donne 37.8 en celcius
Décomposer une somme d' argent en monnaies de 1, 2, 5 et 10 Dh.
Soit S la somme à décomposer. Il existe q et r
entiers tels que: S = b * q + r. Si
q = 10, b est le nombre de pièces de 10Dh et r le
reste de la monnaie. On décompose alors r en pièces de 5 Dh
suivant le même principe, et ainsi de suite.
Utiliser les opérateurs C/ et %, qui donnent respectivement le quotient entier et le reste de deux entiers.
NB. Dans ce programme, même si r devient nulle on continue les opérations. Il faut utiliser une instruction if (voir plus bas)./* Decomposer une somme d' argent en monnaies de 1, 2, 5 et 10 Dh */
#include<stdio.h>
main(){
int somme; /* la sommme decomposer */
int p10, p5, p2, p1; /* nombres de pieces de 10, 5, 2 et 1 */
int reste; /* variable de travail */
printf("Rentrer la somme: "); scanf("%d",&somme);
p10 = somme / 10;
reste = somme % 10;
p5 = reste / 5;
reste = reste % 5;
p2 = reste / 2;
reste = reste % 2;
p1 = reste;
printf("%d pcs de 10, %d pcs de 5, %d pcs de 2 et %d pcs de 1 Dh\n", p10, p5,p2, p1);
}
Données: Taxe 10%, Prix unitaire, ancien et nouvel index de consommation.
Résultat recherché: Prix total TTC de la facture.
- Exercice : introduire deux variables intermédiaires consommation et prixHorsTaxe.#include<stdio.h>
main(){
int ancien, nouveau;
const int taxe = 10; /* taxe 10% */
float prixTotal;
const float prixUnitaire = 0.6;
printf("Rentrer ancien index: "); scanf("%d",&ancien);
printf("Rentrer nouvel index"); scanf("%d",&nouveau);
prixTotal= (nouveau - ancien)*prixUnitaire * (1 + taxe/100.);
printf("Total a payer: %7.2f\n", prixTotal);
}
Ancien index: 100
Nouvel index: 200
Consommation: 100
PrixHT : 100 x 0.6 = 60
TVA 10% : 6
Total a payer: 66 Dh.
Maintenant, la première tranche de 100 kwh est facturée 0.6 Dh l'unité, et au dela, 0.9 Dh. On rajoute les instructions
...
consommation = nouveau - ancien;
if (consommation <= 100)
prixHorsTaxe= consommation * prixUnitaire1 ;
else
prixHorsTaxe= 100*prixUnitaire1 + (consommation-100)*prixUnitaire2 ;
prixTotal= prixHorsTaxe * (1 + taxe/100.);
...
Maintenant, on fait N facture. N défini par
#define N 10en début de fichier.
- Utiliser for (i=0; i<N; i++) { ... } pour répéter N fois le traitement entre accolades.
- Exercice : La table de multiplication des nombres 2 à 9 (Boucles imbriquées)/* Table de multiplication de N donne'. N lu dans une variable n */
#include <stdio.h>
main(){
int i,n;
printf("Rentrer N: "); scanf("%d",&n);
for (i=1; i<11;i++)
printf("%2d X %d = %2d \n", i, n, i*n);
}
Exécuter avec: a.out | moremain(){
int i,n;
for (n=2; n<10; n++) {
for (i=1; i<11;i++)
printf("%2d X %d = %2d \n", i, n, i*n);
printf("\n");
}
}
On n'en connaît pas le nombre, mais la dernière lecture est un index négatif. (Utiliser while)
9) L'ordinateur choisit un nombre entre 1 et 100. Vous essayer de le deviner. L'ordinateur peut vous dire si votre choix est en dessus ou en dessous du code caché.
#include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { int x, code; srand(getpid()); /* initialisation des nombres aléatoires */ code = rand() % 100; /* Choix aléatoire entre 1 et 100 */ do { printf("Devinez :\t"); scanf("%d", &x); if (x < code) printf("Trop petit\n"); else if (x > code) printf("Trop Grand\n"); else printf("GAGNE\n"); } while (x != code); }
- Sous Unix, compilateur C de base
- Compiler avec: cc prog.c.
- srand(n) initialise la séquence des
nombres aléatoires. getpid() est une fonction qui retourne le
numéro d'ordre attribué par le système au programme qui s'exécute. Il est
nouveau à chaque exécution.
- Avec DevC++, compilateur gcc
par exemple,
remplacer par le programme suivant (l'initialisation de la fonction
aléatoire est différente)
#include <conio.h> #include <stdlib.h> #include <time.h> #include <stdio.h> main() { int x, code; /* initialisation des nombres aliatoires */ time_t s; time(&s); srand((unsigned int) s); code = rand() % 100; /* Choix aliatoire entre 1 et 100 */ printf("%d\n\n",code); do { printf("Devinez :\t"); scanf("%d", &x); if (x < code) printf("Trop petit\n"); else if (x > code) printf("Trop Grand\n"); else printf("GAGNE\n"); } while (x != code); getch(); }
- Modifier ce programme, avec N donné lu par scanf(). Attention, prévoir le cas N = 0 avant de diviser./*
* Programmes qui calcule la moyenne de N temperatures
* lues sur le clavier.
*/
#include <stdio.h>
#define N 12
main()
{
int i;
float temp, moyenne, sigma = 0;
for (i = 0; i < N; i++) {
printf("rentrer une temperature:\t");
scanf("%f", &temp);
sigma += temp;
}
moyenne = sigma / N;
printf("\n La moyenne est :\t%f\n", moyenne);
}
- Calculer et imprimer aussi le nombre d'itérations#include <stdio.h>
#include <math.h>
/*
* Calcule de racine de A par le nieme terme d'une suite.
*/
main()
{
double u, a; /* terme de la suite et a */
float eps;
u = 1; /* terme initial */
printf("rentrer a :\t");
scanf("%lf", &a);
printf("rentrer epsilon :\t");
scanf("%f", &eps);
printf("%f %f\n\n", a, eps);
while (fabs (u*u -a) > eps)
u = (1/2.)*(u + a/u);
printf("Racine(%g) = %g\n",a, u);
}
Par la série s = 1 + 1/1 + 1/2 + 1/3! + ... + 1/n! . On calcule le i-ème terme u = 1/i! de la suite et on le rajoute à la somme s = s + u précédemment calculée. On calcule jusqu'à u <epsilon.
- Calculer exp(x), avec x donné. On change par:#define EPS 0.00001
#include <stdio.h>
/*
* Calcule de e=exp(1) par devpt en serie
*/
main(){
double u, s;
int i;
u = s = i = 1;
while (u > EPS) {
u /= i;
s += u;
i++;
}
printf("exp(1) = %f\n", s);
}
printf("rentrer x : ");
scanf("%lf", &x);
while (u > EPS) {
u = u*x/i;
s += u;
i++;
}
Calculer la température qui s'écarte le plus de la moyenne.
/*
* Programmes qui calcule la moyenne de 12 temperatures
* lues sur le clavier, et on cherche la temperature qui s'ecarte le
* plus de la moyenne
* Usage d'un tableau pour garder les valeurs lues
*/
#include <stdio.h>
#include <math.h>
#define N 12
main()
{
int i, j, max;
float temp[N], moyenne, sigma = 0, ecart;
/* Calcule de la moyenne */
for (i = 0; i < N; i++) {
printf("rentrer une temperature:\t");
scanf("%f", &temp[i]);
sigma += temp[i];
}
moyenne = sigma / N;
printf("\n La moyenne est :\t%f\n", moyenne);
/* Calcule de l' ecart maximum. */
max = -1;
j = 0;
for (i = 0; i < N; i++) {
ecart = fabs(temp[i] - moyenne);
if (ecart > max) { /* temp[i] s' ecarte encore plus */
j = i;
max = ecart;
}
}
printf("\n Ecart maximum pour temp[%d]:\t%f\n", j, temp[j]);
}
Version.0 avec booléen trouve.
#include<stdio.h>
#define N 10
/*
* Programme de recherche d'un element x dans
* une table tab
* Version 0 (avec trouve)
*/
int tab[N] = {3, 5, 2, 89, 54, 1, 0, -4, 2, 55};
main()
{
int i, x, trouve;
printf("Element a chercher:\t");
scanf("%d", &x);
i = 0;
trouve = 0;
while (i < N && !trouve)
if (tab[i] == x)
trouve = 1;
else
i++;
if (trouve)
printf("Au rang %d\n", i);
else
printf("N'existe pas \n");
}
Version.1 avec break. (C'est aussi de la programmation structurée!.)
- Exercice: Utiliser for au lieu de while.#include<stdio.h>
#define N 10
/*
* Programme de recherche d'un element x dans
* une table tab
* Version-1 (avec break)
*/
int tab[N] =
{3, 5, 2, 89, 54, 1, 0, -4, 2, 55};
main()
{
int i, x;
printf("Element a chercher:\t");
scanf("%d", &x);
i = 0;
while (i < N )
if (tab[i] == x)
break;
else
i++;
if (i<N)
printf("Au rang %d\n", i);
else
printf("N'existe pas \n");
}
#include <stdlib.h> /* pour les fonctions rand et srand */ #include <stdio.h> #include <time.h> /* fonction time pour initialiser srand */
#define N 7 /* grille de N numéros*/ int tab[N]; main(){ int i, j, x; srand (time(0)); /* Initier la liste des pseudo-aléatoires */ i = 0; do { /* On tire au hasard et remplit le 1er No */ x = (rand() % 49) + 1; /* nombre aléatoire entre 1 et 49 */ /* table remplie jusqu'a i-1. On verifie si x n'y est pas */ for (j = i - 1; j >= 0; j--) if (tab[j] == x) /* nombre deja tire */ break; if (j < 0) tab[i++] = x; } while (i <= N); /* On sort le resultat */ for (i = 0; i < N; printf("%4d ", tab[i++])) ; printf("\n"); }
/*
* Programme qui calcule le quotient et le reste
* de deux entiers donne's
*/
#include <stdio.h>
main()
{
int a, b, q, r;
printf("Rentrer a: ");
scanf("%d", &a);
printf("Rentrer b: ");
scanf("%d", &b);
if (b == 0)
printf("B est nulle\n");
else {
r = a;
q = 0;
while (r > b) {
q++;
r -= b;
}
printf("Quotient = %d Reste = %d\n", q, r);
}
}
pgcd (int a, int b){
/* PGCD de a b , par EUCLID. Version iterative*/
int r;
r = b;
while (r != 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
- Lire la chaîne de chiffre comme donnée (scanf ("%s", chif); )./*
* Programme qui retrouve la valeur d un nombre
* a partir de sa suite de chiffres, codes en ASCII
* La suite de chiffre se termine par \Ø
*/
#include <stdio.h>
#include <ctype.h>
char chif[10] = "12345\0"; /* Jeu d essai */
main(){
int val = 0; /* Valeur cherchee */
int i = 0;
while (chif[i] != '\0') {
val = val * 10 + (chif[i] - 48); /* Decalage 48 du a representation ASCII */
i++;
}
printf("Valeur: %d test : %d\n",val, val+6);
}
/*
* Programme qui retrouve la suite de chiffres
* d'un nombre a partir de sa valeur
* La suite de chiffre se termine par \0
*/
#include <stdio.h>
#include <ctype.h>
char chif[10]; /* init \0 */
main() {
int n, i = 0;
printf("Rentrer une valeur: ");
scanf("%d", &n);
do {
chif[i++] = n % 10 + 48;
n /= 10;
} while (n != 0);
for (; i >= 0; i--)
printf("%c", chif[i]);
printf("\n");
}
/*
* Programme qui lit votre nom, et vous dit Bonjour
*/
#include <stdio.h>
main(){
char nom[20];
printf("Rentrer votre nom: ");
scanf("%s",nom); /* Sans & */
printf("\nBonjour %s, Comment ca va ?\n", nom);
}
- Convertir les lettres minuscules en majuscule et vice versa. Utiliser la fonction isupper(x)/*
* Programme qui convertit une chaine en majuscule
*/
#define N 20
#include <stdio.h>
#include <string.h>
main(){
char chaine[N];
int i;
printf("Rentrer la chaine: ");
scanf("%s",chaine);
for(i=0; i<N; i++)
if (islower(chaine[i]) )
chaine[i] -= 32;
printf("\n%s\n", chaine);
}
/*
* Programme qui fait trois tentatives de lecture
* d'une chaine donnee.
*/
#include <stdio.h>
#include <string.h>
#define N 3 /* nb tentatives */
main()
{
char code[20] = "ginfo"; /* code a lire */
char s[10];
int i = 0;
do {
printf("Rentrer code: ");
scanf("%s", s);
if (strcmp(code, s) == 0)
break;
printf("code errone!\n");
i++;
} while (i < N);
if (i < N)
printf("Bravo\n");
else
printf("LOCK\n");
}
On a deux listes triées foot et cine contenant les matricules des élèves inscrits aux clubs football et cinéma. Imprimer le matricule de chaque élèves en indiquant s'il est inscrit au club foot seulement, ciné seulement ou aux deux clubs.
#include <stdio.h>
#define N 20
int c[N] ={
2, 5, 7, 10, 11, 12, 13, 15, -1};
/* Liste des inscrits au Foot */
int f[N] ={
2, 3, 6, 9, 12, 13, 16, 18, 20, -1};
/* Liste des inscrits au Cine */
main()
{
int i = 0, j = 0;
while ((f[i] != -1) && (c[j] != -1))
if (f[i] < c[j]) {
printf("%d %d Inscrit en Foot \n", i, f[i]);
i++;
}
else if (f[i] > c[j]) {
printf("%d %d Inscrit en Cine\n", j, c[j]);
j++;
}
else { /* f[i] == c[j] */
printf("%d %d %d Inscrit dans les Deux\n", i, j, f[i]);
i++;
j++;
}
if (c[j] == -1) /* On termine avec Foot */
while (f[i] != -1) {
printf("%d %d Inscrit en Foot \n", i, f[i]);
i++;
}
else if (f[i] == -1) /* On termine avec Cine*/
while (c[j] != -1) {
printf("%d %d Inscrit en Cine \n", j, c[j]);
j++;
}
}
- Maintenant on voudrait imprimer aussi le matricule des élèves inscrits
dans aucun club. Modifier le programme, sachant que les élèves sont en
nombre de N immatriculés de 1 à N.
24) A suivre#include <stdio.h>
#include <string.h>
#define N 20
char s1[N], s2[N];
main(){
int i = 0, l, l1, l2;
printf("Rentrer mot1: ");
scanf("%s", s1);
printf("Rentrer mot2: ");
scanf("%s", s2);
printf("%s %s\n", s1, s2);
l1 = strlen(s1);
l2 = strlen(s2);
(l1 < l2) ? (l = l1) : (l = l2);
/* l est la longueur minimum */
while (s1[i] == s2[i] && i < l)
i++;
if (i < l) /* on compare ieme car de s1 et s2 */
if (s1[i] > s2[i])
printf("s1 > s2\n");
else
printf("s1 < s2\n");
else
/* l'un des mots est termine */
if (l1 < l2)
printf("s1 < s2\n");
else if (l1 == l2)
printf("s1 = s2\n");
else
printf("s1 > s2\n");
}