Programme en c aidez moi

Résolu/Fermé
DevGl Messages postés 136 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 16 mai 2015 - Modifié par jipicy le 26/03/2014 à 23:26
DevGl Messages postés 136 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 16 mai 2015 - 14 avril 2014 à 14:50
Bonjour,
est que vous pouvez m'aider ? je dois faire un programme dans lequel si par exemple je tape la chaine de caractere suivant : "MARRAKECH"
le résultat doit etre :"MARKECHIJKLNOPQSTUVWXYZBDFG"
c-à-d : ici dans la chaine de caracters on supprime les lettres qui sont repereté , dans "MARRAKECH" --> "MARKECH" : on a supprimé la lettre R !
et puis on continue l'odre alphabetique , puisque le derniére caractere est : H donc on aura
HIJKLMNOPOSTUVWXYZBDFG
alors on obtien la chaine suivant "MARKECHIJKLNOPQSTUVWXYZBDFG"
jusqu'au avoir 27 lettres !
moi , j'ai fait le programme suivant , est que vous pouvez le corriger ?
voila
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void F01(char *);
void F02(char *);
main(){
       char *S;
       S=(char *)malloc(27);
       printf("entrer une clef\n");
       gets(S);
       F01(S);
       F02(S);
       puts(S);
       system("pause");
       }
       void F01(char *S){
       int i,l;
       int j;
       i=0;
       while(*(S+i)){
                     for(j=0;j<i;j++){
                                      if(*(S+i)==*(S+j)){
                                                         l=i;
                                                         while(*(S+l)){
                                                                       *(S+l)=*(S+l+1);
                                                                       l++;
                                                                       }
                                                                       break ;}
                                                                       }
                                                                       i++;
                                                                       }
                                                                       }
       void F02(char *S){
                         int i;
                         int n;
                         n=strlen(S);
                         for(i=n;i<27;i++){
                                           if(*(S+(i-1))== 'Z'){
                                                           *(S+(i-1)) ='A';}
                                             *(S+i)=*(S+(i-1))+1;
                                             }
                                             }


J'ai utilisé 2 fonctions , la premiére pour la suppression des caracteres qui sont repeté , et la 2éme fonction pour terminer l'ordre alphabetique !
dans la 2éme fonction j'ai mis une condition :
  if(*(S+(i-1))== 'Z'){
                                                           *(S+(i-1)) ='A';}

puisque si on fait pas ca , une fois quand la chaine arrive a la lettre Z , aprés il va nous donner dans l'exécution des caractres comme ; : § {]}['~#
puisque c'est le code asci qui domine comme vous savez , donc une fois qu'il arrive à Z
je lui donne le caractere A pour éviter tel problemes et continuer jusqu'a termier les 27 lettres ... !
MAIS dans l'exécution parfois le résultat est correcte parfois non !!
je ne sais pas ou est le probleme !! aidez-moi s'il vous plait

4 réponses

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié par [Dal] le 27/03/2014 à 18:28
Salut DevGl,

Pourquoi 27 lettres alors que l'alphabet (français) en comporte 26 ?

Je crois que tu fais trop compliqué.

Si j'ai bien compris, ce que tu veux c'est :

- afficher les lettres de l'alphabet une fois
- en commençant par les lettres du mot "MARRAKECH" dans leur ordre d'apparition
- et en continuant dans l'ordre alphabétique des lettres restantes à partir de la lettre suivante en bouclant sur le début de l'alphabet si nécessaire

Le plus simple est de créer un tableau de char de la taille de l'alphabet, comportant les caractères dans l'ordre alphabétique, et d'utiliser les valeurs ASCII des caractères saisis du mot "MARRAKECH" ramenées à 0 pour A, 1 pour B, etc., comme index du tableau pour noter dans ce tableau que telle lettre est prise en compte (en "l'effaçant" par exemple) ou en la remplaçant par
'\0'
).

En faisant cela, tu crées une sorte de table de hachage, qui t'évite toutes ces boucles.

Tu n'auras d'une boucle à faire : une fois les lettres du mot entrées dans la table de hachage, et affichées, afficher les lettres restantes à partir de l'index traité (en revenant au début du tableau comme tu le fais).

Sinon utiliser gets est très déconseillé pour une saisie, et il faudrait aussi que tu t'assures que ce sont bien des majuscules et des lettres que l'utilisateur saisit et qu'il se limite au maximum à 26 lettres, et ton main devrait être prototypé
int main(void)
et la dernière ligne du main se terminer par
return 0;
.


Dal
1
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
27 mars 2014 à 18:44
Voilà un exemple de début de code pour illustrer ce que je propose :

#include <stdio.h>
#include <string.h>

int main(void)
{
    char alpha[27];
    int n;
    char * mot = "MARRAKECH";

    /* remplir la table de hachage */
    for (n=0; n<26; n++)
        alpha[n] = 'A' + n;

    /* on commence par les lettres de mot */
    for (n=0; n<strlen(mot); n++)
        if (alpha[mot[n] - 'A']) {
            printf("%c", alpha[mot[n] - 'A']);
            alpha[mot[n] - 'A'] = '\0';
        }

    /* continue ... */                                                                                                                                                                                             
    return 0;
}
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
28 mars 2014 à 17:01
alors on obtien la chaine suivant "MARKECHIJKLNOPQSTUVWXYZBDFG"

Il y a deux fois la lettre "K" ci-dessus, ce qui explique que tu aies 27 lettres. Je suppose que c'est une erreur, et que c'est bien 26 lettres que tu dois afficher.
0
#include <stdio.h>
#include <string.h>

int main(void)
{
    char alpha[27];
    int n,i;
    char * mot = "MARRAKECH";

    /* remplir la table de hachage */
    for (n=0; n<26; n++)
        alpha[n] = 'A' + n;

    /* on commence par les lettres de mot */
    for (n=0; n<strlen(mot); n++){
        if (alpha[mot[n] - 'A']) {
            printf("%c", alpha[mot[n] - 'A']);
            alpha[mot[n] - 'A'] = '\0';
        }}
        /* le resté de programme */
     for(i=0;i<26;i++)
     if(alpha[i]!='\0'){
        printf("%c",alpha[i]);}


    return 0;
}


http://tutodev1.blogspot.com/
0
karara20 Messages postés 32 Date d'inscription mercredi 19 juin 2013 Statut Membre Dernière intervention 13 juillet 2014 9
Modifié par karara20 le 28/03/2014 à 22:51
#include <stdio.h>
#include <string.h>

int main(void)
{
    char alpha[27];
    int n,i;
    char * mot = "MARRAKECH";

    /* remplir la table de hachage */
    for (n=0; n<26; n++)
        alpha[n] = 'A' + n;

    /* on commence par les lettres de mot */
    for (n=0; n<strlen(mot); n++){
        if (alpha[mot[n] - 'A']) {
            printf("%c", alpha[mot[n] - 'A']);
            alpha[mot[n] - 'A'] = '\0';
        }}
        /* le reste de programme*/
     for(i=0;i<26;i++)
     if(alpha[i]!='\0'){
        printf("%c",alpha[i]);}


    return 0;
}



https://tutodev1.blogspot.com/
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
31 mars 2014 à 10:16
Cela ne produit pas l'affichage recherché.

Vois l'énoncé.

De plus, je crois que c'est à DevGl de poursuivre le code. C'est elle qui doit faire l'exercice, et ainsi, elle se l'appropriera et en comprendra le fonctionnement.


Dal
0
DevGl Messages postés 136 Date d'inscription samedi 23 novembre 2013 Statut Membre Dernière intervention 16 mai 2015
14 avril 2014 à 14:50
J'apprecie vrement votre aide les amis : Dal , karara20 ,language c , merci encore une fois !!
0