Mes 2 programmes ne fonctionnent pas
Fermé
Utilisateur anonyme
-
6 janv. 2013 à 12:43
mamiemando Messages postés 33345 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 - 6 janv. 2013 à 21:33
mamiemando Messages postés 33345 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 8 novembre 2024 - 6 janv. 2013 à 21:33
A voir également:
- Mes 2 programmes ne fonctionnent pas
- 2 ecran pc - Guide
- Word numéro de page 1/2 - Guide
- 2 comptes whatsapp - Guide
- Programmes au démarrage windows 10 - Guide
3 réponses
mamiemando
Messages postés
33345
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 novembre 2024
7 803
Modifié par mamiemando le 6/01/2013 à 13:11
Modifié par mamiemando le 6/01/2013 à 13:11
1. Loto
Écrire un programme qui génère un tirage au sort de 6 nombres différents entre 1 et 50, et qui, ensuite, demande 6 nombres à l'utilisateur.
Le programme affichera les nombres communs aux deux listes.
Il y a une erreur, tu as mélangé affichage et tirage aléatoire. Tu dois d'abord mémoriser le résultat de ton tirage aléatoire dans une variable, et ensuite afficher la valeur de cette variable.
Tel que tu l'as écrit, tu stockes le code de retour de la fonction printf qui n'a évidemment rien à voir avec la valeur aléatoire que tu as calculé.
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/sprintf.3.html
Ensuite l'instruction :
.. ne fait pas du tout ce que tu crois. Elle signifie fait le ET logique de 5 entiers (ce qui vaut vrai si les 5 entiers son non nuls), puis regarde si cette valeur est différente de tirage[0]. En effet, en C tu peux tout à fait écrire des conditions qui n'impliquent pas de booléans : si l'opérande est différente de 0 ou NULL, elle est considérée comme "vraie". Ainsi "2 && 5" est considéré comme vrai en C, tandis que "3 && 0" est considéré comme faux. Tu pourrais même avoir des opérandes de type différent, ça ne pose aucun problème. Par exemple "2 && x && NULL" vaut faux, peu importe ce qu'est x.
Dans ton cas il faudrait par exemple écrire une boucle qui tire une valeur entre 1 et 50 tant qu'elle est égale à l'une des valeurs déjà tirée. Je te conseille de prendre le temps d'écrire des fonctions, ton programme sera plus facile à écrire et plus lisible.
En maths, un tirage cohérent vérifie la propriété suivante : pour tout i != j, tirage[j] != tirage[i]. Comme ici tu tires tes valeurs les unes après les autres, il suffit que lorsque tu calcules la j-ième valeur de vérifier que pour tout i < j, tirage[i] != tirage[j], sinon il faut retirer une valeur pour tirage[j].
2.Histogramme
Écrire un programme qui demande à l'utilisateur de saisir 10 entiers compris entre 1 et 15 qui seront stockés dans un tableau.
Le programme affichera un histogramme de '.' correspondant aux valeurs entières saisies.
Même erreur tu stockes le résultat de n * le résultat de printf. L'énoncé ne précise pas dans quel sens est dessiné l'histogramme, et la manière la plus simple de faire, c'est de dessiner des barres appuyées sur le bord gauche. Ainsi, chaque ligne correspond à une valeur saisie par l'utilisateur (il suffit d'itérer sur ces valeurs par exemple avec une boucle for), puis on dessine autant de points que mentionné par l'utilisateur (en écrivant les points un par un, dans une boucle for).
Bonne chance
Écrire un programme qui génère un tirage au sort de 6 nombres différents entre 1 et 50, et qui, ensuite, demande 6 nombres à l'utilisateur.
Le programme affichera les nombres communs aux deux listes.
Il y a une erreur, tu as mélangé affichage et tirage aléatoire. Tu dois d'abord mémoriser le résultat de ton tirage aléatoire dans une variable, et ensuite afficher la valeur de cette variable.
Tel que tu l'as écrit, tu stockes le code de retour de la fonction printf qui n'a évidemment rien à voir avec la valeur aléatoire que tu as calculé.
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man3/sprintf.3.html
x = rand() % 49 + 1; printf("x = %d\n", x);
Ensuite l'instruction :
tirage[0]!=(tirage[1] && tirage[2]&& tirage[3]&& tirage[4]&& tirage[5]);
.. ne fait pas du tout ce que tu crois. Elle signifie fait le ET logique de 5 entiers (ce qui vaut vrai si les 5 entiers son non nuls), puis regarde si cette valeur est différente de tirage[0]. En effet, en C tu peux tout à fait écrire des conditions qui n'impliquent pas de booléans : si l'opérande est différente de 0 ou NULL, elle est considérée comme "vraie". Ainsi "2 && 5" est considéré comme vrai en C, tandis que "3 && 0" est considéré comme faux. Tu pourrais même avoir des opérandes de type différent, ça ne pose aucun problème. Par exemple "2 && x && NULL" vaut faux, peu importe ce qu'est x.
Dans ton cas il faudrait par exemple écrire une boucle qui tire une valeur entre 1 et 50 tant qu'elle est égale à l'une des valeurs déjà tirée. Je te conseille de prendre le temps d'écrire des fonctions, ton programme sera plus facile à écrire et plus lisible.
En maths, un tirage cohérent vérifie la propriété suivante : pour tout i != j, tirage[j] != tirage[i]. Comme ici tu tires tes valeurs les unes après les autres, il suffit que lorsque tu calcules la j-ième valeur de vérifier que pour tout i < j, tirage[i] != tirage[j], sinon il faut retirer une valeur pour tirage[j].
2.Histogramme
Écrire un programme qui demande à l'utilisateur de saisir 10 entiers compris entre 1 et 15 qui seront stockés dans un tableau.
Le programme affichera un histogramme de '.' correspondant aux valeurs entières saisies.
Même erreur tu stockes le résultat de n * le résultat de printf. L'énoncé ne précise pas dans quel sens est dessiné l'histogramme, et la manière la plus simple de faire, c'est de dessiner des barres appuyées sur le bord gauche. Ainsi, chaque ligne correspond à une valeur saisie par l'utilisateur (il suffit d'itérer sur ces valeurs par exemple avec une boucle for), puis on dessine autant de points que mentionné par l'utilisateur (en écrivant les points un par un, dans une boucle for).
Bonne chance
Utilisateur anonyme
6 janv. 2013 à 17:02
6 janv. 2013 à 17:02
Salut mamiemando,
Alors mon problème est surtout le suivant :pour le 1 je n'arrive à afficher les valeurs en commun des deux tableaux ( il n'y a rien d'afficher).
j'ai fait:
if(tirage[0]==tab[0]||tirage[0]==tab[1]||tirage[0]==tab[2]||tirage[0]==tab[3]||tirage[0]==tab[4]||tirage[0]==tab[5])
{printf("voici les resultat : %d",tirage[0]);
}
pour qu'il m'affiche la valeur de tirage[0] mais ça ne marche pas et je ne vois pas où est l'erreur.
Alors mon problème est surtout le suivant :pour le 1 je n'arrive à afficher les valeurs en commun des deux tableaux ( il n'y a rien d'afficher).
j'ai fait:
if(tirage[0]==tab[0]||tirage[0]==tab[1]||tirage[0]==tab[2]||tirage[0]==tab[3]||tirage[0]==tab[4]||tirage[0]==tab[5])
{printf("voici les resultat : %d",tirage[0]);
}
pour qu'il m'affiche la valeur de tirage[0] mais ça ne marche pas et je ne vois pas où est l'erreur.
mamiemando
Messages postés
33345
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
8 novembre 2024
7 803
6 janv. 2013 à 21:33
6 janv. 2013 à 21:33
Tu devrais peut-être commencer par afficher le contenu de tes cases pour voir si elles contiennent bien ce que tu crois, et aussi commencer à apprendre à utiliser des boucles, car tu vas rapidement en avoir besoin (au moins pour l'exercice 2 !) :
Ensuite il ne faut pas perdre de vue que tu peux imbriquer des boucles les unes dans les autres (et ça aussi tu en auras besoin...).
Par exemple si je veux comparer tirage[0] à chaque tab[i], i allant de 0 à 5 je vais écrire :
Là j'ai raisonné pour j = 0, mais je veux maintenant faire ce raisonnement pour j = 1, ... j = 5 également. Alors je peux certes copier coller 5 fois de suite ce que j'ai écrit au dessus et remplacer 0 par successivement 1, 2, ... 5, mais c'est un peu fastidieux et pas très élégant. Au lieu de ça, je peux répéter avec une boucle for ce raisonnement pour j allant de 0 à 5.
Bonne chance
unsigned i; for (i = 0; i < 6; i++) { print("tab|%d] = %d\n", i, tab[i]); print("tirage|%d] = %d\n", i, tirage[i]); }
Ensuite il ne faut pas perdre de vue que tu peux imbriquer des boucles les unes dans les autres (et ça aussi tu en auras besoin...).
Par exemple si je veux comparer tirage[0] à chaque tab[i], i allant de 0 à 5 je vais écrire :
unsigned i; for (i = 0; i < 6; i++) { if (tab[i] == tirage[0]) { printf("tab[%d] == tirage[0] == %d\n", i, tirage[0]); } else { printf("tab[%d] == %d != tirage[0] == %d\n", i, tab[i], tirage[0]); } }
Là j'ai raisonné pour j = 0, mais je veux maintenant faire ce raisonnement pour j = 1, ... j = 5 également. Alors je peux certes copier coller 5 fois de suite ce que j'ai écrit au dessus et remplacer 0 par successivement 1, 2, ... 5, mais c'est un peu fastidieux et pas très élégant. Au lieu de ça, je peux répéter avec une boucle for ce raisonnement pour j allant de 0 à 5.
unsigned i, j; for (j = 0; j < 6; j++) { for (i = 0; i < 6; i++) { if (tab[i] == tirage[j]) { printf("tab[%d] == tirage[%d] == %d\n", i, j, tirage[j]); } else { printf("tab[%d] == %d != tirage[%d] == %d\n", i, tab[i], j, tirage[j]); } } }
Bonne chance