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 :

Rot13: petit problème de modulo (et peut-etre plus)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut Rot13: petit problème de modulo (et peut-etre plus)
    Bonjour, voila je dois faire le programme rot13 (decalage de 13 de la valeur ascii des caractères a à z et A à Z).
    Étant une bonne grosse quiche en C (bah oui je suis biologiste pas informaticien ^^) j'ai fais l'ébauche suivante mais j'ai un ptit soucis avec le modulo.... donc si quelqu'un pouvait m'aider ca super sympa.
    voila mon programme:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    int main ( int charc , char *argv[] )
     
    {
    	char *str;
    	char *res;
    	int i = 0;
    	str = "";
    	res = "";
    	if (argc != 1)
    		{
    		printf ("Erreur : nombre d'argument incorrect. \n");
    		exit (1);
    		}
    	str = argv[1];
    	while (str[i] != '\0')
    		{
    		if (str[i] >= 'a') && (str[i] =< 'z') || (str[i] >= 'A') && (str[i] =< 'Z') then
    			{
    			LA JE DOIS METTRE LE MODULO
    			}
    		else
    			{
    			}
    		i++;
    		}
    	printf ("%s \n", res);
    	return (0);
    }
    Bien entendu j'ai fait une petite recherche avant de poster mais le seul sujet qui parlait de Rot13 en C ba j'ai pas tout compris à la syntaxe...
    Donc j'ai préféré ouvrir une nouvelle discussion.

    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    ton code repris:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #define BUF_LEN 127
     
    int main ( int charc , char *argv[] )
     
    {
    /*on initialise nos pointeurs//tableaux, c'est une bonne pratique*/
    	char *str = NULL;
    	char res[BUF_LEN+1] = {0};
    	int i = 0;
    /* reviser les chaines de caractere en C, notemment la notation ""
    	str = "";
    	res = "";
    */
    /* argv[0] => commande,  argv[1] => premier argument
    argc = 1 quand la commande est lancee sans arguments */
    	if (argc != 2)
    		{
    		printf ("Erreur : nombre d'argument incorrect. \n");
    		return EXIT_FAILURE;
    		}
    	str = argv[1];
    	while (str[i] != '\0' && i < BUF_LEN)
    		{
    		if (str[i] >= 'a') && (str[i] =< 'z') || (str[i] >= 'A') && (str[i] =< 'Z') then
    			{
    /* ici, tu dois ajouter 13 a str[i] et penser a utiliser le modulo correctement pour ramener str[i] + 13 sur un caractere imprimable*/
    res[i]=?
    			}
    /*sinon quoi ... on code pas notre caractere en rot13? il passe "normalement"?*/
                    else
    			{
                       res[i]=str[i];
    			}
    		i++;
    		}
    	printf ("%s \n", res);
    	return EXIT_SUCCESS;
    }
    je pense pas avoir fait de grosses erreurs (les autres corrigerons si c'est le cas), je te laisse chercher pour le modulo.

  3. #3
    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 Dark_Ebola
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    		if (str[i] >= 'a') && (str[i] =< 'z') || (str[i] >= 'A') && (str[i] =< 'Z') then
    			{
    /* ici, tu dois ajouter 13 a str[i] et penser a utiliser le modulo correctement pour ramener str[i] + 13 sur un caractere imprimable*/
    Ce code n'est pas portable. Il fonctionne correctement pour un charset ASCII. Si c'est de l'EBCDIC, ça me fonctionnera pas.

  4. #4
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ce code n'est pas portable. Il fonctionne correctement pour un charset ASCII. Si c'est de l'EBCDIC, ça me fonctionnera pas.
    tu recommande donc l'utilisation de la fonction isalpha(int) a la place du test actuel?

    coyotte507 : ton code est ... euuuhhh ... tu faisais quoi avant de faire du C (qui est un langage different de C++, rapelons le) ? du vb ?

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    Bon ba je voyais pas comment faire avec le modulo j'ai fait comme ca:

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    int main ( int argc , char *argv[] )
    {
    	char *str;
    	int i = 0;
    	str = "";
    	if (argc != 2)
    		{
    		printf ("Erreur : nombre d'argument incorrect. \n");
    		exit (1);
    		}
    	str = argv[1];
    	while (str[i] != '\0')
    		{
    		if (((str[i] >= 'a') && (str[i] <= 'z')) || ((str[i] >= 'A') && (str[i] <= 'Z')))
    			{
    			str[i] = (str[i] - 13);
    			if ((str[i] < 'a') || (str[i] < 'A'))
    			str[i] = (str[i] + 26);
    			}
    		i++;
    		}
    	printf ("%s\n", str);
    	return 0;
    }
    Par contre j'ai un petit probleme, voila je suis sur un mac et qd je fais cc rot13.c dans mon terminal il me sort des erreurs dont voici le screen, si vous pouviez m'aidez ca serait super.


    Mais bon, je vais peut etre créer une autre discussion pour ce problème.

  6. #6
    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 Dark_Ebola
    tu recommande donc l'utilisation de la fonction isalpha(int) a la place du test actuel?
    Oui, et le transcodage par tableau...

  7. #7
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 8
    Par défaut
    Bon et bien en fait le programme que je vous ai mis quelques lignes plus haut ne marche pas tout à fait. En effet le ptit truc avec Rot13 c'est que si on l'applique 2 fois de suite on retombe sur le texte d'origine. Oui, mais pas dans ce cas la ^^.

    Donc voici une version revue et corriger (qui utilise le modulo).

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    int main ( int argc , char *argv[] )
    {
    	char *str;
    	int i = 0;
    	str = "";
    	if (argc != 2)
    		{
    		printf ("Erreur : nombre d'argument incorrect. \n");
    		exit (1);
    		}
    	str = argv[1];
    	while (str[i] != '\0')
    		{
    		if ((str[i] >= 'a') && (str[i] <= 'z'))
    			{
    			str[i] = (((str[i] - 'a' ) + 13 ) % 26 ) + 'a';
    			}
    			if ((str[i] >= 'A') && (str[i] <= 'Z'))
    				{
    				str[i] = (((str[i] - 'A' ) + 13 ) % 26 ) + 'A';
    				}
     
    		i++;
    		}
    	printf ("%s\n", str);
    	return 0;
    }

  8. #8
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Bon moi je suis un débutant dans le langage C++ (mais pas dans les autres), alors voila ce que je propose:

    deja je je croit que argc doit être égal à 2 (en effet il y a argv[0], et argv[1])

    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
    #include <stdio.h>
    #include <stdlib.h>
    int main ( int charc , char *argv[] )
     
    {
    	char *str;
    	char *res;
    	int i = 0;
            int j = 0
    	str = "";
    	res = "";
    	if (argc != 2)
    		{
    		printf ("Erreur : nombre d'argument incorrect. \n");
    		exit (1);
    		}
    	str = argv[1];
    	while (str[i] != '\0')
    		{
    		if ((str[i] >= 'a') && (str[i] =< 'z') || (str[i] >= 'A') && (str[i] =< 'Z'))
    			{
    			//LA JE DOIS METTRE LE MODULO
                            for (j=65; (char)j != str[i]; j++) // (char)65 = A, (char) 66 = B...
                            //On a l'Ascii de str[i]
                                {
                                if (str[i] >= 'a') // c'est une minuscule, de 97 à 122
                                      {
                                       j = (j >= 97+13) ? j-13 : j+13; //si j est supérieur à 109, on lui enleve 13. Autrement, on lui rajoute 13.
                                      }
                                else
                                      {
                                       j = (j >= 65+13) ? j-13 : j+13; // meme chose avec les majuscules
                                      }
    			    }
                                res[i] = (char)j;
                            }
    		else
    			{
                                res[i] = str[i];
    			}
    		i++;
    		}
    	printf ("%s \n", res);
    	return (0);
    }
    Edit: L'auteur du topic veut utiliser de toute facon du ASCII.

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

Discussions similaires

  1. Probléme de root et/ou _parent ou peut etre autre chose
    Par aptagud dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 11/02/2009, 10h25
  2. Problème d'upload de fichiers peut etre serveur
    Par fccman dans le forum Langage
    Réponses: 1
    Dernier message: 16/01/2009, 09h31
  3. petit problème premier plan, arrière plan
    Par gros bob dans le forum OpenGL
    Réponses: 4
    Dernier message: 19/04/2004, 12h00
  4. [jointure] Petit problème sur le type de jointure...
    Par SteelBox dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/02/2004, 18h55

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