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 :

problème avec un tableau


Sujet :

C

  1. #41
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par chicabonux Voir le message
    Voilà ma logique de programme représentée par mes commentaires
    <...>
    Le code ne fonctionne pas mais j'ai l'impression que c'est parce que la division de n par 16 est mal interprété par le compilateur ?
    Le compilateur fait exactement ce qu'on lui demande. Si il produit une erreur, c'est qu'on lui a demandé de faire une erreur...

    Est-il nécessaire de faire plus compliqué que :
    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
     
    #include <stdio.h>
     
    int main (void)
    {
       int n;
    /* -entrer un nombre n au clavier */
       printf ("Introduire n : ");
       scanf ("%d", &n);
       printf ("%X\n", n);
     
       {
          int i = 0;
          char t[100];
    /* -Faire les divisions succesives jusqu'à ce que le quotient égale 0 */
          while (n != 0)
          {
             static char const hex[] = "0123456789ABCDEF";
    /* stocker le caractere correspondant */
             t[i] = hex[n % 16];
             n = n / 16;
             i++;
          }
     
    /* -Afficher les caractères contenus dans le tableau du dernier au premier */
          {
             int j;
             for (j = 0; j < i; j++)
             {
                putchar (t[i - 1 - j]);
             }
          }
       }
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  2. #42
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Ton programme fonctionne à merveille mais je ne suis pas sur que c'était le but de mon exercice global . Je pense qu'il aurait fallut que je poursuive le code sur ceux que j'avais déjà fait auparavant , sans doute pour essayer d'apprendre une certaine logique que je n'ai toujours pas acquise

  3. #43
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    J'essaie à nouveau pour tenter de trouver une solution plus conforme à mon exercice

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #include <stdio.h>
     
    int main (void)
    {
     
        int n,i,j;
        char t[100];
      int T[100];
     
    printf("Introduire n");
    scanf("%d",&n);
     
    do
    {
               T[i]=n%16;
               n=n/16;
               i++;
     
               if((T[i-1])<0)T[i-1]=t[j];
     
               else
               {
                   switch(T[i-1])
                   {
                            case 10:t[j]='a';
                            break;
                            case 11:t[j]='b';
                            break;
                            case 12:t[j]='c';
                            break;
                            case 13:t[j]='d';
                            break;
                            case 14:t[j]='e';
                            break;
                            case 15:t[j]='f';
                            break;
                            default:printf("erreur");
                            }
                            }
     
                            for(j=0;j<i;j--)printf("%c\n",t[j]);
                            }while(n!=0);
     
                            system("PAUSE");
                            return 0;
                            }
    Et ce programme ne me donne même pas de résultat!

    J'aimerais essayer de comprendre mes erreurs pour pouvoir progresser

  4. #44
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    on patine dans la choucroute là....

    Déjà :

    • de nouveau i et j non initialisés

    • de nouveau ton tableau (chaque élément calculé) est écrasé à chaque fois...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #45
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Désolé j'ai oublié d'initialiser i et j

    Par contre mon gros problème c'est de pouvoir sauvegarder les différentes valeurs des restes sans les écraser et aussi de trouver la méthode pour parvenir au bout de mes raisonnements

  6. #46
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Nouvelle tentative

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
     
    #include <stdio.h>
     
    int main (void)
    {
     
        int n,i=0,j=0;
        char t[1000];
     
     
    printf("Introduire n");
    scanf("%d",&n);
     
    while(n!=0)
    {
               t[i]=n%16;
               n=n/16;
               i++;
     
               if((t[i-1])<0)t[i-1]=t[j];
     
               else
               {
                   switch(t[i-1])
                   {
                            case 10:t[j]=a;
                            break;
                            case 11:t[j]=b;
                            break;
                            case 12:t[j]=c;
                            break;
                            case 13:t[j]=d;
                            break;
                            case 14:e=t[j]+'0';
                            break;
                            case 15:t[j]=f;
                            break;
                            default:printf("erreur");
                            }
                            }
                            }
                            for(j=(i-1);j>=0;j--)printf("%c\n",t[j]);
     
                            system("PAUSE");
                            return 0;
                            }
    ça ne fonctionne toujours pas et je n'arrive toujours pas à trouver les erreurs que je dois commettre !

    Je pense que pour l'instruction 'switch' ça ne doit pas pouvoir fonctionner comme je l'ai fait mais je ne vois pas comment faire ?

  7. #47
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Tu te compliques beaucoup. Il y a plus simple.

    Quelques remarques :
    1/ A l'intérieur du "while", ne mélange pas "i" et "j". Une seule variable est nécessaire. Tu peux utiliser "i" par exemple.
    2/ Tu peux incrémenter "i" avant la fin du bloc du "while", cela évite de retrancher 1 à chaque fois à l'indice du tableau.
    3/ Dans ton switch, tu confonds caractère et variable. Tu écris : a au lieu de 'a', b au lieu de 'b', etc.

    Une piste :
    1/ Si le reste est inférieur à 10, il faut remplir la case courante du tableau par un caractère représentant le chiffre (0 -> '0', etc). Une addition suffit.
    2/ Dans les autres cas, le reste est donc supérieur ou égal à 10. Il faut donc remplir la case courante du tableau par un caractère représentant le chiffre hexadécimal (10 -> 'A', etc).

    Tu es presque au but, il y a quelques trucs à modifier dans ton code, et cela fonctionne (j'ai corrigé ton code chez moi et cela fonctionne).

    Pour des questions de lisibilité et de 'logique', tu peux aussi utiliser une variable à part entière pour y mettre le reste de la division, la variable "reste" par exemple. Et réserver le tableau uniquement pour la chaine de caractère représentant ce nombre hexadécimal.

  8. #48
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Je ne comprends pas ton explication ?

    1/ Si le reste est inférieur à 10, il faut remplir la case courante du tableau par un caractère représentant le chiffre (0 -> '0', etc). Une addition suffit.
    Faut il ici aussi que je passe par l'instruction 'switch' pour représenter les 10 chiffres quand i est inférieur à 10 ?

    Avec mon nouveau programme j'ai bien les résultats pour les caractères mais ce n'est pas bon pour les chiffres ?

    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
    37
    38
    39
    40
    41
    42
    43
    44
    int main (void)
    {
     
        int n,i=0,j=0,courant;
        char t[1000];
     
     
    printf("Introduire n");
    scanf("%d",&n);
     
    while(n!=0)
    {
              i=n%16;
               n=n/16;
     
     
               if(i<10)t[j]=i+'0';
     
               else
               {
                   switch(i)
                   {
                            case 10:t[j]='a';
                            break;
                            case 11:t[j]='b';
                            break;
                            case 12:t[j]='c';
                            break;
                            case 13:t[j]='d';
                            break;
                            case 14:t[j]='e';
                            break;
                            case 15:t[j]='f';
                            break;
                            default:printf("erreur");
                            }
                            }
                            }
                            i++;
                            for(j=(i-1);j>=0;j--)printf("%c\n",t[j]);
     
                            system("PAUSE");
                            return 0;
                            }
    Je vais tenter avec un switch mais je ne suis pas sur que ce soit la bonne méthode ce que je fais ?

    if(i<10)t[j]=i+'0';
    Je vois bien que c'est là le problème du programme mais je n'arrive pas à comprendre comment représenter les chiffres de 0 à 9 ?

  9. #49
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Je ne comprends pas ton explication ?
    Qu'est-ce que tu ne comprends pas ?

    Faut il ici aussi que je passe par l'instruction 'switch' pour représenter les 10 chiffres quand i est inférieur à 10 ?
    Non, mais regarde la condition de ton "if". Il n'y a rien qui te choque dedans ?
    Je vais tenter avec un switch mais je ne suis pas sur que ce soit la bonne méthode ce que je fais ?
    Pas besoin pour les chiffres. La norme C garantit que les chiffres sont contigüs. L'addition, comme tu l'as fait, fonctionne bien. C'est la condition qui ne va pas.

    Comme tu utilises "j" pour l'indice du tableau, c'est "j" qu'il faut incrémenter et non "i"... et il faut le faire avant la fin du bloc du "while", pas après.

    Comme tu utilises "j" également pour le "for", il faut donc modifier la ligne de manière à faire disparaître "i" dedans.

    C'est donc tout à fait normal que le code, écrit ainsi, ne puisse pas donner le résultat attendu.

  10. #50
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    J'ai suivi tes conseils mais ça ne s'arrange pas

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
     
    #include <stdio.h>
     
    int main (void)
    {
     
        int n,i=0,j=0;
      char t[1000];
     
     
    printf("Introduire n");
    scanf("%d",&n);
     
    while(n!=0)
    {
              i=n%16;
               n=n/16;
     
     
               if(i<10){
     
             t[j]=i+'0';
               }
               else
               {
                   switch(i)
                   {
                            case 10:t[j]='a';
                            break;
                            case 11:t[j]='b';
                            break;
                            case 12:t[j]='c';
                            break;
                            case 13:t[j]='d';
                            break;
                            case 14:t[j]='e';
                            break;
                            case 15:t[j]='f';
                            break;
                            default:printf("erreur");
                            }
                            }
                          j++;
                            for(j=n%16;j>=0;j--)printf("%c\n",t[j]);
                            }
     
                            system("PAUSE");
                            return 0;
                            }
    Pourquoi ça ne donne pas les bons résultats ?

    la condition if ne fonctionne toujours pas et je ne suis pas sur de bien faire se comporter la variable j ?

  11. #51
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Rien ne te choque ici ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (condition)
    {
      /* (... code ...) */
      j++;
      for(j=n%16;j>=0;j--)printf("%c\n",t[j]);
    }
    En outre, je ne comprends pas pourquoi tu mets j=n%16. C'est plus du pifomètre que de la logique.

  12. #52
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Tu me dis ça

    Comme tu utilises "j" pour l'indice du tableau, c'est "j" qu'il faut incrémenter et non "i"
    Alors j'essaie de faire comme tu as dit,bien que je me doutais bien que c'était pas ça
    Après tu me dis d'enlever i dans la boucle for

    Comme tu utilises "j" également pour le "for", il faut donc modifier la ligne de manière à faire disparaître "i" dedans.
    C'est sur que là je patauge beaucoup et j'aimerais être guidé pour comprendre le mécanisme et la méthode

  13. #53
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <stdio.h>
     
    int main (void)
    {
     
        int n,i=0,j=0;
    char t[1000];
     
    printf("Introduire n");
    scanf("%d",&n);
     
    while(n!=0)
    {
              i=n%16;
               n=n/16;
     
               /*première condition les restes sont numériques */
               if(i<10){
         /*Je convertis les nombres en caractères ?*/
             t[j]=i+'0';
               }
    /*deuxième condition les restes deviennent des caractères*/
               else
               {
                   switch(i)
                   {
                            case 10:t[j]='a';
                            break;
                            case 11:t[j]='b';
                            break;
                            case 12:t[j]='c';
                            break;
                            case 13:t[j]='d';
                            break;
                            case 14:t[j]='e';
                            break;
                            case 15:t[j]='f';
                            break;
                            default:printf("erreur");
                            }
                            }
    /*J'incrémente i pour trouver le résultat du prochain reste*/
                         i++;
    /*J'affiche les résultats du tableau à l'aide d'une nouvelle boucle
                            for(j=i;j>=0;j--)printf("%c\n",t[j]);
                            }
                          
                            system("PAUSE");
                            return 0;
                            }
    Je prends des exemples et les résultats ne fonctionnent pas
    J'aimerais comprendre mes erreurs pour pouvoir progresser

  14. #54
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    ici c'est j qu'il faut ue tu incrémentes, et pas i :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /*J'incrémente i pour trouver le résultat du prochain reste*/
                         i++;
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  15. #55
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Après tu me dis d'enlever i dans la boucle for
    Vu que tu as décidé d'utiliser la variable i (ça aurait pu être une autre variable, peu importe) afin d'y mettre le reste de la division, i n'a donc plus rien à faire dans la boucle for, qui, elle, ne sert qu'à afficher le tableau dans la console. D'où le fait qu'il faut faire disparaître i de la boucle for.
    Le tableau ne doit afficher qu'un certain nombre de caractères, c'est-à-dire un nombre correspondant à la valeur de j, puisque j vaut au départ 0, mais il est incrémenté de 1 à chaque passage dans la boucle while. Cette variable correspond donc à la position de l'indice courant dans le tableau, où l'on inscrit le nombre hexadécimal. Et par conséquent, une fois qu'on est sorti de la boucle while, cette variable correspond aussi au nombre de caractères qui sont dans le tableau.
    On sait aussi que la tableau se remplit "à l'envers", vu l'algorithme utilisé. Et comme un tableau commence à l'indice 0, il faut donc afficher les caractères du tableau situé de l'indice j-1 à 0 inclus, ce qui correspond bien à l'affichage de j caractères. Or, tu initialises ta boucle for avec des valeurs incohérentes; c'est sur ce point-là que je ne te suis pas, je ne comprends pas pourquoi tu t'y prends de cette manière.

    D'après la position de ton printf dans ton code, tu sembles vouloir afficher le tableau à chaque fois qu'il se remplit d'un caractère. Pas de soucis. Mais vu que tu utilises cette même variable j au sein du for, elle vaudra alors -1 lorsqu'elle en sortira, puisque for la décrémente jusqu'à 0, puis juste avant le dernier test (qui provoquera la sortie de cette boucle), j est encore décrémenté, et vaut donc -1 en sortie de boucle. Cela veut dire qu'à chaque fois qu'on reviendra en début de boucle while, la variable j vaudra -1. Non seulement, le programme risque de crasher (écriture en dehors du tableau) mais surtout seule la première case du tableau sera remplie. Et ceci n'est pas le but, car le programme ne pourra pas fonctionner comme on veut.

    Donc, si tu veux afficher le résultat à chaque passage de boucle, il faut utiliser une autre variable que j. Tu peux soit utiliser i (lui est modifié grâce à l'opérateur = au début de la boucle, donc c'est pas gênant si on écrase sa valeur une fois qu'on a inscrit le caractère dans le tableau, puisqu'à partir de cet endroit jusqu'en fin de bloc du while, cette variable ne sert donc plus à rien), soit tu peux déclarer une nouvelle variable utilisée seulement pour parcourir la boucle for (à la rigueur, c'est presque mieux, car ça permet d'éviter de s'embrouiller avec les différentes variables).
    Si tu veux afficher le résultat une fois le tableau rempli, tu peux dans ce cas garder la variable j pour parcourir ton tableau à l'envers, puisque j correspond alors au nombre de caractères écrits dans le tableau.
    Dans tous les cas, il faut parcourir le tableau à partir de la position j-1 comme je viens de l'expliquer juste au-dessus.

    De plus, dans ton code, c'est toujours i que tu incrémentes... au lieu de j.

    Le problème est simple. Mais je crois que tu t'embrouilles un peu avec toutes les variables de ton code et leur utilité.


    Pour résumer :

    1) Pour le reste de la division, tu utilises i. Pas de problème ici.
    2) Pour la position courante de l'élément du tableau, tu utilises j (comme c'est le cas actu). Par conséquent,il faut remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*J'incrémente i pour trouver le résultat du prochain reste*/
                         i++;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /*J'incrémente j pour passer à l'élément du tableau suivant*/
                         j++;
    3) Pour l'affichage du tableau, dans la boucle for :
    a) Si tu veux afficher le tableau à chaque passage de boucle, tu peux utiliser i (qui ne sert plus à rien, une fois le nouveau caractère inscrit dans le tableau) et l'initialiser avec le résultat de j-1. Mais n'initialise surtout pas j !
    b) Si tu veux afficher le tableau une fois le tableau rempli, tu peux utiliser la variable j, mais en la décrémentant d'1.

    Le problème, ce n'est pas l'utilisation des variables toto, bidule, j, i ou abc, mais de définir leur utilité dans le programme, et les éventuels problèmes inattendus liés à une modification de valeur qui n'a pas lieu d'être.
    C'est une question d'algorithmique, de logique. Il faut bien comprendre ce que chaque instruction provoque comme conséquence(s).

  16. #56
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Super tes explications

    Je crois que j'ai pas encore bien compris ce qu'est un tableau et comment manipuler ses valeurs et les variables Qu'est ce que ça va être quand je vais avoir des exercices plus compliqués sur les pointeurs ou les structures ?

    Le programme fonctionne super bien grace à tes explications . j'espère que tu pourras encore m'aider dans mon apprentissage du langage

    Merci

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    #include <stdio.h>
     
    int main (void)
    {
     
        int n,i=0,reste;
    char t[1000];
     
     
    printf("Introduire n");
    scanf("%d",&n);
     
    while(n!=0)
    {
              reste=n%16;
               n=n/16;
     
     
               if(reste<10){
     
             t[i]=reste+'0';
               }
               else
               {
                   switch(reste)
                   {
                            case 10:t[i]='a';
                            break;
                            case 11:t[i]='b';
                            break;
                            case 12:t[i]='c';
                            break;
                            case 13:t[i]='d';
                            break;
                            case 14:t[i]='e';
                            break;
                            case 15:t[i]='f';
                            break;
                            default:printf("erreur");
                            }
                            }
                         i++;
     
                            }
     
                          for(i=(i-1);i>=0;i--)printf("%c\n",t[i]);
     
                            system("PAUSE");
                            return 0;
                            }

  17. #57
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Le code a l'air bon, cette fois.
    Il y a juste un "mais"... Le seul cas où ça pose problème, c'est lorsqu'on entre la valeur 0. Pour résoudre ça, il suffit simplement de remplacer la boucle while par une boucle do / while, et ce sera impec.

    Je crois que j'ai pas encore bien compris ce qu'est un tableau et comment manipuler ses valeurs et les variables
    Un tableau, c'est juste une zone de mémoire constituée d'un certain nombre d'éléments d'un type donné. Pour imager, c'est comme un meuble constitué de plusieurs tiroirs identiques, qui se suivent, dans chacun desquels on peut ranger un même type d' "information" (soit une valeur soit un ensemble de valeurs (structure) ).
    Chaque tiroir est indépendant des autres. Modifier l'information contenue dans un tiroir ne modifie pas celles situées dans les autres.
    On peut donc accéder à chacun de ces tiroirs en utilisant, ce qu'on appelle un indice, qui correspond au numéro du tiroir. Le première tiroir a l'indice 0, le second a l'indice 1, etc.

    Si tu déclares un tableau du style :
    tu as donc un tableau de 10 éléments (tiroirs) dans chacun desquels tu peux ranger ou lire un nombre entier (int).

    Si tu tapes
    tu ranges le nombre 15 dans le premier tiroir (indice 0).

    Si ensuite tu tapes
    tu ranges le nombre 50 dans le second tiroir (indice 1). Dans le premier tiroir, tu as toujours la valeur 15 de rangée, ça ne la modifie pas.

    Si par contre tu tapes
    tu remplaces alors le nombre 15 du premier tiroir par le nombre 2.

    Il existe aussi des tableaux à (par exemple) 2 dimensions. C'est la même chose, mais les tiroirs sont disposés à la fois en longueur et en hauteur. On accède au bon tiroir en donnant entre crochets l'indice correspondant respectivement à la ligne et à la colonne du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int tab2dim[10][10];
    tab2dim[1][7]=20; /* Ligne 2, colonne 8 -> on y range le nombre 20 */
    Même principe pour les tableaux à 3, 4, ... dimensions (tailles arbitraires) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int tab2dim[5][10];
    int tab3dim[20][15][15];
    int tab4dim[10][10][15][30];

    Une structure, par contre, est un ensemble de données de tel ou tel type. Chacune de ses données peut être modifiée indépendamment de celle des autres.
    Une structure, c'est quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct voiture
    {
      int numero_dossier;
      int nombre_porte;
      double poids;
      char etat; /* 0=neuve 1=occaz correcte 2=bonne à la casse */
      (...)
    };
    qui permet, par exemple, à un programmeur bossant dans le domaine des voitures de gérer une liste de voiture, et d'y entrer les informations pour chaque voiture. Dans ce cas, on utilise un tableau de structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     struct voiture listevoiture[10]; /* 10, valeur arbitraire */
    Pour la voiture 1 (premier élément du tableau, donc indice 0), on peut écrire les données qui nous intéresse. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    listevoiture[0].numero_dossier=1;
    listevoiture[0].nombre_porte=5;
    listevoiture[0].poids=1500.0;
    listevoiture[0].etat=1;
    Pour la voiture 2, on peut taper, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    listevoiture[1].numero_dossier=2;
    listevoiture[1].nombre_porte=3;
    listevoiture[1].poids=1400.0;
    listevoiture[1].etat=2;
    etc.

    Le problème avec un tableau, quel que soit son type, c'est qu'il faut connaître, lors de la compilation, le nombre maximal d'éléments qu'il pourra contenir.

    Pour les pointeurs, c'est un peu plus compliqué. Mais une fois qu'on a compris le truc, c'est facile. Je vais éviter de t'embrouiller avec ça, il faut y aller étape par étape. Un jour, tu seras de toute façon amené à les utiliser, c'est très pratique.

  18. #58
    Membre régulier Avatar de chicabonux
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    329
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Oise (Picardie)

    Informations forums :
    Inscription : Mai 2007
    Messages : 329
    Points : 73
    Points
    73
    Par défaut
    Vraiment super tes explications . Au risque de me répéter je te remercie grandement une nouvelle fois
    J'aurai encore beaucoup de question sur le C à poser dont celle ci : dans les différents IDE que j'utilise (Visual Studio 2005 , Dev C++ et code:blocks ) à chaque fois à la fin du main je suis obligé de mettre la ligne 'System("PAUSE")' pour pouvoir voir les résultats sur l'écran . Je ne peux pas faire autrement ?

  19. #59
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    J'aurai encore beaucoup de question sur le C à poser dont celle ci : dans les différents IDE que j'utilise (Visual Studio 2005 , Dev C++ et code:blocks ) à chaque fois à la fin du main je suis obligé de mettre la ligne 'System("PAUSE")' pour pouvoir voir les résultats sur l'écran . Je ne peux pas faire autrement ?
    Tu peux le remplacer par un getchar();, pour que le programme quitte après l'appui sur la touche ENTRéE.

  20. #60
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pour Dev-C++ et Code::Blocks, c'est un problème connu.

    Pour Visual Studio 2005, le problème ne se pose pas si tu lances le programme hors du debugger: Pour cela, utiliser l'option "Start Without Debugging" (Icône: Flèche verte creuse, raccourci VC6: Ctrl-F5) au lieu de l'option "Start Debugging" (Icône: Flèche verte pleine, raccourci VC6: F5).

    Je suggère d'ajouter cette commande à la barre d'outils, à côté de l'autre, car elle est vachement utile.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. Réponses: 5
    Dernier message: 24/05/2006, 08h59
  2. Problème avec redimensionnement tableau
    Par PoZZyX dans le forum Réseau
    Réponses: 18
    Dernier message: 20/04/2006, 15h46
  3. Problème avec un tableau et saut de ligne
    Par ero-sennin dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 08/03/2006, 18h48
  4. Problème avec un tableau de tableau
    Par SubZero2 dans le forum Langage
    Réponses: 4
    Dernier message: 07/12/2005, 15h25
  5. problème avec un tableau dans un insert ...
    Par vbcasimir dans le forum Langage
    Réponses: 3
    Dernier message: 02/11/2005, 14h31

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