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 :

Un problème de débutant !


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut Un problème de débutant !
    Bonjour à tous, j' essaye de developper mon premier programme en C.
    Je me sert des tutoriaux mis à disposition sur developpez.com , mais voila j'ai un souci et je ne comprends pas !

    J'utilise Dev-C++ pour developper .

    J'aimerai faire un Cryptage selon la méthode de César, mais je n'y arrive pas.

    Voila 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    /* Déclaration de la fonction sleep  */
    void sleep( int nbr_seconds );
    /* Déclaration de la fonction cesar  */
    void cesar (char *str, int decalage);
     
     
    void main( void )
    { 
        char *str ;
        str = "bonjour" ; 
        int decalage = 2;
     
        cesar ( *str , decalage );
     
        while (*str)
        {
              printf ("%c",* str) ;
              str++ ;
        }
     
        int x;
        int wait = 13;
     
        /* Pause pendant un nombre de secondes déterminé. On affiche *
         * un point pour chaque seconde de pause.                   */
     
        printf("Pause pendant %d secondes\n", wait );
        printf(">");
     
        for (x=1; x <= wait; x++)
        {
           printf(".");         /* affichage d'un point */
           fflush(stdout);      /* on force l'affichage du point sur les*/
                                /* machines qui utilisent la mémoire tampon*/
           sleep( (int) 1 );    /* pause d'une seconde */
        }
        printf( "Fin !\n");
     
    }
     
     
    /* Pause pendant un nombre de secondes déterminé */
    void sleep( int nbr_seconds )
    {
        clock_t goal;
     
        goal = ( nbr_seconds * CLOCKS_PER_SEC ) +  clock();
     
        while( goal > clock() )
        {
           ; /* loop */
        }
    }
     
    /* Cryptage selon la méthode de César */
    void cesar (char *str, int decalage)
    {
      const char alphabet[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                               'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
                               'u', 'v', 'w', 'x', 'y', 'z'};
     
      while (*str)
      {
        int i;
     
        for (i = 0; i < 26; i++)
        {
          if (alphabet[i] == *str)
          {
            *str = alphabet[(i+decalage)%26];
            break;
          }
        }
        str++;
      }
    }
    et quand je compile j'obtient ça :
    In function `main':
    [Warning] passing arg 1 of `cesar' makes pointer from integer without a cast
    [Warning] return type of 'main' is not `int'

  2. #2
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Bonjour et bienvenue sur les forums de Developpez

    Enlève l'étoile lorsque tu appelles la fonction cesar()
    Et le prototype de main c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main()
    {
     // ton code
     return 0 ;
    }
    Nas'

  3. #3
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    Et pour la lisibilite de ton code:


    Bonne soiree !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Merci Nasky, j'ai procédé au modif ...

    Je n'ai plus de problème de compilation.
    Mais quand j'execute mon programme j'aobtient une erreur windows !

    cesar.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru.
    |Débogage| |Envoyer le rapport d'erreur| |Ne pas envoyer|

    Merci pour ton aide

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Voici le nouveau 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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h> 
     
    /* Déclaration de la fonction sleep  */
    void sleep( int nbr_seconds );
    /* Déclaration de la fonction cesar  */
    void cesar (char *str, int decalage);
     
     
    int main( )
    { 
        char *str ;
        str = "bonjour" ; 
        int decalage = 2;
     
        cesar ( str , decalage );
     
        while (*str)
        {
              printf ("%c",* str) ;
              str++ ;
        }
     
        int x;
        int wait = 13;
     
        /* Pause pendant un nombre de secondes déterminé. On affiche *
         * un point pour chaque seconde de pause.                   */
     
        printf("Pause pendant %d secondes\n", wait );
        printf(">");
     
        for (x=1; x <= wait; x++)
        {
           printf(".");         /* affichage d'un point */
           fflush(stdout);      /* on force l'affichage du point sur les*/
                                /* machines qui utilisent la mémoire tampon*/
           sleep( (int) 1 );    /* pause d'une seconde */
        }
        printf( "Fin !\n");
     
        return 0;
    }
     
     
    /* Pause pendant un nombre de secondes déterminé */
    void sleep( int nbr_seconds )
    {
        clock_t goal;
     
        goal = ( nbr_seconds * CLOCKS_PER_SEC ) +  clock();
     
        while( goal > clock() )
        {
           ; /* loop */
        }
    }
     
    /* Cryptage selon la méthode de César */
    void cesar (char *str, int decalage)
    {
      const char alphabet[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
                               'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
                               'u', 'v', 'w', 'x', 'y', 'z'};
     
      while (*str)
      {
        int i;
     
        for (i = 0; i < 26; i++)
        {
          if (alphabet[i] == *str)
          {
            *str = alphabet[(i+decalage)%26];
            break;
          }
        }
        str++;
      }
    }

  6. #6
    Membre chevronné Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Par défaut
    A mon avis l'erreur provient du fait que tu tentes de modifier une chaine declaree en dur dans le code.

    Selon la compilation, ca peut faire planter ton programme.

    Essaie d'allouer une chaine par toi meme et de la passer en parametre a ta fonction.
    Je ne garanti pas que ton erreur vienne de la, mais c'est possible.

  7. #7
    Rédacteur

    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 113
    Par défaut
    tu as écrit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        char *str ;
        str = "bonjour" ;
    essaye plutot d'allouer de la place pour ta str (assure-toi qu'il y est assez de place pour ce que tu veux faire, et teste aussi l'allocation )

    Après c'est plutot un strcpy (ou strncpy) qu'il te faut parce pour l'affectation des chaines de caractère ca ne marche pas avec l'opérateur "="

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Merci de vos réponses

    Essaie d'allouer une chaine par toi meme et de la passer en parametre a ta fonction.
    cad ?

    essaye plutot d'allouer de la place pour ta str (assure-toi qu'il y est assez de place pour ce que tu veux faire, et teste aussi l'allocation )

    Après c'est plutot un strcpy (ou strncpy) qu'il te faut parce pour l'affectation des chaines de caractère ca ne marche pas avec l'opérateur "="
    je ne comprends pas vraiment ...

    vous pourriez me montrer ce que ça donne en C

    Merci encore

  9. #9
    Rédacteur

    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 113
    Par défaut
    pour allouer de la mémoire pour ta chaine : malloc
    pour copier une chaine dans une autre : strcpy

    voilà, j'espere que ça t'aidera

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 9
    Par défaut
    Merci pour tout ajJi !

    hey j'avais pas vu "localisation : Maroc" !!
    Je suis Marocain aussi, ça fait plaisir ...

    choukrane ya sadikki el aziz !

    et une dernière petite question ( svp )

    mon application semble maintenant tourner correctement.
    l'invite de commande se lance, l'appli tourne comme il faut, mais dés que tout mon code est lu, l'invite de commande disparait aussitôt .

    Comment faire pour que l'invite de commande ne disparaisse pas ?

  11. #11
    Membre émérite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par défaut
    Avant le return 0, ajoute :
    Nas'

  12. #12
    Rédacteur

    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 113
    Par défaut
    Citation Envoyé par Ascella
    Merci pour tout ajJi !

    hey j'avais pas vu "localisation : Maroc" !!
    Je suis Marocain aussi, ça fait plaisir ...

    choukrane ya sadikki el aziz !

    et une dernière petite question ( svp )

    mon application semble maintenant tourner correctement.
    l'invite de commande se lance, l'appli tourne comme il faut, mais dés que tout mon code est lu, l'invite de commande disparait aussitôt .

    Comment faire pour que l'invite de commande ne disparaisse pas ?

    lol de rien, n'oublie pas le tag

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Ascella
    Bonjour à tous, j' essaye de developper mon premier programme en C.
    Je me sert des tutoriaux mis à disposition sur developpez.com , mais voila j'ai un souci et je ne comprends pas !

    J'utilise Dev-C++ pour developper .

    J'aimerai faire un Cryptage selon la méthode de César, mais je n'y arrive pas.
    Une petite erreur, quelques améliorations possibles, mais dans l'ensemble, c'est du bon travail. Très bon, même sur certains points, comme la version portable du cesar() (indépendante du charset). Voir quand même les fonctions standards comme strchr()...
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #if 0
    /* -ed- Je deconseille les prototypes separes pour le fonctions non exportees */
    /* Déclaration de la fonction sleep */
    void sleep (int nbr_seconds);
    /* Déclaration de la fonction cesar */
    void cesar (char *str, int decalage);
    #endif
     
    /* -ed- reorganisation du code. */
    /* Pause pendant un nombre de secondes déterminé */
    static void sleep (int nbr_seconds)
    {
       clock_t goal;
     
       goal = (nbr_seconds * CLOCKS_PER_SEC) + clock ();
     
       while (goal > clock ())
       {
          ;                         /* loop */
       }
    }
     
    /* Cryptage selon la méthode de César */
    static void cesar (char *str, int decalage)
    {
       const char alphabet[] =
       {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
        'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
        'u', 'v', 'w', 'x', 'y', 'z'
       };
     
       while (*str)
       {
          int i;
     
          for (i = 0; i < 26; i++)
          {
             if (alphabet[i] == *str)
             {
                *str = alphabet[(i + decalage) % 26];
                break;
             }
          }
          str++;
       }
    }
     
    /* -ed-
       void main( void )
     
       main() retourne int. Toujours
     */
    int main (void)
    {
       /* -ed-
          char *str ;
     
          str = "bonjour" ;
     
          Une chaine n'est pas modifiable.
          Il faut le qualificateur const ou utiliser une tableau de char.
          Si j'en crois la suite, la chaine sera modifiee par la fonction de cesar().
          Il faut donc un tableau.
        */
       char str[] = "bonjour";
       int decalage = 2;
     
       /* -ed-
          cesar ( *str , decalage );
     
          *str est un char.
          Or la fonction attend l'adresse d'un char. C'est probablement :
        */
       cesar (str, decalage);
     
       /* -ed-
          while (*str)
          {
          printf ("%c",* str) ;
          str++ ;
          }
     
          Une facon inutilement complexe d'ecrire
          (\n et '' ajoutes pour la clarete de la presentation)
        */
     
       printf ("'%s'\n", str);
     
     
    #if 1
       /* -ed- tres joli, mais hors-sujet, non ?) */
       {
          int x;
          int wait = 13;
     
          /* Pause pendant un nombre de secondes déterminé. On affiche *
             * un point pour chaque seconde de pause. */
     
          printf ("Pause pendant %d secondes\n", wait);
          printf (">");
     
          for (x = 1; x <= wait; x++)
          {
             printf (".");          /* affichage d'un point */
             fflush (stdout);       /* on force l'affichage du point sur les */
             /* machines qui utilisent la mémoire tampon */
             sleep ((int) 1);       /* pause d'une seconde */
          }
       }
       printf ("Fin !\n");
    #endif
     
       /* -ed- parce que main() retourne un int : */
       return 0;
    }

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

Discussions similaires

  1. requete, problème de débutant
    Par focus dans le forum Access
    Réponses: 4
    Dernier message: 16/02/2006, 05h51
  2. Problème de débutant dans une requête
    Par decour dans le forum Access
    Réponses: 7
    Dernier message: 14/10/2005, 14h17
  3. [C#][service windows] problème de débutant avec 1 timer
    Par Nycos62 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 14/10/2005, 11h22
  4. Réponses: 3
    Dernier message: 24/09/2005, 09h34
  5. [DB2] problèmes de débutant
    Par rémi_tounul dans le forum DB2
    Réponses: 4
    Dernier message: 21/04/2005, 17h08

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