Mes 2 programmes ne fonctionnent pas

Fermé
Utilisateur anonyme - 6 janv. 2013 à 12:43
mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 - 6 janv. 2013 à 21:33
Bonjour,


J'ai deux exercices à faire en programmation en C et les deux programmes de marchent pas, ils compilent mais ne fonctionnent pas comme le demande l'exercice.
Voici les deux exos :

1. Loto

Écrire un programme qui génère un tirage au sort de 6 nombres différents entre 1 et 49, et qui, ensuite, demande 6 nombres à l'utilisateur.
Le programme affichera les nombres communs aux deux listes.

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.

Voici ce que j'ai fait:

1.#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
srand(time(NULL));
int i;
int tab[6];
int tirage[6];

tirage[0]!=(tirage[1] && tirage[2]&& tirage[3]&& tirage[4]&& tirage[5]);
tirage[1]!=(tirage[0] && tirage[2]&& tirage[3]&& tirage[4]&& tirage[5]);
tirage[2]!=(tirage[1] && tirage[0]&& tirage[3]&& tirage[4]&& tirage[5]);
tirage[3]!=(tirage[1] && tirage[2]&& tirage[0]&& tirage[4]&& tirage[5]);
tirage[4]!=(tirage[1] && tirage[2]&& tirage[3]&& tirage[0]&& tirage[5]);
tirage[5]!=(tirage[1] && tirage[2]&& tirage[3]&& tirage[4]&& tirage[0]);

tirage[0]=printf("\nvoici le premier numero :%d\n",rand()%49+1);

tirage[1]=printf("\nvoici le deuxieme numero: %d\n",rand()%49+1);

tirage[2]=printf("\nvoici le troisieme numero :%d\n",rand()%49+1);

tirage[3]=printf("\nvoici le quatrieme numero :%d\n",rand()%49+1);

tirage[4]=printf("\nvoici le cinquieme numero: %d\n",rand()%49+1);

tirage[5]=printf("\nvoici le sixieme numero :%d\n",rand()%49+1);


for (i=0;i<6;i++)
{
printf("\nentrez un entier entre 1 et 49 pour la case %d\n",i);
scanf("%d",&tab[i]);

}

switch(tab[i])
{

case 0: if(tirage[0]==(tab[0]||tab[1]||tab[2]||tab[3]||tab[4]||tab[5]))
{printf("voici les resultat : %d",tirage[0]);
return 1;}

case 1:if(tirage[1]==(tab[0]||tab[1]||tab[2]||tab[3]||tab[4]||tab[5]))
{printf("\n%d",tirage[1]);
return 1;}

case 2:if(tirage[2]==(tab[0]||tab[1]||tab[2]||tab[3]||tab[4]||tab[5]))
{printf("\n%d",tirage[2]);
return 1;}

case 3:if(tirage[3]==(tab[0]||tab[1]||tab[2]||tab[3]||tab[4]||tab[5]))
{printf("\n%d",tirage[3]);
return 1;}

case 4:if(tirage[4]==(tab[0]||tab[1]||tab[2]||tab[3]||tab[4]||tab[5]))
{printf("\n%d",tirage[4]);
return 1;}

case 5:if(tirage[5]==(tab[0]||tab[1]||tab[2]||tab[3]||tab[4]||tab[5]))
{printf("\n%d",tirage[5]);
return 1;}

}

fflush(stdin);
getchar();
}

Problème : ici le programme ne me trouvent pas les nombres communs aux deux listes.

2.#include<stdio.h>

int main()
{
int i;
int n;
int tab[10];
char point[10];
for (i=0;i<10;i++)
{
printf("entrez un entier entre 1 et 15 pour la case %d\n",i);
scanf("%d",&tab[i]);
}
for (i=0;i<10;i++)
{
switch(tab[i])
{
case 0:tab[0]=n*printf("\n.",point);
break;
case 1: tab[1]=n*printf("\n.",point);
break;
case 2:tab[2]=n*printf("\n.",point);
break;
case 3:tab[3]=n*printf("\n.",point);
break;
case 4: tab[4]=n*printf("\n.",point);
break;
case 5: tab[5]=n*printf("\n.",point);
break;
case 6:tab[6]=n*printf("\n.",point);
break;
case 7: tab[7]=n*printf("\n.",point);
break;
case 8: tab[8]=n*printf("\n.",point);
break;
case 9: tab[9]=n*printf("\n.",point);
break;

}

}

fflush(stdin);
getchar();
}

Problème : ici le programme m'affiche juste une colonne de points.


Pouvez-vous m'aider svp j'ai énormément cherché je ne comprend pas ce qui ne vas pas.Merci.

A voir également:

3 réponses

mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 7 804
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

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
0
Utilisateur anonyme
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.
0
mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 7 804
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 !) :

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
0