Rentrée de variable de mauvais type en C

Résolu
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022
-
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022
-
Bonsoir à tous,
Je débute en C++ (mais pour l'instant je reste surtout en C d'après ce que j'ai compris) et je cherche à coder un programme calculateur de moyenne qui demande à l'utilisateur combien de valeurs il veut rentrer et lui fait rentrer ces valeurs (oui je débute totalement… :o ).

Voici mon programme (il marche mais doit encore être améliorable) :
#include <iostream>
#include <vector>
#include <cmath>

using namespace std;

int main()
{
    int nbValeurs(1);
    double moyenne(0);

    cout << "Combien de valeurs voulez-vous rentrer ? (nb strictement positif attendu) ";
    cin >> nbValeurs;

    while (nbValeurs <= 0)
    {
        cout << "Merci de rentrer un nombre valide. Combien de valeurs voulez-vous rentrer ? ";
        cin >> nbValeurs;
    }

    double Notes[nbValeurs];
    cout << "Rentrez " << nbValeurs << " valeurs." << endl;

    for(int i(0); i<nbValeurs; ++i)
    {
        cin >> Notes[i];
    }

    for(int i(0); i<nbValeurs; ++i)
    {
        moyenne += Notes[i];
    }

    moyenne /= nbValeurs;
    cout << "La moyenne des valeurs est de " << moyenne << " !" << endl;

    return 0;
}


Le problème, c'est qu'à cette partie :
cout << "Combien de valeurs voulez-vous rentrer ? (nb strictement positif attendu) ";
cin >> nbValeurs;
, on peut rentrer vraiment n'importe quoi ! Comme des lettres, des symboles,… Et évidemment, comme la variable attendue est de type int, le programme ne reconnaît pas.
Par exemple :


Ce que je voudrais, c'est que le programme accepte uniquement des nombres positifs en tant que variable "nbValeurs", c'est-à-dire que si un symbole ou un caractère alphabétique est rentré, le programme le rejette avec un message (comme j'ai fait pour les nombres négatifs). Je doute que ce soit possible, mais je vous demande quand-même. :-)

Autre chose, je voudrais modifier l'arrondi de la variable "moyenne" (à disons 5 chiffres) car elle reste à un chiffre après la virgule, ce qui n'est pas très précis :

Comment peut-on faire ?

Merci par avance, bonne soirée ! :-)

PS : CodeBlocks est mon IDE. ;-)

4 réponses

Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022
1 002
bonjour,
quelle valeur obtiens-tu pour nbValeurs quand tu tapes n'importe quoi?
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022

Oh my god je viens de réessayer en rentrant e et le programme est devenu complètement fou en n'arrêtant pas d'écrire la même chose !!


Juste une question : comment puis-je connaître le contenu d'une variable (comme tu l'as demandé) ? Il faut passer par cout puis afficher la variable c'est ça ?
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022
1 002 >
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022

As-tu écrit ce programme?
Qu'y fais-tu en ligne 22?
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022
>
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022

Oui, j'ai écrit ce programme. ^^

En ligne 22, j'informe l'utilisateur qu'il a demandé à rentré <nbValeurs> caractères et qu'il va le faire maintenant avec l'instruction/la boucle for ;

  cout << "Rentrez " << nbValeurs << " valeurs." << endl;
for(int i(0); i<nbValeurs; ++i)
    {
        cin >> Notes[i];
    }

Qui va demander à rentrer autant de valeurs que l'utilisateur a demandé.
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022
1 002 >
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022

Cela ne répond-il pas à ta question "comment puis-je connaître le contenu d'une variable"?
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022
1 002 >
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022

Un programme qui change de comportement, c'est souvent un code qui a été modifié.
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022
1 002
Vu les questions que tu poses, je suggère que tu commences par des exercices plus simples.
Peut-être, demander un nombre, et afficher le nombre reçu.
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022

On peut connaître le contenu d'une variable en l'affichant avec cout, non ?
J'ai posé cette question pour être sûr qu'il n'y avait pas d'autre méthode, parce que si le programme n'arrête pas de tourner super rapidement et indéfiniment quand on rentre "e" pour nbValeurs, je ne pourrai pas avoir accès à cette instruction cout qui vient après.

Sinon justement c'est ce que je ne comprends pas trop, je n'ai pas tellement modifié le programme entre temps, mis à part que j'avais rajouté une instruction :
cout << nbValeurs << endl;
à la ligne 35 pour pouvoir savoir ce que contenait la variable comme tu l'avais demandé, mais entre-temps j'ai supprimé cette instruction et ça a refait la même chose. C'est bizarre…

C'est vrai que j'ai peut-être pas tout bien compris…
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022
1 002
Un programme peut être assez sensible, une petite modification peut avoir de grands effets.

Vu les questions que tu poses, je suggère que tu commences par des exercices plus simples.
Peut-être, demander un nombre, et afficher le nombre reçu.
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022

Ça je pense pouvoir le faire ainsi :
#include <iostream>

using namespace std;

int main()
{	double nbChoisi(0);

	cout << "Choisissez un nombre : ";
	cin >> nbChoisi;

	cout << "Vous avez choisi le nombre " << nbChoisi << " !" << endl;

	return 0;
} 
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022
1 002
Et que se passe-t-il si tu rentres un symbole ou un caractère alphabétique?
Comment pourrais-tu traiter cela?
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022
>
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022

Quand je choisis de rentrer par exemple 'e', le programme affiche "Vous avez choisi le nombre 0 !".

Je sais pas du tout comment je pourrai faire en sorte que le programme détecte qu'il ne s'agisse pas d'un nombre, puisqu'on ne peut faire de boucle while uniquement pour l'égalité ou la grandeur de la variable int/double…

Ah si j'ai peut-être une idée…
Je viens de faire un test et lorsque l'on rentre un caractère alphabétique ou un symbole, la variable se met automatiquement à 0, peu importe son ancienne valeur.
Ce qui nous permettrait peut-être de faire une boucle "while" qui demande à rentrer une nouvelle valeur correcte si nbChoisi = 0, pour empêcher de rentrer des caractères non pris en charge par la variable…
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022
1 002 >
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022

Peux-tu alors marquer la discussion comme résolue?
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022
>
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022

J'avais juste une dernière question : comment peut-on modifier l'arrondi d'une variable, par exemple la variable moyenne dans le cas du premier programme, dont l'arrondi est à 1 chiffre après la virgule ?
Messages postés
18318
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
26 janvier 2022
1 002 >
Messages postés
330
Date d'inscription
mercredi 3 novembre 2021
Statut
Membre
Dernière intervention
24 janvier 2022

Tu peux contrôler la précision de l'affichage fait par cout.
Si tu fais une recherche "precision cout", je pense que tu trouveras des exemples et des explications.