|
Corrigé de la séance d'exercices 6, Programmation I |
|
Sciences et Technologies du Vivant, Semestre 1 |
#include <iostream>
#include <time.h>
using namespace std;
int main(int argc, char **argv) {
const int nb_elements = 15;
int tableau[nb_elements];
int n, pos;
srand(time(0));
tableau[0] = rand() % 50;
for (int i=1; i<nb_elements-1; i++)
tableau[i] = tableau[i-1] + (rand() % 20);
tableau[nb_elements-1] = 0;
cout << "Tableau initial:" << endl;
for (int i=0; i<nb_elements; i++)
cout << tableau[i] << " ";
cout << endl;
cout << "Entrez un entier a inserer dans le tableau: ";
cin >> n;
/* calcul de la position a laquelle on va
* inserer le nouvel element */
pos = 0;
while (tableau[pos] < n)
pos++;
// decalage des elements vers la droite
for (int i=nb_elements-1; i>pos; i--)
tableau[i] = tableau[i-1];
// insertion du nouvel element
tableau[pos] = n;
cout << endl << "Tableau avec le nouvel element:" << endl;
for (int i=0; i<nb_elements; i++)
cout << tableau[i] << " ";
cout << endl;
return 0;
}
float min2(float a, float b) {
if (a < b)
return a;
else
return b;
}
- Pour calculer le minimum de 3 nombres, on peut, par exemple,
calculer d'abord le minimum des 2 premiers, et ensuite calculer le
minimum de ce résultat et du dernier nombre. Comme on a déjà
écrit une fonction retournant le minimum de 2 nombres au point
précédent, on peut donc la réutiliser.
int min3(int a, int b, int c) {
return int(min2(min2(a, b), c));
}
- Pour arrondir un nombre à 2 décimales, il suffit de le
multiplier par 100, le convertir en
int, le reconvertir en
float et le diviser par 100, comme nous l'avions vu à la
série 2. Lorsqu'on divise 2 nombres, si l'un d'entre eux est un
float, le compilateur effectuera une division
réelle. Dans le corrigé, on écrit la constante 100
100.0 afin que le compilateur la considère comme une
constante float, ce qui nous évite de faire la conversion
explicite.
float arrondi(float a) {
return int(a * 100) / 100.0;
}
- Il n'y pas d'autre manière que de fournir un texte particulier
pour chaque nombre. La fonction peut aussi
s'écrire avec des
ifs.
void traduction(int n) {
switch (n) {
case 0:
cout << "zero";
break;
case 1:
cout << "un";
break;
case 2:
cout << "deux";
break;
case 3:
cout << "trois";
break;
case 4:
cout << "quatre";
break;
case 5:
cout << "cinq";
break;
case 6:
cout << "six";
break;
}
}
- Comme pour l'exercice 1 de la série précédente, tout
l'intérêt de l'exercice réside dans la recherche de la
relation entre le numéro de ligne et le nombre d'espaces et
d'étoiles. Si
est le numéro de ligne, commençant à 0,
et lignes le nombre de lignes, le nombre d'espaces est
donné par lignes-i-1 et le nombre d'étoiles par
2*i+1.
void dessine_etage(int lignes)
{
for (int i = 0; i < lignes; i++)
{
for (int j = 0; j < lignes - i - 1; j++)
cout << " ";
for (int j = 0; j < i * 2 + 1; j++)
cout << "*";
cout << endl;
}
}
- Pour obtenir le même dessin que sur l'énoncé, il faut
décaler les étages du sapin en ajoutant des espaces
suppléntaires. Une solution consiste à légèrement modifier
la fonction
dessine_etage en lui ajoutant un paramètre
spécifiant le nombre d'espaces supplémentaires.
#include <iostream>
using namespace std;
void dessine_etage(int lignes, int espaces)
{
for (int i = 0; i < lignes; i++) {
for (int j = 0; j < espaces + lignes - i - 1; j++)
cout << " ";
for (int j = 0; j < i * 2 + 1; j++)
cout << "*";
cout << endl;
}
}
int main(int argc, char **argv) {
dessine_etage(2, 2);
dessine_etage(3, 1);
dessine_etage(4, 0);
dessine_etage(1, 3);
return 0;
}
#include <iostream>
using namespace std;
// calcule a^b
int puissance(int a, int b) {
int resultat = 1;
for (int i=0; i<b; i++)
resultat *= a;
return resultat;
}
// calcule le log entier de n en base 'base'
int log_entier(int n, int base) {
int resultat = 0;
while (n > 0) {
resultat++;
n /= base;
}
return resultat;
}
// converti 'original', de taille 'bits' bits de la
// base de depart a la base d'arrivee
int conversion(int original, int bits,
int base_depart, int base_arrivee) {
int converti = 0;
int puissance_depart;
int puissance_arrivee;
for (int i=bits-1; i>=0; i--) {
puissance_depart = puissance(base_depart, i);
puissance_arrivee = puissance(base_arrivee, i);
if (original / puissance_arrivee > 0) {
original -= puissance_arrivee;
converti += puissance_depart;
}
}
return converti;
}
int main(int argc, char **argv) {
const int max_bits = 10;
int decimal, binaire, original, bits;
cout << "Entrez un nombre entier: ";
cin >> decimal;
// calcul du nombre de bits de 'decimal'
bits = log_entier(decimal, 2);
cout << decimal << " a " << bits << " bits." << endl;
if (bits > 10) {
cout << "Nous ne pouvons pas convertir de nombres plus grands que "
<< max_bits << " bits." << endl;
return 0;
}
// conversion en binaire
binaire = conversion(decimal, bits, 10, 2);
cout << decimal << " vaut '" << binaire << "' en binaire." << endl;
// calcul du nombre de bits
bits = log_entier(binaire, 10);
cout << decimal << " a " << bits << " bits." << endl;
// conversion de binaire en decimal
original = conversion(binaire, bits, 2, 10);
cout << "Nombre original: " << original << endl;
return 0;
}
#include <iostream>
using namespace std;
void dessine_etage(int lignes, int espaces, int sommet) {
for (int i=sommet; i<lignes; i++) {
for (int j=0; j<espaces+lignes-i-1; j++)
cout << " ";
for (int j=0; j<i*2+1; j++)
cout << "*";
cout << endl;
}
}
int main(int argc, char **argv) {
dessine_etage(3, 2, 0);
dessine_etage(4, 1, 1);
dessine_etage(5, 0, 2);
cout << " |||" << endl;
return 0;
}
Retour