Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 01/02/2023, à 19:03

ROGER2327

[Résolu] c++ Vérifier qu'une entrée est un nombre entier

Bonjour.

J'ai un problème de néophyte : comment faire comprendre à c++ que 3.5 n'est pas un nombre entier ?

Avec ce code :

#include <iostream>

int main()
{
    int a;
    std::cout << "Donner un nombre entier : ";

    if( std::cin >> a)
    {
        std::cout << "D\'accord.\n";
    }
    else
    {
        std::cout << "J\'ai dit un ENTIER !\n";
    }

    std::cout << a << std::endl;

    return 0;
}

/*
entier.cpp
*/

je compile et j'obtiens :

moi@utilisateur:~/Documents/C2plus/doc/ex$ g++ -std=c++17 entier.cpp -o entier; ./entier
Donner un nombre entier : 2327
D'accord.
2327
moi@utilisateur:~/Documents/C2plus/doc/ex$ ./entier
Donner un nombre entier : trois
J'ai dit un ENTIER !
0
moi@utilisateur:~/Documents/C2plus/doc/ex$ .

Jusque ici, tout va bien.

moi@utilisateur:~/Documents/C2plus/doc/ex$ ./entier
Donner un nombre entier : 3.5
D'accord.
3
moi@utilisateur:~/Documents/C2plus/doc/ex$ .

Moi, pas d'accord.

Je sais que std:: cin << a opère une conversion implicite de 3.5 en 3.
Sauriez-vous me dire comment faire pour obtenir

moi@utilisateur:~/Documents/C2plus/doc/ex$ ./entier
Donner un nombre entier : 3.5
J'ai dit un ENTIER !
0
moi@utilisateur:~/Documents/C2plus/doc/ex$ .

dans le dernier cas ?

Merci d'avance.

Dernière modification par ROGER2327 (Le 17/03/2023, à 02:10)


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#2 Le 01/02/2023, à 19:08

grigouille

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Je te suggère de lire toute l'entrée standard dans un std::string.
Ensuite tu analyses le texte, par exemple avec une regex.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#3 Le 01/02/2023, à 20:21

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Merci. S'il n'y a rien de plus simple, je vais faire ça.


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#4 Le 01/02/2023, à 21:21

iznobe

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Bonjour : https://www.google.com/search?client=fi … ion+entier .
y a des dizaines de reponses validees et bien plus simple dont la 1ere qui apparait .

Dernière modification par iznobe (Le 01/02/2023, à 21:21)


retour utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .

Hors ligne

#5 Le 02/02/2023, à 03:47

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

À iznobe : Pensez-vous à cette proposition ? (La première des seize proposées, étiquetée Meilleure réponse.)

#include <iostream>

int main()
{
    int n;
    if(std::cin >> n) std::cout << "C\'est un entier: " << n << std::endl;
    else std::cout << "Ce n\'est pas un entier" << std::endl;
}

Si c'est le cas, elle ne me convient pas car elle prétend que 3.5 est un entier, ce qui est manifestement faux.
Merci d'avoir pris le temps de répondre.

À grigouille : Efficace, l'expression régulière.

#include <iostream>
#include <regex>

/*
g++ -std=c++17 entier.cpp -o entier; ./entier
*/

int main()
{
    std::string as;
    std::cout << "Donner un nombre entier : ";
    std::cin >> as;
    
    int a;
    if( std::regex_match(as, std::regex("[+|-]?[0-9]+")) )
    {
        a = std::stoi(as);
        std::cout << "D\'accord.\n";
    }
    else
    {
        std::cout << "J\'ai dit un ENTIER !\n";
    }

    std::cout << a << std::endl;

    return 0;

/*
entier.cpp
*/
}

Ce code fonctionne comme je le souhaite. Mais le code compilé pèse plus de 600 ko (contre 18 pour mon code précédent). C'est cher payé.

Dernière modification par ROGER2327 (Le 02/02/2023, à 16:40)


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#6 Le 02/02/2023, à 11:17

grigouille

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

sans regex, avec stoi :

$ cat toto.cpp
#include<iostream>

int main() {
        std::string line;
        if(std::getline(std::cin, line)) {
                try {
                        std::string::size_type idx;
                        int a = std::stoi(line, &idx);
                        if(idx == line.size()) {
                                std::cout << "entier: " << a << std::endl;
                        } else {
                                std::cout << "entier: " << a << " suivi de: '" << line.substr(idx) << '\'' << std::endl;
                        }
                } catch(const std::invalid_argument& ia) {
                        std::cerr << "n'est pas un entier : " << line << std::endl;
                } catch(const std::out_of_range& oor) {
                        std::cerr << "Out of Range error: " << line << std::endl;
                }
        }
}

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#7 Le 02/02/2023, à 11:38

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Merci.
Je vais essayer ça...


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#8 Le 02/02/2023, à 18:18

JBF

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

L'expression régulière de la réponse #5 teste si la saisie n'est composée que des signes + ou - et des chiffres 0 à 9. Du coup elle va considérer 3.0 comme non entier, ce qui, mathématiquement, est faux.

Une façon de vérifier si un nombre est entier est de le comparer à sa partie entière (partie entière de X = le plus grand entier inférieur ou égal à X. Pour 3,5 on obtient 3 et pour -3,5 on obtient -4). Si la différence est nulle, le nombre est entier.

Si tu veux seulement un nombre sans partie décimale, il faut préciser la contrainte à ton utilisateur, et il suffit alors de vérifier qu'il n'y a pas de séparateur décimal dans la saisie. Remarque : cela ne prend pas en compte une saisie en format scientifique du genre 3.5e+4 (c'est entier, mais 3.5e-4 ne l'est pas).


LibreOffice : https://fr.libreoffice.org/ (téléchargement, documentation, FAQ, assistance, contribuer, ...)
Aide pour LibreOffice par la communauté francophone : https://ask.libreoffice.org/fr/

Hors ligne

#9 Le 16/02/2023, à 01:02

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Bonjour et merci...

...à JBF :
    D'accord avec les explications qui, après une grosse trentaine d'années d'enseignement des mathématiques, ne me surprennent guère. Mon problème est de faire comprendre à c++ que 3.5 n'est pas un entier.

... grigouille (#6) :
    L'analyse de votre proposition m'aide beaucoup, en fournissant un exemple concret.

Pour que vous compreniez le sens de ma demande, je vous dois quelques explications.

Je suis un vieux bonhomme de soixante-quinze piges sans grande expérience de programmation.
J'utilise à peu près correctement LaTeX pour éditer des textes mathématiques lisibles, j'ai quelques notions de Python sans prétendre à sa maîtrise et j'ai su jadis me débrouiller en VisualBasic® dans Excel® (que j'ai aujourd'hui oublié). Dans des temps anciens que les moins de vingt ans ne peuvent pas connaître, j'ai eu une bonne maîtrise de la programmation des calculatrices Hewlett-Packard (HP 41 notamment).

Le 31 janvier, j'ai décidé de découvrir c++. Les premières lignes que j'ai écrites sont celles du message #1.

Depuis, j'ai, grâce à grigouille (#6), et au prix d'innombrables plantages, développé mon projet initial comme suit :

//$ cat test3.cpp // cette ligne «bordélise» comme dit élégamment en haut lieu

#include <ctime>
#include <filesystem>
#include <fstream>
#include <iostream>
#include <vector>

/*
But :
- saisir une série de données numériques entières horodatées dans un fichier
    "test3_correct.txt"
- enregistrer les données non conformes dans un fichier "test3_erreur.txt".
- organiser les données selon l'arborescence :

répertoire courant
└── Test3
    ├── test3_correct.txt
    └── Erreur
        └── test3_erreur.txt

Répertoire courant :
clear; cd ~/Documents/C2plus/doc/ex

Compilation ; exécution :
g++ -std=c++20 test3.cpp -o test3; ./test3
*/


std::string horodate(){ // horodatage de forme 2023-02-15 22:02:47
    std::time_t t = std::time(nullptr);
    std::tm* maintenant = std::localtime(&t);
    char tampon[20];
    strftime(tampon, sizeof(tampon), "%F %T", maintenant);

    return tampon;

}


void sortie(std::string f, auto m, auto fcl){ // écriture horodatée des données 
    std::ofstream erreur;                     // fcl et m en fin du fichier f
    erreur.open(f, std::ios::app);
    erreur << horodate() << '\t' << fcl << m << std::endl;
    erreur.close();
}


int validation(std::string ligne){ // validation d'un entier positif
    int a;
    bool b = false;

    try{
        std::string::size_type idx;
        std::string nombre = std::to_string(std::stof(ligne, &idx));
        a = (std::stoi(nombre, &idx));
        b = (std::stof(nombre.substr(idx)) == 0);
        // vrai si la partie décimale du nombre est nulle

        if(!b || (b && a < 0)) // si la partie décimale n'est pas nulle ou
                               // si le nombre est négatif, on retient la
                               // valeur absolue de la partie entière
            std::cout << "Nombre retenu = " << abs(a) << std::endl;

    }
    catch(...){
        std::cout << "«Ce n'est pas un échec, c'est juste\nque ça n'a pas marché !»\ncomme dit le Macron.\n"; // bof...
        a = 0;
    }

    return abs(a);

}


int saisie(std::string correct, std::string erreur, int i){
    /* mutadis mutandi, même principe que dans la fonction validation, 
    avec traitement plus fin des erreurs */
    std::string ligne;
    int a;
    std::cout << "Donner un nombre entier : a" << i << " = ";
    bool b = false;

    if(std::getline(std::cin, ligne)){

        try{
            std::string::size_type idx;
            std::string nombre = std::to_string(std::stod(ligne, &idx));
            a = (std::stoi(nombre, &idx));
            b = (std::stof(nombre.substr(idx)) == 0);

            if(b){
                std::cout << "D'accord.\n";
                std::cout << "a" << i << " = " << a << std::endl;
                sortie(correct, a, "");
            }

            else{
                std::cout << "Décimal ! Troncature à l'unité : " << a << ", suivie de : '" << nombre.substr(idx) << '\'' << std::endl;
                sortie(erreur, "\tType incorrect.", nombre);
            }

        }
        catch(const std::invalid_argument& ia){
            std::cout << '\'' << ligne << "' ??? J'ai dit un ENTIER !\n";
            sortie(erreur, "\tType incorrect.", ligne);
        }
        catch(const std::out_of_range& oor){
            std::cout << "Dépassement de capacité : " << ligne << std::endl;
            sortie(erreur, "\tDépassement de capacité.", ligne);
        }
        catch(...){
            std::cout << "Vire le programmeur !" << std::endl;
            sortie(erreur, "\tLe programmeur a déconné.", "");
        }
    }

    return b;

}


bool disponible(std::string chemin, std::string objet){

    std::ofstream obj(chemin + objet, std::ios::app);
    bool b = obj.is_open();

    if(!b)
        std::cout << "Impossible d'ouvrir " << objet << std::endl;
    else
        obj.close();

    return b;

}


int main(){
    // gérer l'arborescence
    std::string niveau1 = "Test3", niveau2 = "Erreur";
    std::string arborescence = niveau1 + "/" + niveau2;

    std::cout << "Le répertoire " << niveau1 ;

    if(std::filesystem::exists(arborescence))
        std::cout << " existe.\nVous pouvez le compléter." << std::endl;
    else{
        std::filesystem::create_directories(arborescence);
        std::cout << " est créé." << std::endl;
    }

    // s'assurer que les fichier de sortie sont disponibles
    bool b = true;
    std::string chemin = "./" + niveau1 + "/";
    std::string correct = "test3_correct.txt";
    std::string erreur = niveau2 + "/test3_erreur.txt";

    std::vector<std::string> objet{correct, erreur};

    for(const std::string & str : objet)
        b = b && disponible(chemin, str);

    // si tout va bien...
    if(b){
        std::string ligne;
        std::cout << "Nombre de données ?" << std::endl;
        std::getline(std::cin, ligne);
        int u = validation(ligne);

        for (int i = 1; i <= u; i++) {
            i -= !saisie(chemin + correct, chemin + erreur, i);
        }
    }

    return 0;

}

La première ligne est commentée : si je la décommente, g++ me balance six mille lignes (et plus) d'injures dans un charabia incompréhensible pour moi. Pourquoi ?

En l'état, ce code fonctionne.

toto@tata:~/Documents/C2plus/doc/ex$ g++ -std=c++20 test3.cpp -o test3; ./test3
Le répertoire Test3 est créé.
Nombre de données ?
Cent mille
«Ce n'est pas un échec, c'est juste
que ça n'a pas marché !»
comme dit le Macron.
toto@tata:~/Documents/C2plus/doc/ex$ ./test3
Le répertoire Test3 existe.
Vous pouvez le compléter.
Nombre de données ?
-0.5
Nombre retenu = 0
toto@tata:~/Documents/C2plus/doc/ex$ ./test3
Nombre de données ?
9
Donner un nombre entier : a1 = 3
D'accord.
a1 = 3
Donner un nombre entier : a2 = 3.5
Décimal ! Troncature à l'unité : 3, suivie de : '.500000'
Donner un nombre entier : a2 = +23
D'accord.
a2 = 23
Donner un nombre entier : a3 = -32
D'accord.
a3 = -32
Donner un nombre entier : a4 = 1/7
D'accord.
a4 = 1
Donner un nombre entier : a5 = 2e2
D'accord.
a5 = 200
Donner un nombre entier : a6 = Prout !
'Prout !' ??? J'ai dit un ENTIER !
Donner un nombre entier : a6 = 0xfed
D'accord.
a6 = 4077
Donner un nombre entier : a7 = -0xfed
D'accord.
a7 = -4077
Donner un nombre entier : a8 = 12345678901
Dépassement de capacité : 12345678901
Donner un nombre entier : a8 = 2327 512 83
D'accord.
a8 = 2327
Donner un nombre entier : a9 = .
'.' ??? J'ai dit un ENTIER !
Donner un nombre entier : a9 = 3800e-1
D'accord.
a9 = 380
toto@tata:~/Documents/C2plus/doc/ex$

qui donne, pour test3_correct.txt :

2023-02-15 17:57:07	3
2023-02-15 17:57:14	23
2023-02-15 17:57:18	-32
2023-02-15 17:57:22	1
2023-02-15 17:57:30	200
2023-02-15 17:57:50	4077
2023-02-15 17:57:59	-4077
2023-02-15 17:58:20	2327
2023-02-15 17:58:36	380

et pour test3_erreur.txt

2023-02-15 17:57:10	3.500000	Type incorrect.
2023-02-15 17:57:42	Prout !	Type incorrect.
2023-02-15 17:58:09	12345678901	Dépassement de capacité.
2023-02-15 17:58:25	.	Type incorrect.

Mais, étant donné ma qualité de parfait débutant, je suppose que ce code comporte bien des maladresses et mérite des corrections.
Aussi compté-je sur vous pour toute remarque que vous pourrez me faire.

Voilà, vous savez tout.
Merci encore et à bientôt.

Correction mineure du code.

Dernière modification par ROGER2327 (Le 17/02/2023, à 01:26)


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#10 Le 16/02/2023, à 10:18

lann

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Bonjour Roger

je trouve super que quelqu’un de 75 ans se mette à la programmation. Rien de tel pour les neurones.

Pour la compilation : la première ligne n'est pas du langage C++.

cat test3.cpp

ça pourrait aller dans un fichier bash.

man cat

ça sert à afficher le texte d'un fichier dans la sortie standard (afficher le texte)

Pour ce qui est du logiciel en lui même, je n'ai pas tout regardé mais il y a beaucoup d'humour. (+1)

La remarque que je pourrais faire est que tu mélanges le C et le C++. ça passe mais c'est loin d'être l'idéal.
Par exemple :

std::string horodate(){ // horodatage de forme 2023-02-15 22:02:47
    std::time_t t = std::time(nullptr);
    std::tm* maintenant = std::localtime(&t);
    char tampon[20];
    strftime(tampon, sizeof(tampon), "%F %T", maintenant);

    return tampon;

}

Tu commences avec du C++ : std::string, std::time et tu finis par strftime qui est du C.
Essayes de faire le maximum avec la librairie std en C++

Deuxième remarque : le C++ est orienté objet. Je ne sais pas si ton programme peut être réalisé par de la programmation objet mais il faut aller dans ce sens.

C et C++ sont deux langages différents surtout sur la façon de penser l'implémentation du code.

Hors ligne

#11 Le 16/02/2023, à 19:30

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Bonjour lann.

lann a écrit :

Bonjour Roger

(...)

Pour la compilation : la première ligne n'est pas du langage C++.

cat test3.cpp

ça pourrait aller dans un fichier bash.

man cat

ça sert à afficher le texte d'un fichier dans la sortie standard (afficher le texte)
(...)

Vu ! J'ai été étonné par cette première ligne que je n'attendais pas là.
Pour ce qui est de bash, je l'utilise aussi, en restant à un niveau modeste...

lann a écrit :

(...)
Pour ce qui est du logiciel en lui même, je n'ai pas tout regardé mais il y a beaucoup d'humour. (+1)
(...)

Ça ne mange pas de pain, n'est-ce pas ?

lann a écrit :

(...)
La remarque que je pourrais faire est que tu mélanges le C et le C++. ça passe mais c'est loin d'être l'idéal.
Par exemple :

std::string horodate(){ // horodatage de forme 2023-02-15 22:02:47
    std::time_t t = std::time(nullptr);
    std::tm* maintenant = std::localtime(&t);
    char tampon[20];
    strftime(tampon, sizeof(tampon), "%F %T", maintenant);

    return tampon;

}

Tu commences avec du C++ : std::string, std::time et tu finis par strftime qui est du C.
Essayes de faire le maximum avec la librairie std en C++
(...)

Si j'écris

    std::strftime(tampon, sizeof(tampon), "%F %T", maintenant);

rentré-je dans les clous ?

lann a écrit :

(...)
Deuxième remarque : le C++ est orienté objet. Je ne sais pas si ton programme peut être réalisé par de la programmation objet mais il faut aller dans ce sens.
(...)

Ouais... J'ai abordé la question avec Python 3 ; j'ai étudié le concept de classe et je suis parvenu à en écrire quelques unes.

Certains concepts doivent se retrouver dans les deux langages. Reste à trouver le style qui convient à chacun d'eux.
                                                           Facile à dire, yapuqua...

Merci pour tout.


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#12 Le 16/02/2023, à 20:00

Watael

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

je trouvais bizarre que ça paraisse si compliqué de déterminé si une entrée est un nombre entier, alors j'ai cherché rapidement, et je suis tombé sur cette méthode qui me paraît tellement simple.

#include <cmath>

bool is_integer(float k)
{
  return std::floor(k) == k;
}

alors, que je ne parle pas un mot de C(++). big_smile

Dernière modification par Watael (Le 16/02/2023, à 20:01)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#13 Le 16/02/2023, à 20:42

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Bonjour Watael

Merci.
Comment ça s'emploie ?


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#14 Le 16/02/2023, à 20:54

Watael

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

je crois que c'est une fonction :

is_integer(variableSaisie)

?
variableSaisie est (à adapter en fonction de ton code) le nom de la variable de l'entrée de l'utilisateur.

Dernière modification par Watael (Le 16/02/2023, à 20:57)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 16/02/2023, à 21:55

grigouille

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

std::modf semble être un bon candidat aussi.

bool is_integer(double x) {
	double dummy;
	return std::modf(x, &dummy) == 0.;
}

Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#16 Le 21/02/2023, à 19:25

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Merci à grigouille et à Watael pour leurs propositions que je ne sais pas mettre en œuvre.

J'ai l'impression que mon apprentissage sera long (pas trop toutefois vu mon âge...) et douloureux.

(À suivre...)


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#17 Le 21/02/2023, à 21:12

Watael

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Merci à grigouille et à Watael pour leurs propositions que je ne sais pas mettre en œuvre.

je ne sais pas comment je dois le prendre... hmm
lol  lol lol

il faudrait nous montrer ce que tu as essayé, et ce qu'ont été les résultats par rapport au résultat attendu.
aussi, extrait-nous l'endroit où la variable à tester est définie, et indique-nous l'endroit où elle doit être tester.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 28/02/2023, à 03:35

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Watael a écrit :

Merci à grigouille et à Watael pour leurs propositions que je ne sais pas mettre en œuvre.

je ne sais pas comment je dois le prendre...
(...)

C'est à prendre comme c'est écrit :
1. Je vous remercie de prendre en considération mes questions de débutant.
2. Je confesse que mon inexpérience m'empêche de tirer profit de vos réponses.
Ni plus, ni moins : «Tu es comme une poule qui aurait trouvé un couteau» aurait dit narquoisement mon grand-père...

Watael a écrit :

(...)
il faudrait nous montrer ce que tu as essayé, et ce qu'ont été les résultats par rapport au résultat attendu.
aussi, extrait-nous l'endroit où la variable à tester est définie, et indique-nous l'endroit où elle doit être tester.

Ceci ...

#include <iostream>
#include <cmath>

bool is_integer(float k)
{
  return std::floor(k) == k;
}

int main(){
  std::string x;
  std::cout << "x ? ";
  std::cin >> x;
  std::cout << "x = " << x << "\ttest = " << is_integer(x) << std::endl;
  return 0;
}

/*
E2.cpp
g++ -std=c++17 E2.cpp -o E2.out
*/

... est refusé sans surprise par le compilateur : l'argument passé n'est pas du type attendu.
En remplaçant std::string x; par float x; , ça s'arrange :

fhmd@utilisateur-NJ70MU:~/Documents/C2plus/doc/ex/temp$ ./E2.out
x ? 3  
x = 3	test = 1
fhmd@utilisateur-NJ70MU:~/Documents/C2plus/doc/ex/temp$ ./E2.out
x ? 3.
x = 3	test = 1
fhmd@utilisateur-NJ70MU:~/Documents/C2plus/doc/ex/temp$ ./E2.out
x ? 3.5
x = 3.5	test = 0
fhmd@utilisateur-NJ70MU:~/Documents/C2plus/doc/ex/temp$

Mais pas pour longtemps :

fhmd@utilisateur-NJ70MU:~/Documents/C2plus/doc/ex/temp$ ./E2.out
x ? 3A
x = 3	test = 1
fhmd@utilisateur-NJ70MU:~/Documents/C2plus/doc/ex/temp$ ./E2.out
x ? 3.5A
x = 3.5	test = 0
fhmd@utilisateur-NJ70MU:~/Documents/C2plus/doc/ex/temp$

Cela peut encore s'admettre en posant comme convention qu'on ne prend en compte que le début (numérique) de la saisie.

Maintenant, ça se corse :

x ? A3
x = 0	test = 1

ou

x ? toto
x = 0	test = 1

J'aimerais que le test échoue dans ces cas.

Mon problème est de repérer les erreurs de saisie. L'idéal serait que float x; std::cin >> x; plantât dès lors qu'on saisit autre chose qu'un nombre.

(Excusez le délai de réponse : quelques jours d'interruption de ma liaison internet pour cause de routeur en carafe.)

Correction : typo.

Dernière modification par ROGER2327 (Le 28/02/2023, à 11:29)


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#19 Le 28/02/2023, à 23:39

LeoMajor

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

salut,

j'ai quelques notions de Python sans prétendre à sa maîtrise et j'ai su jadis me débrouiller en VisualBasic® dans Excel® (que j'ai aujourd'hui oublié)

-> gestion des erreurs/ catch/ try/except/finally (idem c++, c#, ...)

en gambas3 (une sorte de vba, vb.net), c'est la même chose
a/ input float

gbs3 -e 'sub foo(): while 1: dim a as float: print "entier de type float?": input a: dim b as integer=cint(a): if a=b then print a,"ok" else print a,"ko": wend: catch: print error.code, error.text: foo(): end: foo()'
entier de type float?
12.56
12,56    ko
entier de type float?
12.00
12    ok
entier de type float?
3e3
3000    ok
entier de type float?
hh
6    Type mismatch: wanted Float, got String instead
entier de type float?
3.14e-2
0,0314    ko

b/ input string

gbs3 -e 'sub foo(): while 1: dim a as string: print "entier de type string ?": input a: if a match "^[-+]?\\d+$" or if isdigit(a)=true or if cint(val(a))=val(a) then print "ok" else print "ko": wend: finally: print "ko 2": foo(): end: foo()'

c/ input variant (une sorte auto c++)

gbs3 -e 'sub foo(): while 1: dim a as variant: print "entier ?": try input a: if frac(a)=0 or if isdigit(a)=true  then print "oui" else print "ko": wend: finally: print "ko 2": foo(): end: foo()' 

d/ input byte

gbs3 -e 'sub abc(): while 1: dim a as byte=0: print "entier de type byte [0-255]?": input a: print a, "oui /modulo 256": wend: catch: if string.instr(error.text,"String instead")<>0  then print "ko": abc(): end: abc()'

e/ input short (petit integer)

 gbs3 -e 'sub abc(): while 1: dim a as integer=0: dim b as short: print "entier de type short [-32768/32767]?": input a: b=cshort(a): if a>32767 or if a<-32768 then print b, "short ok (overflow ignored)" else print a, "short ok": wend: catch: if string.instr(error.text,"String instead")<>0  then print "ko. string datatype": abc(): end: abc()'

f/ entier booleén? si la question peut avoir un sens ?
par conversion cbyte/cinteger  (idem avec cshort,clong, etc..

False    0    0
True    255    -1

g/ je n'ai pas vérifié pour long (grand integer), mais c'est le même raisonnement que short mais avec clong
encadrement sur -9.223.372.036.854.775.808...+9.223.372.036.854.775.807

Hors ligne

#20 Le 01/03/2023, à 12:52

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

LeoMajor a écrit :

salut,

j'ai quelques notions de Python sans prétendre à sa maîtrise et j'ai su jadis me débrouiller en VisualBasic® dans Excel® (que j'ai aujourd'hui oublié)

-> gestion des erreurs/ catch/ try/except/finally (idem c++, c#, ...)
(...)

Bonjour LeoMajor.

J'ai utilisé cela dans #9.

(...)
en gambas3 (une sorte de vba, vb.net), c'est la même chose
(...)

Merci de me signaler ce langage dont j'ignorais l'existence.

Bonne journée.


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne

#21 Le 17/03/2023, à 02:12

ROGER2327

Re : [Résolu] c++ Vérifier qu'une entrée est un nombre entier

Passage en «résolu» (bien que ce ne soit pas tout à fait vrai).
Merci à tous.


Machine personnalisée par laptopwithlinux.com sur la base de Notebook NJ70MU (Clevo),
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz × 8, RAM 32 Go, SSD 500 Go + 1To,
Mesa Intel® Xe Graphics (TGL GT2), Wayland, Ubuntu 22.04.1 LTS,
HP OfficeJet Pro 6230 ePrinter series.

Hors ligne