[C] Un petit problème à résoudre

Discussion dans 'Web, design' créé par Machiavel666, 18 Décembre 2003.

Statut de la discussion:
Fermée.
  1. Offline
    Machiavel666 ex membre
    Voilà une mini énigme juste pour le fun.
    Normalement c'est pas trop dur:

    Réaliser une fonction en C qui doit saisir un certain nombre d'entier par exemple puis qui les affiche en sens inverse.
    Bon évidemment là c'est trop facile...
    Pour corser les choses, vous n'avez pas le droit de stocker ces entiers dans un tableau, ni dans une liste chainée.

    En gros chaque entier doit être dans une variable unique.

    Le but n'est pas de garder en mémoire tous les nombres, mais simplement de les afficher.

    Enfin, le nombre d'entiers à sasir doit être passé en paramètre.

    Voici en gros la déclaration de la fonction:
    void fonction(int nbrDEntierASaisir);

    Et un exemple d'utilisation (avec fonction(4) ):
    L'utilisateur entre 5 9 4 7 et le prog affiche 7 4 9 5

    Si j'ai pas assez détaillé, il suffit de demander.
    Machiavel666, 18 Décembre 2003
    #1
  2. Offline
    oui bon => chaîne de caractère...
    On stocke tout dans un char *, on l'inverse et on l'affiche.
    TITM4v3rick, 18 Décembre 2003
    #2
  3. Offline
    Araubas Mr Usant
    OUi ... ca me semble aussi simple que ca....
    Tu peux faire joli en définissant un séparateur dans ta chaine de char (autre chose que chr(0)).

    Pour le reste... pas de difficulté particulière.

    Si tu veux la jouer TRES élégante, voici ma petite solution:
    Tu définis deux entiers en global, et tu ajoutes les nombres entiers alternativement à l'un, puis à l'autres.
    ex:
    soit les deux variables a et b, et l'utilisateur encode 5 9 4 7
    donc a et b seront égales successivement à

    a b
    5 0
    5 9
    9 9
    9 16

    pour depiller les nombres, tu fait comme ceci:
    comme le nombre d'entrée est pair (4), tu obtiens le premier nombre en partant de b-a (a contrario a-b si impair), et tu cycle les opérations suivantes:


    affichage = b - a
    b = b - (b-a)
    next


    et si impair:

    affichage = a - b
    a = a - (a-b)
    next

    les deux derniers résultat sont b et a ( ou a et b)
    et voiliiiii

    tout ca sur deux entiers en tout et pour tout :)

    facile non ?
    Araubas, 18 Décembre 2003
    #3
  4. Offline
    gogoprog Oprahiste vaudou
    ouai mais il veut que chaque entier soit dans une variable unique
    gogoprog, 18 Décembre 2003
    #4
  5. Offline
    zoheir cvm.mangaleet()
    euh je crois que tu n'a pas tout compris :s

    Le problème de cet exercice c'est qur justement tu ne peux stocker dans une chaine de caract. mais uniquement dans des variables.
    zoheir, 18 Décembre 2003
    #5
  6. Offline



    Je ne stocke pas d'entiers dans un tableau ni dans une liste
    TITM4v3rick, 18 Décembre 2003
    #6
  7. Offline
    Machiavel666 ex membre
    TITM4v3rick :
    Désolé mais par définition une chaîne de caractère, c'est juste un tableau dans lequel du stock des char au lieu de int, short ou long et qui se termine par le caractère '\0'.
    De toute façon, la norme du C définit le type char comme un ENTIER de petite taille (en général c'est un octet de toute façon).

    La solution de _Turlutte_ semble en effet plus élégante (je n'avais absolument pas pensé à ça mais j'aime beaucoup).

    Bon je vous livre une autre façon de le faire. Elle utilise le principe de récursivité.
    Voici la fonction en pseudo langage:

    <vide> FONCTION ( <entier> nombre)
    {
    < lire x >

    si (nombre > 1)
    <appel de FONCTION (nombre - 1) >

    < écrire x >
    }


    En C :

    void fonction (int nbr)
    {
    int x;
    scanf (" %d",&x);

    if (nbr > 1)
    fonction(nbr-1);

    printf (" %d",x);
    }
    Machiavel666, 18 Décembre 2003
    #7
  8. Offline
    zoheir cvm.mangaleet()
    ici tu dis le contraire, stockage dans une chaine de caract.
    zoheir, 18 Décembre 2003
    #8
  9. Offline
    ben tu dis pas stocker dans un tableau d'entier.
    alors hop dans une chaîne de caractères puis strrev et voili voulu...
    TITM4v3rick, 18 Décembre 2003
    #9
  10. Offline
    zoheir cvm.mangaleet()
    Il a dit variable entière uniquement ;), donc toute chaîne à proscrire :roll:
    zoheir, 18 Décembre 2003
    #10
  11. Offline

    euh , t'es gentil mais on est obligé de stocker qlq part...
    Fonction récursive => sur la pile avec "à chaque nouvelle instance de tour d'algo" construction et destruction d'un objet int local => en mémoire ...


    Si vous voulez la jouer un peu "magic" => getchar()
    TITM4v3rick, 18 Décembre 2003
    #11
  12. Offline
    Machiavel666 ex membre
    Si j'avais su, j'aurai pas posté.

    Le but était pas de se bouffer la gueule sur la définition d'une chaîne de caractère par rapport à un simple tableau d'entier.

    C'est juste pour le plaisir de trouver des solutions pas habituelles à un problème.
    Machiavel666, 18 Décembre 2003
    #12
  13. Offline
    bah, si t'appelles ça se bouffer la gueule, ben que dirais-tu des "courses algorithmiques" entre profs/élèves ? :D
    TITM4v3rick, 18 Décembre 2003
    #13
  14. Offline
    zoheir cvm.mangaleet()
    Je n'ai pas dit le contraire :roll:
    zoheir, 18 Décembre 2003
    #14
  15. Offline
    Araubas Mr Usant
    J'viens de vérifier ma solution ... et ca marche pas ... y'a un chtite n'erreur pas juste ... donc OUBLIE :)

    :roll:
    Araubas, 18 Décembre 2003
    #15
  16. Offline
    Xaab Touriste
    Voilà ce que je me suis amusé à faire :)
    Mais est-ce autorisé ?
    Exécutable (tapez 999 pour quitez): Soluce ?
    Je sais: le prog a un ptit bug. Et 500 ko pour faire trois fois rien. Ben mazette !!! Le basic fait beaucoup mieux.
    Xaab, 19 Décembre 2003
    #16
  17. Offline
    horrible ce code. Rempli de bug...
    On ne joue pas avec des pointeurs comme ça.




    Je me rend compte que je suis un peu saligaud en ne te disant pas où... en fait tu joues avec des pointeurs et des références, mais tu mélanges un peu la notion...

    Le pointeur pointe vers un objet d'un type primitif ou un type classe/struct définit par le pgmeur.

    Il ne faut pas non plus oublier d'allouer dynamiquement les objets, sinon tout ce que tu fais ce sont des partages de mémoire => bombes à retardement.

    (note : si tu alloues, faut pas oublier de désallouer...)

    Attention de ne pas faire un int * nombres = new int[X]; car là tu jouerais avec un tableau, et donc tu ne répondrais pas à la question...
    TITM4v3rick, 19 Décembre 2003
    #17
  18. Offline
    Xaab Touriste
    C'est clair que je le trouve pas terrible non plus. hihi. Voir j'me demande comment ça arrive à pas planter XP. Vu que c'est un peut comme la fonction Poke du Basic. J'ai d'autres idées. Mais il faut que je trouve certaines fonctions qui me sont encore inconnues. :)
    Xaab, 19 Décembre 2003
    #18
  19. Offline
    Araubas Mr Usant
    Euuhh tu aurais pas travaillé chez Microsoft toa ?
    Araubas, 20 Décembre 2003
    #19
  20. Offline
    aerox ex membre
    omG what a roxor :p
    aerox, 21 Décembre 2003
    #20
Statut de la discussion:
Fermée.