Problème de programmation
darkmetalolo
-
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis actuellement en première année de GEii et je dois réaliser un programme, seulement il me reste une dernière fonction que je n'arrive pas à faire fonctionner.
La voici.
http://imageshack.com/f/ei97247540rp4j
Et voilà le programme en entier : http://www.megaupload.com/fr/?d=2S9T4QG5
Si quelqu'un peut m'aider à me dire ce qu'il faut faire pour résoudre ce problème, merci d'avance.
Je travaille sous DEV C++.
Je suis actuellement en première année de GEii et je dois réaliser un programme, seulement il me reste une dernière fonction que je n'arrive pas à faire fonctionner.
La voici.
http://imageshack.com/f/ei97247540rp4j
Et voilà le programme en entier : http://www.megaupload.com/fr/?d=2S9T4QG5
Si quelqu'un peut m'aider à me dire ce qu'il faut faire pour résoudre ce problème, merci d'avance.
Je travaille sous DEV C++.
A voir également:
- Problème de programmation
- Application de programmation - Guide
- Télécharger le programme de pmu - Télécharger - Médias et Actualité
- Fermer un programme de force - Guide
- Programmation envoi sms - Guide
- Impossible de programmer télécommande came ✓ - Forum Téléviseurs
16 réponses
salut a toi !
deja, un conseil, travailles sous code block, il est mieux a mon gout !
apres, je crois que le "for" ( les "for" ! ) ne peuvent pas marcher car
for ( i = 0 ; )
et int i;
le i n'a pas de valeur !
mets int i = 0, j=0, k=0 ;
voila !
pour code bloks, tu pourras reduire les accolades que tu ne veux pas voir !
deja, un conseil, travailles sous code block, il est mieux a mon gout !
apres, je crois que le "for" ( les "for" ! ) ne peuvent pas marcher car
for ( i = 0 ; )
et int i;
le i n'a pas de valeur !
mets int i = 0, j=0, k=0 ;
voila !
pour code bloks, tu pourras reduire les accolades que tu ne veux pas voir !
Merci de m'avoir répondu aussi vite.
Pour les codes blocks, je sais qu'avec Geany sous Linux (Zenwalk, c'est ce que j'utilise) c'est possible. Seulement notre prof veut un .exe . Mais je pourrais très bien rédiger mon fichier source sur Linux.
J'ai essayé en donnant des valeurs à mes variables seulement, j'ai pas bien saisis ce que je dois faire avec les boucles for.
Pour les codes blocks, je sais qu'avec Geany sous Linux (Zenwalk, c'est ce que j'utilise) c'est possible. Seulement notre prof veut un .exe . Mais je pourrais très bien rédiger mon fichier source sur Linux.
J'ai essayé en donnant des valeurs à mes variables seulement, j'ai pas bien saisis ce que je dois faire avec les boucles for.
non !
tu les laisses, et tu met une valeur nulle a tes variables !
peut-etre que le pronleme vient du fait qu'elles ne sont pas globales ?
tu les laisses, et tu met une valeur nulle a tes variables !
peut-etre que le pronleme vient du fait qu'elles ne sont pas globales ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
alors as-tu verifié :
que la ou tu ecrit, c'est declaré en globale
que tu as un prototype de la fonction
que tu as bien inséré stdio.h et stdlib.h ( c'est la base ! )
que la ou tu ecrit, c'est declaré en globale
que tu as un prototype de la fonction
que tu as bien inséré stdio.h et stdlib.h ( c'est la base ! )
Je n'ai pas regardé ton programme en entier. Mais déjà dans ton main, il y a un point à revoir.
Tu fais nbrf=chargement(nom); et int rest_tri[nbrf]; Il peut y avoir un problème si ton compilateur n'est pas conforme à la norme C99. Dans ce cas, il vaut mieux utiliser :
#include <stdlib.h>
int *rest_tri;
if(rest_tri=malloc(nbrf*sizeof *rest_tri) ==NULL) exit(EXIT_FAILURE);
...
free(rest_tri);rest_tri=NULL;
...
Sinon pourrais-tu dire ce qui ne fonctionne pas ? T'arrives pas à afficher le titre des films ?
Cdlt
Tu fais nbrf=chargement(nom); et int rest_tri[nbrf]; Il peut y avoir un problème si ton compilateur n'est pas conforme à la norme C99. Dans ce cas, il vaut mieux utiliser :
#include <stdlib.h>
int *rest_tri;
if(rest_tri=malloc(nbrf*sizeof *rest_tri) ==NULL) exit(EXIT_FAILURE);
...
free(rest_tri);rest_tri=NULL;
...
Sinon pourrais-tu dire ce qui ne fonctionne pas ? T'arrives pas à afficher le titre des films ?
Cdlt
salut fiddy !
j'ai vu ton site il est pas mal !
si tu veux, tu peux parler des principales fontions pour tracer, etc et autre des hacker !
note bien qu'il y a aussi les lamers, des debutants dans le milieu pour tes decriptions des hackers !
j'ai vu ton site il est pas mal !
si tu veux, tu peux parler des principales fontions pour tracer, etc et autre des hacker !
note bien qu'il y a aussi les lamers, des debutants dans le milieu pour tes decriptions des hackers !
Tu as aussi une erreur à la ligne 357 :
film[i].acteur est un tableau à deux dimensions donc tu devrais plutôt utiliser strcmp(film[j].acteur[qqch entre 0 et 3],...)
Sinon quand tu compiles, tu devrais faire apparaître les avertissements car cette erreur est recensée.
Je te mets les autres :
N'oublie pas l'autre point mentionné dans mon précédent post (allocation dynamique, malloc).
Cdlt
val=strcmp(film[j].acteur,acteur_max);
film[i].acteur est un tableau à deux dimensions donc tu devrais plutôt utiliser strcmp(film[j].acteur[qqch entre 0 et 3],...)
Sinon quand tu compiles, tu devrais faire apparaître les avertissements car cette erreur est recensée.
Je te mets les autres :
films.c: In function «main": films.c:357: attention : passing argument 1 of «strcmp" from incompatible pointer type films.c:361: attention : passing argument 2 of «strcpy" from incompatible pointer type films.c:377: attention : format «%s" expects type «char *", but argument 4 has type «char (*)[35]"
N'oublie pas l'autre point mentionné dans mon précédent post (allocation dynamique, malloc).
Cdlt
Voilà le résultat :
https://imageshack.com/
Il affiche le noms des acteurs du deuxième film, alors que je souhaiterais obtenir une liste comme celle ci (au pire) :
RAGING BULL
Robert De Niro
TAXI DRIVER
Robert De Niro
LES AFFRANCHIS
Robert De Niro
https://imageshack.com/
Il affiche le noms des acteurs du deuxième film, alors que je souhaiterais obtenir une liste comme celle ci (au pire) :
RAGING BULL
Robert De Niro
TAXI DRIVER
Robert De Niro
LES AFFRANCHIS
Robert De Niro
Salut,
Poste sur le forum, en utilisant les balises "code" (à droite de souligner) ton programme entier avec les modifications apportées (celle de mon post 11). Mets également un exemple de ton fichiers.txt (pas en entier car j'imagine qu'il doit être énorme).
Cdlt
Poste sur le forum, en utilisant les balises "code" (à droite de souligner) ton programme entier avec les modifications apportées (celle de mon post 11). Mets également un exemple de ton fichiers.txt (pas en entier car j'imagine qu'il doit être énorme).
Cdlt
Voilà le programme :
Et voilà le fichier txt :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILMS_MAX 200
struct reference
{
int tri;
char titre[100];
char genre[50];
char realisateur[50];
char annee[8];
char pays[15];
char acteur[3][35];
} film[400];
int chargement(char nom[15])//Chargement de la liste de films
{
FILE *ptr;
int i;
char sentence[200];
char p; //ponctuation
ptr=fopen(nom,"rt");
if (ptr==NULL)
{
printf("Erreur a l'ouverture");
return 0;
}
else
{
i = 0;
do
{
fgets(sentence,200,ptr);
sscanf(sentence,"%[^-] %c %[^-] %c %[^-] %c %[^-] %c %[^-] %c %[^,] %c %[^,] %c %[^\n]",film[i].titre,&p,film[i].genre,&p,film[i].realisateur,&p,film[i].annee,&p,film[i].pays,&p,film[i].acteur[0],&p,film[i].acteur[1],&p,film[i].acteur[2]);
//printf("%s- %s- %s- %s- %s- %s, %s, %s \n \n",film[i].titre,film[i].genre,film[i].realisateur,film[i].annee,film[i].pays,film[i].acteur[0],film[i].acteur[1],film[i].acteur[2]);
film[i].tri=0;
i++;
fgets(sentence,200,ptr);
}
while(feof(ptr) == 0);
fclose(ptr);
return i;
}
}
int fdouble(int nbrf)//films en plusieurs exemplaires
{
int i,j,nbrfd=0;
printf("Ces films sont en plusieurs exemplaires:\n\n");
for (i = 0; i < nbrf ; i++)
{
for (j = i+1; j < nbrf; j++)
{
if (strcmp(film[i].titre,film[j].titre)==0)
{
printf("%s\n\n",film[i].titre);
nbrfd++;
}
}
}
return nbrfd;
}
int fdbc(int nbrf)//films a double casquette
{
int i,j,nbrfd=0;
printf("Voici les films a double casquette:\n\n");
for (i = 0; i < nbrf ; i++)
{
for (j = 0; j < 3 ; j++)
{
if (strcmp(film[i].realisateur,film[i].acteur[j])==0)
{
printf("%s\n%s\n\n",film[i].titre,film[i].realisateur);
nbrfd++;
}
}
}
return nbrfd;
}
void acttroif(int nbrf)//acteurs apparaissant dans plus de 3 films
{
int i=0,j=0,k=0,m=0;
printf("Voici les acteurs apparaissant dans plus de 3 films:\n\n");
for (i = 0 ; i < nbrf ; i++)
{
for (j = 0 ; j < 3 ; j++)
{
for (k = 0 ; k <3 ; k++)
{
for (m = 1 ; m < nbrf-1 ; m++)
{
if (strcmp(film[i].acteur[j],film[m].acteur[k])==0)
{
printf("%s\n%s\n\n",film[i].titre,film[i].acteur[j]);
}
}
}
}
}
}
int main(void)//programme principal
{
int nbrf;
int i,j,k,val,position=0;
char nom[15],titre_max[100],genre_max[100],realisateur_max[100],annee_max[100],pays_max[100],acteur_max[100];
printf("Bienvenue dans CINEFILM\n\nEntrez le nom du fichier s'il vous plait:");
scanf("%s",nom);
nbrf=chargement(nom);
int *res_tri[nbrf];
*res_tri=malloc(nbrf*sizeof(*res_tri));
if( res_tri == NULL)
{
exit(1);
}
FILE *tri;
tri=fopen("Tri.txt","wt");
//menu
printf("\n\nMENU PRINCIPAL\n\n");
printf("\nPour faire le point sur l'ensemble de votre collection: \t Tapez 0\n");
printf("\nPour trier vos films par ... \t Tapez 1 \n");
printf("\nPour ameliorer votre culture cinematographique \t Tapez 2\n");
printf("\n\nEntrez un autre nom de fichier \t Tapez 3\n");
printf("\nQuitter \t Tapez 4\n");
int c;
scanf("%d",&c);
switch (c)
{
//sous menu n°1
case 0: system("cls");
printf("Combien de films possedez-vous ? \t Tapez 0 \n");
printf("\nQuels sont les films en plusieurs exemplaires ? \t Tapez 1 \n");
printf("\n\nPour revenir au menu precedent \t Tapez 2 \n");
printf("\nQuitter \t Tapez 3\n");
scanf("%d",&c);
switch (c)
{
case 0: system("cls");
printf("Vous possedez %d film(s)\n\n",nbrf);
break;
case 1: system("cls");
fdouble(nbrf);
printf("\n");
break;
case 2: system("cls");
return main();
break;
case 3: return 1;
break;
default:printf("Pas de choix \n");
}
break;
//sous menu n°2
case 1: system("cls");
printf("Trier par titre \t Tapez 0 \n");
printf("Trier par genre \t Tapez 1 \n");
printf("Trier par realisateur \t Tapez 2 \n");
printf("Trier par annee \t Tapez 3 \n");
printf("Trier par pays \t\t Tapez 4 \n");
printf("Trier par acteurs \t Tapez 5 \n");
printf("\n\nPour revenir au menu precedent \t Tapez 6 \n");
printf("\nQuitter \t Tapez 7 \n");
scanf("%d",&c);
switch (c)
{
case 0: for (i = 0; i < nbrf; i++)
{
strcpy(titre_max,"");
for (j = 0; j < nbrf; j++)
{
val=strcmp(film[j].titre,titre_max);
if (val > 0 && film[j].tri == 0)
{
position = j;
strcpy(titre_max,film[j].titre);
}
}
film[position].tri=1;
*res_tri[i] = position;
}
if (tri==NULL)
{
printf("Erreur a l'ouverture");
}
else
{
for (i = nbrf-1; i >= 0 ; i--)
{
k=*res_tri[i];
fprintf(tri,"%s\n",film[k].titre);
}
}
fclose(tri);
break;
case 1:for (i = 0; i < nbrf; i++)
{
strcpy(genre_max,"");
for (j = 0; j < nbrf; j++)
{
val=strcmp(film[j].genre,genre_max);
if (val > 0 && film[j].tri == 0)
{
position = j;
strcpy(genre_max,film[j].genre);
}
}
film[position].tri=1;
*res_tri[i] = position;
}
if (tri==NULL)
{
printf("Erreur a l'ouverture");
}
else
{
for (i = nbrf-1; i >= 0 ; i--)
{
k=*res_tri[i];
fprintf(tri,"%s\n%s\n\n",film[k].titre,film[k].genre);
}
}
fclose(tri);
break;
case 2:for (i = 0; i < nbrf; i++)
{
strcpy(realisateur_max,"");
for (j = 0; j < nbrf; j++)
{
val=strcmp(film[j].realisateur,realisateur_max);
if (val > 0 && film[j].tri == 0)
{
position = j;
strcpy(realisateur_max,film[j].realisateur);
}
}
film[position].tri=1;
*res_tri[i] = position;
}
if (tri==NULL)
{
printf("Erreur a l'ouverture");
}
else
{
for (i = nbrf-1; i >= 0 ; i--)
{
k=*res_tri[i];
fprintf(tri,"%s\n%s\n\n",film[k].titre,film[k].realisateur);
}
}
fclose(tri);
break;
case 3:for (i = 0; i < nbrf; i++)
{
strcpy(annee_max,"");
for (j = 0; j < nbrf; j++)
{
val=strcmp(film[j].annee,annee_max);
if (val > 0 && film[j].tri == 0)
{
position = j;
strcpy(annee_max,film[j].annee);
}
}
film[position].tri=1;
*res_tri[i] = position;
}
if (tri==NULL)
{
printf("Erreur a l'ouverture");
}
else
{
for (i = nbrf-1; i >= 0 ; i--)
{
k=*res_tri[i];
fprintf(tri,"%s\n%s\n\n",film[k].titre,film[k].annee);
}
}
fclose(tri);
break;
case 4:for (i = 0; i < nbrf; i++)
{
strcpy(pays_max,"");
for (j = 0; j < nbrf; j++)
{
val=strcmp(film[j].pays,pays_max);
if (val > 0 && film[j].tri == 0)
{
position = j;
strcpy(pays_max,film[j].pays);
}
}
film[position].tri=1;
*res_tri[i] = position;
}
if (tri==NULL)
{
printf("Erreur a l'ouverture");
}
else
{
for (i = nbrf-1; i >= 0 ; i--)
{
k=*res_tri[i];
fprintf(tri,"%s\n%s\n\n",film[k].titre,film[k].pays);
}
}
fclose(tri);
break;
case 5:for (i = 0; i < nbrf; i++)
{
strcpy(acteur_max,"");
for (j = 0; j < nbrf; j++)
{
val=strcmp(film[j].acteur[0],acteur_max);
if (val > 0 && film[j].tri == 0)
{
position = j;
strcpy(acteur_max,film[j].acteur[0]);
}
}
film[position].tri=1;
*res_tri[i] = position;
}
if (tri==NULL)
{
printf("Erreur a l'ouverture");
}
else
{
for (i = nbrf-1; i >= 0 ; i--)
{
k=*res_tri[i];
fprintf(tri,"%s\n%s\n\n",film[k].titre,film[k].acteur);
}
}
fclose(tri);
break;
case 6: system("cls");
return main();
break;
case 7: return 1;
break;
default: printf("Pas de choix");
}
break;
//sous menu n°3
case 2: system("cls");
printf("Affichez les films dans lesquels les realisateurs\nont joue dans leur propre film \t Tapez 0\n\n");
printf("Les acteurs apparaissant dans plus de trois films \t Tapez 1\n");
printf("\n\nPour revenir au menu precedent \t Tapez 2 \n");
printf("\nQuitter \t Tapez 3\n");
scanf("%d",&c);
switch (c)
{
case 0: system("cls");
fdbc(nbrf);
break;
case 1: system("cls");
acttroif(nbrf);
break;
case 2: system("cls");
return main();
break;
case 3: return 1;
break;
default: printf("Pas de choix");
}
break;
case 3: system("cls");
return main();
break;
case 4: return 1;
break;
default:printf("Pas de choix \n");
}
free(*res_tri);
system("PAUSE");
return 0;
}
Et voilà le fichier txt :
RAGING BULL - Drame - Martin Scorsese - 1980 - USA - Cathy Moriarty , Joe Pesci , Robert De Niro TAXI DRIVER - Drame - Martin Scorsese - 1976 - USA - Jodie Foster , Robert De Niro LES AFFRANCHIS - Policier - Martin Scorsese - 1990 - USA - Joe Pesci , Ray Liotta , Robert De Niro
Salut,
Tu as une erreur à cette ligne. Même genre d'erreurs que celles signalées dans les posts précédents.
Sinon, quand tu compiles, tu devrais faire apparaître les Warnings et en tenir compte, ça aide beaucoup ;)
Cdlt
Tu as une erreur à cette ligne. Même genre d'erreurs que celles signalées dans les posts précédents.
fprintf(tri,"%s\n%s\n\n",film[k].titre,film[k].acteur...);
Sinon, quand tu compiles, tu devrais faire apparaître les Warnings et en tenir compte, ça aide beaucoup ;)
Cdlt
Merci de la remarque je l'avais pas vue à cette ligne ;)
Désolé mais aucun warning ne s'affiche quand je compile et pourtant d'habtude quand il y a des warnings je les vois hors là il y en a aucun.
Donc manque plus qu'à trouver le problème de cette fonction:
Désolé mais aucun warning ne s'affiche quand je compile et pourtant d'habtude quand il y a des warnings je les vois hors là il y en a aucun.
Donc manque plus qu'à trouver le problème de cette fonction:
void acttroif(int nbrf)//acteurs apparaissant dans plus de 3 films
{
int i=0,j=0,k=0,m=0;
printf("Voici les acteurs apparaissant dans plus de 3 films:\n\n");
for (i = 0 ; i < nbrf ; i++)
{
for (j = 0 ; j < 3 ; j++)
{
for (k = 0 ; k <3 ; k++)
{
for (m = 1 ; m < nbrf-1 ; m++)
{
if (strcmp(film[i].acteur[j],film[m].acteur[k])==0)
{
printf("%s\n%s\n\n",film[i].titre,film[i].acteur[j]);
}
}
}
}
}
}
Je ne vois pas d'erreurs dans cette fonction a priori. Peut-être dans les indices, mais comme je ne suis pas familier avec ton programme.
Ce que tu devrais faire, c'est augmenter la lisibilité de ton programme, et le commenter plus. Dans un devoir c'est noté aussi. Par exemple, tu pourrais alléger la fonction main() en utilisant plus de fonctions.
Et en plus, ça permet d'y voir plus clair. Tu peux aussi utiliser un debugger et suivre l'exécution du programme pour voir si ça fait bien ce que tu veux. Ou alors débugger avec des printf pour vérifier si les variables contiennent bien ce que tu veux. Par exemple, tu peux afficher les valeurs de ta structure pour vérifier si "chargement" fait bien son travail. Et continuer suivant cette idée, ça te permettra mieux de localiser l'erreur. Et là, si t'as un problème technique précis, n'hésite pas à le dire sur le forum ;)
Ce que tu devrais faire, c'est augmenter la lisibilité de ton programme, et le commenter plus. Dans un devoir c'est noté aussi. Par exemple, tu pourrais alléger la fonction main() en utilisant plus de fonctions.
Et en plus, ça permet d'y voir plus clair. Tu peux aussi utiliser un debugger et suivre l'exécution du programme pour voir si ça fait bien ce que tu veux. Ou alors débugger avec des printf pour vérifier si les variables contiennent bien ce que tu veux. Par exemple, tu peux afficher les valeurs de ta structure pour vérifier si "chargement" fait bien son travail. Et continuer suivant cette idée, ça te permettra mieux de localiser l'erreur. Et là, si t'as un problème technique précis, n'hésite pas à le dire sur le forum ;)
deja, un conseil, travailles sous code block, il est mieux a mon gout !
Oui, à ton goût, mais c'est pas le goût de tout le monde.
int i; for ( i = 0 ; ...) ne pose aucun problème. Pas besoin d'initialiser i à 9 lors de la déclaration pour le réaffecter à 0 dans le for.
Cdlt