Petit exercice 2

Résolu/Fermé
ninrin Messages postés 9 Date d'inscription jeudi 3 mai 2018 Statut Membre Dernière intervention 16 mai 2018 - 15 mai 2018 à 02:11
ninrin Messages postés 9 Date d'inscription jeudi 3 mai 2018 Statut Membre Dernière intervention 16 mai 2018 - 16 mai 2018 à 19:17
Bonjour,
je crée ce post suite à un ancien post, voici l'algorithme à traduire en langague C, attention c'est long mais en vrai ont vas juste booser le début vu que c'est assez répétitif vers le milieu :
Variables age, perm, acc, assur en entier
Variable situ en caractère
Début
Écrire "Entrez l’âge : "
Lire age
Écrire "Entrez le nombre d’années de permis : "
Lire perm
Écrire "Entrez le nombre d’accidents : "
Lire acc
Écrire "Entrez le nombre d’années d’assurance : "
Lire assur
C1 ← age >= 25
C2 ← perm >= 2
C3 ← assur > 1
Si Non(C1) et Non(C2) alors
Si acc = 0 alors
situ ← "Rouge"
Sinon
situ ← "Refusé"
FinSi
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
situ ← "Vert"
SinonSi acc = 1 alors
situ ← "Orange"
SinonSi acc = 2 alors
situ ← "Rouge"
Sinon
situ ← "Refusé"
FinSi
FinSi
Si C3 alors
Si situ = "Rouge" alors
situ ← "Orange"
SinonSi situ = "Orange" alors
situ ← "Orange"
SinonSi situ = "Vert" alors
situ ← "Bleu"
FinSi
FinSi
Écrire "Votre situation : ", situ
Fin

TRADUCTION EN C:
 #include <stdio.h>
#include <stdlib.h>

int main(void)
{  int age, perm, acc, assur;
char situ[10];
    printf("Entrez l'âge:\n");
    scanf("&d", age);
    printf("Entre le nombre d'années de permis:\n");
    scanf("%d", &perm);
    printf("Entrez le nombre d'accidents:\n");
    scanf("%d", &acc);
    printf("Entrez le nombre d'années d'assurance:\n");
    scanf("%d", &assur);
    bool C1 = age >= 25 ;
    bool C2 = perm >=2 ;
   bool C3 = assur > 1;
    if (!C1 && !C2) {
    if (acc == 0)
     {
        situ = "rouge";
     }
        else
            {
             situ = "refusé";
             }
    }
            return;

    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)
    {
        situ = "vert";

        else if (acc == 1)
        {
                     situ = "orange";
                 }
        else if (acc == 2)
        {
            situ = "rouge";
        }
            else
                { situ = "refusé";

        }
    }

    return;

    if (C3)
        {

        if (situ == "rouge")
            {
            situ = "orange";
        }
        else if (situ == "Orange")
            {
                situ = "Orange";
            }
        else if (situ == "vert")
        {
            situ = "bleu";
        }

    }
return;

prinft ("votre situation: %s\n", situ);



    return 0;
}
 

Donc mon 1er problème, le logiciel m'indique une erreur sur la ligne 15 du bool avec le message : "error: unknown type name 'bool', je n'arrive pas à comprend pourquoi ? tout m'a l'air bon!
@Dal J'ai remplacé au début par char situ[10] ainsi il y aura assez de place (10 max) pour écrire les chaines.

4 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
15 mai 2018 à 03:08
Bonjour,

Pour avoir le type
bool
, il faut ajouter au début
#include <stdbool.h>
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 15 mai 2018 à 09:57
Salut ninrin,

En ajoutant le #include <stdbool.h> donnant accès au type bool, et en compilant avec les warnings avec gcc, on obtient ces messages d'avertissements et d'erreurs :

$ gcc -Wall 35364348.c
35364348.c: In function ‘main’:
35364348.c:9:2: warning: too many arguments for format [-Wformat-extra-args]
scanf("&d", age);
^
35364348.c:22:9: error: assignment to expression with array type
situ = "rouge";
^
35364348.c:26:9: error: assignment to expression with array type
situ = "refusé";
^
35364348.c:29:2: warning: ‘return’ with no value, in function returning non-void [-Wreturn-type]
return;
^
35364348.c:31:2: error: ‘else’ without a previous ‘if’
else if (((!C1) && C2) || (C1 && (!C2)))
^
35364348.c:34:9: error: assignment to expression with array type
situ = "orange";
^
35364348.c:38:9: error: assignment to expression with array type
situ = "rouge";
^
35364348.c:42:9: error: assignment to expression with array type
situ = "refusé";
^
35364348.c:46:2: warning: ‘return’ with no value, in function returning non-void [-Wreturn-type]
return;
^
35364348.c:48:2: error: ‘else’ without a previous ‘if’
else if (acc == 0)
^
35364348.c:50:8: error: assignment to expression with array type
situ = "vert";
^
35364348.c:52:3: error: expected ‘}’ before ‘else’
else if (acc == 1)
^
35364348.c:54:9: error: assignment to expression with array type
situ = "orange";
^
35364348.c:58:9: error: assignment to expression with array type
situ = "rouge";
^
35364348.c:61:10: error: assignment to expression with array type
{ situ = "refusé";
^
35364348.c:18:7: warning: unused variable ‘C3’ [-Wunused-variable]
bool C3 = assur > 1;
^
35364348.c:7:7: warning: variable ‘situ’ set but not used [-Wunused-but-set-variable]
char situ[10];
^
35364348.c: At top level:
35364348.c:66:2: error: expected identifier or ‘(’ before ‘return’
return;
^
35364348.c:68:2: error: expected identifier or ‘(’ before ‘if’
if (C3)
^
35364348.c:85:2: error: expected identifier or ‘(’ before ‘return’
return;
^
35364348.c:87:10: error: expected declaration specifiers or ‘...’ before string constant
prinft ("votre situation: %s\n", situ);
^
35364348.c:87:35: error: unknown type name ‘situ’
prinft ("votre situation: %s\n", situ);
^
35364348.c:91:2: error: expected identifier or ‘(’ before ‘return’
return 0;
^
35364348.c:92:1: error: expected identifier or ‘(’ before ‘}’ token
}
^

Codeblocks, que tu indiquais utiliser dans ton précédent message, a dû te les signaler. Traite les un par un en commençant par le premier : comprend pourquoi il se manifeste, corrige le, recompile, passe au suivant qui se manifestera en premier.

Les "error" vont empêcher la compilation car ils n'ont pas de sens syntaxiquement en C.
Les "warning" n'empêcheront pas la compilation, mais avertissent d'un code anormal, et dans 90% des cas, c'est un bogue.

Élimine les tous jusqu'à ce que ton programme compile proprement sans erreurs ni avertissements. Tous les bogues ne seront pas détectés par le compilateur, mais tu auras déjà bien progressé.

Quelques rappels ou indications :

Pour affecter une chaîne C à un tableau de char, tu dois utiliser strcpy() ou strncpy(), comme je te l'avais indiqué.

Pour comparer deux chaînes en C, tu dois utiliser strcmp()

Ces dernières fonctions sont accessibles par
#include <string.h>


Si tu ne connais pas le fonctionnement de ces fonctions, lis leur documentation.

Les liens que je te fournis vers http://www.cplusplus.com/reference/clibrary/ décrivent très précisément la syntaxe et l'usage des fonctions et comportent des exemples de code.

Il y a d'autres sites : https://en.cppreference.com/w/c/header ; les pages de manuel Linux ; ton manuel ; ton cours,... apprend à te servir de ces ressources pour progresser.

Si tu es bloqué sur une erreur ou un avertissement ou l'usage d'une fonction, reposte ton code corrigé et demande de l'aide sur le forum :-)


Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
15 mai 2018 à 09:54
Autre conseil : lorsque tu programmes, n'attends pas d'avoir écrit une centaine de lignes de code pour vérifier que ton programme compile proprement sans erreurs ni warnings et qu'il s'exécute comme tu l'attends.

Dès que tu as quelques lignes testables, compile et débogue en vérifiant que cela fonctionne comme cela le devrait.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 15 mai 2018 à 13:43
Tes
return
placés au milieu du code de
main()
ne sont pas syntaxiquement incorrects en eux-mêmes (tu as seulement droit à un avertissement car tu ne renvoies pas un
int
attendu par
main()
), mais leur effet est d'interrompre l'exécution de la fonction (et donc de terminer le programme à cet endroit puisqu'il s'agit de la fonction
main()
). Ce n'est certainement pas ce que tu cherches à faire (sauf pour le dernier
return 0
).

Si tu cherches juste à terminer le bloc
if
, c'est déjà le rôle de l'accolade fermante et tu dois supprimer ces
return
(sauf, donc, le dernier
return 0
).

Cela provoque d'autres erreurs aux lignes qui suivent ces
return
, qui comportent des
else
:
error: ‘else’ without a previous ‘if’
car tu as interrompu la séquence if / else. Ces messages d'erreurs disparaîtront lorsque tu auras supprimé ces
return
.
0
Pinzou76 Messages postés 609 Date d'inscription dimanche 17 septembre 2017 Statut Membre Dernière intervention 25 février 2019 190
15 mai 2018 à 10:00
Petite erreur d'étourderie sur le premier scanf:
scanf("&d", age);

devient
scanf("%d", &age);

Pourtant tu as bien syntaxé les autres
0
ninrin Messages postés 9 Date d'inscription jeudi 3 mai 2018 Statut Membre Dernière intervention 16 mai 2018
16 mai 2018 à 19:17
Parfait j'ai réussis! merci à tous, je me rend compte que les cours de la cned sont légèrement dépassé xD. En tout cas je sens que je vais adorée :). Je vais faire un post post sur un exo de tableau cette fois ci, qui me pose quelque problème
0