// cours_15_02_2003.cpp : structures à composition variable / fichiers / pointeurs / tri


/*
                                COURS

  structures à composition variable
 ********************************************

*  Par definition ,c' est une structure avec deux paties:

  1-Une partie "statique"
  (exemple :les caracteristiques d un vehicule)
  1-Une partie "dynamique"
    
  Syntaxe en C statique:
  ----------------------
  struct cellule
  {int attribut1;
   float attribut2;
   char nom[25];

  Syntaxe en C dynamique:
  ----------------------
  uniom

  {int ch2;
  char ch2[30];
  float ch3;
  int  *ptr;
  }CD
  };
  
  on affecte l un ou l autre
  donc un "ou exclusive"

  syntaxe:
  cellule  cel1;

  exemple :
  cel1.CD.ch1=12


 *****************************************************************************************************
*   
 */

#include <stdafx.h>
#include <string.h>
#include <ctype.h>

	struct cel		 // cel : nom du type de cellule
	{ char nomVille[20];	
	  int nbHab;
	  
	  cel * voisin;	 //reference recursive, pointeur vers le voisin = NULL si par de voisin

	};
	struct cel  *tliste, *fliste;  // tete et fin de liste vers structure de type cel
	struct cel  *surf;			 // pointeur pour parcourir la liste


FILE  *PF;
char nom_fich[20];


 
/* 
	ouverture d'un fichier 
	 ********************************************************************************************
**/
void ouvrir_fichier ()
{	

	 
/* demander le nom du fichier à ouvrir  */
	printf("\n Donnez le nom du fichier à traiter :");
	scanf("%s",nom_fich);
	printf("\n fichier à ouvrir -> %s",nom_fich);

	 
/* tenter d'ouvrir le fichier et afficher un message d'erreur si erreur à l'ouverture  */
	PF=fopen(nom_fich,"r");
	if (PF==NULL) {printf("\n *** erreur ouverture %s",nom_fich) ;}
	else {printf("\n ok, fichier %s ouvert",nom_fich);};

};

 
/*
	lecture du fichier
	 ********************************************************************************************
**/
void lire_fichier(FILE  *ppf,char nom_fichier[20])
{ //on les met en local les variables car elles  sont utilisé que dans cette structure
	char nville[20];  //
	int nb;
	printf("\n Ouverture du fichier:%s   ",nom_fichier);	 
/* afficher son contenu sur l'ecran  */
	while (!feof(ppf))
	{
		


	 
/* lire selon un certain mode, une structure d'enregistrement  */
		fscanf(ppf,"%s %i",nville,&nb);
    	printf("\n ville:%s  Nombre d 'habitant :%i   ",nville,nb);

			if (fliste==NULL)  //creation de premiere cellule
			{tliste = new cel;
			strcpy (tliste ->nomVille,nville);
			tliste ->nbHab = nb;
			tliste ->voisin =NULL;
			fliste=tliste;}
			else
			{
				surf = new cel;
				strcpy (surf ->nomVille,nville);
			surf ->nbHab = nb;
			surf ->voisin =NULL;
            fliste ->voisin=surf;
			fliste=surf;};
	} 
/* fin du fichier  */

	fclose(ppf);

surf =tliste;
while(surf !=NULL)
{
	printf("\n ville:%s  Nombre d 'habitant :%i   ",surf ->nomVille,surf->nbHab);
	surf=surf->voisin;}

};




 
/*
	MAJUSCULE  §! ATTENTION ERREUR  **
*	 ********************************************************************************************
**/
char  * majuscule (char chaine[20])
{
	char temp_chaine[20];
	for (int i=0;i<(strlen(chaine));i++)
		{temp_chaine[i]=toupper(chaine[i]};
	strcopy(temp_chaine,   );
	return temp_chaine;
}


 
/*
	tri
	 ********************************************************************************************
**/
void trier_alpha()
{   int non_trie=1;
	char temp_ville[20];
	int temp_nbHab;
	struct cel  *surf1, *surf2;
	
	printf("\n tri");

	while (non_trie==1)
	{	surf1=tliste;
		non_trie=0;
		while(surf1->voisin!=NULL)
		{	surf2=surf1->voisin;
			printf("\n tri %s %s",surf1->nomVille,surf2->nomVille);

			 // COMPARAISON DES VALEURS DE NOM DE VILLE (en majuscule pour code ascii)
			if (strcmp(majuscule(surf1->nomVille),majuscule(surf2->nomVille))>0)
			{
				 //si 1 supérieur à 2 : permutation
				 //sv 1 dans temp
				strcpy(temp_ville,surf1->nomVille);
				temp_nbHab=surf1->nbHab;
				 // copie 2 dans 1
				strcpy(surf1->nomVille,surf2->nomVille);
				surf1->nbHab=surf2->nbHab;
				 // copie temp dans 2
				strcpy(surf2->nomVille,temp_ville);
				surf2->nbHab=temp_nbHab;

				 // on a effectué une permutation => il faudra encore parcourir la liste
				non_trie=1;
			};
			surf1=surf2;

		};
	};
};


 
/* 
	ouverture d'un fichier en sortie
	 ********************************************************************************************
**/
void ouvrir_fichier_en_ecriture ()
{	

	 
/* demander le nom du fichier à ouvrir  */
	printf("\n Donnez le nom du fichier à traiter :");
	scanf("%s",nom_fich);
	printf("\n fichier à ouvrir -> %s",nom_fich);

	 
/* tenter d'ouvrir le fichier et afficher un message d'erreur si erreur à l'ouverture  */
	PF=fopen(nom_fich,"w");
	if (PF==NULL) {printf("\n *** erreur ouverture %s",nom_fich) ;}
	else {printf("\n ok, fichier %s ouvert",nom_fich);};

};

 
/*
	sauvegarder la liste dans un fichier
	 ***********************************
**/
void sauvegarder_liste()
{	
		printf("\n sauv liste");

	if (tliste==NULL) 
		{printf("\n-- la liste est vide --");}
		else
		{
		 
/* ouvrir  */
		ouvrir_fichier_en_ecriture();

		surf=tliste;
		while (surf != NULL)
		{
			fprintf(PF,"%s %i\n",surf->nomVille,surf->nbHab);
			surf=surf->voisin;
		};  // fin while
	
		fclose(PF);
		};  // fin if


};


void main()
{
ouvrir_fichier ();
lire_fichier( PF, nom_fich);

trier_alpha();
sauvegarder_liste();


}