Alors voilà mon problème, j'ai un exercice où dans la consigne on nous donne un acronyme par exemple "PP", on nous donne ensuite une liste de titre par exemple : "Pere Et Fils" "La Condition Humaine" "Petit Prince" et je dois trouver les titres correspondant à l'acronyme donné (ici PP correspond à Petit Prince).
J'ai fait un début de code mais ça donne rien, c'est comme si j'avais rien fait. J'arrive pas à comparer les lettres de l'acronyme(sachant que là j'ai fais au plus simple mais il y a des acronyme à 3 ou 4 lettres) avec les initiales de chaque mots.
J'imagine que pour les mots on peut faire une condition du genre "si mot[i] = 'espace' alors mot[i+1] l'initiale d'un mot mais même ça, ça ne donne pas grand chose si vous avez une idée sur comment je pourrais aborder ce problème.
Voilà mon début de code :
#include <stdio.h>
#include <stdlib.h>
int main()
{
char acronyme[] = "PP";
char titre[] = "Petit Prince";
char copie[201];
int longueurAcro = strlen(acronyme);
int longueurTitre = strlen(titre);
for(int i = 0; i < longueurTitre; i++)
{
for(int j = 0; i < longueurAcro; j++)
{
if(
)
}
}
return 0;
}
Non on a pas le droit d'utiliser gets enfin comme on nous l'a pas appris on doit se débrouiller autrement (franceIOI).
Sinon pour transformer "Pere Et Fils" en "PEF" j'ai pensé à ça :
#include <stdio.h>
#include <stdlib.h>
int main()
{
char titre[] = "Pere Et Fils";
int longueurTitre = strlen(titre);
for(int i = 0; i < longueurTitre; i++)
{
if(titre[i] == titre[0])
{
printf("%c", titre[i]);
}
if(titre[i] == ' ')
{
printf("%c", titre[i+1]);
}
}
return 0;
}
j'imagine qu'une fois le titre transformé en acronyme je créé un autre tableau, j'utilise la fonction strcpy pour copier l'acronyme et je le compare à celui que j'ai déjà. mmmh c'est pas bête du tout merci, je vais essayer ça voir ce que ça donne.
J'ai juste un soucis c'est quand je teste avec Petit Prince, ça me renvoie PPP au lieu de PP.
Non on a pas le droit d'utiliser gets enfin comme on nous l'a pas appris on doit se débrouiller autrement (franceIOI).
lis bien mon message … je ne parle pas de gets …
Rapidement : gets a été dépréciée et retirée du standard C ⇒ il ne faut plus du tout l'utiliser.
À ma connaissance, france IOI n'interdit rien, tu peux utiliser ce que tu veux … enfin bref revenons à nos moutons :
IyasJ. a écrit:
Non on a pas le droit d'utiliser gets enfin comme on nous l'a pas appris on doit se débrouiller autrement (franceIOI).
Sinon pour transformer "Pere Et Fils" en "PEF" j'ai pensé à ça :
Tu penses en C ?
Avant de vouloir commencer à écrire du code en C, il faut avant tout être capable de simplement expliquer en français ce que tu cherches à faire. Par exemple ici tu aurais dû commencer par dire : «je parcours le titre et je ne garde que les lettres majuscules».
Est-ce ce que tu fais ? non →
Tu parcours bien le tire en ligne 11 avec la boucle for, mais ensuite tu dis : «si le caractère courant est égal au premier caractère alors j'imprime le caractère courant» ⇒ ça n'[a rien à voir.
EDIT: et ça marche pas, parce qu'on ne peut pas concatener ou copier juste un caractere.
On peut tout à fait concaténer des caractères après une chaine. Il faut juste utiliser la bonne méthode. Par exemple:
chaine[strlen(chaine)+1] = '\0'; // on met deux '\0' à la fin de la chaine
chaine[strlen(chaine)] = caractere_a_ajouter; // on remplace le 1er '\0' par le caractère
Ou plus simple : on a pris soin de préremplir le tableau de '\0', ensuite il suffit d'ajouter chaque caractère à la fin.
Et en effet, tu te compliques la vie en algo. Comme l'a écrit WhiteCrow, dis ce qu'il faut faire, ça peut se dire en une phrase.
Il y a peut-être un piège. Comme ton énoncé est un exemple, je vois plusieurs moyens de trouver l'acronyme: - s'intéresser au 1er caractère et à tous ceux qui suivent une espace (ou peut-être une apostrophe) - s'intéresser au majuscules. Quel est l'acronyme de : "S'Intéresser aux Majuscules" (SIM ou SIAM ou SAM)?
Du coup je vais me substituer au PO pour donner l'énoncé →
Acronymes
Comme dans tout lieu de travail, les employés de la bibliothèque ont pris l’habitude d’utiliser des acronymes (exemples d’acronymes : IOI, RATP, BEPC, LOL...) pour les titres de livres les plus utilisés, ce qui leur permet de parler plus vite !
Seulement vous ne connaissez pas encore tous les acronymes, aussi lorsqu’on vous demande d’aller chercher un livre sans vous donner le titre complet, vous êtes bien embêté(e) !
Étant donné un acronyme, vous devez trouver tous les titres qui correspondent et les afficher "joliment".
Limites de temps et de mémoire (C)
Temps : 0,1 s sur une machine à 1 GHz.
Mémoire : 8 000 ko.
Contraintes
Tous les titres de livres ainsi que les acronymes contiennent au plus 200 caractères.
Entrée
Sur la première ligne, un acronyme, uniquement constitué de lettres majuscules.
Sur la seconde ligne, un entier nbLivres, le nombre de titres de livres.
Sur les nbLivres lignes suivantes les titres de livres, uniquement constitués de lettres ou d’espaces, sans accents.
Les mots de chaque titre sont toujours séparés par un seul espace.
Sortie
Vous devez afficher chaque titre de livre qui correspond à l’acronyme, en mettant toutes ses lettres en minuscules sauf la première lettre de chaque mot, qui doit être en majuscule.
L'acronyme de "The Art Of Computer Programming" est Knuth? Première question à se poser: comment je ferais pour trouver le premier caractère de chaque mot dans le titre? Ensuite je les écris quelque part à la suite. Où ça? Comment je sais que j'ai fini de parcourir le titre? Comment je compare cette suite avec l'acronyme qu'on me donne?
Le Tout est souvent plus grand que la somme de ses parties.
Pour trouver le premier caractère de chaque mot dans le titre je prend le premier et ceux après un espace.
Je les écris à la suite dans un tableau secondaire.
Je sais que j'ai fini de parcourir le titre quand il n'y a plus d'espace ou quand on arrive au caractère de fin \0.
Je compare les deux tableaux avec strcmp. S'ils sont égaux c'est que c'est le bon acronyme donc le bon titre.
Mais mon problème se situe à la phase deux je vois pas comment je pourrais attraper chaque caractère du titre pour les coller à la suite dans un tableau.
Bienvenu dans le monde merveilleux de la programmation (surtout en C). Il faut aussi penser au cas limites comme … un titre de livre qui serait «123 !» par exemple. Mais bon, ils ne sont pas méchants sur France IOI au départ.
Si il y avait 123 j'aurais rajouté j'aurais demandé au programme seulement les caractère de type lettre après un espace. Et la première lettre de type lettre. Chacun ses débuts ils ne sont pas méchants de ton point de vue du mien ils sont sacrément agressifs. Mais je crois qu'un jour un certain WhiteCrow m'a dit on devient forgeron en forgeant, comme on devient programmeur en programmant, la pratique la pratique la pratique seul moyen pour avancer, alors je pratique du mieux que je peux, bien que je sois un peu lent à la détente.
Comme tu ne sais pas à l'avance le nombre de caractères dans l'acronyme, tu suppose que France IOI n'est pas méchant. Tu te fais un tableau disons de 20 caractères et une variable qui compte le nombre de caractères déjà présents. Ça pourrait avoir l'air de ceci: int longueur = 0; char tstacro[20]; // ou 21 si tu veux ... Pour ajouter: tstacro[longueur++] = nouveau_caractere; À la fin: tstacro[longueur] = '\0'; et longueur te donne la longueur de la chaîne.
Le Tout est souvent plus grand que la somme de ses parties.
Une petite remarque pour pinailler... En français (contrairement à ce que certains croient) on ne met pas systématiquement des majuscules au début de chaque mot d'un titre, c'est plus compliqué. Voir paragraphe 7 ici : https://www.dictionnaire-academie.fr/article/QDL047
Si on veut suivre les règles du français, il faut chercher les premières lettres de chaque mot sans s'intéresser forcément aux majuscules. Il faudra donc penser à mettre en majuscules toutes les lettres trouvées dans le titre.
Il y a une autre manière de faire que créer l'acronyme du titre, et de le comparer à celui donné: c'est de vérifier si les lettres de l'acronyme donné se présentent dans l'odre du titre fourni. C'est juste l'inverse, et ce n'est pas plus compliqué. Je donne le code à titre d'exemple, tout en conseillant de continuer la discussion sur la voie proposée par WhiteCrow
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int main(void) {
char *acronym="TAOCP";
char *titles[]={
"The Art Of Computer Programming In Fortran",
"The Art Of Computer Programming",
"The Art Of Balancing Tree",
"The Art Of Computer Paradigm",
"Brol",
"The Ange"
};
int nelem=sizeof(titles)/sizeof(titles[0]);
for(int i=0;i<nelem;i++) {
bool acro=false;
printf("%s ",titles[i]);
if(*titles[i]==*acronym) {
char *ac=acronym+1;
char *pt=strchr(titles[i],' ');
while(pt && *(pt+1)==*ac) {
ac++;
pt=strchr(pt+1,' ');
}
acro= pt==NULL && !*ac;
}
printf("--> %s acronyme\n",acro ? "" : "pas");
}
return(0);
}
Je n'ai pas écrit le code avec une fonction, ne sachant pas si le po les connait
- Edité par edgarjacobs 4 mai 2021 à 20:32:19
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Oui c'est vrai mais de toute façon comme tu as dit mon code est bancal même comme ça, ça fonctionne pas pourtant j'étais sûr d'avoir le bon filon !
EDIT: je viens de remarquer que pour pouvoir le faire pour chaque titre il aurait fallu que je mette la boucle for dans l'autre boucle for et même comme ça, ça fonctionne pas, j'ai plus tellement d'idée, là je sèche complètement !
Cette technique elle marche si je l'utilise pour un titre prédéfini mais dès que ça se corse pour plusieurs qu'on ne connaît pas à l'avance ça plante. Si je veux l'utiliser dans une boucle qui boucle dans une autre boucle, ça me fait une pyramide de lettre.
Pour simplifier un peu, si tu pouvais écrire une fonction qui ne vérifierais qu'une seule phrase, ça te paraîtrait moins compliqué. Je trouve la méthode de construire un acronyme avec le texte plus simple. Ça se fait en une seule boucle. J'utiliserais une variable booléenne du genre espaceAvant qui dirait si le caractère précédent était un espace. On le mettrait à true au départ. Il me semble qu'il y avait des posts de ce genre, mais je n'ai pas ttrouvé.
Le Tout est souvent plus grand que la somme de ses parties.
Manque un point virgule ligne 7 et l'include <string.h> pour la fonction strlen !
Sachant que tu parcours le tableau de caractère élément par élément et que les chaîne de caractères se termine par '\0', tu pourrais te passer de strlen !
Je les ai oublié faute d'inattention à force de trop chercher la réponse, mais le code fonctionne. En postant j'ai fais des fautes de frappes j'ai rajouté le point virgule et le <string.h> .
@edgarjacobs: Le code que tu proposais avait un avantage et un inconvénient. L'avantage est qu'on n'a pas besoin de mémoire pour stocker le paradigme associé à un titre. L'inconvénient est que tu utilises des pointeurs, ce qui peut embêter royalement un débutant ...
Le Tout est souvent plus grand que la somme de ses parties.
Ligne 16 je teste une initiale juste après un espace.
Vous auriez pas une piste sur ce que je pourrais entreprendre ?
Edit: laissez tomber j'ai eu accès à la correction, j'ai regardé la correction je vais essayer de le refaire si ça match je posterai mon code ici mais en clair pierrot avec raison il fallait faire une condition bool qu'on initialise a true.
Ligne 16 je teste une initiale juste après un espace.
Ce n'est pas correct car la boucle commence à zéro.
Soit tu fais :
if(i == 0)
{
copie[i] = titre[i];
}
else // i ne peut pas être égal à 0 dans la suite
{
if(titre[i-1] == ' ') // donc i-1 existe
{
copie[strlen(copie)+1] = '\0';
copie[strlen(copie)] = titre[i];
}
}
comme tu faisais au début, soit tu fais comme je t'avais montré dans mon message précédent (qui évite des tests inutiles).
- Edité par robun 6 mai 2021 à 9:54:44
Trouver un mot correspondant à son acronyme .
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Le Tout est souvent plus grand que la somme de ses parties.