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 :

Algorithmie C conversion de chaine en code ascii [Débutant(e)]


Sujet :

C

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 105
    Par défaut Algorithmie C conversion de chaine en code ascii
    Bonjour,
    Je dois rédiger un programme en C, qui convertit une chaque de caractère placé en paramètre a son équivalent en code ASCII.

    Je souhaite juste comprendre comment fonctionne les tableaux de pointeur, et si ma logique algorithmique est juste.
    On place dans un tableau chaque caractère place en paramétre.
    nb_caractere++
    
      Tant que l'on n'arrive pas a "\0"  faire :
           Pour (i, i<= nb_caractere,i++) faire
              argv[1][i]= printf ("%d", argv[1][i]);
           Fin Pour
    /*
    Ce que j'essaie de dire c'est que l'on va tout mettre dans un tableau. 
    J'ai cru comprendre que argv était un tableau d'argument comme l'on 
    définit char** dans le main.
    */
      Fin Tant que 
    
         int asciichaine=0;
         Pour (i, i<=nb_caractere,i++) faire
            asciichaine= asciichaine + argv[1][i];
         Fin Pour
    
    printf (asciichaine) ;
    La syntaxe n'est pas exacte mais l'idée est la, mais je pense que je me suis trompé dans mon raisonnement, car cela ne fonctionne pas.
    A moins que cela vient de ma syntaxe.

    Oni'

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Citation Envoyé par Onitsha Voir le message
    Je souhaite juste comprendre comment fonctionne les tableaux de pointeur, et si ma logique algorithmique est juste.
    Certes, mais ta description qui suit n'a pas beaucoup logique !!! (niveau programmation)
    Tu as regardé la doc de printf ?

    Réaffecter argv, c'est casse-gueule.

    Commence par faire un algo, sans penser au code style printf concaténation de chaine ...
    Pense "logique" avant "programmation".

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 105
    Par défaut
    Justement je n'ai pas la moindre idée de comment faire.

    Pour moi il faudrait stocker tous les arguments dans un tableau.
    Puis comparer chaque case du tableau avec son équivalent en ASCII.
    Puis crée une copie du tableau courant avec le code ASCII du caractère présent dans chaque emplacement du tableau.

    Après comment faire ... j'ai du mal.

  4. #4
    Expert confirmé
    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
    Par défaut
    Je dois rédiger un programme en C, qui convertit une chaque de caractère placé en paramètre a son équivalent en code ASCII.
    Que signifie "convertir une chaîne de caractères en son équivalent en code ASCII" ?
    Je n'ai rien compris (et ce n'est pas ce pseudo code qui va m'éclairer!).

  5. #5
    Membre confirmé
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 105
    Par défaut
    Tu compiles et lance admettons on programme sous Linux :
    ./asciiconvertion jesuisdebutant

    Le programme dois prendre la chaine de caractère " jesuisdebutant"
    Et dire que la chaine est 106 + 101

    106 : code decimal de "j"
    101 : code decimal de "e"
    etc ...

    Puis en faire l'addition.

  6. #6
    Membre émérite
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Par défaut
    Yop,

    Pour ton algo je te propose un truc du genre:

    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Total = 0
    pour i allant de 0 à taille(argv1) -1 par pas de 1
      affichervaleurdecimal argv1[i]
      ajouter valeur de argv1[i] à Total
    fin pour
    afficher Total

    Qu'en penses tu ?

    ++

    Fiki

  7. #7
    Membre confirmé
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 105
    Par défaut
    J'essaie de coder ça tout a l'heure.
    Cependant nous sommes d'accord que "argv" est bien un tableau d'argument que l'on passe en paramètre lors de l’exécution du programme ? ^^

  8. #8
    Membre émérite
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Par défaut
    Oui, nous le sommes

  9. #9
    Membre confirmé
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 105
    Par défaut
    Parfait
    J'essaie de faire ça tout a l'heure. Merci

  10. #10
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    bonjour,

    le mieux est de tout t'expliquer, dans ta fonction main tu a argc et argv

    argc c'est le nombre de paramètre il est égal a 1 si 0 paramètre.
    Donc pour vérifié si tu a un paramètre en entrée tu verifie qu'il soit supérieur a 1.
    Aprés argv ce sont tes paramètres et c'est un tableau de tableau la case 0 c'est ton path + nom d’exécutable ensuite tes paramètres donc pour avoir ta chaine tu doit faire argv[1] ensuite en faisant argv[1][x] la deuxième case contient une valeur qui est le code ascii que tu désire et tu sais quand avançant ton x tu va a la case suivante ton but et de chercher le \0 pour avoir la fin de ton tableau.
    En attendant tu affiches chaque cases.

    Donc tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    tant que argv[1][x] != "\0" 
    alors x++;
    Maintenant j'ai une question pour toi certaine école te font faire un petit programme pour afficher les valeurs numériques si c'est le cas pour toi tu n'as peu être pas le droit d'utilisé printf.

    bone journée tout le monde

  11. #11
    Expert confirmé
    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
    Par défaut
    Aprés argv ce sont tes paramètres et c'est un tableau de tableau ....
    Non, c'est un tableau de pointeurs (vers des chaines de caractères).

  12. #12
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    Bah c'est un tableau de chaîne de caractères, une chaîne de caractère c'est un tableau de char donc tu peux le définir comme un tableau de tableau.

  13. #13
    Membre émérite
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Par défaut
    Perso je suis d'accord avec Diogene:

    On déclare ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char * argv[])
    ou ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char ** argv)
    Ce qui se lit dans le premier cas tableau de pointeurs, et dans le second pointeur de pointeur.
    a ma connaissance il n'est pas possible de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char  argv[][])
    ...
    Donc appelons un pointeur un pointeur et un tableau un tableau...

    Fiki

  14. #14
    Membre confirmé
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 105
    Par défaut
    Citation Envoyé par f-k-z Voir le message
    Yop,

    Pour ton algo je te propose un truc du genre:

    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Total = 0
    pour i allant de 0 à taille(argv1) -1 par pas de 1
      affichervaleurdecimal argv1[i]
      ajouter valeur de argv1[i] à Total
    fin pour
    afficher Total

    Qu'en penses tu ?

    ++

    Fiki



    J'ai essayé de codé ton algorithme, mais je dois avoir un problème de syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char** argv) {
        int i = 0;
        int total = 0;
     
        for (i; i =! "\0"; i++){
            printf("%d",argv[1][i]);
            total = (argv[1][i]"%d", argv[1][i]);        
        }
        printf (total);
     
    }

  15. #15
    Membre émérite
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Par défaut
    Oui y a deux trois soucis,

    soit tu utilises la boucle for, mais tu joues sur la taille:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (i; i <strlen(argv[1]); i++){
    en incluant string.h
    soit tu passes par une boucle while:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while (argv[1][i]!='\0'){
     
    toncodeici
     
    i++;
    }
    et pour ton total:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    total = total + argv[1][i];
    ou
    Les deux sont pareil
    En C et dans les autres langages, un char représente un caratére ascii, (codé sur 8bits). Pour le programme que tu écrives:
    ou
    c'est exactement la même chose, il n'y a qu'à l'affichage, ici avec printf, que cela change:
    %c va nous afficher le caractère sous sa fome alphanumérique
    %d va nous l'afficher avec sa valeur numérique seulement.
    Comprends tu ? ou ne suis je pas assez clair dans mon explication ?

    et pour finir, tu n'utilise pas correctement printf:
    Ce qui se traduit par: j'affiche la chaine "%d\n" où %d correspond à la valeur décimale de total, et \n à un retour à la ligne.

    Personnellement, je pense qu'avant d'aller plus loin, tu devrais jeter un coup d'oeil aux bases du C

    Fiki

    /edit: Autre chose, pour toute manipulation de caractère, il faut utiliser ' et non pas " car cela n'a pas du tout le meme sens. ' délimite un et un seul caractère, alors que " est le délimitateur pour une chaine de caractère.

  16. #16
    Membre confirmé
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 105
    Par défaut
    Comprends tu ? ou ne suis je pas assez clair dans mon explication ?
    Oui c'est vraiment plus clair désormais.
    J'ai donc choisit la boucle while, je trouve ça plus propre de terminer avec la fin du tableau "\0".

    Cependant quand je compile mon code il me sort une erreur relative a mon printf ('total');

    Et en plaçant ma chaine de caractere en paramètre il me retourne un segmentation fault.

    De souvenir c'est lorsque l'on tape dans une adresse mémoire déjà utilisé.
    Cependant je ne comprends pas pourquoi tu écris argv1, alors que je pensais avoir compris qu'il s'agissait du premier tableau d'adresse mémoire. ^^

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char** argv) {
        int i = 0;
        int total = 0;
     
        while (argv[1][i] != '\0') {
            printf("%d", argv[1][i]);
            total = total + argv[1][i];
            i++;
        }
        printf 'total';
     
     
     
    }
    Merci encore

  17. #17
    Membre émérite
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Par défaut
    Yop,

    Désolé pour le argv[1] j'ai corrigé :p
    pour ton printf à la ligne 14:
    ++

    Fiki

    ps: t'as pas besoin du string.h vu que tu n'utilises pas strlen

  18. #18
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Par défaut
    bonjour,

    Perso je mettrai plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("\n%d\n",total);
    Le premier \n histoire de différentier la chaîne du total.
    Et j'utiliserais des cast pour les char utilisés comme des int.

    Bonne journée

  19. #19
    Membre émérite
    Avatar de f-k-z
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Juin 2006
    Messages
    403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2006
    Messages : 403
    Par défaut
    Bonjour,

    Cela ne pose pas/plus de soucis de passer d'un char à un int, parcontre dans l'autre sens, il aurait fallu faire un cast.
    D'ailleurs, compile le code fourni avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc asciiconv.c -Wall -ansi -O3 -Wconversion
    et tu verras que gcc gère le cast correctement. Parcontre, passe d'un int à un char et la tu auras un warning

    cdlt,

    Fiki

  20. #20
    Membre confirmé
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 105
    Par défaut
    Ca fonctionne parfaitement ( du moins je crois ).
    Merci beaucoup =)

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

Discussions similaires

  1. Conversion de caractère en code ASCII
    Par jca dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 09/02/2013, 11h46
  2. conversion de son en code ascii
    Par eclipse2007 dans le forum C++
    Réponses: 11
    Dernier message: 01/06/2009, 11h25
  3. Conversion de chaine ASCII->Unicode
    Par zzorglub dans le forum C
    Réponses: 6
    Dernier message: 04/04/2007, 13h35
  4. Conversion utf-8 an code ascii
    Par Haplo2006 dans le forum Langage
    Réponses: 2
    Dernier message: 22/03/2007, 10h11
  5. Réponses: 2
    Dernier message: 30/05/2006, 08h04

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