Programme en C

Fermé
firk - 4 juil. 2008 à 10:12
zavenger Messages postés 811 Date d'inscription vendredi 29 février 2008 Statut Membre Dernière intervention 20 avril 2012 - 4 juil. 2008 à 13:31
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
4 juil. 2008 à 10:16
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
4 juil. 2008 à 10:19
//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
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81 > firk
4 juil. 2008 à 10:31
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
4 juil. 2008 à 10:21
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
4 juil. 2008 à 10:24
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
4 juil. 2008 à 10:26
regarde la fin de mon post
0
(Pabix) Messages postés 578 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
4 juil. 2008 à 10:27
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
4 juil. 2008 à 10:27
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
4 juil. 2008 à 10:29
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
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12 > firk
4 juil. 2008 à 10:41
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12 > kazouu Messages postés 466 Date d'inscription mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008
4 juil. 2008 à 10:44
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81 > firk
4 juil. 2008 à 10:44
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
4 juil. 2008 à 10:35
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
4 juil. 2008 à 10:39
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
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81 > firk
4 juil. 2008 à 10:46
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81 > (Pabix) Messages postés 578 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009
4 juil. 2008 à 10:48
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009
4 juil. 2008 à 11:26
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12 > firk
4 juil. 2008 à 11:29
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
4 juil. 2008 à 10:48
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
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12 > firk
4 juil. 2008 à 11:57
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008
4 juil. 2008 à 12:07
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12 > firk
4 juil. 2008 à 12:09
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 vendredi 29 février 2008 Statut Membre Dernière intervention 20 avril 2012 161
4 juil. 2008 à 11:54
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
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 mercredi 4 juin 2008 Statut Membre Dernière intervention 24 juillet 2008 12
4 juil. 2008 à 11:55
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 vendredi 29 février 2008 Statut Membre Dernière intervention 20 avril 2012 161
4 juil. 2008 à 12:57
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 vendredi 29 février 2008 Statut Membre Dernière intervention 20 avril 2012
4 juil. 2008 à 13:24
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 vendredi 29 février 2008 Statut Membre Dernière intervention 20 avril 2012 161 > firk
4 juil. 2008 à 13:31
donc tu crois pouvoir repenser ton algo?
0