Rand avec un string ?

Fermé
Mendoza - 7 janv. 2014 à 20:36
 Mendoza - 26 janv. 2014 à 17:42
Bonsoir,

J'aimerai choisir un string au hasard et l'affiché, comment faire ?
Pour l'instant, j'ai déjà fait ça :


#include <stdio.h>
#include <stdlib.h>

void justificatif ();
void qualificatif ();
void deuxièmeQualificatif ();
void messageFin ();

int main(int argc, char **argv)
{
char reponse;
printf("Voulez-vous choisir un justificatif ? (O/N)");
scanf("%c", &reponse);
if (reponse=='O') {
justificatif
}
printf("Voulez-vous choisir un qualificatif ? (O/N)");
scanf("%c", &reponse);
if (reponse=='O') {
justificatif
}
printf("Voulez-vous choisir un deuxième qualificatif ? (O/N)");
scanf("%c", &reponse);
if (reponse=='O') {
justificatif
}
printf("Voulez-vous choisir un message de fin ? (O/N)");
scanf("%c", &reponse);
if (reponse=='O') {
justificatif
}

return 0;
}

void justificatif () {
char j1[13]="Cause Départ\0";
printf ("%s\n", j1);
char j2[14]="Double emploi\0";
printf ("%s\n", j2);
char j3[6]="Décès\0";
printf ("%s\n", j3);
}

void qualificatif () {
}

void deuxièmeQualificatif (){
}

void messageFin (){
}

Donc voilà, comment faire pour qu'il choisisse au hasard un des justificatifs et ensuite me l'afficher. Je ferais de même pour les autres fonctions.

D'avance, merci.

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
7 janv. 2014 à 22:41
Bonjour,

justificatif => justificatif();

scanf("%c", &reponse)
rajoute un getchar(); après le scanf(). Cela aura pour effet de vider le '\n' résidant dans le buffer clavier.

char j1[13]="Cause Départ\0";
Pour info, pas besoin de mettre le \0, il sera rajouté tout seul. De plus, tu n'as pas besoin non plus d'indiquer la taille. Ainsi : char j1[]="Cause Depart"; fonctionne. Fais attention aux accents. Tu risques d'avoir un problème en fonction de l'encodage. Si tu veux impérativement un accent, utilise les wide char.

Sinon, je n'ai pas bien compris ta question.
Si tu veux du hasard :
Tu initialises la graine avec : srand(time(NULL));
Tu tires un nombre pseudo aléatoire : rand() % 5; pour avoir un nombre entre 0 et 5 (non compris).

Ensuite, en fonction du nombre tu appelles la fonction que tu veux. Tu peux même utiliser un tableau de pointeurs sur fonctions.

Cdlt,
0
Merci pour les petites précisions.

Ce que je veux faire, c'est générer aléatoirement des petites annonces, avec un justificatif, un qualificatif, etc., en fonction du choix de l'utilisateur, d'où le (O/N).

Par exemple :

L'utilisateur répond oui à toutes les questions, à l'affichage il aura donc :

Cause départ - Ingénieur - Son - N° de téléphone : xxxxxxxxxxx

Et donc le problème, c'est cette aléatoire là, comment l'utilisé et ou le placé.

Je ne comprends pas très bien quand tu dis :

"Tu initialises la graine avec : srand(time(NULL));
Tu tires un nombre pseudo aléatoire : rand() % 5; pour avoir un nombre entre 0 et 5 (non compris)."

Pourrais-tu me l'expliquer en l'ajoutant dans le code, pour que je sache où le mettre et comprendre son fonctionnement (je débute seulement en C).
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
Modifié par fiddy le 7/01/2014 à 23:18
Dans ce cas, il suffit de faire 4 tableaux.
char justif[][25]={"Case depart", "double emploi", ...};
char qualif[][25]={"ingenieur", ...};
char 2ndQualif[][25]={...};
char msgFin[][25]={...};


Ensuite justif[0] te retourne "Case depart", justif[1] te retourne "double emploi".
De même avec qualif[0], ...

L'idée est donc de tirer 4 nombres aléatoires : nb1, nb2, nb3, nb4;
La phrase à afficher sera donc :
printf("%s %s %s %s\n", justif[nb1], qualif[nb2], 2ndQualif[nb3], msgFin[nb4]);


Pour avoir les nombres aléatoires :
srand(time(NULL));
nb1=rand()%(sizeof justif / sizeof *justif);
nb2=rand()%(sizeof qualif / sizeof *qualif);
nb3=rand()%(sizeof 2ndQualif / sizeof *2ndQualif);
nb4=rand()%(sizeof msgFin / sizeof *msgFin);

S'il y a des choses que ne comprends pas, je te conseille plutôt de lire un tuto et de commencer progressivement : https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c

Cdlt,
0
Je suis justement les cours sur ocr, mais je ne suis pas arrivé suffisamment loin pour comprendre les random avec des char.

J'ai intégrer tes bouts de codes au mien et ça donne ça :


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void justificatif ();
void qualificatif ();
void deuxièmeQualificatif ();
void messageFin ();

int main(int argc, char **argv)
{
char reponse;
printf("Voulez-vous choisir un justificatif ? (O/N)");
scanf("%c", &reponse);
if (reponse=='O') {
justificatif();
}
printf("Voulez-vous choisir un qualificatif ? (O/N)");
scanf("%c", &reponse);
if (reponse=='O') {
qualificatif();
}
printf("Voulez-vous choisir un deuxième qualificatif ? (O/N)");
scanf("%c", &reponse);
if (reponse=='O') {
deuxièmeQualificatif();
}
printf("Voulez-vous choisir un message de fin ? (O/N)");
scanf("%c", &reponse);
if (reponse=='O') {
messageFin();
}

return 0;
}

void justificatif () {
int nb1;
srand(time(NULL));
char justif[][25]={"Case depart", "Double emploi", "Deces"};
nb1=rand()%(sizeof justif / sizeof *justif);
printf("%s\n", justif[nb1]);
}

void qualificatif () {
int nb2;
srand(time(NULL));
char qualif[][25]={"Rigoureux", "Dynamique", "Motivé"};
nb2=rand()%(sizeof qualif / sizeof *qualif);
printf("%s\n", qualif[nb2]);
}

void deuxièmeQualificatif () {
int nb3;
srand(time(NULL));
char 2ndQualif[][25]={"Patient", "Soigneux", "Motivé"};
nb3=rand()%(sizeof 2ndQualif / sizeof *2ndQualif);
printf("%s\n", 2ndQualif[nb3]);
}

void messageFin () {
int nb4;
srand(time(NULL));
char msgFin[][25]={"Cherche", "Cède", "Rencontrerait"};
nb4=rand()%(sizeof msgFin / sizeof *msgFin);
printf("%s\n", msgFin[nb4]);
}

Est-ce que c'est correct ?
0
A quoi sert le [25] ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
8 janv. 2014 à 09:55
Le [25] indique la taille max des mots. N'hésite pas à augmenter la taille si tes mots sont plus longs.
scanf("%c", &reponse);
Pourquoi tu mets plusieurs scanf("%c", &reponse); ? Tu as oublié le getchar() comme je t'ai dit.

La solution que je te proposais était encore plus simple.

int main(...) {
     srand(time(NULL)); /*à ne mettre qu'une seule fois*/
     ...
     message();
}

void message(void) {
     char justif[][25]={"Case depart", "Double emploi", "Deces"};
     char qualif[][25]={"Rigoureux", "Dynamique", "Motivé"};
     char 2ndQualif[][25]={"Patient", "Soigneux", "Motivé"};
     char msgFin[][25]={"Cherche", "Cède", "Rencontrerait"};

     int nb1,nb2,nb3,nb4;

     nb1=rand()%(sizeof justif / sizeof *justif);
     nb2=...;
     nb3=...;
     nb4=...;

     printf("%s %s %s %s\n", justif[nb1], qualif[nb2], 2ndQualif[nb3], msgFin[nb4]);
}
0