Menu

Petit exercice 2 [Résolu]

ninrin 9 Messages postés jeudi 3 mai 2018Date d'inscription 16 mai 2018 Dernière intervention - 15 mai 2018 à 02:11 - Dernière réponse : ninrin 9 Messages postés jeudi 3 mai 2018Date d'inscription 16 mai 2018 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

6 réponses

Dalfab 357 Messages postés dimanche 7 février 2016Date d'inscription 2 octobre 2018 Dernière intervention - 15 mai 2018 à 03:08
0
Merci
Bonjour,

Pour avoir le type
bool
, il faut ajouter au début
#include <stdbool.h>
Commenter la réponse de Dalfab
[Dal] 4745 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 10 octobre 2018 Dernière intervention - Modifié par [Dal] le 15/05/2018 à 09:57
0
Merci
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 : http://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
[Dal] 4745 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 10 octobre 2018 Dernière intervention - 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.
[Dal] 4745 Messages postés mercredi 15 septembre 2004Date d'inscriptionContributeurStatut 10 octobre 2018 Dernière intervention - 15 mai 2018 à 13:40
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
.
Commenter la réponse de [Dal]
Pinzou76 728 Messages postés dimanche 17 septembre 2017Date d'inscription 21 septembre 2018 Dernière intervention - 15 mai 2018 à 10:00
0
Merci
Petite erreur d'étourderie sur le premier scanf:
scanf("&d", age);

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

Pourtant tu as bien syntaxé les autres
Commenter la réponse de Pinzou76
ninrin 9 Messages postés jeudi 3 mai 2018Date d'inscription 16 mai 2018 Dernière intervention - 16 mai 2018 à 19:17
0
Merci
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
Commenter la réponse de ninrin