Effectuer une série d'entrée à la suite en C

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

Effectuer une série d'entrée à la suite en C

par Rockleader » 16 Mar 2014, 11:38

Je cherche à faire quelque chose pour accélérer l'exécution, mais je ne sais pas comment ça peut se coder

Plutot que de faire une boucle qui demanderais un nombre à l'utilisateur jusqu'à ce qu'il sorte de la condition de boucle.

Entrer un nombre: 5 l'utilisateur appuie sur entrée
Entrer un nombre : 4 // etc etc


Je voudrais plutot faire quelque chose du style

ENtrer une série de nombre terminée par le caractère x : 1 4 9 8 7 x et le programme reconnait la suite comme des valeurs indépendantes.

Est ce réalisable ? Si oui comment =)

Merci à vous.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Cliffe
Membre Rationnel
Messages: 967
Enregistré le: 12 Juin 2012, 13:25

par Cliffe » 16 Mar 2014, 17:08

Y'a des forums plus adaptés pour ça.
Jte conseil d'utiliser le C++ ou encore mieux Qt.

Code: Tout sélectionner
// En-têtes //--------------------------------------------------------------------------------------------
#include  // std::cout std::cin
#include    // std::string std::getline
#include    // std::vector
#include   // std:stringstream
#include   // EXIT_SUCCESS

// --------------------------------------------------------------------------------------- // Fonctions //
std::vector func_split_string(const std::string & s, char delim) {
    std::vector elems;
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}

int main() {
    std::string s;
    std::cout  vs = func_split_string(s, ' ');
    for (std::vector::iterator it = vs.begin(); it != vs.end(); ++it)
        std::cout << *it << "\n";
       
    return EXIT_SUCCESS;
}

// Fin //-------------------------------------------------------------------------------------------------

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 16 Mar 2014, 21:24

Bonjour,

Autre solution, tu récupères la chaine de caractère de stdin et tu fais un découpage de la chaine à l'aide de la fonction strtok() puis tu convertis en entier avec atoi / strtol

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 16 Mar 2014, 21:44

Alors, je sais pas si ça marche; mais j'ai testé et ça à l'air de fonctionné

Je fais boucler mon scanf sans appuyé sur entré en séparant les entrées par des espaces et je n'appuis sur entré que lorsque j'ai fini la saisie totale.

Code: Tout sélectionner
do{
     scanf("%d",&nb);
}while(nb !=-1)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 17 Mar 2014, 08:47

Oui cela peut fonctionner, par contre tu as toujours une boucle du coup sur la lecture (et donc ça revient à ton problème précédent) ^^.

De toute façon, tu auras toujours une boucle soit sur la lecture, soit sur le traitement de tes entrées.

Par ailleurs je te propose plutôt une boucle sous cette forme car scanf renvoit le nombre de paramètres qu'il a réussi à lire (ici 1 du coup) :

Code: Tout sélectionner
while (scanf("%d", &entier) != 1) {

}

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 17 Mar 2014, 12:06

C'est noté; mais dans le cas où on laisse l'utilisateur entrer autant de valeur qu'il veut on peut pas utiliser cette forme ;)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 17 Mar 2014, 12:10

Le problème de ta fonction est qu'il est nécessaire de rentrer -1 pour stopper ta boucle. Est-ce le comportement que tu souhaites ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 17 Mar 2014, 12:41

ampholyte a écrit:Le problème de ta fonction est qu'il est nécessaire de rentrer -1 pour stopper ta boucle. Est-ce le comportement que tu souhaites ?



Oui bien sur; puis c'est pas gênant si l'utilisateur veut rentrer -1 dans la liste rien ne l'empêche de faire ça je pense

4 5 -1 6 8 -1 -1

Et on récupérera 4 5 -1 6 8 -1
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 07:03

par ampholyte » 17 Mar 2014, 13:43

Non d'après ton code, tu auras :

4 5 et c'est tout. Ta boucle while détecte nb == -1 donc s'arrête.

C'est pour cette raison que ce que je t'ai proposé plus haut correspond mieux à ce que tu veux je pense.

Pour t'en convaincre il te suffit de faire le test suivant :

Exemple 1 :
Code: Tout sélectionner
int main(void) {
    int nb = 0;
    do {
        scanf("%d", &nb);
        printf("%d\n", nb);
    } while (nb != -1);
     
     return 0;
}

Test : 1 3 5 9 -1 5 7 9 -1 6 4 8
Resultat : 1 3 5 9 -1

Exemple 2 :
Code: Tout sélectionner
int main(void) {
    int nb = 0;
    while (scanf("%d", &nb) == 1) {
        printf("%d\n", nb);
    }

     return 0;
}


Test : 1 3 5 9 -1 5 7 9 -1 6 4 8
Resultat : 1 3 5 9 -1 5 7 9 -1 6 4 8

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 18:42

par Rockleader » 17 Mar 2014, 14:04

Oki dac, j'utiliserais comme ça la prochaine fois alors ;)
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 2 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite