IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

[Débutant] Problème avec un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Par défaut [Débutant] Problème avec un tableau
    Bonjour à tous!
    J'ai un petit problème avec un tableau de réels : tous les nombres que j'essaye d'entrer valent 0.

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    printf("\nVeuillez entrer un nombre réel svp...\n");
    scanf("%lf", &temp);
    tableau[ctr] = temp;
    printf("%lf\n", tableau[ctr]);
    Tous les nombres que j'entre dans ce tableau valent 0...
    Ce code se trouve dans une boucle do...while et ctr est incrémenté à chaque passage de boucle.

  2. #2
    Membre expérimenté Avatar de Gamdwin
    Inscrit en
    Avril 2005
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 186
    Par défaut
    Outre le fait que l'utilisation de scanf(), de la manière dont tu le manies, ne soit pas des plus judicieux (utilise plutôt fgets() + strtod() ), il pourrait être intéressant de savoir comment sont définies et allouées tes variables.

    Peux-tu mettre plus de code ?

  3. #3
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Par défaut
    Désolé si mon utilisation du scanf n'est pas très bonne mais je suis vraiment hyper débutant en C. Je dois en fait faire un exercice pour mon cours de C. Le programme doit permettre à l'utilisateur d'introduire jusqu'à 1000 nombres puis calculer la moyenne de tous ces nombres.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    //Variables
    float tableau[1000];
    float total = 0, moyenne = 0, temp = 0;
    char choix;
    int ctr = 0;
    int i = 0;
     
    printf("\nProgramme qui calcule la moyenne de 1000 réels\n");
     
    //Remplissage du tableau
    do
    {
    	if(ctr < 1000)
    	{
    		printf("\nVeuillez entrer un nombre réel svp...\n");
    		scanf("%lf", &temp);
    		tableau[ctr] = temp;
    		printf("%lf\n", tableau[ctr]);
    		ctr++;
    		printf("Voulez-vous entrer un autre nombre? (O/N)");
    		do
    		{
    			choix = toupper(getch());
    		}while((choix != 'O') && (choix != 'N'));
     
    		printf("%c", choix);
    	}
    	else
    	{
    		printf("Vous avez déja introduit 1000 nombres");
    		choix = 'N';
    		}
     
    	}while (choix != 'N');

  4. #4
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Quelques suggestions:
    • Initialiser toutes tes variables
    • Mettre tes conditions d'arrêt directement dans le while principal


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    //Variables
    float tableau[1000] = {0.0};
    float total = 0, moyenne = 0, temp = 0;
    char choix = 'O';
    int ctr = 0;
    int i = 0;
     
    //Remplissage du tableau
    do
    {
    	printf("\nVeuillez entrer un nombre réel svp...\n");
    	scanf("%lf", &temp);
    	tableau[ctr] = temp;
    	printf("%lf\n", tableau[ctr]);
    	ctr++;
     
    	printf("Voulez-vous entrer un autre nombre? (O/N)");
    	do
    	{
    		choix = toupper(getch());
    	}while((choix != 'O') && (choix != 'N'));
    	printf("%c", choix);
     
    } while ( (ctr < 1000) && (choix != 'N') );

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par salvatore_eice
    Désolé si mon utilisation du scanf n'est pas très bonne
    scanf() n'est pas une fonction pour débutant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    float total = 0, moyenne = 0, temp = 0;
     
    		scanf("%lf", &temp);
    Preuve est faite...

    "%lf" attend l'adresse d'un double et non d'un float...

  6. #6
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Par défaut
    Je tiens encore une fois à tous vous remercier pour vos réponses et votre patience. Soyez certains que je ferais bon usage de tous les liens que vous m'avez laissé sur ce post!

    Bonne journée, et vive developpez.com !


  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Tous les nombres que j'entre dans ce tableau valent 0...
    Logique, mauvaise utilisation de scanf ....

    Voici une version avec fgets...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #include <ctype.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
    //Variables
    double tableau[1000];
    double temp = 0;
    char buf[128], *add;
    char choix;
    int ctr = 0;
     
    printf("\nProgramme qui calcule la moyenne de 1000 réels\n");
     
    //Remplissage du tableau
    do
    {
    		printf("\nVeuillez entrer un nombre reel svp...\n");
    		if(fgets(buf,sizeof(buf),stdin)!=NULL)  {
                       //A ajouter ici une verification de la chaine si on veut etre
                       //sur qu'il n'y a pas de problemes
    		   temp = strtod(buf,&add);
     
    		   if(buf==add)
    		    {
    		    //Erreur de conversion
     		    fprintf(stderr,"Erreur avec la conversion");
    		    return EXIT_FAILURE;
    		    }
    		}
    		else 
    		{
    		  fprintf(stderr,"Erreur avec l´entree\n");
    		  return EXIT_FAILURE;
    		}
     
    		tableau[ctr] = temp;
    		printf("%lf\n", tableau[ctr]);
    		ctr++;
    		printf("Voulez-vous entrer un autre nombre? (O/N)");
    		do
    		{
    			if(fgets(buf,sizeof(buf),stdin)!=NULL) 
    			{
    			choix = toupper(buf[0]);
    			}
    			else
    			{
    			fprintf(stderr,"Erreur avec l´entree pour le choix\n");
    			return EXIT_FAILURE;
    			}
    		}while((choix != 'O') && (choix != 'N'));
     
    		printf("%c", choix);
    }while ((ctr<1000)&&(choix != 'N'));
     
    return EXIT_SUCCESS;
    }
    Jc

  8. #8
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par fearyourself
    Logique, mauvaise utilisation de scanf ....
    Oui, j'ai du aller lire le man pour voir pourquoi. Pas à dire, utiliser scanf, c'est mal

  9. #9
    Membre averti
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Par défaut
    Merci beaucoup pour vos réponses!
    Que voulez-vous dire par "mauvaise utilisation de scanf"?
    J'utilise scanf car c'est la seule methode que le prof nous ait montrée pour récuperer des nombres au clavier...

    fearyourself : je crois que si je montre un code comme le tien à mon prof, il va faire une drôle de tête...

  10. #10
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par salvatore_eice
    Merci beaucoup pour vos réponses!
    Que voulez-vous dire par "mauvaise utilisation de scanf"?
    Je préfére pas le dire sinon tu oublieras tout de suite que c'est mal...

    Lis le man pour le savoir : http://man.developpez.com

    Par contre
    fearyourself : je crois que si je montre un code comme le tien à mon prof, il va faire une drôle de tête...
    Je ne suis pas d'accord, s'il a un problème avec mon code, qu'il vienne sur ce forum et on s'expliquera...

    Il faut bien que les étudiants expliquent aux profs de temps en temps que leur cours n'est pas bon sinon l'éducation n'avancera jamais...

    Jc

  11. #11
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par salvatore_eice
    Merci beaucoup pour vos réponses!
    Que voulez-vous dire par "mauvaise utilisation de scanf"?
    J'utilise scanf car c'est la seule methode que le prof nous ait montrée pour récuperer des nombres au clavier...
    Parce que cette fonction est l'une des plus compliquée à maitriser : http://xrenault.developpez.com/tutoriels/c/scanf/

    Citation Envoyé par salvatore_eice
    fearyourself : je crois que si je montre un code comme le tien à mon prof, il va faire une drôle de tête...
    Oui je le trouve bien compliqué Une simple boucle do...while avec sortie si l'utilisateur tape -1 (ou 'N') suffit.

  12. #12
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par gege2061
    Oui je le trouve bien compliqué Une simple boucle do...while avec sortie si l'utilisateur tape -1 (ou 'N') suffit.
    Eh! Je n'ai fait que reprendre le code de base... Si je devais le faire moi-même j'aurais mis cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
    printf("C'est nul comme programme, qui rentre 1000 nombres pour faire une moyenne?\n");
    return EXIT_SUCCESS;
    }
    Plus sérieusement, j'aurais fait un truc comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <ctype.h>
    #include <stdlib.h>
    #include <stdio.h>
     
    int main()
    {
        //Variables
        double tableau[5];
        double temp = 0;
        char buf[128], *add;
        unsigned int ctr = 0;
        int fin = 0;
     
        printf("\nProgramme qui calcule la moyenne de 1000 réels\n");
     
        //Remplissage du tableau
        do
        {
            printf("\nVeuillez entrer un nombre reel svp...\n");
            if(fgets(buf,sizeof(buf),stdin)!=NULL)  
            {
     
                temp = strtod(buf,&add);
     
                if(buf==add)
                {
                    //Test de sortie
                    if((buf[0]=='N')||(buf[0]=='n'))
                    {
                        fin = 1;
                    }
                    else
                    {
                        //Erreur de conversion
                        printf("Erreur avec la conversion, si vous voulez sortir tapez N\n");
                    }
                }
                else  //Cas general
                {
                    tableau[ctr] = temp;
                    printf("%lf\n", tableau[ctr]);
                    ctr++;
                }
            }
     
            else 
            {
                fprintf(stderr,"Erreur avec l´entree\n");
                return EXIT_FAILURE;
            }
        }while ((fin==0) && (ctr<sizeof(tableau)/sizeof(tableau[0])));
     
        return EXIT_SUCCESS;
    }
    Jc

  13. #13
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par fearyourself
    Eh! Je n'ai fait que reprendre le code de base... Si je devais le faire moi-même j'aurais mis cela :
    Ah ok, je préfère

    On arrive presque au même résultat (j'suis juste un poil plus agressif avec l'utilisateur qui sais pas lire ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <stdlib.h>
    #include <stdio.h>
     
    int main (void)
    {
      double tableau[1000];
      int ctr = 0;
      int done = 0;
     
      printf("\nProgramme qui calcule la moyenne de 1000 reels\n");
      do
      {
        char buf[BUFSIZ];
     
        printf("\nVeuillez entrer un nombre reel svp (N pour sortir) :\n");
        if (fgets (buf, sizeof (buf), stdin) != NULL)
        {
          if (buf[0] != 'n' && buf[0] != 'N')
          {
            char *add = NULL;
            double temp = 0;
     
            temp = strtod (buf, &add);
            if (buf != add)
            {
              tableau[ctr] = temp;
              ctr++;
            }
            else
            {
              fprintf(stderr,"On a dit un nombre ou N !\n");
            }
          }
          else
          {
            done = 1;
          }
        }
        else
        {
          fprintf (stderr, "Erreur avec l´entree\n");
          done = 1;
        }
      } while ((ctr < 1000) && (!done));
     
      return EXIT_SUCCESS;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Problème avec Dev-Cpp 4.9.9.0
    Par P4Pi dans le forum Dev-C++
    Réponses: 7
    Dernier message: 16/01/2010, 16h48
  2. [Débutant] Problème avec tableau à deux dimensions
    Par beegees dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/12/2006, 14h06
  3. [débutant] problème avec le curseur (sablier)
    Par bat dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 01/12/2004, 08h26
  4. [débutant] problème avec un "if"
    Par pingoui dans le forum Langage
    Réponses: 10
    Dernier message: 11/08/2004, 09h46
  5. [débutant] Problèmes avec CRegKey
    Par Pedro dans le forum MFC
    Réponses: 4
    Dernier message: 10/11/2003, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo