Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercices pour débutants en C

Au menu : zSommeChiffres (nombres, algo)

10 janvier 2010 à 21:01:26

Citation : Pouet_forever


Et pour que ça soit plus lisible tu pourrais étaler sur plusieurs lignes parce que scroller juste pour une fonction c'est pas terrible :D

sprintf(buf, "%s%s%s ", (i != 0 && src[i-1] != '0' &&
						 (val != 1 || (1 == val && (src[i-1]-'0' == 8 || src[i-1]-'0' == 9))))?"-":"",
		(i != 0 && 1 == val && src[i-1] != '0' && src[i-1]-'0' != 8 && src[i-1]-'0' != 9)?" et ":"",
		(i != 0 && (7 == src[i-1]-'0' || 9 == src[i-1]-'0') && val < 7)? unites_irr[val-1] : unites[val]);


C'est même pas la question de scroller ou pas, un code pareil est certes concis mais illisible et par voie de conséquence difficile à déboguer et à modifier. N'oublions pas qu'on est sur un forum didactique et parcouru par des programmeurs en cours d'apprentissage du C et donc le code proposé doit enseigner quelque chose.
  • Partager sur Facebook
  • Partager sur Twitter
10 janvier 2010 à 21:58:36

Citation : zoom751

Dommage qu'on ne précise pas les notions a connaitre pour faire tel exercice



Parce que finalement cela en demande peu... :)
Regarde les codes(je ne parle pas de celui de Lithrein.).

Tu es d'accord qu'on n'emploie pas de notions avancées.
Ce qui est compliqué, ici, c'est de prendre du recul par rapport à l'exercice.

Ensuite, je suis d'accord que pour un débutant, entendre parler de Valgrind, segfault et autres peu faire peur. Mais là, on n'est plus dans la résolution de l'exercice.
Je persiste à penser qu'une personne qui a vu les chaînes de caractères, a toutes les notions de C pour aborder cet exercice.

Après, c'est sur, ça ne ce fait pas en 5 mn...

Mais promis, le prochain, sera beaucoup, beaucoup plus simple. :)
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
10 janvier 2010 à 22:24:26

Citation : GurneyH


Tu es d'accords qu'on emploie pas de notions avancées.



Mon avis : l'exercice est difficile. Parce que d'abord, il faut gérer de nombreux cas et qu'il y a un algorithme à construire, et que si on n'a pas l'habitude, ça devient vite un sac de noeuds. Pour faire l'exo comme il faut, il faut posséder un certain nombre de tours de main qui ne s'acquièrent qu'avec le temps (appeler truc[5] pour obtenir "cinq" ou allouer sans cesse des buffers ou encore savoir découper habilement des tâches en fonctions C). Rien que la question de découper un nombre en tranches de trois chiffres à partir de sa droite n'est pas évidente à faire proprement, et à cette occasion, se pose l'allocation de la zone qui va contenir les tranches et qu'on doit trimbaler de fonction en fonction. Par ailleurs, il faut être à l'aise avec strcpy et strcat et donc un peu avec les pointeurs. Faut faire attention à ne pas modifier des chaînes sans précautions, etc. D'ailleurs, personne n'a réussi à faire un code propre du premier coup, il a fallu sans cesse rectifier des erreurs (même moi dans mon coin), il suffit d'ailleurs de lire les messages précédents. Pour donner des TP de C à des étudiants en info, je peux vous assurer que cet exercice sera absolument non trivial pour la majorité des étudiants, d'ailleurs, je vais le tester cette année.
  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 16:48:25

Tout débord je tien a remercier Sherman pour son initiative…
Seulement c’est le bordel, tout le monde pose leur code a gauche a droite on peux vraiment vite être largué
Ensuite tout les débutants qui consulte se topic ont suivit les tutos de M@teo21
Et étant sur le site du zero il serait plus claire de mette la liste des chapitres
Ecrit par M@teo21 a connaitre avant de pouvoir aborder tel exercice
Et surtout chaque personne qui rencontre a un problème avec un exercice pose sont problème sur le forum du C pour filtré les cas c'est-à-dire que le topic des exercices présente l’énoncé et la solution .-
Enfin pour terminé pour avoir des exercices de qualités (c'est-à-dire assez simple mais qui font vraiment réfléchir, sans avoir de notion supplémentaire pas mentionné)
C’est sur que cela ne peux être réalisable que par une personne qui a déjà fait une fonction un débutant ou un expert et qu’il se dit , tien cette fonction est assez intéressante, je devrai la proposé pour en faire un exercice
Je voix pas comment une seule personne peux avoir toute les deux semaines une idée d’exercice de qualité
  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 17:48:40

Citation : zoom751

il serait plus claire de mette la liste des chapitres Ecrit par M@teo21 a connaitre avant de pouvoir aborder tel exercice


Pour résumer, et être claire, il faut lire tout le tuto avant de venir ici pour faire des éxos.
Et puis l'idée de ce topic est de proposer des exercices de réflexion, et non d'application.
Par là je veux dire que l'idée de ce topic n'est pas du genre : j'ai fini le chapitre des pointeurs, alors je devrai pouvoir faire cet exo.
Non, il faudra tout finir, avant de vouloir faire des exos, car ils nécessitent en gros toutes les notions vues dans le tuto (et des fois un peu plus).
  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 20:54:46

Citation : zoom751

Tout débord je tien a remercier Sherman pour son initiative…
Seulement c’est le bordel, tout le monde pose leur code a gauche a droite on peux vraiment vite être largué
Ensuite tout les débutants qui consulte se topic ont suivit les tutos de M@teo21
Et étant sur le site du zero il serait plus claire de mette la liste des chapitres
Ecrit par M@teo21 a connaitre avant de pouvoir aborder tel exercice
Et surtout chaque personne qui rencontre a un problème avec un exercice pose sont problème sur le forum du C pour filtré les cas c'est-à-dire que le topic des exercices présente l’énoncé et la solution .-
Enfin pour terminé pour avoir des exercices de qualités (c'est-à-dire assez simple mais qui font vraiment réfléchir, sans avoir de notion supplémentaire pas mentionné)
C’est sur que cela ne peux être réalisable que par une personne qui a déjà fait une fonction un débutant ou un expert et qu’il se dit , tien cette fonction est assez intéressante, je devrai la proposé pour en faire un exercice
Je voix pas comment une seule personne peux avoir toute les deux semaines une idée d’exercice de qualité



Ton message est confus et mal écrit, à la limite du lisible. Tu poses néanmoins un problème de fond : la connexion qui doit exister entre les exercices et le cours. Je trouve que le lien doit être fort, c'est-à-dire que les exercices (l'énoncé comme le corrigé) doit être mis en relation avec le cours voire même se référer au cours.

Citation : Arthurus


Pour résumer, et être claire, il faut lire tout le tuto avant de venir ici pour faire des éxos.



Ceux qui apprennent le C via le tuto ont besoin d'un endroit où ils peuvent s'entraîner et en recevant des conseils. On peut très bien croire qu'on a compris le Cours (et même avoir vraiment compris le Cours) et être incapable de l'appliquer à des situations, rien que ce parce que déjà on n'a pas l'imagination pour le faire.




Citation : Arthurus


Par là je veux dire que l'idée de ce topic n'est pas du genre : j'ai fini le chapitre des pointeurs, alors je devrai pouvoir faire cet exo.



Moi je trouve que si, en tous cas, il faudrait une place pour ceux qui veulent faire ça.


Citation : Arthurus


Non, il faudra tout finir, avant de vouloir faire des exos, car ils nécessitent en gros toutes les notions vues dans le tuto (et des fois un peu plus).



Non, il est tout à fait possible de trouver des exos adaptés à tel ou tel chapitre. Évidemment, ça nécessite une certaine expérience, une certaine réflexion et un certain travail de recherche de la part de l'auteur des exercices.

Le tout est de choisir ce que l'on veut faire : résoudre en C des exos d'algorithmique ou apprendre le C. Ce sont des choses complètement différentes.

  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 21:06:34

@Candide : Ça dépend de comment on voit ce topic.
Moi je le vois comme un endroit où les gens qui ont fini la phase de lecture du tuto, puis ont fait les ptits exos qui y sont proposés (tri, manip de chaines...), pourront trouver des exos pour s'entrainer.

Toi tu le vois (d'après ce que j'ai compris) comme un endroit qu'on devrait visiter à chaque fois que l'on finirait la lecture d'un chapitre.

Ce sont deux points de vue différents.
Et pour le moment, c'est plutôt le mien qui est appliqué.

Donc si on voudrait appliquer ce que tu veux faire, il faudra changer radicalement la stratégie de ce topic.
  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 21:07:54

Les exo devrait être adapté à l'apprentissage du c

Citation : candide

Le tout est de choisir ce que l'on veut faire : résoudre en C des exos d'algorithmique ou apprendre le C. Ce sont des choses complètement différentes.

Si possible les deux en même temps, et c'est là se que j'appelle un exercice de qualité Et je le répète je pense que se genre d'exercice s'imagine pas mais se rencontre par asar dans l'expériences d'un programmeur mais bon si certainne personne avec beaucoups d’imagination arrive à imaginé ça :)

Par exemple une simple fonction pour trier les nombres en ordre croissant d’un tableau c’est simple et efficace (un des exercices du tuto de Màteo21)
Apprentissage du c + algo nikel


  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 21:15:26

Citation : zoom751

Si possible les deux en même temps, et c'est là ce que j'appelle un exercice de qualité Et je le répète je pense que ce genre d'exercice s'imagine pas mais se rencontre par hasard dans l'expérience d'un programmeur mais bon si certaines personnes avec beaucoup d’imagination arrivent à imaginer ça :)



Sinon :

Citation : zoom751


Par exemple une simple fonction pour trier les nombres en ordre croissant d’un tableau c’est simple et efficace (un des exercices du tuto de Màteo21)
Apprentissage du c + algo nikel


À quoi bon poser un exo qui est déjà sur le tuto ?!!
Si tu veux de l'aide dessus, utilise plutôt le forum.
  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 21:16:48

Sinon je m'excuse mais allez sur un site de jeux flash et essayé de refaire les jeux qui vous plait en C Ensuite venez sur se topic posé vos question tous en même temps comme ça on il y aura plus rien de claire , c'est un peux ça la strategie là , et inventé des exercices dans se cas là ont peux en sortir à l'infinie, avec des fois des notions qu'on doit connaitre qui corresponde pas à un débutant mais bon c'est pas grave
  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 21:25:46

Citation : Arthurus

À quoi bon poser un exo qui est déjà sur le tuto ?!!
Si tu veux de l'aide dessus, utilise plutôt le forum.


Comment ?
C'etait seulement pour l'exemple :(
  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 21:32:30

Si tu n'as ni la maîtrise du langage, ni la maitrise de l'algo, comment veut-tu faire quelque chose ? Ca va en décourager plus d'un !
Le but de ce topic est de faire appliquer ce qui est vu dans le tuto, pas d'apprendre à faire de l'algo !

Si tu veux discuter de ça, GurneyH avait créé un topic pour discuter des exercices. Je te propose de remonter le topic afin de ne pas polluer celui-là inutilement ;)
  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 21:37:26

Après tout vous êtes libre de faire se que vous voulez
Veuillez m'excuser pour la gène occasionné
Je vais a la recherche d'exercice pour apprendre le c et l'algho...
Je doit avouer que la premiere phrase du premier commentaire en arrivant ma perturber

Citation : shareman

Vous apprenez le langage C ? Parfait, c'est ici qu'on s'entraîne !

  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 21:44:17

Ce post a le mérite d' exister. C est pas parce qu on est pas capable de faire les exos ( C est mon cas) qu il est mauvais! Par contre il est bien d' essayer de comprendre la démarche de certains pour progresser......
  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2010 à 23:01:04

Citation : zoom751

Je doit avouer que la premiere phrase du premier commentaire en arrivant ma perturber

Citation : shareman

Vous apprenez le langage C ? Parfait, c'est ici qu'on s'entraîne !


La phrase n'est pas en contradiction avec l'esprit actuel du topic. Mais si y'a mieux à mettre, je suis naturellement ouvert aux propositions.
  • Partager sur Facebook
  • Partager sur Twitter
12 janvier 2010 à 4:16:40

:-° la vache.

Clairement, je me suis trompé avec l'exercice proposé, j'ai sous-estimé la difficulté mea culpa, je compte rectifier le tir.

Citation : shareman

Citation : zoom751

Je doit avouer que la premiere phrase du premier commentaire en arrivant ma perturber

Citation : shareman

Vous apprenez le langage C ? Parfait, c'est ici qu'on s'entraîne !


La phrase n'est pas en contradiction avec l'esprit actuel du topic. Mais si y'a mieux à mettre, je suis naturellement ouvert aux propositions.



Je pense que ce ne sera pas nécessaire.

Citation : zoom751


Je vais a la recherche d'exercice pour apprendre le c et l'algho...



Il n'y a pas assez de C pour toi dans l'exercice courant? Pas assez d'algo non plus. o_O

Mon avis sur l'orientation, j'en ai déjà parlé, et ce sera la dernière!
Des exercices pour vrais débutants, on en trouve à chaque coin de site sur le web. Par contre, à un certain stade, c'est plus dur.
Regarde ma signature et jette un oeil sur les liens du bas.(beaucoup d'algo, peu de C!).

Il continuera à y avoir des exercices pour les plus avancés(pas que pour eux!)

Citation : zoom751

Je voix pas comment une seule personne peux avoir toute les deux semaines une idée d’exercice de qualité


Ca dépend, je peux proposer un exercice de tri tous les 15 jours. :-°
Tu doutes apparemment de ma(déjà, je ne suis pas seul) capacité à proposer des exercices, c'est ton droit.
Seulement, laisse passer au moins quelques semaines, avant d'émettre un avis définitif!

Je vais tenir compte de 2 de tes remarques:
  • Je préciserai le niveau d'avancement dans le tuto nécessaire pour chaque exercice(fait pour l'exercice actuel...)
  • On va essayer de s'organiser pour que ce soit moins anarchique qu'actuellement.


Sinon, j'en profite pour rappeler que ceux qui ont des idées d'exercices peuvent toujours me MP, même si j'ai de quoi tenir un bon moment. ;)
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
12 janvier 2010 à 12:59:40

Citation : GurneyH

Je vais tenir compte de 2 de tes remarques:
Je préciserai le niveau d'avancement dans le tuto nécessaire pour chaque exercice(fait pour l'exercice actuel...)
On va essayer de s'organiser pour que ce soit moins anarchique qu'actuellement.



C'est déjà beaucoup :)

(comme ça je serai ou allez quand j'aurai fini les tutos de M@teo21)

bonne chance et bonne continuation a vous, encore désolé pour la pollution du topic
  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2010 à 14:39:21

Citation : candide

Citation : Pouet_forever


Et pour que ça soit plus lisible tu pourrais étaler sur plusieurs lignes parce que scroller juste pour une fonction c'est pas terrible :D

sprintf(buf, "%s%s%s ", (i != 0 && src[i-1] != '0' &&
						 (val != 1 || (1 == val && (src[i-1]-'0' == 8 || src[i-1]-'0' == 9))))?"-":"",
		(i != 0 && 1 == val && src[i-1] != '0' && src[i-1]-'0' != 8 && src[i-1]-'0' != 9)?" et ":"",
		(i != 0 && (7 == src[i-1]-'0' || 9 == src[i-1]-'0') && val < 7)? unites_irr[val-1] : unites[val]);



C'est même pas la question de scroller ou pas, un code pareil est certes concis mais illisible et par voie de conséquence difficile à déboguer et à modifier. N'oublions pas qu'on est sur un forum didactique et parcouru par des programmeurs en cours d'apprentissage du C et donc le code proposé doit enseigner quelque chose.



De manière à être plus dans l'esprit didactique du forum, j'ai refais une version de ma solution. Il y a vraiment beaucoup (trop) de commentaires de manière à que la plupart puisse suivre.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char const * const unites[]     = {"zero", "un", "deux", "trois", "quatre", "cinq", "six", "sept", "huit", "neuf"};
char const * const unites_irr[] = {"onze", "douze", "treize",  "quatorze", "quinze", "seize"};
char const * const dizaines[]   = {"dix", "vingt", "trente",  "quarante", "cinquante", "soixante", "soixante", "quatre-vingt", "quatre-vingt"};
char const * const centaines[]  = {"cent", "mille", "million", "milliard", "billion", "trillion", "quatrillion", "quintillon"};

void
error (char * msg) {
    fprintf(stderr, "Erreur : %s.\n", msg);
}

char*
removeZeroes (char * s) {
 while (*s == '0')
        ++s;

    return s;
}

void
trim (char * s) {
    int i, j;

    for (i=j = 0; s[i] != '\0'; i++) {
        s[j] = s[i];
        if (s[i] != ' ')
            j++;
    }
    s[j] = '\0';
}

void
_centaine (char * src, char * dst, int index) {
    int centaine = *src-'0';
    int dizaine = *(src+1)-'0';
    int unite = *(src+2)-'0';

    if (centaine > 1) {
        strcat(dst, unites[centaine]);
        strcat(dst, " ");
    }
    strcat(dst, "cent");

    if (index != 2 && centaine > 1 && 0 == dizaine+unite) { /* Doit-on rajouter un 's'  */
        strcat(dst, "s");
    }
}

/**
 * Retourne irr
 * irr = 0 => pas d'irregularite
 * irr = 1 => sauter les unitees
 * irr = 2 => unitees irregulieres (onze, douze, ...)
 */
int
_dizaine (char * src, char * dst, int index) {
    int irr = 0;
    int dizaine = *src-'0';
    int unite = *(src+1)-'0'; /* Equivalent a : src[1]-'0'  */

    if (dizaine != 0) {
        if (7 == dizaine || 9 == dizaine || (dizaine == 1 && 0 < unite && unite < 7)) { /* Les unites seront-elles irrégulières ? */
            irr = 2;
        }

        if (!(dizaine == 1 && 0 < unite && unite < 7)) {
            /* la dizaine ne vaut pas 1 et unite n'appartient pas à l'intervalle ]0, 7[ */
            strcat(dst, dizaines[dizaine-1]);
        } else {
            /* Cas de onze, ..., seize */
            strcat(dst, unites_irr[unite-1]);
            irr = 1; /* On doit donc sauter les prochaines unites */
        }

        if ( !(0 < unite && unite < 7) && (7 == dizaine || 9 == dizaine)) { /* Soixante-dix et quatre-vingt-dix */
                strcat(dst, "-dix");
                irr = 0;
            }

        if (0 == unite) {
            irr = 1; /* On saute les unites puisque elles sont nulles */
            if (8 == dizaine && index != 2) { /* On n'a pas affaire à qatre-vingt mille :  */
                strcat(dst, "s");
            }
        }
    }

    return irr;
}

void
_unite (char * src, char * dst, int dizaine, int irr) {
    int unite = *src-'0';

    if (unite != 0) {
        if (0 == dizaine) {
            strcat(dst, unites[unite]);
        } else {
            if (1 == unite) {
                if (8 == dizaine || 9 == dizaine) { /* quatre-vingt-un et quatre-vingt-onze */
                    strcat(dst, "-");
                } else {
                    strcat(dst, " et ");
                }
            }
            if (unite != 1) {
                strcat(dst, "-");
            }
            if (2 == irr) {
                    strcat(dst, unites_irr[unite-1]);
            } else {
                strcat(dst, unites[unite]);
            }
            
        }
    }

}

char*
z0zero (char * src, char * dst) {
    int index; /* Sert à savoir sur quel bloc on travail, centaines, milliers, millions, etc, ...  */
    int SIndex; /* Sert à savoir si on travaille sur une unite (=0), une dizaine (=1), une centaine (=2)  */
    char * tmp, * for_free; /* Copie de src */
    int irr;
    size_t len, i;
    div_t blocks;

    tmp = malloc (strlen(src)+1); /* Sous entendu : sizeof(char) = 1  */
    if (NULL == tmp) {
        error("Malloc a flanche");
        return NULL;
    }
    for_free = tmp; /* On sauvegarde l'adresse a liberer plus tard */
    
    strcpy(tmp, src); /* Et hop, j'ai les droits d'ecriture  */
    trim(tmp);
    tmp = removeZeroes(tmp);
    len = strlen(tmp);
    dst[0] = '\0';

    if (0 == len) {
        sprintf(dst, "%s", unites[len]);
        free(for_free);
        return dst;
    }
    if (len > 3*8) {
        error("Nombre trop grand");
        dst = NULL;
        free(for_free);
        return dst;
    }

    blocks = div(len, 3);
    index = (blocks.rem > 0) ? blocks.quot+1 : blocks.quot; /* equivalent a : ceil(len/3)  */
    SIndex = len-3*(index-1)-1; /* 0 : unite, 1 : dizaine, 2 : centaine  */

    for (i = 0 ; tmp[i] ; ++i) {
        int centaine, dizaine, unite; /* Ne pas confondre avec les chaine globales (leurs noms se finissent par s)  */
        centaine = dizaine = unite = 0;
        irr = 0; /* Pas d'irregularite au debut  */

        if (2 == SIndex) {
            centaine = tmp[i]-'0';
            if (centaine != 0) {
                if (i != 0) strcat(dst, " ");
                _centaine(tmp+i, dst, index);
            }
            ++i; /* On passe au dizaines  */
            --SIndex;
        }
        if (1 == SIndex) {
            dizaine = tmp[i]-'0';
            if (dizaine != 0) {
                if (i != 0) strcat(dst, " ");
                irr= _dizaine(tmp+i, dst, index);
            }
            ++i; /* On passe au unites  */
            --SIndex;
        }
        if (0 == SIndex) {
            unite = tmp[i]-'0';
            if (!(1 == unite && 4 == strlen(tmp+i)) && (unite != 0 && irr != 1)) { /* On ne doit pas sauter les unites */
                if (i != 0 && dizaine == 0) strcat(dst, " ");
                _unite(tmp+i, dst, dizaine, irr);
            }
        }
        if (index > 1 && centaine+dizaine+unite != 0) { /* Si on est au moins a mille */
            if (!(0 == centaine && 0 == dizaine && 1 == unite && len == 4)) { /* Pas d'espace avant mille tout court */
                strcat(dst, " ");
            }
            strcat(dst, centaines[index-1]);
            if (index != 2 && (unite > 1 || centaine+dizaine > 0)) {
                strcat(dst, "s");
            }
        }
        index--; /* On change de bloc de 3 chiffres  */
        SIndex = 2;
    }

    free(for_free);

    return dst;
}

int main (void) {
    char *x[] =
    { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
    "14", "15", "16", "17", "18", "19", "20", "21", "29", "30", "40", "42",
    "51",
    "60", "69", "70", "71", "77", "80", "81", "85", "90", "91", "99", "100",
    "101",
    "110", "130", "173", "196", "200", "205", "217", "223", "256", "268",
    "273",
    "280", "297", "734", "1 000", "1 001", "1 017", "1 020", "1 032", "1 111",
    "2 000",
    "2 100", "2 200", "3 003", "3 780", "10 000", "10 005", "10 900", "11 000",
    "11 700",
    "12 000", "18 805", "61 400", "77 010", "80 000", "80 078", "90 000", "92 002",
    "97 459",
    "100 000", "100 007", "204 003", "310 857", "700 005", "1 000 000", "2 000 000",
    "2 001 001",
    "72 424 600", "79 828 480", "200 000 000", "708 000 000", "1 000 000 000", "2 000 000 000",
    "2 000 500 000",     "2 000 780 001", "999 999 999 999 999 999 999 999"
  };
    int i, n = sizeof x / sizeof *x;

    for (i = 0; i < n; i++) {
        char NombreEnLettres[500] = {""};
        z0zero(x[i], NombreEnLettres);
        if (NombreEnLettres != NULL)
            printf("%s => %s.\n", x[i], NombreEnLettres);
    }

    return EXIT_SUCCESS;
}

Voilà, voilà.
  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2010 à 15:46:15

C'est déjà plus compréhensible :lol:
Ya un petit sushi aussi. Tu ne libères pas ta mémoire, et tu change le pointeur que tu as alloué. Du coup si tu fais un free ça va sûrement pas aller :

tmp = malloc (strlen(src)+1); /* Sous entendu : sizeof(char) = 1  */
[...]
tmp = removeZeroes(tmp);
  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2010 à 15:53:23

Rhaa, le pire c'est que j'y ai pensé mais j'ai oublié. Je corrige cette bavure.
Voilà c'est corrigé.
  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2010 à 16:57:34

Citation : Lithrein


De manière à être plus dans l'esprit didactique du forum, j'ai refais une version de ma solution.




À mon goût, ça reste une solution beaucoup trop compliquée et opaque pour un problème aussi simple et naturel. Un bon code doit rendre compte de cette simplicité. Mais il est bien connu que faire simple c'est compliqué (et faire compliqué c'est simple ...). Je posterai un code un de ces quatre.
  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2010 à 18:44:01

Citation : candide

Citation : Lithrein


De manière à être plus dans l'esprit didactique du forum, j'ai refais une version de ma solution.




À mon goût, ça reste une solution beaucoup trop compliquée et opaque pour un problème aussi simple et naturel. Un bon code doit rendre compte de cette simplicité. Mais il est bien connu que faire simple c'est compliqué (et faire compliqué c'est simple ...). Je posterai un code un de ces quatre.



Le truc, c'est que je vois pas vraiment comment faire plus simple. :euh:
  • Partager sur Facebook
  • Partager sur Twitter
13 janvier 2010 à 23:03:45

Citation : Lithrein


Le truc, c'est que je vois pas vraiment comment faire plus simple. :euh:



En essayant de ne pas être astucieux ou subtil ;) Demande-toi comment un petit de 10 ans sait lire un nombre, applique cette méthode naïvement et tu auras quelque chose de simple.
  • Partager sur Facebook
  • Partager sur Twitter
14 janvier 2010 à 8:14:07

Citation : candide


En essayant de ne pas être astucieux ou subtil ;) Demande-toi comment un petit de 10 ans sait lire un nombre, applique cette méthode naïvement et tu auras quelque chose de simple.



Merci pour ce conseil, je vais essayer.
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2010 à 9:42:25

bonjour voici ma maige participation :D
de 0 à 99 !
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *unites[10]=  {"","un",  "deux", "trois", "quatre",  "cinq",  "six",  "sept",    "huit",    "neuf"};
char *dizaine1[10]={"dix", "onze","douze","treize","quatorze","quinze","seize","dix-sept","dix-huit","dix-neuf"};
char *dizaine2[9]={ "",   "vingt","trente","quarante","cinquante","soixante","soixante","quatre-vingt","quatre-vingt"};

/*mes fonctions pour compter */
void Traduit(int i,char *chaine);

int main(void)
{
    int i;
    char resultat[100];
    for (i=0;i<100;i++)
    {
        Traduit(i,resultat);
        printf("%d ---> %s\n",i,resultat);
        strcpy(resultat,"");//efface le resultat !
    }
    return 0;
}


void Traduit(int i,char *chaine)
{
    // cas du zero
    if (i==0)
    { strcpy (chaine,"zero"); }
    //je compte de 1 a 9
    if ( (i>0) && (i<10) )
    { strcpy (chaine,unites[i]); }

    //je compte de 10 à 19
    if ( (i>=10) && (i<20) )
    { strcpy (chaine,dizaine1[i-10]); }

    //je compte de 20 à 99
    if ( (i>=20) && (i<100) )
    {
        int idizaine = i / 10;   //extraction du chiffre dizaine
        int iunite   = i % 10; // extraction de l'unite

        strcpy(chaine,dizaine2[idizaine-1]);
        if ( ((idizaine>1) && (idizaine<7)) || (idizaine == 8) )
            {
                 if (iunite !=0) {strcat(chaine,"-");}
                 strcat(chaine,unites[iunite]);
            }
        if ( (idizaine==7) || (idizaine==9) )
        {
                 strcat(chaine,"-");
                 strcat(chaine,dizaine1[iunite]);
        }

    }
}


je continue pour au moins arriver au million :-°
merci pour cet exercice cela m'a fait énormement reflechir :p
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2010 à 10:06:41

Pas trop mal mais il manque encore quelques trucs ^^

21 ---> vingt-un
80 ---> quatre-vingt  : Manque le 's'


Tu peux simplifier tes if aussi. Tu fais un test if (nb == 0), et après tu fais if (nb > 0 && nb < 10) mais dans tous les cas il sera compris entre 0 et 9. Pareil pour les autres if :)

if ( i == 0 )
...
else if ( i < 10 )
...
else if ( i < 20 )
...
else if ( i < 100 )
...

J'ai exagéré avec les 'else if' mais c'est pour l'idée ;)

Un petit truc aussi (avis perso mais je pense qu'il est partagé) je trouve que les accolades mises comme ça (et surtout sur une seule instruction) assombrissent le code inutilement :

if (i==0)
    { strcpy (chaine,"zero"); }

Yen à qui disent : Une accolade, une ligne.
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2010 à 10:28:29

merci pour tes remarques,
j'ai pas vu ces deux cas la !
je rectifie avant de compliquer ! :p

en fait j'ai encore du pain sur la planche :p:-°
j'ai pas traite non plus le cas de
31 41 51....
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2010 à 10:46:33

Citation : darkipod


j'ai pas traite non plus le cas de
31 41 51....




En effet. D'accord aussi avec les remarques de Pouet, en particulier sur l'utilisation des else if. Ton code est correct bien qu'un peu compliqué. Par exemple, il serait mieux de traiter le cas du trait d'union en un seul cas et non en deux fois comme tu le fais ici :

if (iunite !=0) {strcat(chaine,"-");}


et là


strcat(chaine,"-");

  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2010 à 17:48:13

-->pouet : j'ai résolu les problèmes. Il est vrai que j'ai resonne en intervalle plutôt que par élimination
-->candide : je revois ma copie, car j'ai pas encore trouve comment faire autrement
  • Partager sur Facebook
  • Partager sur Twitter