Programme en C

firk -  
zavenger Messages postés 811 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

J'aimerais trouver d'où vient l'erreur dans mon programme; j'ai essayé toutes les possibilités qui me semblent plausibles, mais je ne parviens pas à la corriger.(elle y est plusieurs fois dans mon programme, mais c'est la même à chaque fois, via le message d'erreur invalid lvalue in assignment)

Par exemple :

char* (status[6])={"CDI_hors_ess_ou_preavis_lic,CDD_CNE_ou_CDI_essai,Etudiant,TNS,Retraités,Douze_mois_sans_incident_paiement"};

colocation(int R[],int L,char statut1,char statut2)
{ int i,h,k;

switch(statut1,statut2){

{ case(statut1=statut2 && statut2=status[5]): /* Cas 2 En place(les 2 premiers case) */
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
}

case(statut1=status[5] && statut2=!status[1]): /* Cas 1 En place avec n'importe qui */
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
}

11 réponses

(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
Euh, en effet, vous ne devez pas avoir beaucoup appris le C, mais un autre programme… parce qu’il y a beaucoup, beaucoup d’erreurs, je vais les détailler !
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
//char* (status[6])={"CDI_hors_ess_ou_preavis_lic,CDD_CNE_ou_CDI_essai,Etudiant,TNS,Retraités­//,Douze_mois_sans_incident_paiement"};

char * status [6] = {"CDI_hors_ess_ou_preavis_lic" , "CDD_CNE_ou_CDI_essai" , "Etudiant,TNS" , "Retraités­", "Douze_mois_sans_incident_paiement" } ;


//colocation(int R[],int L,char statut1,char statut2)
//{ int i,h,k;
//Là, j’ai vraiment rien compris

//switch(statut1,statut2){
//
//{ case(statut1=statut2 && statut2=status[5]): /* Cas 2 En place(les 2 premiers case) */
//printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
//}
//case(statut1=status[5] && statut2=!status[1]): /* Cas 1 En place avec n'importe qui */
//printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
//}
Ici, vous comparez des chaines de caractères, il faut que vous utilisiez strcmp.
0
firk
 
le premier case correspond au cas où les 2 personnes ont le même status, à savoir 12 mois...
Je ne voudrais pas énumérer tous les if, c'est pourquoi j'ai introduis le switch suivi de case.
si j'utilise strcmp, je dois faire tous les if.

Est-ce que je peux utiliser strcmp dans les cases?

P.S : c'est bien strcmp(statut1==statut2; statut2=status[5]) pour le premier case ?
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81 > firk
 
non, tu es sous Linux, si tu veux connaître la syntaxe de strcmp, le mieux est de la chercher dans le manuel avant de demander… comme je suis bon prince :

strcmp(char*, char*) renvoie 0, si les deux pointeurs pointent vers une chaîne de caractères identiques (jusqu’au caractère '\0')
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12
 
je vois pas l'interet de ton switch la


fais plutot
if(statut1==statut2 && statut2==status[5])
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");


else if(statut1==status[5] && statut2=!status[1])
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");


et comme ton tableau status[] contien des char* il faut que statu1 et statu2 soit aussi des char*
et a ce moment tu doit les comparé non pas avec un (==) mais avec un STRCMP
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
kazou, status[5] est un pointeur, ça m’étonnerait qu’il veuille comparer des pointeurs… quoique pas sûr.
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12
 
regarde la fin de mon post
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
en effet, j’avais pas vu ! Excuse-moi pour le dérangement
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12
 
tu ne déranges pas si tu as d'autre solution a apporter soit le bienvenu =)
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12
 
non c'est

strcmp(statut1,statut2) && strcmp(statut2=status[5])



et je ne sais pas si tu a le droit de switch sur 2 variables
0
firk
 
j'ai essayé comme tu m'as proposé mais j'ai les erreurs lorsque j'insère ceci, kazouu :

case(strcmp(statut1,statut2) && strcmp(statut2=status[5]) ):


warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast
warning: assignment makes integer from pointer without a cast
warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
error: too few arguments to function ‘strcmp’
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12 > firk
 
lis tout ce que l'on marque !


et comme ton tableau status[] contien des char* il faut que statu1 et statu2 soit aussi des char*
et a ce moment tu doit les comparé non pas avec un (==) mais avec un STRCMP
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12 > kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention  
 
si je corrige ton ton code a vu d'oeil ca donne un truc du genre

(status[6])={"CDI_hors_ess_ou_preavis_lic,CDD_CNE_ou_CDI_essai,Etudiant,TNS,Retraités­,Douze_mois_sans_incident_paiement"};

colocation(int R[],int L,char* statut1,char* statut2)
{ int i,h,k;

switch(statut1,statut2){

{ case(strcmp(statut1,statut2) && strcmp(statut2,status[5])): /* Cas 2 En place(les 2 premiers case) */
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
}

case(strcmp(statut1,status[5]) && !strcmp(statut2,status[1])): /* Cas 1 En place avec n'importe qui */
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
}
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81 > firk
 
firk, si statut1 et statut2 sont des entiers alors ça ne sert à rien de les comparer avec une chaîne de caractères, ni entre eux avec strcmp.

D’autre part tu n’as pas compris à quoi sert switch, il faut ABSOLUMENT que tu utilises if pour faire ce que tu veux.

if ((statut1 == statut2) && (statut2 == 5))
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
Bonjour, la structure de switch, c’est

switch(EXPRESSION) {

case VALEUR :
[…] break;
etc.
}

statut1, statut2 est effectivement une expression, mais qui ne sert à rien, puisque l’opérateur virgule, en C, renvoie la deuxième valeur ;
et ici, au lieu de faire des comparaisons avec ==, tu fais des affectations avec =, qui te renvoient automatiquement la valeur de droite… bref.
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12
 
ouai et je ne vois pas la difference entre faire

switch
case
case
...

ou
if
else if
else if
..


mais bon a toi de voir
0
firk
 
C'est juste par souci d'élégance que je procède comme tel. Je dois réaliser les combinaisons de 2 agents : le cas où les 2 agents ont le même status, le cas où ils ont des statuts différents.
C'est assez long, alors pour 3 agents, c'est encore pire!!
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81 > firk
 
dans ce cas, si tu veux utiliser switch, il faut que tu fasses

switch (statut1 == statut2) {

case 0: // statuts différents

break;

default: // statuts identiques

break;
}
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81 > (Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention  
 
PS. sincèrement tu m’as l’air de ne pas connaître la syntaxe du C précisément, il faut absolument que tu lises un cours de C avant de continuer, car tu fais énormément d’erreurs !

Je te conseillerais le cours en lien : http://sites.univ-provence.fr/wcpp/V2/index.htm
0
firk > (Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention  
 
Si je fais qqch du style :

switch(statut1==statut2){

case(0):statut2=status[5]; /* Cas 1 En place avec n'importe qui */
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;

default( );statut2==status[5]: /* Cas 2 En place(les 2 premiers case) */
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;
}
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12 > firk
 
mais c'est affreux ^^
arrête de vouloir faire un a tout prix un switch

un switch a la base c'est pour tester les different resultat d'une expression
donc si tu veux vraiment faire un switch faut que tu fasse


switch(statut1==statut2){

case(0): if(statut2=status[5]) /* Cas 1 En place avec n'importe qui */
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");break;

mais c'est vraiment très très laid
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12
 
moi je te conseil

(status[6])={"CDI_hors_ess_ou_preavis_lic,CDD_CNE_ou_CDI_essai,Etudiant,TNS,Retraités­­,Douze_mois_sans_incident_paiement"};

colocation(int R[],int L,char* statut1,char* statut2)
{ int i,h,k;

if(strcmp(statut1,statut2) && strcmp(statut2,status[5]))
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n")


else if(strcmp(statut1,status[5]) && !strcmp(statut2,status[1]))
printf("Vous remplissez les conditions d'acceptation auprès de notre assurance\n");
}
0
firk
 
Excuse-moi, j'ai une question :

le premier if correspond bien au cas où statut1==statut2?
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12 > firk
 
ce if la

if(strcmp(statut1,statut2) && strcmp(statut2,status[5]))

correspond au cas ou statut 1=statu2 et ou statu2= status[5]
0
firk > kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention  
 
quand tu dis statut1=statut2 : en français, c'est bien statut1 et statut2 sont identiques, n'est-ce pas, kazouu?
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12 > firk
 
oui strcmp renvoi TRUE quand 2 chaine sont egal

donc if(strcmp(chain1,chaine2)){ /* ici tu met les instruction qu'il faut excuté quand la chaine 1 est identique ( attention a la casse ) a la chaine2 */
0
zavenger Messages postés 811 Date d'inscription   Statut Membre Dernière intervention   161
 
Bonjour,

Je peux me tromper bien sur, mais je me demande si tu ne prends pas le probleme a l'envers. Ne serait il pas possible de calculer pour chaque cas final les conditions d'acceptation. Je n'ai bien sur pas les details, mais faire qque chose comme:

AssuranceOK = condition1 ET condition2 ou conditin3
....

ensuite

faire le traitement de tous tes resultats

Juste une idee comme cela ...
0
firk
 
Tu as bien l'idée en tête, mais il faut étudier les cas intermédiaires, et le refus de l'assurance.
Ces 3 issues dépendent du revenu de l'agent i=1 puis 2, ainsi qu'au rapport R/L(L=loyer) s'il est<2, (>=2 && <=3) et si R/L>3.
0
kazouu Messages postés 466 Date d'inscription   Statut Membre Dernière intervention   12
 
oui après ca c'est l'algo nous on l'aide juste pour le codage ^^
0
zavenger Messages postés 811 Date d'inscription   Statut Membre Dernière intervention   161
 
mais c'est peut-etre justement l'algo qui fait que le codage est difficile. C'est pour cela que je demande si l'algo ne pourrait pas etre revu, car il a l'air d'avoir un algo du style

si condiftion1 alors resultat1
si condiftion2 alors resultat2
si condiftion3 alors resultat1
...

Alors qu'il faudrait peut etre avoir un algo

on a resultat1 si condition1 et condition3
on a resultat2 si condition2
...
0
firk > zavenger Messages postés 811 Date d'inscription   Statut Membre Dernière intervention  
 
oui,

pour 2 locataires :

si les 2 sont etudiant, alors pour tout revenu, on a "caution solidaire".
si etudiant+CDD : si revenu (CDD)>=2*L, alors "caution solidaire".
si revenu (CDD)<2*L, alors "impossible.

il y a des situations où un statut domine tous les autres, 2 statuts qui sont dominés, etc...

et ainsi de suite. le noeud de l'algorithme réside dans le fait de bien combiner le statut des 2 locataires.
(je dois aussi faire pour 3 locataires, c'est plus complexe encore).
0
zavenger Messages postés 811 Date d'inscription   Statut Membre Dernière intervention   161 > firk
 
donc tu crois pouvoir repenser ton algo?
0