Problème d'affectation de variable char[]
Résolu/Fermé
Aj'galere
-
Modifié par Aj'galere le 2/05/2013 à 23:05
Aj'galere Messages postés 2 Date d'inscription vendredi 3 mai 2013 Statut Membre Dernière intervention 4 mai 2013 - 4 mai 2013 à 00:50
Aj'galere Messages postés 2 Date d'inscription vendredi 3 mai 2013 Statut Membre Dernière intervention 4 mai 2013 - 4 mai 2013 à 00:50
A voir également:
- Problème d'affectation de variable char[]
- Variable objet ou variable de bloc with non définie - Forum VB / VBA
- Vba excel sélectionner une plage de cellules variable ✓ - Forum VB / VBA
- Formule excel plage de données variable ✓ - Forum Excel
- Char(10) excel francais ✓ - Forum Excel
- Convertir char en int c - Forum C
5 réponses
capa57
Messages postés
352
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
26 mai 2016
13
3 mai 2013 à 11:01
3 mai 2013 à 11:01
Rajouter le " & " devant crédit_temp.taux ?
capa57
Messages postés
352
Date d'inscription
lundi 30 juin 2008
Statut
Membre
Dernière intervention
26 mai 2016
13
3 mai 2013 à 11:01
3 mai 2013 à 11:01
Dans les scanf je parle
Aj'galere
Messages postés
2
Date d'inscription
vendredi 3 mai 2013
Statut
Membre
Dernière intervention
4 mai 2013
3 mai 2013 à 13:47
3 mai 2013 à 13:47
Non ce n'est pas nécessaire, car les variables sont des strings. J'ai testé quand même et ca ne change rien...
Voici le code en entier. Bon a part ça le tout marche..
Voici le code en entier. Bon a part ça le tout marche..
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define nombre_credit 100 /*--création de type (pas de structure--*/ /*--déclaration des procedures--*/ void credits_proposes(); void nouv_credit(); void sauvegarde_fichier(); void suppr_credit(); void ouvrir_fichier(); void conv_maj(char ch[]); void simul_credit(); int fixe(int x); /*--variables globales--*/ struct banque_credit { char nom[25]; char taux[6]; char type_credit[50]; char seuil_pena[6]; }; struct banque_credit tab_credit[nombre_credit]; int credits_enregistres = 0; char nom_fichier[]="fichier_credit"; /*--principal--*/ main() { printf("--bienvenu sur le logiciel de simulation de crédit-- \n"); ouvrir_fichier(); int choix; int choix2; while (choix!=0) { printf("menu : \n"); printf("-1- Voir les différents crédits proposés \n"); printf("-2- Entrer une simulation \n"); printf("-3- Revoir une simulation enregistrée \n"); printf("-0- QUITTER \n"); printf("choix : "); scanf("%d",&choix); switch (choix) { case 1 : /*choix qui va vers le sous menu*/{ while (choix2!=0) { printf("menu des crédits enregistrés: \n"); printf("-1- Voir les crédits proposés\n"); printf("-2- Enregistrer un nouveau crédit \n"); printf("-3- Supprimer un crédit \n"); printf("-0- Revenir au menu principal \n"); printf("choix : "); scanf("%d",&choix2); switch (choix2) { case 0 : ; break; case 1 : credits_proposes(); break; case 2 : nouv_credit(); break; case 3 : suppr_credit(); break; default : printf("erreur de saisie\n"); break; } } ; }break; case 2 : simul_credit(); break; case 3 : ; break; case 0 : printf("au revoir\n"); break; default : printf("erreur de saisie\n"); break; } } } /*--procedures--*/ /*procédure qui charge la liste des crédits actifs en mémoire*/ void ouvrir_fichier() { credits_enregistres=0; FILE *f1; struct banque_credit banque_temp; int retour; printf("le fichier utilisé est : %s \n",nom_fichier); f1=fopen(nom_fichier,"r"); if (f1==NULL){ printf("Pb d'acces au fichier"); } else { while (!feof(f1)) { retour=fscanf(f1,"%s %s %s %c",banque_temp.nom,banque_temp.taux,banque_temp.type_credit,&banque_temp.seuil_pena); if (retour !=EOF) { tab_credit[credits_enregistres++] = banque_temp; } } } fclose(f1); printf("nombre de credit enregistré = %d\n",credits_enregistres); } /*procédure qui affiche la liste des crédits actifs en mémoire*/ void credits_proposes() { printf("**Nom du crédit**********************Taux*****Type de crédit***********Seuil pénalité***\n"); printf("*--------------------------------------------------------------------------------------*\n"); int i; if (credits_enregistres>0) { for (i=0;i<credits_enregistres;i++) { printf("| %-20s | %15.3s |%-25s | %15.3s |\n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena); } printf("*--------------------------------------------------------------------------------------*\n"); printf("Nombre de crédits enregistré : %d\n",credits_enregistres); } else { printf("pas de crédit enregistré\n"); } } /*procédure qui enregistre un nouveau crédit en mémoire*/ void nouv_credit() { credits_enregistres++; struct banque_credit credit_temp; printf("Entrez le nom du credit :\n"); scanf("%s",credit_temp.nom); conv_maj(credit_temp.nom); printf("Entrez le taux du credit :\n"); scanf("%s",credit_temp.taux); printf("Entrez le type du credit :\n"); scanf("%s",credit_temp.type_credit); /*ajouter un controle de saisie pour verifier que le type existe*/ printf("Entrez le pourcentage de modulation autorisé gratuitement du credit :\n"); scanf("%s",credit_temp.seuil_pena); printf("%s",credit_temp.nom); /* tab_credit[credits_enregistres].nom=credit_temp.nom; tab_credit[credits_enregistres].taux=credit_temp.taux; tab_credit[credits_enregistres].type_credit=credit_temp.type_credit; tab_credit[credits_enregistres].seuil_pena=credit_temp.seuil_pena; printf("%s",tab_credit[credits_enregistres].nom);*/ printf("le credit %s est bien enregistré \n",credit_temp.nom); sauvegarde_fichier(); } /*procédure qui sauvegarde le tableau en mémoire dans le fichier*/ void sauvegarde_fichier() { int i; FILE *f1; f1=fopen(nom_fichier,"w"); for(i=0;i<credits_enregistres;i++) { printf("%s %s %s %s \n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena); fprintf(f1,"%s %s %s %s \n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena); } fprintf(f1,"\n"); fclose(f1); ouvrir_fichier(); } /*procédure qui convertit une chaine en chaine majuscule*/ void conv_maj(char ch[]) { int taille,i; taille=strlen(ch); for(i=0;i<taille;i++) { ch[i]=toupper(ch[i]); } } /*procédure qui supprime un crédit*/ void suppr_credit() { int i=0,trouve=0, numero=-1; char nom_credit_cherche[50]; struct banque_credit credit_temp; printf("Entrez le nom du credit a supprimer:\n"); scanf("%s",nom_credit_cherche); conv_maj(nom_credit_cherche); while ((i<credits_enregistres)&&(!trouve)) { credit_temp=tab_credit[i]; if(strcmp(nom_credit_cherche,credit_temp.nom)==0) { trouve=1; numero=i; } i++; } /**/ if (numero==-1) { printf("Aucun crédit à ce nom n'a été trouvé.\n"); } /**/ else { for (i=numero;i<credits_enregistres;i++) { tab_credit[i]=tab_credit[i+1]; } printf("Le crédit %s a bien été supprimé\n",credit_temp.nom); credits_enregistres--; } /*integré la procédure sauvegarde*/ sauvegarde_fichier(); } void simul_credit() { int i=0,trouve=0, numero=-1; char nom_credit_cherche[50]; struct banque_credit credit_temp; printf("Voici les crédits à disposition :\n"); credits_proposes(); printf("Saisir le nom du crédit choisi :\n"); scanf("%s",nom_credit_cherche); conv_maj(nom_credit_cherche); while ((i<credits_enregistres)&&(!trouve)) { credit_temp=tab_credit[i]; if(strcmp(nom_credit_cherche,credit_temp.nom)==0) { trouve=1; numero=i; } i++; } if (numero==-1) { printf("Aucun crédit à ce nom n'a été trouvé.\n"); } else { i--; printf("vous avez choisi : %s avec un taux de %0.3s% |%s | %0.3s |\n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena); } if (strcmp(tab_credit[i].type_credit,"echeance_fixe")==0) { fixe(i); } else if (strcmp(tab_credit[i].type_credit,"credit_classique")==0) { classique(i); } else if (strcmp(tab_credit[i].type_credit,"credit_variable")==0) { classique(i); } else { printf("Ce crédit n'a pas de type de référence \n"); } } /*calcul d'un tableau d'ammortissement avec taux fixe et échéance constante*/ int fixe(int x) { float cout_total, k, txi, ech, txim, partint , partk, reste, restepre; int i,ieme, duree,periodicite ; txi=atof(tab_credit[x].taux); periodicite = 12; printf("Quel est le montant de la simulation\n"); scanf("%f",&k); printf("Quel est le nombre de mois\n"); scanf("%i",&duree); cout_total=0; ieme = 1; txi=txi/100; txim = txi/periodicite; restepre = k; ech = (k*txim)/(1-(pow((1+txim),(0-duree)))); printf("Voici le tableau d'amortissement de l'emprunt\n"); printf("______________________________________________________________________________________\n"); printf("| MOIS | ANNUITE | CAPITAL REMBOURSE |INTERETS REMBOURSES | CAPITAL RESTANT DU|\n"); printf("______________________________________________________________________________________\n"); for (i=0; i<duree; i++) { partint = restepre*txim; partk = ech - partint; reste = restepre-partk; cout_total=cout_total+partint; printf("|%5d | %17.2f | %17.2f| %17.2f | %17.2f |\n",ieme , ech, partk, partint, reste); /* Améliorer l'affichage du tableau && afficher les dates && afficher les totaux */ restepre=reste; ieme = ieme +1; } printf("______________________________________________________________________________________\n"); printf("Cout total du crédit : %f\n",cout_total); } /* calcul d'un tableau d'ammortissement avec taux fixe et capital constant */ int classique(int x) { float cout_total, k, txi, ech, txim, partint , partk, reste, restepre; int i,ieme, duree, periodicite; txi=atof(tab_credit[x].taux); printf("%s\n",tab_credit[x].taux); printf("%f\n",&txi); periodicite=12; printf("montant\n"); scanf("%f",&k); printf("nombre de mois\n"); scanf("%i",&duree); cout_total=0; ieme = 1; txi=txi/100; txim = txi/periodicite; restepre = k; partk = k/duree; printf("Voici le tableau d'amortissement de l'emprunt\n"); printf("______________________________________________________________________________________\n"); printf("| MOIS | ANNUITE | CAPITAL REMBOURSE |INTERETS REMBOURSES | CAPITAL RESTANT DU|\n"); printf("______________________________________________________________________________________\n"); for (i=0; i<duree; i++) { partint = restepre*txim; reste = restepre-partk; ech = partk + partint; cout_total=cout_total+partint; printf("|%5d | %17.2f| %17.2f | %17.2f | %17.2f |\n",ieme , ech, partk, partint, reste); restepre=reste; ieme = ieme +1; } printf("______________________________________________________________________________________\n"); printf("Cout total du crédit : %f\n",cout_total); }
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 833
3 mai 2013 à 22:06
3 mai 2013 à 22:06
Bonjour,
Plein de points à corriger :
main() : n'existe pas en C -> int main (void)
Tu as oublié : return 0; à la fin.
Dans : ouvrir_fichier() :
retour=fscanf(f1,"%s %s %s %c",banque_temp.nom,banque_temp.taux,banque_temp.type_credit,&banque_temp.seuil_pena);
Tu as mis %c pour banque_temp.seuil_pena qui est de type : char seuil_pena[6];
Dans conv_maj() :
ch[i]=toupper(ch[i]);
Tu as oublié d'inclure le prototype de toupper() : #include <ctype.h>
Dans simul_credit() :
printf("vous avez choisi : %s avec un taux de %0.3s% |%s | %0.3s |\n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena);
%0.3s n'existe pas. Une chaîne est une chaîne. Si tu souhaites afficher un nombre, il faut le convertir en int avec strtol(). Ou plus simple, tu utilises le type int dans la structure plutôt qu'une chaîne de caractère.
%0.3s% -> Tu ne peux pas afficher % sans le faire précéder d'un % -> %%.
Dans classique() :
txi=atof(tab_credit[x].taux);
atof() est obsolète. Il faut plutôt utiliser strtof().
printf("%f\n",&txi); &txi représente l'adresse. Il faut enlever &.
classique() est définie après main(). Donc lors de l'appel à main, il ne connait pas le prototype. Il faut donc mettre : int classique(int) à côté des autres déclarations.
Tu as oublié de retourner une variable. Si tu n'as pas besoin de retourner une variable, tu peux mettre : void classique(int x)
Même remarque pour int fixe(int x).
Commence déjà par corriger le tout. Sinon, attention à l'utilisation de feof(), tu ne peux pas t'en servir comme condition de fin de fichier.
Cdlt,
Plein de points à corriger :
main() : n'existe pas en C -> int main (void)
Tu as oublié : return 0; à la fin.
Dans : ouvrir_fichier() :
retour=fscanf(f1,"%s %s %s %c",banque_temp.nom,banque_temp.taux,banque_temp.type_credit,&banque_temp.seuil_pena);
Tu as mis %c pour banque_temp.seuil_pena qui est de type : char seuil_pena[6];
Dans conv_maj() :
ch[i]=toupper(ch[i]);
Tu as oublié d'inclure le prototype de toupper() : #include <ctype.h>
Dans simul_credit() :
printf("vous avez choisi : %s avec un taux de %0.3s% |%s | %0.3s |\n",tab_credit[i].nom,tab_credit[i].taux,tab_credit[i].type_credit,tab_credit[i].seuil_pena);
%0.3s n'existe pas. Une chaîne est une chaîne. Si tu souhaites afficher un nombre, il faut le convertir en int avec strtol(). Ou plus simple, tu utilises le type int dans la structure plutôt qu'une chaîne de caractère.
%0.3s% -> Tu ne peux pas afficher % sans le faire précéder d'un % -> %%.
Dans classique() :
txi=atof(tab_credit[x].taux);
atof() est obsolète. Il faut plutôt utiliser strtof().
printf("%f\n",&txi); &txi représente l'adresse. Il faut enlever &.
classique() est définie après main(). Donc lors de l'appel à main, il ne connait pas le prototype. Il faut donc mettre : int classique(int) à côté des autres déclarations.
Tu as oublié de retourner une variable. Si tu n'as pas besoin de retourner une variable, tu peux mettre : void classique(int x)
Même remarque pour int fixe(int x).
Commence déjà par corriger le tout. Sinon, attention à l'utilisation de feof(), tu ne peux pas t'en servir comme condition de fin de fichier.
Cdlt,
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Merci pour ton aide. Quelques erreurs qui me font honte... Mais je suis encore débutant. Si je ne dois pas utiliser feof faut que j'utilise quoi?
Autre question : vu que je tire tout d'un fichier je pensais que j'étais obligé d'enregistré les variables comme char ou char[]... Mauvaise info?
Bref beaucoup moins d'avertissement à la compilation mais mon problème reste là :
la procédure "nouv_credit" ne marche pas.
Voici ce que me sort le compilateur :
Autre question : vu que je tire tout d'un fichier je pensais que j'étais obligé d'enregistré les variables comme char ou char[]... Mauvaise info?
Bref beaucoup moins d'avertissement à la compilation mais mon problème reste là :
la procédure "nouv_credit" ne marche pas.
Voici ce que me sort le compilateur :
projet_emprunt.c: In function `nouv_credit': projet_emprunt.c:152:2: attention : format `%s' expects argument of type `char *', but argument 2 has type `char (*)[25]' [-Wformat] projet_emprunt.c:155:2: attention : format `%s' expects argument of type `char *', but argument 2 has type `char (*)[6]' [-Wformat] projet_emprunt.c:157:2: attention : format `%s' expects argument of type `char *', but argument 2 has type `char (*)[50]' [-Wformat] projet_emprunt.c:160:2: attention : format `%s' expects argument of type `char *', but argument 2 has type `char (*)[6]' [-Wformat]
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 833
3 mai 2013 à 23:33
3 mai 2013 à 23:33
Non, il faut bien récupérer les variables comme tu fais.
while (!feof(f1))
{
retour=fscanf(f1,"%s %s %s %c",banque_temp.nom,banque_temp.taux,banque_temp.type_credit,&banque_temp.seuil_pena);
if (retour !=EOF) {
tab_credit[credits_enregistres++] = banque_temp;
}
}
A la place de feof, j'utiliserais char buffer[250]; while(fgets(buffer, sizeof buffer, f1) != NULL) ainsi tu liras tout jusqu'à la fin du fichier. Et à la place de fscanf(), sscanf(buffer, "%s %" ...", ...);
Ah, et en rejetant un oeil dans nouveau_credit(), une erreur classique :
tab_credit[credits_enregistres].nom=credit_temp.nom;
tab_credit[credits_enregistres].taux=credit_temp.taux;
tab_credit[credits_enregistres].type_credit=credit_temp.type_credit;
tab_credit[credits_enregistres].seuil_pena=credit_temp.seuil_pena;
Impossible. Il faut utiliser strcpy(). Par exemple : strcpy(tab_credit[credits_enregistres].nom,credit_temp.nom);
while (!feof(f1))
{
retour=fscanf(f1,"%s %s %s %c",banque_temp.nom,banque_temp.taux,banque_temp.type_credit,&banque_temp.seuil_pena);
if (retour !=EOF) {
tab_credit[credits_enregistres++] = banque_temp;
}
}
A la place de feof, j'utiliserais char buffer[250]; while(fgets(buffer, sizeof buffer, f1) != NULL) ainsi tu liras tout jusqu'à la fin du fichier. Et à la place de fscanf(), sscanf(buffer, "%s %" ...", ...);
Ah, et en rejetant un oeil dans nouveau_credit(), une erreur classique :
tab_credit[credits_enregistres].nom=credit_temp.nom;
tab_credit[credits_enregistres].taux=credit_temp.taux;
tab_credit[credits_enregistres].type_credit=credit_temp.type_credit;
tab_credit[credits_enregistres].seuil_pena=credit_temp.seuil_pena;
Impossible. Il faut utiliser strcpy(). Par exemple : strcpy(tab_credit[credits_enregistres].nom,credit_temp.nom);
Aj'galere
Messages postés
2
Date d'inscription
vendredi 3 mai 2013
Statut
Membre
Dernière intervention
4 mai 2013
4 mai 2013 à 00:50
4 mai 2013 à 00:50
Ah merci c'était bien ça! Trois jours que je suis bloqué la dessus... J'ai encore pas mal de lacune en C. Bonne soirée...