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 :

representation en binaire sur n bits


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 0
    Points
    0
    Par défaut representation en binaire sur n bits
    bonjour j'ai un petit souci et j'espere que vous pouvez me donner un coup de main.
    le probleme consiste a entrer en clavier un nmbre entier n et de donner toutes les representations binaires sur n bite ( cad 2 a la puissance n representations).
    et les representer dans une matrice,
    voila ce que j'ecris,

    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
    int main(){
        char mat[50][50];
    char c[50];
           int n,i,j;
           printf("entrer n\n");
           scanf("%d",&n);
           int N=(int)pow(2,n-1);
     
           for(i=0;i<N;i++){
                            for(j=0;j<n;j++){
                            mat[i][j]='0';}
                            }\\ initialisation de la matrice
                        for(i=0;i<n;i++){
                            for(j=0;j<pow(2,i);j++)
                            mat[j][i]='0';
                            for(j=pow(2,i);j<=pow(2,i+1)-1;j++)
                            mat[j][i]='1';}
    for(i=0;i<n;i++){ 
     strcpy(c,s[i])
    for(j=0;j<=pow(2,n-i-1)-1;j++)
    strcat(s[i],c);}
     
     
                        return 0;
     
                   }
    svp je chercher pas un algorithme mais juste je voudrais corriger le mien. merci pour votre aide

  2. #2
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    Salut,

    En ignorant la boucle avec strcpy et strcat, puisque s n'est pas déclaré; et la boucle d'initialisation, il reste le for central qu'on va décortiquer.

    Le parcours se fait colonne par colonne, les 2^i premières lignes de chaque colonne i sont à mise à 0 et les suivantes à 1.

    Pour n=3, on a une matrice initialisée de 4x3 !!! alors qu'on attend un matrice de 8x3 si je ne me trompe pas, qu'on remplit ainsi (avec x des indéterminés) :
    0 0 0
    1 0 0
    x 1 0
    x 1 0
    x x 1
    x x 1
    x x 1
    x x 1

    Il semblerait donc si on suit ton algorithme que tu ne reproduis pas "les motifs", qui te permettent de créer toutes les combinaisons.

    Enfin, ça serait chouette si tu pouvais mettre un code indenté, avec coloration syntaxique, avec le moins d'erreurs de syntaxe possible, avec quelques commentaires...

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 0
    Points
    0
    Par défaut
    salut niehu merci tout d'abord pour ta reponse.
    alors je t'explique le probleme. c'etait une partie d'un examen qui consistait a identifier les codes barres en introduisant au clavier 3 parameteres n,k,m.( pas important ici)
    la premiere partie consister à generer tous les nombres bianaire a n-1 bits ( le bit n est deja fixé à 1).
    voila ce que j'ai fait,
    sur n-1 bit on aura une matrice de dimension n-1 lignes i 2 puissance n-1 colonnes.
    cette matrice je l'ai initialisée a '0'
    si on voit dans le code bianaire par exemple pour 4 bits
    0000
    0001
    0010
    0011
    0100
    0101
    0110
    0111
    1000
    1001
    1010
    1011
    1100
    1101
    1110
    1111
    pour la premiere colonne 01 se repetent 7 fois,
    pour la deuxieme conne 0011 se repetent 3 fois
    pour la 3eme colonne 000011111 se repetent une fois
    e la dernier colonnes se repetent 0 fois.

    Mon algorithme consistait au debut de definir pour chaque colonne la partie qui se repete ( les 2 boucles for)
    ensuite utilisant starcat je concatene la partie qui se repete pour chaque colonne.
    j'espere que vous avez compris ce que je voulais faire.

    stp que dois je faire, je dois rendre le code compilable et excutable aujourd'hui.
    merci

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 15
    Points : 23
    Points
    23
    Par défaut
    Déjà il y a quelques points à corriger dans ton code :

    Les includes (si tu as oublié de les mettre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    s n'est pas déclaré, on ne sait pas de quoi il s'agit.
    Ensuite il manque un ; derrière le strcopy.

    Enfin, je ne pense pas que tu puisses utiliser les fonctions de manipulation de chaînes de cette manière. En C une chaîne de caractère se termine par le caractère '\0', or dans ton tableau ce caractère n'est pas présent, strcat et strcpy vont donc dysfonctionner. De plus tu attends la lecture des caractères sur une colonne alors que les éléments consécutifs sur une colonne ne se suivent pas en mémoire, cela ne peut donc pas fonctionner.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 24
    Points : 0
    Points
    0
    Par défaut
    j'ai fait tous les includes necessaires. pour s just une petite erreur il s'agit en faite de mat. pour mat[i] ca represente la ligne i de la matrice mat donc pour selectionner la colone je vais faire la transposée d'abors puis ajouter '\0' la fin de chaine de caractere. est ce il vous juste ce que je voudrais faire.
    je sais bien qu'il ya des algorithmes bien sophistiqués, mais le probleme je dois utiliser l'algorithme en question.
    merci encore une fois pour votre aide

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    svp je chercher pas un algorithme mais juste je voudrais corriger le mien.
    Cela nécessite tout de même de réfléchir sur cet algorithme même si on conserve l'idée de base que tu as (partir du nombre de 1 ou de 0 consécutifs dans une colonne donnée).

    Tu veux construire un tableau (mat) contenant la liste des combinaisons possibles de n bits (comme dans l'exemple de ton message précédent).
    - D'abord, ton tableau de 50x50 n'est pas approprié puisqu'il y a beaucoup plus de lignes que de colonnes. En prenant le premier indice comme celui des lignes, on peut envisager par exemple un tableau
    - Il faut savoir où mettre les '0' et où mettre les '1' dans une colonne.
    Si n est le nombre de bits et N le nombre de combinaisons (= 2^n) et si on considère la colonne C (=0..n-1), on constate que les blocs de '0' et les blocs de '1' ont chacun Bloc(C) = N/2^(C+1) éléments soit :
    Bloc(0) = N/2
    Bloc(i+1) = Bloc(i)/2, i=0...
    Dans ton exemple n=4 , N=16, Bloc(0)=8, Bloc(1)=4, Bloc(2)=2, Bloc(3)=1

    - On peut numéroter les blocs à partir de 0 en partant de la première ligne. Alors, les blocs de numéro impair doivent avoir un '1' et les autre un '0'. Il suffit donc de savoir le numéro du bloc où on se trouve.
    Si on est sur la ligne L, Le numéro de bloc de la colonne C où on se trouve est L/Bloc(C)
    Alors :
    Initialiser la taille d'un bloc Bloc à N/2
    De la colonne C=0 à la colonne C=n-1
     - De la première ligne L=0 à la dernière ligne L=N-1
        Si L/Bloc est impair (L/Bloc%2==1) mettre '1' sinon mettre '0'
     - Diviser Bloc par 2  
    Ce qui nous donne :
    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
    ....
      char tab[256][8];
      int C,L;
      int Bloc= N/2;
      // Calcul 
      for(C=0; C<n;C++,Bloc/=2)
        for(L=0; L<N;L++)
         tab[L][C] = L/Bloc%2==1 ? '1' : '0'; //ou,si on préfère, utiliser un if...else
     
      // Affichage
      for(L=0; L<N;L++)
      {
        for(C=0; C<n;C++) printf("%c ", tab[L][C]);
        printf("\n");
      }
    - Autre possibilité qui se rapproche plus de ton code je crois:
    Sur la colonne C, on a NBloc(C) = N/Bloc(C)/2 = 2^C blocs constitué d'un bloc de Bloc(C) '0' suivi d'un bloc de Bloc(C) '1' soit :
    NBloc(0) = 1
    NBloc(i+1) = 2*NBloc(i) i=0...
    Dans ton exemple n=4 , N=16, Bloc(0)=8, Bloc(1)=4, Bloc(2)=2, Bloc(3)=1, NBloc(0) = 1, NBloc(1) = 2, NBloc(2) = 4, NBloc(3) = 8
    - Initialiser la taille d'un bloc Bloc à N/2 et le nombre de blocs NBloc à 1
    - De la colonne C=0 à la colonne C=n-1
      - Se placer sur la première ligne (L=0)
      - faire NBloc fois
         -  de i = 0 à Bloc-1  tab[L][C] = '0' ; incrémenter L;
         -  de i = 0 à Bloc-1  tab[L][C] = '1' ; incrémenter L;
      - Diviser Bloc par 2  
      - Multiplier NBloc par 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    .....
      int Bloc= N/2;
      int NBloc = 1;
      for(C=0; C<n; C++,Bloc/=2,NBloc *=2 )
      {
        for(L=0, j=0; j<NBloc;j++)
        {
          for(i=0; i<Bloc; i++, L++)tab[L][C] = '0';
          for(i=0; i<Bloc; i++, L++)tab[L][C] = '1';
        }
      }
      //affichage
    ....
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Manipulations sur les bits
    Par ThE_LaSt dans le forum C
    Réponses: 23
    Dernier message: 27/03/2006, 14h22
  2. Addition sur 16 bits de tous les octets d'une chaîne
    Par fkerbourch dans le forum Langage
    Réponses: 6
    Dernier message: 06/07/2005, 11h06
  3. Insérer un entier sur 64 bits dans une base ?
    Par DJZiaK dans le forum SQLite
    Réponses: 1
    Dernier message: 10/05/2005, 17h37
  4. Réel sur 80 bits...
    Par julson dans le forum Assembleur
    Réponses: 12
    Dernier message: 17/05/2004, 16h37
  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