algorithme de codage

codage numéro 3

a marqué ce sujet comme résolu.

Bonjour, Je suis face à un TP où l’on doit créer des algorithmes de codage à partir des TDs que l’on a déjà fait. Nous avons plutot bien avancé dans le cours mais j’ai toujours du mal avec la programmation.

**TP**
1- Algorithme de codage 1 :
MoT!D#P@SSe? -----codage---> RtY&I(UEXXjD
2- Algorithme de codage 2 :
MoT!D#P@SSe? -----codage---> 77111843268328032838310132
3- Algorithme de codage 3 :
MoT!D#P@SSe? -----codage----> MRotTY!&DI#(PU@ESXSXej?D

J’ai déjà fait le premier et le second en me basant sur nos TDs, mais sur le troisième codage je bloque complètement. Voici le codage 1 :

Codage 1

#include<stdio.h>

//Fonction de saisie d'un tableau de caractères
void saisir(char * T, int n){
    int i;
    char free;
    for(i=0;i<n;i++){
        free=getchar();
        printf("Caractere %d : ", i+1);
        scanf("%c", &T[i]);
    }
}

char plusLoin(char c, int n){
    return c+n;
}

char * Codage1(char * T, int n){
    char * TRes = malloc((n+1) *sizeof(char));
    int i, distance;
    printf("Donner la distance : ");
    scanf("%d", &distance);
    for(i = 0; i<n ;i++){
        TRes[i] = plusLoin(T[i], distance);
    }
    TRes[i] = '\0';
    return TRes;
}

int main (int n) {
    char * TCodage1[n];
    saisir(TCodage1, n);
    char * TResCodage1;
    TResCodage1 = Codage1(TCodage1, n);
    printf("Le codage 1 de la chaine %s donne : %s \n", TCodage1, TResCodage1);
}

Le codage 3 ressemble au codage 1 car il mélange le résultat de ce codage avec le mot de base. Il faudrait changer la boucle 'for' dans le 'char codage' je suppose. Voici ce que j’ai réalisé pour l’instant sur le codage 3 :

codage 3

#include<stdio.h>

char plusLoin(char c, int n){
    return c+n;
}

void insererCaracPos(char * T, int n, char nouveau, int pos){
    T = realloc(T, (n+1)*sizeof(char));
    int i = n;
    while((i>pos) && (i>=0)){
        T[i]=T[i-1];
        i--;
    }
    T[i] = nouveau;
}

//Fonction de saisie d'un tableau de caractères
void saisir(char * T, int n){
    int i;
    char free;
    for(i=0;i<n;i++){
        free=getchar();
        printf("%c ", T[i]);
    }
    printf("\n");
}

char Codage3(char * T, int n){
    char * TRes = malloc((n+1) *sizeof(char));
    char carac, p, chaine[] = "Mot!de#passe?";
    int i, distance, comptage, m=12;
    printf("Donner la distance : ");
    scanf("%d", &distance);
    for(i = 0; i<n ;i++){
        TRes[i] = plusLoin(T[i], distance);
    }
    TRes[i] = '\0';
    for (comptage=0; comptage < n; comptage++){
        carac = TRes[comptage];
        printf("%c\n", TRes[comptage]);
        insererCaracPos(T, m, p, comptage);
        printf("%c\n",T[comptage]);
    }
    saisir(T,m);
}

int main (){
    int i;
    int n = 12;
    char chaine[] = "Mot!de#passe?";
    Codage3(chaine, n);
}

Si quelqu’un a des indications pour moi, ça serait vraiment génial. Merci d’avance !

Edit ache : Formatage des codes sources.

+0 -0

J’ai l’impression que c’est un beau bordel, si on m’autorise ce mot un peu violent.

La fontion main(), dans ton 1er code, elle fait 3 choses :

  • appel à la fonction saisir() : on demande à l’utilisateur de saisir une chaine de caractères, et on fait quelques controles.

  • appel à une fonction de 'cryptage' ; cette fonction renvoie un resultat (Return …)

  • affichage des 2 chaines : chaine avant cryptage, et après cryptage.

Ok, clair.

Dans ton 2ème programme, ça devrait être exactement pareil. Sauf que la fonction de cryptage qu’on appelle devrait être un peu différente.

Pourquoi avoir supprimé la fonction saisir() dans le main ? Pourquoi il n’y a plus de return dans la fonction de cryptage, et surtout, pourquoi un appel à saisir() dans la fonction de cryptage ?

Sur tous ces points, où il fallait juste recopier le premier programme, tu as changé plein de choses, sans raison.

Corrige ces points là, et ensuite, tu pourras t’attaquer à la fonction de cryptage proprement dite.

Désolé du très long retard de ma réponse. Je n’avais ni le temps ni (surtout) l’envie de me remettre dedans.

Concernant la fonction main je l’ai modifié comme ceci :

int main (int i, int n){    
    char chaine[] = "Mot!de#passe?";
    saisir(T,m);
    printf("Chaine avant le chiffrage : %s", chaine);
    Codage3(chaine, n);
    printf("Chaine apres le chiffrage : %s", chaine);
}

Sinon pour le retour de la fonction de chiffrage, j’ai retourné 'TRes’.

Tu peux me dire ce que tu en penses ?

+0 -0

Il y a encore trop de choses qui ne sont pas cohérentes.

Ajoute sur chaque ligne un commentaire, pour décrire précisément à quoi la ligne sert, ce qu’elle fait.

Tu vas te rendre compte toi-même que certaines choses ne vont pas.

En particulier la ligne 3 : saisir (T,m);

Bonjour, et comme ceci ? Pour la fonction main avec les commentaires

Si tu es capable de commencer un exercice, le laisser tomber, et le reprendre au bout de 3 semaines, bravo.

Moi, je ne sais pas faire. Au bout de 3 semaines, j’ai oublié tout ce que j’avais fait, pourquoi j’avais fait tel choix.

Quand je reprends 3 semaines plus tard un travail que j’avais vaguement commencé, j’efface tout, et je recommence à 0. C’est la seule façon d’avancer.

Quand tu écris int main(int i, int n), c’est que tu t’attends à ce que ton programme reçoive comme argument deux entiers. En fait, une fonction main s’attend à recevoir un entier (le nombre d’arguments passés en ligne de commande) et un char** (un tableau contenant les arguments passés en ligne de commande. Tu peux observer cela en passant les bons drapeaux à ton compilateur (-Wall par exemple ici), qui te signifiera ton erreur.

Ce que tu voulais probablement faire, c’est déclarer ton int n dans ton main, comme tu l’avais fait précédemment.

J’ai finalement réussi en reprenant tout mon code par moi-même. Cela me donne :

Ce n’est peut-être pas le plus optimisé mais c’est fonctionnel !

Merci à tous ceux qui ont répondu et qui m’ont aidé

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte