Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercices pour débutants en C (suite)

Venez vous entrainer!

    8 septembre 2010 à 14:29:25

    Citation : Arthurus

    Vous ne créez plus de topics pour les réponses ?


    http://www.siteduzero.com/forum-83-556178-p1-zcalc.html

    ^^
    • Partager sur Facebook
    • Partager sur Twitter
      16 octobre 2010 à 14:28:35

      zCrypt - Octobre 2010






      Voici un petit exercice qui va vous permettre d'apprendre à utiliser un opérateur binaire : le XOR.

      Pour réaliser cet exercice, il faut savoir utiliser les tableaux, les pointeurs et les chaines de caractères.

      Le but de l'exercice, est de crypter du texte suivant un cryptage bien connu : le XOR.

      Pour que vous comprenez comment fonctionne l'opérateur XOR, voici un petit exemple :

      Soit A, B, K trois entiers.
      
      A = B ^ K
      
      Ici, A est le cryptage de B avec la clef K.
      
      A = A ^ K
      
      Ici, A est la valeur décrypté de B.
      
      À ce stade, A == B.
      
      Voici la table de vérité du XOR :
      
      1 ^ 0 == 1
      0 ^ 1 == 1
      0 ^ 0 == 0
      1 ^ 1 == 0



      1) Exercice débutant.

      Vous devrez demander à l'utilisateur de rentrer une chaine de caractère, et il vous faudra afficher la version crypté et la version décrypté caractère par caractère.

      Je vous laisse libre pour le choix de la clef. Vous pouvez par exemple utiliser le générateur de nombres pseudo-aléatoires, ou la laisser en "dur" dans le code. Elle devra par contre être comprise entre 1 et 254.

      Conseils :
      • pour afficher la valeur hexadécimal d'un caractère, vous pouvez utiliser le format %.2x de printf.
      • utilisez des types non-signées. (unsigned )
      • Une fois la chaine crypté, ne l'utilisez plus comme une chaine, mais comme un tableau de caractère. En effet, si la clef est égale à un des caractère de la chaine, il y aura des '\0' terminaux dans la chaine cryptée.



      Voici un exemple de sortie :

      Entrez une chaine de caractères :
      >Je suis une chaine.
      
      Chaine non-cryptée (Clef = 0x0a) : 
      4a 65 20 73 75 69 73 20 75 6e 65 20 63 68 61 69 6e 65 2e 0a 00 
      
      Chaine cryptée (Clef = 0x0a) : 
      40 6f 2a 79 7f 63 79 2a 7f 64 6f 2a 69 62 6b 63 64 6f 24 00 0a



      2) Exercice intermédiaire.

      Il s'agit dans cet exercice de créer un crypteur et décrypteur de fichiers.

      Le programme devra prendre en entrée deux fichiers, et le choix de l'utilisateur. (Si il veux crypter ou décrypter)

      Le programme cryptera ou décryptera suivant le choix de l'utilisateur le fichier source, et le résultat sera enregistré dans le fichier destination.

      Conseils :
      • Utilisez les fonctions fread/fwrite pour lire et écrire dans vos fichiers.
      • Formatez votre fichier crypté pour que vous puissiez retrouver la clef facilement pour décrypter le fichier. Je vous conseille par exemple de placer la clef sur le premier octet du fichier.



      Voici deux exemples d'utilisation du programme :

      ./zCrypt --crypt source.txt destination.txt
      
      Le fichier source.txt a été correctement crypté grâce à la clef 0xa4.
      Le résultat a été enregistré dans destination.txt.


      ./zCrypt --decrypt source.txt destination.txt
      
      Le fichier source.txt a été correctement décrypté grâce à la clef 0xa4.
      Le résultat a été enregistré dans destination.txt.


      Il vous faut donc retrouver à la fin, exactement le même fichier qu'au départ.

      Vous n'êtes bien sûr pas obligés d'utiliser les arguments de la fonction main() comme dans l'exemple.


      3) Exercice avancé.

      Même exercice que le 2), mais maintenant il s'agit de crypter le fichier avec des clefs supérieures à 1 octet.

      Après, rien ne vous empêche de proposer des améliorations pour cet exercice !


      Bien entendu, il s'agit d'un simple exercice, car stocker la clef dans le fichier n'est vraiment pas sécurisé. Vous pouvez toujours chercher un moyen de rendre le fichier plus dur à décrypter...

      On peut par exemple imaginer que c'est l'utilisateur qui choisis sa clef, avec une chaine de caractère. Et il faudra fournir la bonne clef pour la partie décryptage.

      Bon courage !

      • Partager sur Facebook
      • Partager sur Twitter
        16 octobre 2010 à 15:32:58

        #include <stdio.h>
        
        int main(void) {
          int i, j;
          for (i = 0; i <= 1; ++i)
            for (j = 0; j <= 1; ++j)
              printf("%d ^ %d = %d\n", i, j, i^j);
          return 0;
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          16 octobre 2010 à 15:47:26

          Citation : Tosh

          zCrypt - Octobre 2010




          Voici la table de vérité du XOR :
          1 ^ 0 == 0
          0 ^ 1 == 0
          0 ^ 0 == 1
          1 ^ 1 == 1




          XOR c'est bien le OU exclusif ? Donc c'est faux ?


          EDIT : Ah, je viens de comprendre à quoi sert le post au dessus x).
          • Partager sur Facebook
          • Partager sur Twitter
            16 octobre 2010 à 16:04:20

            Euh oui. Post édité, merci.
            • Partager sur Facebook
            • Partager sur Twitter
              16 octobre 2010 à 16:42:46

              Citation : colbseton

              #include <stdio.h>
              
              int main(void) {
                int i, j;
                for (i = 0; i <= 1; ++i)
                  for (j = 0; j <= 1; ++j)
                    printf("%d ^ %d = %d\n", i, j, i^j);
                return 0;
              }
              

              Le boulet a encore frappé. Si t'as mal aux yeux et que tu comprends pas l'exercice, on peut rien pour toi, mais poste pas n'importe quoi n'importe où. Ca vaudra mieux pour tout le monde.
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                16 octobre 2010 à 16:47:17

                Pouet_forever, je ne crois pas que colbseton soit un boulet.
                • Partager sur Facebook
                • Partager sur Twitter
                  16 octobre 2010 à 16:52:17

                  Arf, j'ai été trop gentil ? que trouver de pire que 'boulet' ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    16 octobre 2010 à 16:53:16

                    Je crois qu'il m'informait juste que ma table de vérité était fausse. :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 octobre 2010 à 18:51:03

                      zCalc - Correction



                      Niveau Débutant



                      Le but de cet exercice était de réaliser une calculatrice simple qui fonctionne quasiment de la même manière que les calculatrices peu évoluées avec une interface graphique. Ce qui nous permettait d'être un peu plus subtil que de passer par un switch qui demande quelle opération l'on souhaite faire et qui ne traite pas plus de deux nombres à la fois.

                      La méthode la plus simple consistait à demander un nombre et appliquer l'opération sur le nombre précédent et le nouveau.
                      Ce qui nous donnait tout simplement :
                      #include <stdio.h>
                      
                      int
                      main(void) {
                      
                          int resultat = 0, nb = 0;
                          char op = '+';
                      
                          while (op != 'q') {
                              printf("Entrez un nombre : ");
                              scanf("%d", &nb);
                              while (getchar() != '\n');
                      
                              if (op == '+')
                                  resultat += nb;
                              else if (op == '-')
                                  resultat -= nb;
                              else if (op == '*')
                                  resultat *= nb;
                              else if (op == '/')
                                  resultat /= nb;
                      
                              printf("Quelle operation (+, -, *, /, c, q) : %d ", resultat);
                              op = getchar();
                      
                              if (op == 'c') {
                                  resultat = 0;
                                  op = '+';
                              }
                          }
                      
                          return 0;
                      }
                      


                      Niveau intermédiaire



                      Non pas que je n'ai rien fait, je ne proposerai pas de correction pour l'exercice de niveau intermédiaire car il y a une foule de méthodes pour résoudre cet exercice.
                      Les plus connues sont :
                      * La conversion de l'expression en NPI puis son évaluation.
                      * L'utilisation d'un générateur de parser (flex/bison).
                      * La création d'un arbre de syntaxe abstrait au moyen d'une grammaire puis le calcul de cet arbre.
                      * Au feeling :D

                      Par ailleurs, Je vous invite à regarder les codes proposés dans le sujet dédiés au réponses de cet exercice ou encore à l'Atelier Calculatrice(s)
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        31 octobre 2010 à 23:37:09

                        Faire cette calculatrice avec flex ou bison devrait être intéressant, surtout que ça permet de s'exercer pour faire d'autres choses bien plus complexes, mais y a t'il une documentation, ou plutôt un genre de tutoriel qui sache expliquer comment utiliser ces outils et pourquoi pas leur fonctionnement ? ça fait un moment que je cherche, et je n'ai trouvé qu'une paire de pages beaucoup trop expéditives.
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          1 novembre 2010 à 10:50:50

                          info flex
                          RTFM
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Anonyme
                            1 novembre 2010 à 17:57:43

                            Merci de me remémorer cette commande.
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              1 novembre 2010 à 18:22:15

                              Le premier et deuxième sont ce que j'ai trouvé.
                              Pour le reste, merci beaucoup ;)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 novembre 2010 à 12:41:27

                                Titre: zSpirale
                                Mois: Novembre
                                Sujet: Boucles, manipulation de tableaux à 2 dimensions et allocation dynamique

                                zSpirale



                                Le but de l'exercice consiste à déclarer un tableau à 2 dimensions et de le remplir en spirale. La spirale peut être faite du bord vers le centre ou du centre vers les bords, c'est vous qui choisissez. Vous pouvez faire les 2, et aussi changer le coin sur lequel on commence. :)

                                Voilà un exemple de sortie pour le type 'bord vers centre' :

                                00      01      02      03
                                11      12      13      04
                                10      15      14      05
                                09      08      07      06


                                *) Dans un premier temps on utilisera un tableau carré (hauteur=largeur) et il sera donc déclaré normalement (tab[10][10]),
                                *) Ensuite on utilisera un tableau quelconque (hauteur!=largeur),
                                *) Pour terminer, on essayera d'allouer un tableau à 2 dimensions dynamiquement (malloc, ne pas oublier les free).

                                Voilà un début de code :

                                #include <stdio.h>
                                #include <stdlib.h>
                                
                                /* Défini la taille du tableau */
                                #define SZ_TAB  10
                                
                                void zSpirale(int tableau[SZ_TAB][SZ_TAB]) {
                                  /* Le code ici */
                                }
                                
                                void afficherTableau(int tableau[SZ_TAB][SZ_TAB]) {
                                  /* Le code ici */
                                }
                                
                                int main(void) {
                                  int tableau[SZ_TAB][SZ_TAB];
                                  
                                  zSpirale(tableau);
                                  afficherTableau(tableau);
                                  return EXIT_SUCCESS;
                                }
                                


                                Bon courage à tous. :)




                                PS : Gros merci a Pouet_forever pour la mise en forme

                                Le topic pour discuter des solutions possible est la-bas

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Zeste de Savoirbépocode minimal  — Ge0 <3
                                  9 novembre 2010 à 13:23:40

                                  Citation : simbilou


                                  Sujet : Creer un tableau de int a 2 dimensions et le remplir avec un compteur. Le parcour du tableau se fera en spiral



                                  Exo sympa et qui peut même être utile, par exemple, cf. le gadget memory game sur igoogle, c'est comme ça qu'il fait "recouvir" les images avant que le jeu ne commence.


                                  Citation : simbilou


                                  Attention contrairement a ce qu'on pourrait croire au premier abord, cet exercice est difficile.



                                  Non, cet exo est relativement simple, à jeun en tous cas ;)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 novembre 2010 à 14:03:48

                                    En meme temps le topic s'intitule 'exercices pour debutant en C'. Et manier un tableau 2D quand on est tout frais sortis du tuto de m@teo (ou autre tuto C pour debutant) c'est loin detre facile.
                                    Apres si ca fait quelques annees que tu codes j'espere bien que tu t'en sortes facilement. :p

                                    Et oui, l'idee derriere l'exercice est que cet algo concerne les tableau 2D en general, pourquoi pas une image comme tu dis.

                                    Dune maniere general, j'aime bien qu'un exercice puisse se lire a plusieurs niveaux, pas trop dur pour ne pas decourager les debutants mais avec des notions plus profondes derriere pour ceux qui on un peu plus de bouteille.
                                    Si tu regardes les bons problemes de math sont souvent fait comme ca. Pour l'eleve qui a le nez dans le guidon c'est une application du cours. Mais quand tu refais le meme exercice quelques temps plus tard tu t'apercois qu'il 'cache' un concepte. On a pas besoin de connaitre cette partie cache pour reussir l'exercice mais ca donne plus de recul.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Zeste de Savoirbépocode minimal  — Ge0 <3
                                      9 novembre 2010 à 17:06:02

                                      Ce serait pas mal d'attendre la correction de l'exercice en cours avant d'en proposer un autre. :)
                                      Ce serait pas mal d'en parler avec les autres avant de proposer un exo. ;)
                                      Et essaye de respecter la 'convention' de présentation des exos. :)

                                      Les exos facile ne sont pas réalisés par les débutants (ni les autres) donc faire un exo qui puisse se faire à plusieurs niveaux... Autant taper plus haut directement pour ceux que ça intéresse. ^^
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        9 novembre 2010 à 17:41:17

                                        ooops :-°

                                        En fait j'ignorais que c'etait autant codifie comme topic. J'aurais sans doute du lire le premier post en detail. :euh:
                                        Qu'entends tu par en parler aux autres ? Ils faut contacter les 'faiseurs d'exo' par MP? Il y a une liste ?

                                        Sinon pour l'exo, je le retire pour le presenter d'un maniere correct plus tard ou le mal est fait?

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Zeste de Savoirbépocode minimal  — Ge0 <3
                                          9 novembre 2010 à 18:07:02

                                          Les autres, c'est ceux qui ont postés les derniers exos (Tosh, Lithrein, et les autres).
                                          Laisse ton exo, mais essaye de le mettre en forme (et corriger les fautes d'orthograpeh). ;)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            9 novembre 2010 à 18:55:41

                                            Citation : simbilou


                                            EDIT2:
                                            Puisque je me suis lamentablement planté dans ma façon de m'introduire dans ce topic ( :-° ), cet exercice n'est pas officiel et aucune correction ne sera donnée ici. Cela dit pour les personnes intéressés par une correction vous pouvez me contacter par MP ou même créer un topic dédié.



                                            C'est pas grave ouvre un topic et propose ton exo, tu verras, plein de monde va répondre, ya plein de joueurs ici ;) . Juste réfléchis bien à l'énoncé, essaye d'être clair. La spirale peut aussi se dérouler depuis le centre du tableau plutôt qu'à l'extérieur. Sinon, je t'assure c'est un exo pas dur, un débutant ayant deux mois de C le fait sans problème, peut-être pas canoniquement, mais il le fait.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              9 novembre 2010 à 20:57:21

                                              Hum, tu as sans doute raison.
                                              Sinon j'ai une autre idée pour un exercice intéressant (et plus conséquent), je continue a y réfléchir et je contacterais les derniers posteurs quand je serais satisfait de l'énoncé. Il y a certainement déjà un exercice dans les tuyaux pour ce mois ci mais peut être pour le suivant.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Zeste de Savoirbépocode minimal  — Ge0 <3
                                                11 novembre 2010 à 0:31:38

                                                Bon, le post originel a été édité. Un topic pour l'exo (rapide il est vrai) à été ouvert, c'est la-bas
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Zeste de Savoirbépocode minimal  — Ge0 <3
                                                  3 décembre 2010 à 22:04:24

                                                  Mois: Décembre
                                                  Sujet: Boucles, manipulation de tableaux et pointeurs

                                                  zMorp - 1ère partie


                                                  Le sujet se trouve ici : http://www.siteduzero.com/forum-83-586 [...] e-partie.html
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    8 décembre 2010 à 6:01:16

                                                    Sujet disparu des post-it ? Bug?
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      8 décembre 2010 à 18:18:30

                                                      Les devs se penchent soi disant dessus (en attendant, le nouveau design est sorti et ils "arrivent pas" a remettre un post-it --')
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Anonyme
                                                        10 décembre 2010 à 14:56:22

                                                        Zscript - mon petit code ^^



                                                        Bonjour,
                                                        C'est la première fois que je viens sur ce topic.
                                                        Pour tester j'ai coder Zscript :

                                                        pour crypter un fichier :

                                                        nom_du_prog.exe < fichier_a_crypter.txt >fichier_destionation.txt ( windows)

                                                        le fichier doit avec la clé tout au début du fichier (première ligne) et tout ce qui commence à partir de la deuxième ligne va être crypté.
                                                        exemple

                                                        Citation : doc.txt

                                                        salut
                                                        test



                                                        Salut va être la clé et test va être crypté.

                                                        Code :

                                                        #include <stdio.h>
                                                        #include <stdlib.h>
                                                        
                                                        int main(void) {
                                                            char *chaine2,caract;
                                                            int *chaine_nbr,i,nbr_caract=0;
                                                        
                                                             chaine2 = (char*)calloc(100,sizeof(char));
                                                             chaine_nbr = (int*)calloc(100,sizeof(int));
                                                        
                                                           fscanf(stdin,"%s",chaine2);
                                                        
                                                           caract = fgetc(stdin);
                                                           for(i=0;caract != EOF;i++,nbr_caract++){
                                                               chaine_nbr[i] = (int)caract ^ (char)chaine2;
                                                               caract = fgetc(stdin);
                                                           }
                                                            printf("%s\n",chaine2);
                                                            printf("%d\n",nbr_caract);
                                                             for(i=0;i<100;i++){
                                                              if(chaine_nbr[i] != 0)
                                                                printf("%x\n",chaine_nbr[i]);
                                                             }
                                                        
                                                          return 0;
                                                        }
                                                        


                                                        Pour le décrypteur (je sais pas si ça se dit) :

                                                        nom_du_prog.exe < fichier_a_décrypter.txt >fichier_destionation.txt ( windows)

                                                        et le code :


                                                        #include <stdio.h>
                                                        #include <stdlib.h>
                                                        
                                                        int main(void) {
                                                            int nbr_line,i,chiffre;
                                                            char *chaine2;
                                                        
                                                            chaine2 = (char*)calloc(100,sizeof(char));
                                                        
                                                        fscanf(stdin,"%s",chaine2);
                                                        fscanf(stdin,"%d",&nbr_line);
                                                        
                                                        printf("%s",chaine2);
                                                        for(i=0;i<nbr_line;i++){
                                                            fscanf(stdin,"%p",&chiffre);
                                                            printf("%c",(char)chiffre ^ (char)chaine2);
                                                        }
                                                        
                                                        return 0;
                                                        }
                                                        



                                                        Exemple du programme :

                                                        salut
                                                        test


                                                        va devenir :

                                                        salut
                                                        5
                                                        ffffffc2
                                                        ffffffbc
                                                        ffffffad
                                                        ffffffbb
                                                        ffffffbc


                                                        et décrypter ça donne:

                                                        test


                                                        Voilà c'est tout pour aujourd'hui

                                                        Bonne journée
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Anonyme
                                                          10 décembre 2010 à 20:49:04

                                                          Mais ton est rentrée est ratée ! Il faut lire les règles dans la vie ...

                                                          Bon pour info, c'est .

                                                          Voilà :)

                                                          PS : le prends pas mal, hein j'ai juste envie de me défouler au moment d'écrire ce message ...
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Exercices pour débutants en C (suite)

                                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                          • Editeur
                                                          • Markdown