Problème de programmation

darkmetalolo -  
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++.
A voir également:

16 réponses

HACKER 712 Messages postés 1463 Statut Contributeur 255
 
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 !
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Salut,
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
0
darkmetalolo Messages postés 25 Statut Membre 2
 
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.
0
HACKER 712 Messages postés 1463 Statut Contributeur 255
 
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 ?
0
darkmetalolo Messages postés 25 Statut Membre 2
 
J'ai essayé mais ça change rien.
0

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

Posez votre question
HACKER 712 Messages postés 1463 Statut Contributeur 255
 
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 ! )
0
HACKER 712 Messages postés 1463 Statut Contributeur 255
 
et nbrf il vaut combien ??? ( est-il global ? )

affiche ta fonction strcmp !
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
0
HACKER 712 Messages postés 1463 Statut Contributeur 255
 
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 !
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Merci.
T'es tombé sur l'ancienne partie du partie ^^ (3 ans).
Il y a plein de choses à revoir (des inexactitudes), mais pour le moment, grosse flemme :).
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Tu as aussi une erreur à la ligne 357 :
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
0
darkmetalolo Messages postés 25 Statut Membre 2
 
Merci ;)
0
darkmetalolo Messages postés 25 Statut Membre 2
 
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
0
darkmetalolo Messages postés 25 Statut Membre 2
 
Répondez-s'il vous plait j'ai jusqu'à lundi !
0
darkmetalolo Messages postés 25 Statut Membre 2
 
À l'aide
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
0
darkmetalolo Messages postés 25 Statut Membre 2
 
Voilà le programme :

#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 
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Salut,
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
0
darkmetalolo Messages postés 25 Statut Membre 2
 
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:

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]);
                       }
                   }
               }
          }
    }
}
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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 ;)
0