Programme en c aidez moi
Résolu
DevGl
Messages postés
136
Date d'inscription
Statut
Membre
Dernière intervention
-
DevGl Messages postés 136 Date d'inscription Statut Membre Dernière intervention -
DevGl Messages postés 136 Date d'inscription Statut Membre Dernière intervention -
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
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 :
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
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
A voir également:
- Programme en c aidez moi
- Programme demarrage windows - Guide
- Mettre en veille un programme - Guide
- Message programmé iphone - Guide
- Programme word gratuit - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
4 réponses
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
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é
Dal
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
[Dal]
Messages postés
6205
Date d'inscription
Statut
Contributeur
Dernière intervention
1 105
Voilà un exemple de début de code pour illustrer ce que je propose :
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.
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.
#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/
#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/