[Résolu] Pb de débutant, insérer des valeurs dans un tableau

Pb de débutant, insérer des valeurs dans un tableau [Résolu] - C - Programmation

Marsh Posté le 07-03-2022 à 09:44:45    

Bonjour, je dois lire une série de valeurs (de 1 à 50), les ranger dans un tableau et en faire l'addition (pour plus tard calculer la moyenne).
 
Je ne comprends pas pourquoi mon programme ne fonctionne pas
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int nbValeur=51;
  6. while ((nbValeur<0) || (nbValeur >50)) {
  7.  printf("Combien de valeurs allez-vous saisir ? :" );
  8.  scanf("%i", &nbValeur);
  9. }
  10.     double tab[nbValeur];
  11.     double somme=0.0;
  12.     double valeur=0.0;
  13.    
  14.     for (int i=0; i< nbValeur ; i++){
  15.         tab[i]=1;
  16. //     printf("\nSaisissez la valeur %i / %i ? : ",i+1,nbValeur);
  17.  scanf("%s", &valeur);
  18.         tab[i]=valeur;
  19.         somme=somme+tab[i];
  20. //        printf("%d",valeur);
  21.     }
  22.     for (int i=0; i<nbValeur ; i++){
  23.         printf("%d",tab[i]);
  24.     }
  25.     printf("\nLa somme = %d", somme );
  26. }

Message cité 1 fois
Message édité par Jaxom31 le 07-03-2022 à 10:26:34

---------------
0 118 999 881 999 119 725 ...... 3 -
Reply

Marsh Posté le 07-03-2022 à 09:44:45   

Reply

Marsh Posté le 07-03-2022 à 10:04:06    

Premier conseil pour t'apprendre à debugger : mets des printf un peu partout dans ton code avec les valeurs intermédiaires pour voir par où tu passes et qu'est-ce qui se trame dans tes variables et dans ta boucle, ça t'aidera à cible le problème :)


---------------
c cui ki di ki é
Reply

Marsh Posté le 07-03-2022 à 10:12:58    

Tu dis que ça ne fonctionne pas mais quelle(s) sortis(s) as-tu ?
Des messages d'erreurs ?


---------------
Achats/Ventes
Reply

Marsh Posté le 07-03-2022 à 10:16:52    

Bonsoir


---------------
"Xat le punk à chien facho raciste. C'est complexe comme personnage." caudacien 05/10/2020
Reply

Marsh Posté le 07-03-2022 à 10:20:02    

tu enregistres ta saisie en tant que String que tu stockes dans un tableau de double. La transformation n'est sans doute pas automatique
(après, mon C est peut-être rouillé)


---------------
Achats/Ventes
Reply

Marsh Posté le 07-03-2022 à 10:22:19    

Jaxom31 a écrit :

Bonjour, je dois lire une série de valeurs (de 1 à 50), les ranger dans un tableau et en faire l'addition (pour plus tard calculer la moyenne).
 
Je ne comprends pas pourquoi mon programme ne fonctionne pas
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main()
  4. {
  5. int nbValeur=51;
  6. while ((nbValeur<0) || (nbValeur >50)) {
  7.  printf("Combien de valeurs allez-vous saisir ? :" );
  8.  scanf("%i", &nbValeur);
  9. }
  10.     double tab[nbValeur];
  11.     double somme=0.0;
  12.     double valeur=0.0;
  13.    
  14.     for (int i=0; i< nbValeur ; i++){
  15.         tab[i]=1;
  16. //     printf("\nSaisissez la valeur %i / %i ? : ",i+1,nbValeur);
  17.  scanf("%s", &valeur);
  18.         tab[i]=valeur;
  19.         somme=somme+tab[i];
  20. //        printf("%d",valeur);
  21.     }
  22.     for (int i=0; i<nbValeur ; i++){
  23.         printf("%d",tab[i]);
  24.     }
  25.     printf("\nLa somme = %d", somme );
  26. }



 

Fantome Persecuteur a écrit :

Premier conseil pour t'apprendre à debugger : mets des printf un peu partout dans ton code avec les valeurs intermédiaires pour voir par où tu passes et qu'est-ce qui se trame dans tes variables et dans ta boucle, ça t'aidera à cible le problème :)


Oui, quand on comprend la syntaxe du printf  :o  
 

jay31790 a écrit :

Tu dis que ça ne fonctionne pas mais quelle(s) sortis(s) as-tu ?
Des messages d'erreurs ?


Les valeurs affichées sont fausses !
 


Pas encore couché ?  :o  
 
 
C'est bon, en fait mon programme fonctionnait bien, ce sont mes printf qui merdaient avec printf("%lf", valeur); ça marche mieux.
 
edit : et des scanf("%lf", &valeur); (merci Jay)


Message édité par Jaxom31 le 07-03-2022 à 10:25:42

---------------
0 118 999 881 999 119 725 ...... 3 -
Reply

Marsh Posté le 07-03-2022 à 10:23:46    

jay31790 a écrit :

tu enregistres ta saisie en tant que String que tu stockes dans un tableau de double. La transformation n'est sans doute pas automatique
(après, mon C est peut-être rouillé)


Oui, merci, j'avais testé un peu tout, je pensais que mes scanf n'était pas correct.


---------------
0 118 999 881 999 119 725 ...... 3 -
Reply

Marsh Posté le 09-03-2022 à 00:00:26    

Jaxom,
 
Deux petites choses :
int nbValeur=51;
while ((nbValeur<0) || (nbValeur >50)) {
 printf("Combien de valeurs allez-vous saisir ? :" );
 scanf("%i", &nbValeur);
}
 
c'est moins logique que :
int nbValeur;
do {
 printf("Combien de valeurs allez-vous saisir ? :" );
 scanf("%i", &nbValeur);
} while ((nbValeur<0) || (nbValeur >50));
 
Et d'autre part, pour ce genre de programme, de nos jours, c'est bien plus pratique et plus simple d'écrire ça en C++ (qui par exemple, a des conteneurs dynamiques, qui ne t'obligent pas a faire des hypothèses sur le nb de valeurs à saisir).
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-03-2022 à 16:24:43    

gilou a écrit :

Et d'autre part, pour ce genre de programme, de nos jours, c'est bien plus pratique et plus simple d'écrire ça en C++ (qui par exemple, a des conteneurs dynamiques, qui ne t'obligent pas a faire des hypothèses sur le nb de valeurs à saisir).

Ca c'est une discussion qui peut durer une éternité probablement. Certes, le C++ c'est plus puissant mais aussi beaucoup plus complexe. Perso je dirais quelque bases en C ne font pas de mal, surtout si on veut ensuite partir sur des µC.
 
Et pour les conteneurs dynamiques, il y a toujours malloc() et realloc(). :o :o

Reply

Marsh Posté le 09-03-2022 à 23:26:04    

Code :
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <sstream>
  5. #include <iterator>
  6. #include <numeric>
  7. int main()
  8. {
  9.   std::vector<double> values;
  10.   std::string line;
  11.  
  12.   std::cout << "Veuillez entrer des nombres (un ou plusieurs par ligna)" << std::endl
  13.             << "les nombres incorrects seront sautés" << std::endl
  14.             << "Terminez par une ligne vide." << std::endl << std::flush;
  15.    
  16.   while (true) {
  17.     std::getline(std::cin, line);
  18.     if (!line.empty()) {
  19.       std::istringstream myStream( line );
  20.       std::istream_iterator<std::string> it;
  21.       for (it = std::istream_iterator<std::string>(myStream); it != std::istream_iterator<std::string>(); ++it)
  22.         try { values.push_back(std::stod(*it)); } catch(...) {}
  23.     }
  24.     else break;
  25.   }
  26.   std::cout << "La somme vaut : " << std::accumulate(values.begin(), values.end(), 0.0) << std::endl;
  27. }


Pour ce type d'exercice, on peut faire du C++ sans utiliser de manière explicite les classes, juste avec une bonne utilisation des conteneurs.
Et ça te fait du code bien plus robuste que le code C (grosso modo, le seul truc que j'ai pas géré, c'est si la somme accumulée dépasse les bornes d'un double).
Mais ça accepte autant d'entrée que la mémoire de ta machine veut bien, ça saute tout ce qui est invalide sans broncher...
 
A+,


Message édité par gilou le 09-03-2022 à 23:28:11

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 09-03-2022 à 23:26:04   

Reply

Marsh Posté le 15-03-2022 à 09:54:33    

gilou a écrit :

Jaxom,

 

Deux petites choses :
int nbValeur=51;
while ((nbValeur<0) || (nbValeur >50)) {
 printf("Combien de valeurs allez-vous saisir ? :" );
 scanf("%i", &nbValeur);
}

 

c'est moins logique que :
int nbValeur;
do {
 printf("Combien de valeurs allez-vous saisir ? :" );
 scanf("%i", &nbValeur);
} while ((nbValeur<0) || (nbValeur >50));

 

Et d'autre part, pour ce genre de programme, de nos jours, c'est bien plus pratique et plus simple d'écrire ça en C++ (qui par exemple, a des conteneurs dynamiques, qui ne t'obligent pas a faire des hypothèses sur le nb de valeurs à saisir).

 

A+,

 

Désolé, je n'avais pas vu les réponses, le c est imposé. effectivement le do...while est plus logique, merci. Je n'ai pas l'habitude de cette boucle.

 


Message édité par Jaxom31 le 15-03-2022 à 09:55:42

---------------
0 118 999 881 999 119 725 ...... 3 -
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed