Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercices pour débutants en C

Au menu : zSommeChiffres (nombres, algo)

22 octobre 2008 à 17:45:20

Tu rends les corrections en C99 ? Sinon, attention aux déclarations de variable à un endroit arbitraire.
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 18:16:45

Quand on fait des corrections, faudrait penser à bien vérifier son code.
erosquare@mvk-desktop:~$ ./test

 Bienvenue sur zReader - lisez, cr�ez et �crivez dans vos fichiers !

 1. Lire
 2. Ecrire
 3. Cr�er
 4. Quitter 

 Votre choix ? 2

 Entrez le chemin du fichier (si invalide, le fichier sera cr�e) : 


 Saisie dans le fichier (pour fermer, tapez "f.close") : 

oulala
Erreur de segmentation
erosquare@mvk-desktop:~$
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 18:28:53

Citation : correction

void wait()
{
    printf("\n Appuyez sur entrer pour retourner au menu...");
    getchar();
    buf();
}

Cette fonction est mauvaise, car si l'utilisateur appuie effectivement sur entrer, rien ne se passe !

Ceci fonctionne correctement :
void wait()
{
    printf("\n Appuyez sur entrer pour retourner au menu...");
    buf();
}


Sinon, je trouve un peu dommage que le probleme évoqué plus haut par DzEt4 n'ait pas été traité dans la correction.
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 18:30:59

Arf, une erreur c'est glissé dans le code ? Je l'ai codé rapidement juste avant de poster alors c'est possible, je vais rapidement voir sa.

Effectivement pour getchar(), c'est parce que j'ai d'abord écrit wait() puis j'ai ajouté buf() sans y prêter attention.
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 18:38:35

Pour le reste, il suffit de tester correctement les fopen(). (la fonction creat aussi n'est pas safe)
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 18:42:17

Évite également de donner des noms à tes fonctions qui existent déjà. Bon d'accord, wait() n'est pas POSIX mais c'est un appel système qui existe sur les systèmes linux.
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 18:43:21

yoch : C'est pas très beau, j'aurais aussi pu faire en sorte que l'utilisateur entre le nom et l'extension du fichier mais bon, les débutants auront ainsi l'occasion de découvrir certaines techniques. Si j'ouvre en w, inutile de tester fopen.

Erosquare : Oui, merci pour l'info. Je suis sous windows. ^^
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 18:46:44

Citation : crys'

Si j'ouvre en w, inutile de tester fopen.



Tu crois ? Essaye de mettre <enter> comme nom de fichier (par exemple)...
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 19:02:04

Ah d'accord. Ok, j'ai un peu raté ma correction car j'ai fais sa trop vite. Je prendrais mon temps la prochaine fois. ;)

Le prochain exercice, moins complexe et plus abordable pour les débutants :

Titre : zBinary
N° et mois : 2, octobre
Sujet : Algorithmique, binaire

Objectif



L'objectif de cet exercice est de réaliser un convertisseur de valeurs en base décimal (10) vers la base binaire (2). L'exo vous entraînera à l'algorithmique et à la compréhension de la base binaire. C'est un très bon exercice et tout ce qu'il vous faut se trouve sur ce site. Cherchez par exemple le tutoriel sur les conversions de bases ou essayer de trouver une autre méthode pour déterminer une valeur binaire. ;)
dec ? 25
bin : 11001

edit : Le programme ne devra que convertir les entiers positifs sur l'intervalle [0;+inf[ .

Bonne chance ! ;)
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 19:08:34

Tiens, j'ai eu droit au même exercice en interro :-°
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 19:35:16

Effectivement, c'est un exercice bien connu. ;)
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 20:17:50

Ouais ! ça te dérange si je te passe (dans un futur proche) mon code, avec en plus l'hexa et l'octal (même si l'octal est plus trop utiliser je trouve ça marrant :D ).
D'ailleurs si je puis me permettre de conseiller amusez vous à coder le convertisseur en rajoutant donc l'hexadécimal (base 16) et l'octal (base 8).

PS: crys'> si ça te dérange que je propose un truc tu me dit j'édite mon message ;) . Que tu n'ai pas l'impression que je te pique ton topic (très bien fait d'ailleurs).
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 20:29:16

Bonjour,
Le nombre décimal(en base 10) à convertir en base 2 :
est il un entier ou un réel ?
doit on s'occuper en plus de son signe (négatif ou positif)?
Et si en plus on rajoute une puissance de 10 ..........
-----> ici l'excercice ne serait plus pour des novices si c'est le cas ? :p
En tout les cas c'est hors de ma portée ! :-°
@+



  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 20:37:21

Non, uniquement les entiers positifs sur l'intervalle [0;+inf[ .

Pour la proposition de -Triskel-, il n'y a pas de soucis, vous pouvez m'envoyer un convertisseur de bases qui gère l'hexa et l'octal si vous le souhaitez mais n'en faites pas trop.
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 20:46:17

ouf j'ai eu peur :)
ca va etre un peu plus simple.
je m'attele à la tache pour la base 8 & 16
@+ :D
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 21:08:16

En fait je crois que j'ai fait des heureux ^^ !
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 21:39:16

Pour un supplément, la conversion en base n serait sans doute plus intéressante, parce que l'octal et l'hexa, avec les formats de printf en une seule ligne de code c'est réglé.
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 21:43:13

Effectivement, c'est pourquoi le sujet est la conversion en binaire. Mais si les participants font aussi l'octal et l'hexa, ils devront coder une fonction qui le fait par eux-même et pas utiliser l'astuce printf. ;) Pour l'idée de la base n, je pense que c'est une mauvaise idée parce que c'est un exercice qui n'est pas trop à la porté d'un débutant, restons le plus basique possible.
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 21:47:44

Oui, codé un convertisseur pour la base n, je pense pas que ça soit à la portée de tous... je sais même pas pour moi ^^

EDIT: ah bah si au fait c'est fait ! :D
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 21:57:14

Au final le principe de conversion d'une base à l'autre est toujours le même, quelle que soit la base utilisée, et ceux qui codent également l'hexa et l'octal, en s'y prenant correctement ils vont vite s'en rendre compte.
La seule difficulté est de trouver une représentation adéquat des caractères pour une base > 10, (voire une base > 36 en reprenant le principe de la représentation hexadécimale), mais rien n'empêche de fixer n dans l'intervalle [2;10].
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 22:20:58

Je suis d'accord, c'est toujours le même principe.
Donc les zér0s qui voudront coder un convertisseur dont la base est au choix ont bien sûr le droit.

Mais si j'ai fixé l'exo sur la base binaire, c'est parce que c'est primordial de bien connaître cette base si l'on programme (quel est la base compréhensible par un ordinateur ?) et quoi de mieux qu'un convertisseur pour bien assimiler la chose. D'autre part, il existe de nombreuses techniques pour trouver la valeur binaire d'un nombre dans une autre base. Les divisions, les soustractions ... mais aussi l'accès directe aux bits de l'ordinateur ! D'ailleurs, je crois que c'est cette méthode que je vais utiliser lors de la correction. Je ne compte pas tout vous révéler dés maintenant quand même. Allez, au boulot ! ^^
  • Partager sur Facebook
  • Partager sur Twitter
22 octobre 2008 à 22:50:59

Citation : mcyrb

Pour un supplément, la conversion en base n serait sans doute plus intéressante, parce que l'octal et l'hexa, avec les formats de printf en une seule ligne de code c'est réglé.


Je trouve moi aussi que c'est une bonne idée de penser a la généricité des fonctions lorsque l'on code.

C'est d'ailleurs précisément ce que j'ai fait dans mon code. Mais mon prog ne propose que le binaire, l'octal et l'hexa, car je trouve les autres pas très utiles.
  • Partager sur Facebook
  • Partager sur Twitter
23 octobre 2008 à 9:51:48

Bonjour à tous,

Faut il faire un menu pour zBinary ?
Ou bien on demande juste le nombre à "convertir" en base n , on affiche le resultat et on quitte le programme une fois que c'est fait ?

Personellement, j'ai fait de tel maniere que l'utilisateur puisse convertir son nombre en base n (n >=2 et n <=10) :)
  • Partager sur Facebook
  • Partager sur Twitter
23 octobre 2008 à 13:28:57

je pense que le mieux serait un programme sans menu (ce n'est pas important ici) mais qu'il tourne en boucle tant que l'utilisateur n'a pas tapé une certaine valeur (par exemple une négative ou pourquoi pas un caractère ou une chaîne).

Human-Behind : Ton programme convertit en base n mais quel est la base de départ (la base du nombre que l'utilisateur veut convertir) ? Au choix aussi ?
  • Partager sur Facebook
  • Partager sur Twitter
23 octobre 2008 à 14:14:34

Citation : crys'

Human-Behind : Ton programme convertit en base n mais quel est la base de départ (la base du nombre que l'utilisateur veut convertir) ? Au choix aussi ?



La base de départ est la base decimal ( 10 ) , il faut aussi laisser le choix de la base de départ à l'utilisateur ?

Sa vas devenir compliqué :p

  • Partager sur Facebook
  • Partager sur Twitter
23 octobre 2008 à 19:23:14

c'est un peu complexe pour un débutant non?(c'est de l'ironie, c'est sur que c'est pas très difficile)

Moi sa m'avais paru très difficile, car je ne maitrisais pas les tableaux.

Mais ce qui serait très instructif, ca serait de voir les différents algorithmes utilisés par les zéros, bon je vais me lancer dans celui la aussi sans consulter d'autres algos, avec le bon vieux algo que j'avais appris il y a 2 ans rien que pour frimer devant les copains. :-°:honte:
  • Partager sur Facebook
  • Partager sur Twitter
23 octobre 2008 à 19:49:33

Citation : Human-Behind

La base de départ est la base decimal ( 10 ) , il faut aussi laisser le choix de la base de départ à l'utilisateur ?


L'énoncé fixé à la base, c'est uniquement un convertisseur décimal -> binaire. ^^

edit : Je vais fixer la date de la correction cette fois.
  • Partager sur Facebook
  • Partager sur Twitter
23 octobre 2008 à 21:06:09

bonjour
j'affiche mon code. Qu'en penses tu ?
@+
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void Presentation();
void Conversion(int nombre, int base);


int main()

{
    int nombre,base;


       Presentation();
       printf("Entrer un nombre entier positif S.V.P : ");
       scanf ("%d",&nombre);
       printf("En quelle base (2 a 36) vous voulez le convertir :");
       scanf ("%d",&base);
       Conversion (nombre,base);
       printf("\n");


    return 0;
}




void Presentation()
{
    system("cls");
    printf("Novembre 2008 ZX_SPECTRUM\n");
    printf("Le principe pour convertir un nombre de la base 10 en base a\n");
    printf("avec  2<= a <= 36\n");
    printf("____________________________________________________________\n");
    printf(" prenons un exemple 64 en base 10 a convertir en base 2 \n");
    printf(" il suffit de faire des divisions par 2 :\n");
    printf("64 | 2\n");
    printf("   |---\n");
    printf("  0| 32 | 2\n");
    printf("        |---\n");
    printf("      0 | 16 | 2\n");
    printf("             |---\n");
    printf("            0| 8 | 2\n");
    printf("                 |---\n");
    printf("               0 | 4 | 2\n");
    printf("                     |---\n");
    printf("                    0| 2 | 2\n");
    printf("                         |---\n");
    printf("                        0| 1 | 2\n");
    printf("                             |---\n");
    printf("                            1| 0  \n");
    printf("\n");
    printf("Et donc mon resultat est 1000000 en base 2\n");
    printf("En fait pour mon algorithme il suffit de faire des divisions par a=2 ici\n");
    printf("de s'occuper de stoker mes restes des divisions successives ,bon pas trop \n");
    printf("compliques! il suffit d'utiliser la fonction modulo \n");
    printf("j'arretes mes divisions quand mon quotient = 0\n");
    printf("--------------------------------------------------------------------------------\n");
    printf("Plus generalement pour convertir un nombre en base 10 dans une autre base a\n");
    printf("il suffit de faire des divisions par a . Pour les restes >9 on code avec des\n");
    printf("lettres A pour le reste 10 , B pour le reste 11 ............\n");
    printf("Ici on codera jusqu'a la base 36, les dix chiffres arabes + les 26 lettres de\n");
    printf("l'alphabet.\n");
    printf("--------------------------------------------------------------------------------\n");

}


void Conversion(int nombre, int base)
{
    int tab[32]; // nombre jusqu a 2 puissance 32------->2 147 483 647 maxi d'un int
    int i;
    int quotient;
    for (i=0;i<64;i++);
    {
        tab[i]=0;
    }
    quotient = nombre;
    i=0;
    // je fais mes divisions successives
    while (quotient !=0)
    {
        tab[i]=quotient % base;
        quotient=quotient/base;
        i++;
    }
    //j affiche le resultat
    i--;
    if (base==2)
    {
        printf("le nombre occupe en memoire %d octets\n",i/8+1);
    }

    printf("le resultat de : %d en base %d :",nombre,base);
    while (i>=0)
    {

        switch (tab[i])
        {
            case 10 :
                printf("A");
                break;
            case 11 :
                printf("B");
                break;
            case 12 :
                printf("C");
                break;
            case 13 :
                printf("D");
                break;
            case 14 :
                printf("E");
                break;
            case 15 :
                printf("F");
                break;
            case 16 :
                printf("G");
                break;
            case 17 :
                printf("H");
                break;
            case 18 :
                printf("I");
                break;
            case 19 :
                printf("J");
                break;
            case 20 :
                printf("K");
                break;
            case 21 :
                printf("L");
                break;
            case 22 :
                printf("M");
                break;
            case 23 :
                printf("N");
                break;
            case 24 :
                printf("O");
                break;
            case 25 :
                printf("P");
                break;
            case 26 :
                printf("Q");
                break;
            case 27 :
                printf("R");
                break;
            case 28 :
                printf("S");
                break;
            case 29 :
                printf("T");
                break;
            case 30 :
                printf("U");
                break;
            case 31 :
                printf("V");
                break;
            case 32 :
                printf("W");
                break;
            case 33 :
                printf("X");
                break;
            case 34 :
                printf("Y");
                break;
            case 35 :
                printf("Z");
                break;
            default :
                printf("%d",tab[i]);
                break;

        }
        i--;
    }
    printf("\n");

    //fin procedure conversion
}
  • Partager sur Facebook
  • Partager sur Twitter
23 octobre 2008 à 21:11:07

Bonsoir,

trop d'appel à printf ^^ , tu pourrais l'appeler beaucoup moins souvent. Au lieu de faire :
printf("blabla.\n");
printf("blablabla.\n");
printf("blablablabla.\n");

Tu peux faire :
printf("blabla.\n"
       "blablabla.\n"
       "blablablabla.\n");


Sinon la partie conversion me semble pas mal.
  • Partager sur Facebook
  • Partager sur Twitter