Petit exercice

Résolu/Fermé
ninrin Messages postés 9 Date d'inscription jeudi 3 mai 2018 Statut Membre Dernière intervention 16 mai 2018 - Modifié le 3 mai 2018 à 02:17
ninrin Messages postés 9 Date d'inscription jeudi 3 mai 2018 Statut Membre Dernière intervention 16 mai 2018 - 15 mai 2018 à 01:44
Bonjour, je dois convertir en language C comme suit:
Variables nb, carr en entier
Début
Écrire "Entrez un nombre : "
Lire nb
carr ← nb * nb
Écrire "Son carré est : ", carr
Fin

TRADUCTION:

int main(int nb, int carr)
{
    printf("Entrez un nombre:");
    nb=getchar();
    carr= WTF
    printf("Son carre est: %d", carr);
    return 0;
}

donc comme vous pouvez le voir ma traduction en language C, dans la ligne de déclaration de variable carr, que dois-je mettre exactement à la place de mon "WTF"? D'ailleurs j'ai un sérieux doute concernant la ligne "nb= getchar()" pour "lire nb"? Merci de m'éclairer et me dire mes erreurs ^^, bien à vous!

EXO 2: je dois déclarer 4 variables contenant chacune des fragments de texte. Je dois réussir à aligner les 4 fragments (concaténation) :
int main()
{

char t1[] = "belle Marquise";
char t2[] = "vos beaux yeux";
char t3[] = "me font mourir";
char t4[] = "d'amour";
printf("%s", t1);
return 0;
}

comme vous voyez avec sprinf, je n'ai réussis que à afficher la variable "t1" et je dois afficher t1&t2&t3&t4 en une seul ligne. Avez vous une astuce??

1 réponse

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
3 mai 2018 à 10:29
Salut ninrin,

Tu devrais sérieusement revoir ton cours ou ton manuel de C.

Ton prototype pour main est erroné et ne correspond pas aux prototypes standards acceptables en C (
int main(int argc, char **argv)
ou
int main(void)
, vois ton cours ou ton manuel.

Déclare tes variables dans le code de la fonction main, à l'intérieur des accolades.

Prend l'habitude de terminer tes printf avec un retour à la ligne
\n
ou une instruction
fflush(stdout);
si tu ne veux pas faire de retour à la ligne, pour t'assurer que ton texte sera bien affiché.

getchar va retourner sous forme d'entier le code ASCII d'un caractère lu, ce n'est donc pas ce que tu veux, utilise scanf.

Une fois que tu as ton entier, tu le multiplies par lui-même en ligne 5.. je ne vois pas où est ton problème.

Pour ton 2ème code, si ce que tu dois faire c'est juste afficher le contenu des chaînes à la suite, avec printf, tu peux indiquer un nombre variable de spécificateurs et un nombre correspondant d'arguments. Tu peux aussi faire plusieurs printf avec un seul spécificateur et un seul argument correspondant et sans retour à la ligne, sauf pour le dernier, mais c'est un peu bourrin.

Je suppose que tu devras rajouter des espaces pour que la phrase se lise correctement.

Dal
0
ninrin Messages postés 9 Date d'inscription jeudi 3 mai 2018 Statut Membre Dernière intervention 16 mai 2018
3 mai 2018 à 17:47
Salut Dal, oui je suis complètement novice, je vient juste de commencer ^^. J'utilise code bloc et il met int main () par défault. Du coup j'ai fais comme tu dis l'a dis, j'ai déclarer mes variable "nb, carr" dans l'accolade et mis "void" à la place, dans int main:

int main(void)
{
int nb, carr ;
printf("Entrez un nombre:\n");
scanf(nb);
carr= nb*nb;
printf("Son carre est: %d\n", carr);
return 0;
}

J'ai surement foiré quelque part, car lorsque que je lance compil, il m'affiche bien "entrez un nombre:" et tape ensuite 2 et valide avec la touche "entrer". Et là il m'affiche "son carre est 1073758208. Ce qui est impossible comme résultat. Tu a une idée du problème? Je suis certain que sa vient de la ligne de scanf et de carr.

Pour la 2ème partie: concaténation, le résultat est fabuleux (je trouve), voici comment je m'y suis pris:

int main(void)
{

char t1[] = "belle Marquise";
char t2[] = "vos beaux yeux";
char t3[] = "me font mourir";
char t4[] = "d'amour";
printf("%s %s %s %s\n", t1, t2, t3, t4);
printf("%s %s %s %s\n", t3, t2, t4, t1);
printf("%s %s %s %s\n", t2, t3, t1, t4);
printf("%s %s %s %s\n", t4, t1, t2, t4);
return 0;
}
0
Pinzou76 Messages postés 614 Date d'inscription dimanche 17 septembre 2017 Statut Membre Dernière intervention 25 février 2019 191
3 mai 2018 à 17:50
Bonjour, essaie plutôt avec une esperluette dans le scanf:
scanf(&nb)

Ca devrait marcher comme ça

Bonne journée
0
ninrin Messages postés 9 Date d'inscription jeudi 3 mai 2018 Statut Membre Dernière intervention 16 mai 2018
Modifié le 3 mai 2018 à 18:18
j'ai fais, c'est encore pire xD, je peux même plus mettre écrire ma valeur numérique, sa affiche directement la valeur (aléatoire) du carré. C'est comme si en faisant cela, l'application saute la ligne de scanf et ne le prend plus en compte
0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 3 mai 2018 à 18:40
@Pinzou76 et @ninrin: le prototype de scanf est :
int scanf(const char * format, ... );
... il faut donc une chaîne descriptive du format et des arguments adéquats, avec des types correspondants, scanf attendant des pointeurs sur ces types. En l'occurrence puisque nb est un entier :

scanf("%d", &nb);
l'esperluette étant l'opérateur permettant effectivement d'obtenir l'adresse mémoire où est stocké le contenu de la variable.

le lien que je donnais vers la documentation de scanf comporte des exemples http://www.cplusplus.com/reference/cstdio/scanf/

@ninrin: scanf est une instruction très puissante et complexe à bien maîtriser

au minimum, il faudrait vérifier la valeur de retour de scanf pour s'assurer que quelque chose qui est un nombre entier décimal (en base 10) a bien été trouvé sur stdin et se plaindre si ce n'est pas le cas, sinon on aura des résultats imprévisibles si l'utilisateur tape "toto" au lieu d'un nombre (scanf échouera, et ton programme ne le saura pas et continuera avec une valeur de nb non initialisée pouvant contenir n'importe quoi).

il faudrait aussi vérifier si on n'excède pas la capacité du type int, compte tenu de la taille maximale d'un int (dans ce cas, pour la saisie, plutôt que scanf, on utiliserait fgets pour récupérer une chaîne et strtol pour convertir la saisie en entier avec vérification), et aussi utiliser des types plus grands, etc.

cela dit, peut-être qu'on n'attend pas tout cela de toi si tu débutes tout juste :-)

Dal
0
Merci j'ai réussis !
le prochain l'exercice consiste à imbriber plusieurs else if, if etc... avec des opération logique comme suit :
Variables age, perm, acc, assur en entier
Variable situ en caractère
Début
C1 ← age >= 25

Sinonsi ((Non(C1) et C2) ou (C1 et Non(C2)) alors
Si acc = 0 alors
situ ← "Orange"
SinonSi acc = 1 alors
situ ← "Rouge"
Sinon
situ ← "Refusé"
FinSi
Sinon
Si acc = 0 alors

TRADUCTION C:

int main(void)
{
int age, perm, acc, assur;
char situ;
int C1 = 25;
if (age >=C1);

else if (!C1 && C2 || C1 && !C2)
{
if acc = 0 {
situ = "orange";
}

else if acc = 1 {
situ = "rouge";
}

else {
situ = "refusé";
}

}
return;

else if (acc = 0)








1er problème, j'ai un doute concernant ma déclaration en C, de ma variable C1 age >= 25, car j'ai pas bien saisis l'algorithme.
2ème problème, l'applicaton me dit qu'il y a erreur sur la ligne else if (!C1 && C2 || C1 && !C2), j'ai dû me tromper quelque part?
3ème, j'ai un doute pour "finsi" de l'algorithme, j'ai juste mis "return;" en C, c'est bon ? Car je vois parfois sur des sites "return 1.0;" par exemple.
4ème, j'ai un doute pour "Sinon
Si acc = 0 alors" de l'algorithme , j'ai mis direct "else if" en C. J'aurais peut-être dû mettre "else { if (acc = 0) }" ???
Voila n'hésitez pas à me faire remarqué les erreurs ^^.
0