Credo di aver terminato il programma.
#include <stdio.h>
#include <stdlib.h>
#define MAX 15
#define DATA 11
struct cliente
{
char nome[MAX];
char cognome[MAX];
char data[DATA];
};
enum Ordine
{Nome,Cognome, Data};
typedef enum Ordine Ordine;
int ReadFile(char* path,struct cliente* cl);
int WriteFile(char* path, struct cliente* cl, int len);
int Ordina(struct cliente* cl, int len,Ordine ordine);
int strcmp(char* str_a,char* str_b);
int strcmpdata(char* data1,char* data2);
int strlen(char* _source);
void strcpy(char* _Dest,char* _source);
int main(int argc, char * argv[])
{
struct cliente cl[MAX]={'\0'};
struct cliente *ord;
int len;
len = ReadFile("C:\\clienti.txt",cl);
Ordina(cl,len,Nome);
//Ordina(cl,len,Cognome);
//Ordina(cl,len,Data);
WriteFile("C:\\clientiordinati.txt",cl,len);
return 1;
}
////////////////////////////////////////////
//fileio
int ReadFile(char* path,struct cliente* cl)
{
FILE *fp;
int c,i=0;
fp = fopen(path,"r");
while((c=getc(fp))!=EOF)
{
ungetc(c,fp);
fscanf(fp,"%s\0",cl[i].nome);
fscanf(fp,"%s\0",cl[i].cognome);
fscanf(fp,"%s\0",cl[i++].data);
}
fclose(fp);
return i;
}
int WriteFile(char* path, struct cliente* cl, int len)
{
FILE *fp;
fp = fopen(path,"w");
for(int i=0;i<len;i++)
{
fprintf(fp,"%s ",cl[i].nome);
fprintf(fp,"%s ",cl[i].cognome);
fprintf(fp,"%s\n",cl[i].data);
}
fclose(fp);
return 1;
}
//////////////////////////////////////////////
//stringhe
int strlen(char* _source)
{
int i;
for(i=0;_source[i]!='\0';i++);
return i;
}
void strcpy(char* _Dest,char* _source)
{
for(int i=0;i<strlen(_source);i++)
_Dest[i]=_source[i];
}
int strcmp(char* str_a,char* str_b)
{
/*compara due stringhe, ritorna 0 nel caso le due stringhe
sono uguali ritorna 1 nel caso la prima stringa è alfabeticamente
minore della seconda, ritorna -1 altrimenti.*/
int i=0;
for(i=0;str_a[i]==str_b[i] && str_a[i]!='\0' && str_b[i]!='\0';i++);
if (str_a[i]==str_b[i])
return 0;
else if (str_a[i]<str_b[i])
return 1;//la prima stringa viene prima
else
return -1;//la seconda stringa viene dopo
}
int strcmpdata(char* data1,char* data2)
{
/*la funzione compara due date, ritorna 0 se le date sono uguali,1 se la prima data è
maggiore della seconda, 2 se la seconda data è maggiore della prima, -1 se il valore
di una delle due date è errato*/
int mese=0,anno=0,giorno=0,i=0;
giorno = atoi(data1);
if (giorno>31 || giorno<1) return -1;
mese =atoi(&data1[3]);
if (mese>12 || mese <1)return -1;
anno =atoi(&data1[6]);
if(anno==atoi(&data2[6]))
if(mese==atoi(&data2[3]))
if (giorno==atoi(data2))
return 0;
else if(giorno>atoi(data2))
return 1;
else
{
if (atoi(data2)>31 || atoi(data2)<1) return -1;
return 2;
}
else if (mese>atoi(&data2[3]))
return 1;
else {
if (atoi(&data2[3])>12 || atoi(&data2[3]) <1)return -1;
return 2;
}
else if (anno>atoi(&data2[6]))
return 1;
else
return 2;
}
///////////////////////////////////////////////////////
///ordinamento
void Scambio(struct cliente* _a,struct cliente* _b)
{
struct cliente tmp = *_b;
*_b = *_a;
*_a = tmp;
}
int Ordina(struct cliente* cl,int len,Ordine ordine)
{
/*la funzione ritorna una struttura avente gli elementi
della struttura passata in input ordinati per nome */
for(int i=0;i<len;i++)
for(int n=i+1, c;n<len;n++)
{
switch (ordine)
{
case Nome:
if(strcmp(cl[i].nome,cl[n].nome)==-1)
Scambio(&cl[n],&cl[i]);
break;
case Cognome:
if(strcmp(cl[i].cognome,cl[n].cognome)==-1)
Scambio(&cl[n],&cl[i]);
break;
case Data:
if(c=strcmpdata(cl[n].data,cl[i].data)==2)
{
Scambio(&cl[n],&cl[i]);
break;
}
else if(c==-1)
return -1;
}
}
return 1;
}
legge da file e salva nell'array di struttura cliente. Poi ordina con la funzione Ordina() che ha come parametri, il puntatore alla struttura cliente, la lunghezza e un enum, che indica il tipo di ordine. Acceta valori
Nome Cognome e Data, rispettivamente per ordinare la struttura per Nome, cognome e data.
Non conoscendo lo standard C89, ho creato le funzione per la gestione delle stringhe come la strcpy, strlen e la strcmp che compara due stringhe, mentre la strcmpdata compara due date.
strcmpdata:
int strcmpdata(char* data1,char* data2)
{
/*la funzione compara due date, ritorna 0 se le date sono uguali,1 se la prima data è
maggiore della seconda, 2 se la seconda data è maggiore della prima, -1 se il valore
di una delle due date è errato*/
int mese=0,anno=0,giorno=0,i=0;
giorno = atoi(data1);
if (giorno>31 || giorno<1) return -1;
mese =atoi(&data1[3]);
if (mese>12 || mese <1)return -1;
anno =atoi(&data1[6]);
if(anno==atoi(&data2[6]))
if(mese==atoi(&data2[3]))
if (giorno==atoi(data2))
return 0;
else if(giorno>atoi(data2))
return 1;
else
{
if (atoi(data2)>31 || atoi(data2)<1) return -1;
return 2;
}
else if (mese>atoi(&data2[3]))
return 1;
else {
if (atoi(&data2[3])>12 || atoi(&data2[3]) <1)return -1;
return 2;
}
else if (anno>atoi(&data2[6]))
return 1;
else
return 2;
}