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 :

Exercice sur les bits


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut Exercice sur les bits
    Nouveau problème qui n'en ai pas réellement un... c'est plutôt une correction explicative que je recherche... Avis aux amateurs.

    Je souhaite écrire un programme qui lit une suite de caractère '0' ou '1' tapés au clavier, dont l'arrêt intervient à la rencontre de EOF ou '\n'. Il affiche une erreur et se termine si le caractère entré est différent de ' 0 ' ou ' 1 '.

    Enfin, il affiche les valeurs de la suite de 0 et de 1 lue (si plus de 32 caractères sont lus, les 32 derniers seront affichés) interprété comme entier, comme entier non signé, comme un tableau de 2 entiers courts et comme un flottant.

    L'aide indique que :
    - x << n renvoie la valeur de x décalée vers la gauche de n bits avec introduction de n bits à 0 à droite.
    - x << = n affecte cette valeur décalée à la variable x elle meme.
    - prototype de getchar()
    -liste des opérateurs bits à bits (& , |, ^ et tilde (désolé je ne le vois pas sur mon clavier US :/))

    Mon code :
    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()
    {
        int bit;
        char tabit[32];
        int i = 0, cmp = 0;
        for(i;i<32;i++)
        {
            tabit[i]='a';//pour stopper a moins de 32 char
        }
        char var;
        bit = getchar();
        var = (char) bit;
        while (var == '1' || var == '0')
        {
            tabit[cmp]= var;
            cmp++;
            var = (char)getchar();
            if(cmp == 31)
            {
                cmp = 0; // au bout de 32 char, on revient au debut
            }
        }
        for(i;i<cmp;i++)
        {
            if(tabit[i] == 'a')
            {
                return 0;
            }
            printf("%c",tabit[i]);//il manque pas mal d affichage je sais mais je souhaite d abord comprendre.
        }
        printf("\n");
        return 0;
    }
    Il y a surement pas mal d'erreurs et je ne vois pas comment utiliser certains points de l'aide.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 476
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 476
    Par défaut
    Bonjour,

    — Ligne 13, tu déclares une nouvelle variable alors que tu as commencé à écrire des instructions auparavant. C99 te permet de le faire, mais c'est mieux si tu prends l'habitude de regrouper tes variables en début de bloc ;
    — Ligne 21, tu vérifies si cmp est égal à 31 (ce qui est encore une valeur correcte) au lieu de 32 ;

    Pour le reste, je crois que ton professeur te demande de manipuler directement les bits d'un int et pas de remplir un tableau de caractères les simulant. Donc, lorsque tu lis un caractère parmi « 0 » ou « 1 », il faut d'abord lui retrancher « '0' », soit le code ASCII du caractère « 0 », de manière à obtenir une vraie valeur numérique égale à 0 ou à 1, laquelle tient alors, donc, sur un seul bit.

    Tu décales ensuite le contenu d'un int sur 32 bits d'une position à gauche pour insérer le nouveau, et tu ajoutes ce nouveau bit (qui est déjà à la bonne position), à l'aide d'un OU logique « | ».

    Pour afficher le contenu de la variable ainsi chargée, il te suffit d'utiliser « printf("%d\n",variable); » comme tu le ferais en temps normal. Pour afficher le résultat suivant d'autres formats (unsigned int, float), le plus simple est de récupérer l'adresse de ta variable avec « & », de faire un transtypage (cast) dessus, et de le re-déférencer avec « * ».

    Enfin, je te conseille d'utiliser « #include <stdint.h> » et le type int32_t pour être sûr que la variable que tu exploites est bien longue de 32 bits. Sur certaines machines, ce type peut ne pas être disponible. Il le sera forcément sur la tienne.

    PS : pour le tildé « ~ », tu le trouveras probablement sur la touche la plus en haut à gauche de ton clavier, c'est-à-dire celle qui sert au « ² » en Europe, juste au dessus de la touche de tabulation. Il faudra peut-être utiliser Shift avec.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2008
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 146
    Par défaut
    Merci de la promptitude de ta réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 28/07/2006, 10h16
  2. Besoin d'aide pour un exercice sur les registres
    Par zakuza dans le forum Assembleur
    Réponses: 5
    Dernier message: 14/04/2006, 14h23
  3. Manipulations sur les bits
    Par ThE_LaSt dans le forum C
    Réponses: 23
    Dernier message: 27/03/2006, 14h22
  4. Réponses: 4
    Dernier message: 28/07/2005, 16h22
  5. opérations sur les bits d'un byte
    Par petitours dans le forum C++Builder
    Réponses: 4
    Dernier message: 10/02/2004, 20h42

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