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 :

Emplacement d'un "\n" dans un programme et problème de nombre trop grand


Sujet :

C

  1. #1
    Membre confirmé Avatar de vg-matrix
    Inscrit en
    Février 2007
    Messages
    1 220
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Février 2007
    Messages : 1 220
    Points : 612
    Points
    612
    Par défaut Emplacement d'un "\n" dans un programme et problème de nombre trop grand
    Salut à tous, j'ai écris un programme modulé qui permet de faire la multiplication de 2 nombres entiers par addition entière. Lorsque je place un "\n" (là in diqué dans le code ci-dessus), je n'obtiens pas de résultat et je ne sais pourquoi.
    Ensuite lorsque j'entre des nombres trop grand, j'obtiens un résultat négatif.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include<stdio.h>
    #include<conio.h>
     
    int multi(int x, int y)
    {
      int i,result;
      result =0;
      for (i=0; i<x; i++)
          result=result+y;
      return result;
    }
     
    main()
    {
      int x,y,r;
      clrscr();
     
      x=0;
      y=0;
      r=0;
      scanf("%i",&x);
      printf("X\n");
      scanf("%i",&y); //scanf("%i\n",&y) 
      r=multi(x,y);
      printf("= %i",r);
      getch();
      return 0;
    }
    Il est difficile de retrouver ses erreurs lorsqu'on est persuadé que son code est juste...

    Groupe des développeurs ivoiriens

  2. #2
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour,

    la réponse est dans la FAQ et maintes fois dites sur le forum concernant scanf :
    1. http://c.developpez.com/faq/?page=cl...EN_scanf_fgets
    2. http://c.developpez.com/faq/?page=cl...EEN_gets_fgets
    C'est par l'adresse que vaut le bûcheron, bien plus que par la force. Homère

    Installation de Code::Blocks sous Debian à partir de Nightly Builds

  3. #3
    Membre confirmé Avatar de vg-matrix
    Inscrit en
    Février 2007
    Messages
    1 220
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Février 2007
    Messages : 1 220
    Points : 612
    Points
    612
    Par défaut
    je traite des nombres entiers
    Il est difficile de retrouver ses erreurs lorsqu'on est persuadé que son code est juste...

    Groupe des développeurs ivoiriens

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par vg-matrix Voir le message
    Lorsque je place un "\n" (là in diqué dans le code ci-dessus), je n'obtiens pas de résultat et je ne sais pourquoi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       /* printf("X\n"); */
       printf("%d\n",x);
    Citation Envoyé par vg-matrix Voir le message
    Ensuite lorsque j'entre des nombres trop grand, j'obtiens un résultat négatif.
    (int)(2147483647 + 1) = -2147483648
    (unsigned int)(2147483647 + 1) = 2147483648

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    La réponse de buchs portait sur la première question et l'utilisation de scanf.

    Pour ce qui est de "nombres trop grands => resultats négatifs"...
    Le comportement n'est pas définit dans ce cas et ca retourne des choses "étranges".

    Basiquement, un int permet (généralement) de représenter jusqu'à
    • 2^31-1 nombres positifs et
    • 2^31 nombre négatifs

    Lorsque çà déborde (overflow), ca retourne en général le "reste" de la somme modulo 2^32.
    A défaut de prendre d'avoir des types plus grands (long ou long long en fonction du compilo et/ou de la plateforme), on peut tester que l'addition a + b a débordé en vérifiant a + b < min (a, b).
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017

  7. #7
    Membre confirmé Avatar de vg-matrix
    Inscrit en
    Février 2007
    Messages
    1 220
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Février 2007
    Messages : 1 220
    Points : 612
    Points
    612
    Par défaut
    Lorsque je remplace les int par des unsigned int, j'obtiens toujours des nombres négatifs pour cette opérations et des résultats totalement faux pour d'autres, toute fois les nombres pas très grand fournissent des résultats justes.
    Il est difficile de retrouver ses erreurs lorsqu'on est persuadé que son code est juste...

    Groupe des développeurs ivoiriens

  8. #8
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Salut

    2^31 ca fait jamais que 2 milliards
    et 2^32 ca en fait 4.

    donc des que tu depasses ces valeurs (selon le signe de ta variable) ca pete.

    tu peux ptet essayer avec des double ?
    "vaste programme"

  9. #9
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    pas avec des doubles mais avec des unsigned long long (64 bits). Mais quel est l'intéret de cet exercice?
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par vg-matrix Voir le message
    Salut à tous, j'ai écris un programme modulé ...
    Modulé ?

    Pas très sérieux comme code...
    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
    17
    18
     
    -------------- Build: Debug in hello ---------------
     
    Compiling: main.c
    C:\dev\hello\main.c:3: warning: return type defaults to `int'
    C:\dev\hello\main.c:3: warning: function declaration isn't a prototype
    C:\dev\hello\main.c: In function `main':
    C:\dev\hello\main.c:5: warning: implicit declaration of function `clrscr'
    C:\dev\hello\main.c:10: warning: implicit declaration of function `scanf'
    C:\dev\hello\main.c:11: warning: implicit declaration of function `printf'
    C:\dev\hello\main.c:13: warning: implicit declaration of function `multi'
    C:\dev\hello\main.c:15: warning: implicit declaration of function `getch'
    Linking console executable: bin\Debug\hello.exe
    obj\Debug\main.o: In function `main':
    C:/dev/hello/main.c:13: undefined reference to `_multi'
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)
    1 errors, 7 warnings
    ceci est correct :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    #include <stdio.h>
    #include <limits.h>
     
    static int multi (int a, int b)
    {
       return a * b;
    }
     
    int main (void)
    {
       int n;
       int x;
       int err;
       do
       {
          printf ("x : ");
          n = scanf ("%d", &x);
          getchar ();
          err = (unsigned) x > INT_MAX;
     
       }
       while (n != 1 || err);
     
       {
          int y;
          do
          {
             printf ("y : ");
             n = scanf ("%d", &y);
             getchar ();
             err = (unsigned) y > INT_MAX;
          }
          while (n != 1 || err);
     
          {
             int r = multi (x, y);
             if ((unsigned) r <= INT_MAX)
             {
                printf ("%d x %d = %d\n", x, y, r);
             }
             else
             {
                printf ("overload !\n");
             }
          }
       }
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    2
    3
    2 x 3 = 6
     
    Process returned 0 (0x0)   execution time : 3.098 s
    Press any key to continue.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    x : 11111
    y : 22222
    11111 x 22222 = 246908642
     
    Process returned 0 (0x0)   execution time : 5.901 s
    Press any key to continue.
    Pose des questions si tu ne comprends pas.
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre confirmé Avatar de vg-matrix
    Inscrit en
    Février 2007
    Messages
    1 220
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Février 2007
    Messages : 1 220
    Points : 612
    Points
    612
    Par défaut
    Excusez moi pour le terme mais je veux parler d'un découpage en procédure.
    Il est difficile de retrouver ses erreurs lorsqu'on est persuadé que son code est juste...

    Groupe des développeurs ivoiriens

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par vg-matrix Voir le message
    Excusez moi pour le terme mais je veux parler d'un découpage en procédure.
    Tu fais trop de Delphi ! Contrairement au Pascal, en C les notions de 'procédures' et de 'fonctions' ne sont pas différenciées. On dit 'découpage en fonctions'.
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 7
    Points : 8
    Points
    8
    Par défaut
    essayé le type longdouble et tou va bien

Discussions similaires

  1. [vbnet 1.1]Inserer deux simple quote sans texte dans une db
    Par ChristopheOce dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/03/2007, 08h51

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