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 :

erreur de syntaxe et valeur invalide?


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut erreur de syntaxe et valeur invalide?
    J'essaie de coder, avec ce que je sais, un programme qui permettrait de faire fonctionner chaque chiffre, 1 par 1, avec l'algorithme de Collatz (ou Syracuse pour que ça parle plus). Je ne sais si mon code est vraiment bon, mais après l'avoir travaillé sur manuscrit, je pense qu'il ne doit plus me manquer grand chose.
    Il y a quand même un petit problème, après compilation mon IDE m'indique 2 erreurs que je n'arrive vraiment pas à retrouver =/.


    Voici donc mon code:




    Et les 2 erreurs:





    Merci d'avance pour votre aide!

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut


    Tu as des balises de code pour poster ton code sur le forum (le signe '#' juste au dessus de là où tu écris ton message).

    Dans ton if il faut faire attention à = et ==.
    = sert pour l'affectation,
    == sert pour la comparaison.

    Pour l'erreur du else c'est que tu n'as pas ouvert d'accolades pour ton if
    Si tu ne mets pas d'accolades il faut qu'il y ai une seule instruction après le if, sinon il faut mettre des accolades.

  3. #3
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 088
    Par défaut
    while(1) ?

    Tu n'as pas trop de probleme pour arreter ton programme ?

    Le mieux serait de faire un booleen "continuer" qui prendrait 1 a l'initialisation et 0 quant tu veux sortir.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    Oui c'est parce que, en fait, l'algorithme de collatz vérifie que pour tout nombre inférieur ou égal a 2 puissance 51, chacun d'entre eux, algorithmé de cette façon arrive à 1 au bout d'un moment, à partir de ce moment le résultat est toujours 1.
    Sauf les ordinateurs n'ont justement pas vérifier au-dessus de ce nombre (2 puissance 51), et moi je voudrais aller au dessus de ça.
    C'est pourquoi, j'ai utilisé la boucle infinie, pour pas avoir a faire une manip a chaque fois (je connais que ça ^^). Mais merci du conseil, je vais en prendre compte =).

    Mon problème maintenant, c'est qu'au début de la boucle, après la première, je veux remplacer le nombreChoisi, par le nombreObtenu.

    C'est à dire, par exemple, si le nombre était pair (nombreChoisi % 2 == 0), on l'a diviser par 2 (nombreChoisi / 2). Sauf que l'algorithme de collatz ne dit pas de re-choisir un nombre à la fin des instructions, c'est le nombre qu'on a obtenu précédemment qu'on doit traiter ensuite dans l'algorithme, et ainsi de suite.

    Là, mon code actuel me traite toujours le même chiffre (nombreChoisi)...
    La première fois c'est bon, mais après je voudrais que ce soit le nombreObtenu après l'opération qui soit traité à la place du premier nombreChoisi.

    J'espère être assez clair, car j'ai pas l'impression xD.

  5. #5
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    (j'ai rien compris )
    Mais si tu veux gérer des grands nombres je t'invite à aller voir du côté de la librairie GMP qui est spécialisé là-dedans si je puis dire ^^

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    Lol non t'inquiètes ça n'a rien à voir avec un grand nombre mon problème, je vais te montrer l'algorithme en langue française et faire le rapprochement pour que tu comprennes mieux :

    "Etape 1: Choisir un nombre entier (donnée, ou entrée)

    Etape 2: Répéter la procédure suivante:

    -Si le nombre est pair, le diviser par 2
    -Si le nombre est impair, le multiplier par 3 puis ajouter 1,
    -Remplacer le nombre du départ par le nombre ainsi obtenu."

    Quand on a choisi un chiffre au départ, par exemple 17, au bout d'un certain moment l'algorithme s'arrête car le résultat est toujours 1.

    Sauf que la dernière instruction de cet algorithme c'est qu'il faut remplacer le nombre du départ par le nombre obtenu après les calculs: c'est avec lui que l'on va recommencer la série de calcul, et ainsi de suite...

    Mon problème: je ne sais pas comment faire pour recommencer ma boucle (en C) avec le chiffre obtenu après les calculs, comme l'algorithme dit de faire..

    ça va là? =)

  7. #7
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Ahhhhh c'est la suite de Collatz ! (je viens de tilter )

    Hé bien dans ta boucle while il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (nombreObtenu != 1)
    Et pour le contenu de la boucle tu fais 2 ifs.
    Le premier pour savoir si le nombre est pair (nombreObtenu % 2 == 0)
    Else : le reste ^^
    Par contre une seule variable suffit

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    Ohh merci beaucoup la boucle marche =D

    Maintenant, ce que je voudrais faire c'est faire marcher chaque chiffre 1 par 1 (1, 2, 3, 4...) avec cette boucle.
    Il faudrait que j'utilise une autre boucle ainsi qu'une incrémentation c'est bien ça ?

  9. #9
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Hé bien il faut que tu englobes ton while avec une boucle for

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    C'est ce que je fait, mais du coup ça ne fait que répeter l'algorithme partant de la valeur 2.



    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        printf("                ///Algorithme de Collatz///\n\n\n\n");
     
     
        int nombreObtenu;
     
    for(nombreObtenu = 1; nombreObtenu > 0; nombreObtenu++)
    {
     
            printf("\nLe nombre qui fonctionnera avec l'algorithme est %d \n", nombreObtenu);
     
            do
            {
     
                if(nombreObtenu % 2 == 0)
                {
                    nombreObtenu = nombreObtenu / 2;
                    printf("%d\n", nombreObtenu);
                }
     
                else
                {
                    nombreObtenu = nombreObtenu * 3 + 1;
                    printf("%d\n", nombreObtenu);
                }
     
     
            } while(nombreObtenu != 1);
    }
     
    }

  11. #11
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Il te faut utiliser une autre variable maintenant
    Tu initialises une variable dans ton for mais tu la modifies ensuite donc ce n'est pas bon
    De plus la condition de ton for est incorrecte !

    Essaye avec ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int nombreObtenu, i;
     
    for(i = 1; i < 10; i++)
    {
    	nombreObtenu = i;

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    La condition est pas incorrect, elle permet juste de créer une boucle infinie, car je suis un gros feignant, je veux pas avoir a toucher au programme toutes les 5 min pour le relancer sachant que je veux le faire marcher jusqu'au nombre 2^51 qui est mega grand xD.

    Sinon le programme marche, merci infiniment =D
    On va pouvoir mettre le topic en résolu ;-)

    Pour le code final ça donne ça:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        printf("                ///Algorithme de Collatz///\n\n\n\n");
     
     
    int nombreObtenu, i;
     
    for(i = 1; i > 0; i++)
    {
        nombreObtenu = i;
     
            printf("\nLe nombre qui fonctionnera avec l'algorithme est %d \n", nombreObtenu);
     
            do
            {
     
                if(nombreObtenu % 2 == 0)
                {
                    nombreObtenu = nombreObtenu / 2;
                    printf("%d\n", nombreObtenu);
                }
     
                else
                {
                    nombreObtenu = nombreObtenu * 3 + 1;
                    printf("%d\n", nombreObtenu);
                }
     
     
            } while(nombreObtenu != 1);
    }
     
    }
    Merci encore et peace à tous ;-)

  13. #13
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Je doute fort que tu ailles jusqu'à 2^51 avec un int
    Il te faut un type sur 8 octets

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    Oo ah ouais c'est vrais j'avais zappé xD
    Il existe quoi comme type sur 8 octets? x)

  15. #15
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Chez moi un long est codé sur 8 octets, chez toi il faut vérifier.
    Sinon tu as le double qui doit sûrement être codé sur 8 octets mais c'est un type flottant ...

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    chez moi un long équivaut à un int =/
    Et sinon pour le double j'a essayé mais j'ai une erreur che-lou xD

    dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(nombreObtenu % 2 == 0)
    il m'indique une erreur avec un truc dans le genre "invalid operands" ou je sais plus quoi... x)

  17. #17
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Pour utiliser le modulo % il faut avoir des nombres entiers.
    Pour faire un modulo sur des nombres flottants il faut utiliser 'fmod' contenue dans math.h
    Mais cela dit je te déconseille d'utiliser le double pour ton application parce que tu vas te retrouver avec plein de problèmes liés aux nombres flottants ...

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    Ouaip' je m'en étais rendu compte =/

    Tu ne saurais pas m'éclaircir sur d'autres types susceptibles d'être codé sur assez d'octet pour que je puisse traiter l'algorithme jusqu'au dessus de 2^51 sans problèmes particuliers? x)

  19. #19
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    2 possibilités :

    1*) Tu utilises la librairie GMP,
    2*) Tu crées toi-même tes fonctions de multiplication, division, addition, modulo (et tout ce dont tu as besoin).

    La 2ème est très instructive

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    la librairie GMP en est une comme math.h c'est ça? ^^

Discussions similaires

  1. Erreur de syntaxe lors de la conversion d'une valeur datetime
    Par info3licen dans le forum Débuter avec Java
    Réponses: 10
    Dernier message: 28/05/2011, 02h31
  2. [Turbo Pascal] [Débutant] Erreur de syntaxe (valeur absolue d'un entier)
    Par yupi_yupi dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 07/10/2010, 22h02
  3. [PHP-JS] Erreur de syntaxe récupération valeur dans variable PHP
    Par sosophie dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/04/2007, 13h33
  4. [Directives] Page blanche quand erreur de syntaxe
    Par syl2095 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 17/02/2006, 16h15
  5. erreur de syntaxe javascript dans ma page
    Par Oluha dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 01/02/2005, 15h53

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