/*
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();
}