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 :

échange nombre, sans variable intermédiaire.


Sujet :

C++

  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut échange nombre, sans variable intermédiaire.
    Bonsoir,

    J'essaye de programmer cet algorithme. Sur ce chapitre, j'ai appris à échanger les variables, déclarer/affecter une variable, afficher du texte, les chaines de caractère (string), les opérations. Avec le langage de programmation C++
    Pouvez-vous m'aider svp.

    J'ai du mal à échanger les nombres sans variables intermédiaires. Mais j'ai essayé

    Voici l'énoncé:
    Ecrire un programme qui demande à l'utilisateur deux nombres, les affiches, les échange, et les ré-affiche, après échange, mais sans utiliser de variable intermédiaire. On pourra utiliser une addiction et une soustraction pour ne rien perdre.

    Mes difficultés c'est que je n'arrive pas à tâtonner un peu mais avec + et -.

    Pouvez-vous m'éclairer svp ?

    Merci d'avance
    Bonne soirée

  2. #2
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut
    J'ai essayé mais je ne sais pas si je réponds totalement à la consigne

    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
    #include <iostream>
    #include <string>
    using namespace std;
     
    int main()
    {
        int a, b; 
        cout << "Saisir deux nombres" << endl; 
        cin >> a >> b; 
        a=a+b;
        b=a-b;
        a=a-b;
        cout << a << b << endl;
     
        return 0;
    }

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Oui ton échange échange fonctionne. Donc à partir de là, pourquoi tu n'aurais pas répondu à la question?

  4. #4
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2013
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2013
    Messages : 10
    Par défaut
    Citation Envoyé par darkman19320 Voir le message
    Oui ton échange échange fonctionne. Donc à partir de là, pourquoi tu n'aurais pas répondu à la question?
    La consigne m'embrouille 'les échange, ré-échange......"

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Tu dois simplement saisir deux nombres, les afficher, les échanger puis les réafficher... c'est tout

  6. #6
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    Salut,

    Citation Envoyé par OlympeGeekette Voir le message
    J'ai du mal à échanger les nombres sans variables intermédiaires.
    Ce n’est pas possible sans risque.
    Il y a bien la technique du XOR swap (mais si les deux valeurs sont identiques, tu as perdu) ou à base d’addition et soustraction comme le demande l’exercice (mais là gare aux overflow).
    Et en plus c’est généralement moins performant (du moins sur processeur Intel de bureau).

    Citation Envoyé par OlympeGeekette Voir le message
    J'ai essayé mais je ne sais pas si je réponds totalement à la consigne

    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
    #include <iostream>
    #include <string>
    using namespace std;
     
    int main()
    {
        int a, b; 
        cout << "Saisir deux nombres" << endl; 
        cin >> a >> b; 
        a=a+b;
        b=a-b;
        a=a-b;
        cout << a << b << endl;
     
        return 0;
    }
    Oui, le code est correct du point de vue de l’exercice.
    Par contre je voudrai te mettre en garde sur le risque d’overflow si les nombres à échanger sont trop grand.
    Et les overflow sur des nombres signés c’est un comportement indéfini.
    Exemple avec ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    % g++ -o foo foo.cpp                                                                 
    % ./foo               
    Saisir deux nombres
    2147483647 1                      
    1 2147483647
    % clang++ -o foo foo.cpp
    % ./foo                   
    Saisir deux nombres
    2147483647 1
    1 2147483647
    Ça semble ok, maintenant on va utiliser quelques options de clang bien sympathique, et voilà le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    % clang++ -fsanitize=undefined-trap -fsanitize-undefined-trap-on-error -o foo foo.cpp
    % ./foo                                                                                
    Saisir deux nombres
    2147483647 1
    zsh: illegal hardware instruction (core dumped)  ./foo
    Et si on veut une trace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    % clang++ -fsanitize=undefined-trap -o foo foo.cpp 
    % ./foo                                             
    Saisir deux nombres
    2147483647 1
    foo.cpp:10:8: runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int'
    foo.cpp:11:8: runtime error: signed integer overflow: -2147483648 - 1 cannot be represented in type 'int'
    foo.cpp:12:8: runtime error: signed integer overflow: -2147483648 - 2147483647 cannot be represented in type 'int'
    1 2147483647
    Donc oui, ton code est correct vis à vis de l’exercice
    Mais dans la « vraie vie », si tu veux échanger deux variables je te conseille de faire comme ça :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
     
    int main()
    {
        int a, b;
     
        std::cout << "Saisir deux nombres\n";
        std::cin >> a >> b;
        std::swap(a, b);
        std::cout << a << ' ' << b << '\n';
     
        return 0;
    }

Discussions similaires

  1. Permuter deux variables sans variable temporaire
    Par khayyam90 dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 09/01/2015, 08h02
  2. [Débutant][Math] Afficher un nombre sans exposant
    Par tanguy dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 24/09/2012, 13h58
  3. Réponses: 2
    Dernier message: 05/03/2012, 16h31
  4. [SGBD] mysql_close() : Utile sans variable dans les () ?
    Par psychoBob dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/01/2006, 21h08
  5. Fonction Execlp avec nombre parametres variable
    Par laurent_ifips dans le forum C
    Réponses: 3
    Dernier message: 25/11/2005, 20h14

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