Série 4 - Moodle
Transcription
Série 4 - Moodle
Série 4 - correction Exercice 1 (niveau 1): Retrouver les erreurs. // faire include de stdio.h et stdlib.h #include <stdio.h> #include <stdlib.h> int main (void) { int x, y; // syntaxique printf ("Please enter two numbers : "); // syntaxique scanf ("%d %d", &x, &y); if (x == y) // semantique printf ("Both numbers are equal!\n"); if ((x < 0) && (y < 0)) // 2 erreurs syntaxiques printf ("Both numbers are negative!\n"); if (x < y) // semantique printf ("The second number is greater than the first!\n"); return EXIT_SUCCESS; } Exercise 4 (niveau 1): Creating / Reading / Manipulating / Writing Variable Size Multidimensional Arrays #include <stdio.h> #include <stdlib.h> int main(void) { int w = 0, h = 0; int x = 0, y = 0; int lambda = 0; printf("Please enter the scalar value:\n"); scanf("%d", &lambda); printf("Please enter the height and the width of the matrix:\n"); if(scanf("%d %d", &h, &w) != 2) { printf("Wrong input! Exiting..."); return EXIT_FAILURE; } int matrix[h][w]; printf("Please enter the content of the matrix\n"); for(y = 0; y < h; ++y) for(x = 0; x < w; ++x) { if(scanf("%d", &(matrix[y][x])) != 1) { printf("Wrong input! Exiting..."); return EXIT_FAILURE; } } printf("The resulting matrix is:\n"); } for(y = 0; y < h; ++y) { for(x = 0; x < w; ++x) { printf("%d ", lambda * matrix[y][x]); } printf("\n"); } return EXIT_SUCCESS; Exercice 5 (niveau 1): Ce nombre est-il premier? Le programme suivant indique si un nombre entier entré au clavier par l'utilisateur, par exemple x, est premier ou non. Remarque: il suffit de tester si x est divisible par 1 ... sqrt(x). Comme cela on peut réduire l’ordre de complexité du programme de O(x) à O(sqrt(x)). #include <stdio.h> #include <stdlib.h> #include <math.h> int main (void) { int valeur_courante = 0; int i = 0; int max; printf ("Entrez un nombre entier:"); scanf ("%d", &valeur_courante); // la borne max permet de réduire le coût calcul // de O(valeur_courante) à O(sqrt(valeur courante)) max = sqrt(valeur_courante); for (i = 2; i <= max ; ++i) { if (valeur_courante % i == 0) { printf ("%d n'est pas un nombre premier\n", valeur_courante); exit(0); } } printf ("%d est un nombre premier\n", valeur_courante); return EXIT_SUCCESS; } Exercice 6 (niveau 2): crible d'Eratosthène Un tableau de booléens à une seule entrée de taille n+1 est déclaré juste après la lecture de n. Le tableau est initialisé à vrai. Ensuite on trouve une double boucle suivie d’une boucle d’affichage sélectif. Dans la boucle d’indice i on parcourt tous les nombres de 2 à n. si le nombre i est premier alors on met à faux tous ses multiples jusqu’à n avec la boucle d’indice k. Cela explique pourquoi la boucle k commence à 2*i et progresse de i à chaque passage. #include <stdio.h> #include <stdlib.h> #include <stdbool.h> int main (void) { int n; printf ("nombre N: "); scanf("%u",&n); int premier[n+1]; int i, k ; premier[0]= premier[1] = false; for(i=2 ; i <= n ; i++) premier[i]= true; for(i=2 ; i <= n ; i++) if(premier[i]) for(k= 2*i; k <= n ; k += i) premier[k]= false; for(i=2 ; i <= n ; i++) if(premier[i]) printf ("Le nombre %d \t est premier\n", i); } return EXIT_SUCCESS; Exercice 7 (niveau 2 et 3): Boucles imbriquées: le triangle de Pascal Les programmes suivants calculent le triangle de Pascal. L'ordre de complexité du premier programme est O(N*N*N). La deuxième solution est plus rapide. Elle utilise la propriété de récurrence. L'ordre de complexité est O(N*N). Programme 1: #include <stdio.h> #include <stdlib.h> int main (void) { int n, p, i; for (n=0; n <= 10; n++) { for (p=0; p <= n; p++) { double v = 1; /* Calcule le coefficient binomial: */ for (i=0; i < p; i++) /* d’abord toutes les multiplications */ v *= n - i; for (i=2; i <= p; i++) /* et ensuite toutes les divisions. */ v /= i; printf ("%5g", v); } printf ("\n"); } } return EXIT_SUCCESS; Programme 2: #include <stdio.h> #include <stdlib.h> int main (void) { int n, p; for (n=0; n <= 10; n++) { double v = 1; /* Le premier coeff. binomial de la ligne est 1 */ for (p=0; p <= n; p++) { printf ("%5g", v); v *= n - p; /* Calcule le prochain coefficient binomial */ v /= p + 1; /* a partir de celui actuel. */ } printf ("\n"); } } return EXIT_SUCCESS;