Witam!
mam problem z moim programem…
dostalem takie zadanie:
zaimplementowac algorytm sortowania babelkowego struktur po roznych
kryteriach. zaimplementowac obsluge bledow. odczyt/zapis do pliku.
i kod wyglada jak narazie tak…
##include
#include
#include
#define WYPIS "wypis.txt" /* plik do ktorego prog przepisuje dane */
#define DATA_FILE "baza.txt" /* plik z danymi */
#define MAX_WPIS 100 /* maksymalna ilosc wpisów */
#define MAX_IMIE 20 /* maksymalne dlugosci */
#define MAX_NAZW 30 /* wpisów */
typedef struct
{
char imie[MAX_IMIE];
char nazwisko[MAX_NAZW];
int tel;
}Wpis;
typedef struct
{
Wpis baza_danych[MAX_WPIS];
int ilosc_wpisow;
}Baza_wpisow;
Baza_wpisow ksiazka_tel;
void czysc_pamiec(Baza_wpisow *baza)
{
int i;
for(i=0;i
{
memset(baza->baza_danych[i].imie,0,MAX_IMIE);
memset(baza->baza_danych[i].nazwisko,0,MAX_NAZW);
baza->baza_danych[i].tel=0;
}
baza->ilosc_wpisow=0;
}
/*int wiersze(char *filename)
{
FILE *fd = fopen(filename,"r");
int i, j=0;
char c;
for(i=0; (c=fgetc(fd))!=EOF;i++)
if(c=='\n')
j++;
fclose(fd);
printf("\nilosc wyrazow to %d, a ilosc linijek to %d\n", i, j);
if (i>0)
return j;
else
return 0;
}*/
int wczytaj_baze(char *filename)
{
FILE *fp = fopen(filename,"r");
int i/*, il_wierszy*/;
/*il_wierszy=wiersze(filename); */
/*printf("\nil wierszy = %d\n", il_wierszy); */
if(fp == NULL)
{
printf("\nnie ma pliku z danymi\n");
return 0;
}
for(i=0;i
{
if(fscanf(fp,"%s %s %d",ksiazka_tel.baza_danych[i].imie,ksiazka_tel.baza_danych[i].nazwisko, &ksiazka_tel.baza_danych[i].tel) == -1)
break;
}
ksiazka_tel.ilosc_wpisow = i;
if (ksiazka_tel.ilosc_wpisow == 0)
{
printf("\nbaza jest pusta\n");
return 0;
}
/*for(i=0;i<=ksiazka_tel.ilosc_wpisow;i++)
{
if (isdigit(&ksiazka_tel.baza_danych[i].tel) == 0)
{
printf("\nniepoprawna baza\n");
return 0;
}
else
{
printf("\npoprawna baza\n");
return 1;
}
}*/
fclose(fp);
return 1;
}
void Sortowanie(Baza_wpisow *strona,int x)
{
int zmiana;
int i,j;
Wpis rob;
for(i=0;iilosc_wpisow-1;i++)
{
zmiana=0;
for(j=0;j< strona->ilosc_wpisow-1-i ;j++)
{
if( x == 1 )
{
rob = strona->baza_danych[j];
strona->baza_danych[j] = strona->baza_danych[j+1];
strona->baza_danych[j+1] = rob;
zmiana=1;
}
}
if(zmiana == 0)
break;
}
}
int kryterium_numertel(Wpis pierwszy,Wpis drugi)
{
if(pierwszy.tel < drugi.tel)
return 1;
else
return 0;
}
void kryterium_nazwisko(Wpis pierwszy,Wpis drugi, int j)
{
Wpis rob;
/* printf ("\npierwszy %d %c drugi %d %c\n", pierwszy.imie[0] +'\0',pierwszy.imie[0], drugi.imie[0] +'\0', drugi.imie[0]); */
if (pierwszy.nazwisko[0] +'\0' < drugi.nazwisko[0] +'\0')
{
rob = ksiazka_tel.baza_danych[j];
ksiazka_tel.baza_danych[j] = ksiazka_tel.baza_danych[j+1];
ksiazka_tel.baza_danych[j+1] = rob;
/* printf ("\npierwszy po %d %c drugi po %d %c\n", pierwszy.imie[0] +'\0',pierwszy.imie[0], drugi.imie[0] +'\0',drugi.imie[0]); */
}
else if (pierwszy.nazwisko[0] +'\0' == drugi.nazwisko[0] +'\0')
if (pierwszy.nazwisko[1] +'\0' < drugi.nazwisko[1] +'\0')
{
rob = ksiazka_tel.baza_danych[j];
ksiazka_tel.baza_danych[j] = ksiazka_tel.baza_danych[j+1];
ksiazka_tel.baza_danych[j+1] = rob;
}
}
void kryterium_imie(Wpis pierwszy,Wpis drugi, int j)
{
Wpis rob;
/* printf ("\npierwszy %d %c drugi %d %c\n", pierwszy.imie[0] +'\0',pierwszy.imie[0], drugi.imie[0] +'\0', drugi.imie[0]); */
if (pierwszy.imie[0] +'\0' < drugi.imie[0] +'\0')
{
rob = ksiazka_tel.baza_danych[j];
ksiazka_tel.baza_danych[j] = ksiazka_tel.baza_danych[j+1];
ksiazka_tel.baza_danych[j+1] = rob;
/* printf ("\npierwszy po %d %c drugi po %d %c\n", pierwszy.imie[0] +'\0',pierwszy.imie[0], drugi.imie[0] +'\0',drugi.imie[0]); */
}
else if (pierwszy.imie[0] +'\0' == drugi.imie[0] +'\0')
if (pierwszy.imie[1] +'\0' < drugi.imie[1] +'\0')
{
rob = ksiazka_tel.baza_danych[j];
ksiazka_tel.baza_danych[j] = ksiazka_tel.baza_danych[j+1];
ksiazka_tel.baza_danych[j+1] = rob;
}
}
/*void sprawdzenie(void)
{
int i;
for(i=0;i
printf("%s %s %d",ksiazka_tel.baza_danych[i].imie,ksiazka_tel.baza_danych[i].nazwisko, ksiazka_tel.baza_danych[i].tel);
}*/
int zapisz_baze(char *filename)
{
int i;
FILE *fp = fopen(filename,"w");
if(fp == NULL)
{
printf("\nnie mozna otworzyc pliku do zapisu\n");
fp = fopen(filename,"a");
if(fp == NULL)
{
printf("\nnie mozna nic dopisac do pliku\n");
fp = fopen (filename, "r");
if ( fp != NULL)
printf("\nistnieje juz taki plik i jest tylko do odczytu\n");
return 0;
}
}
for(i=0;i
{
fprintf(fp,"\n%s %s %d\n",ksiazka_tel.baza_danych[ksiazka_tel.ilosc_wpisow-i-1].imie,ksiazka_tel.baza_danych[ksiazka_tel.ilosc_wpisow-i-1].nazwisko,ksiazka_tel.baza_danych[ksiazka_tel.ilosc_wpisow-i-1].tel);
}
fclose(fp);
return 1;
}
int main(int argc, char*argv[])
{
int i, x;
if (argc != 2)
{
printf("\nniepoprawna ilosc argumentow wywolania\n");
return 0;
}
czysc_pamiec(&ksiazka_tel);
if(!wczytaj_baze(DATA_FILE))
{
printf("\ntrzeba to chyba naprawic? ;)\n");
return 0;
}
switch (*argv[1])
{
case '1':
for(i=0;i<=ksiazka_tel.ilosc_wpisow;i++)
{
kryterium_imie(ksiazka_tel.baza_danych[i],ksiazka_tel.baza_danych[i+1], i);
/* Sortowanie(&ksiazka_tel, x); */
}
break;
case '2':
for(i=0;i<=ksiazka_tel.ilosc_wpisow;i++)
{
kryterium_nazwisko(ksiazka_tel.baza_danych[i],ksiazka_tel.baza_danych[i+1], i);
/* Sortowanie(&ksiazka_tel, x); */
}
break;
case '3':
for(i=0;i<=ksiazka_tel.ilosc_wpisow;i++)
{
x=kryterium_numertel(ksiazka_tel.baza_danych[i],ksiazka_tel.baza_danych[i+1]);
Sortowanie(&ksiazka_tel, x);
}
break;
default:
printf("\nargument wywolania jest niewlasciwy\nmozliwe argumenty to:\n");
printf("\n1 - dla sortowania po imieniu\n2 - po nazwisku\n3 - po numerze telefonu\n");
break;
}
zapisz_baze(WYPIS);
/*sprawdzenie(); */
return 1;
}
a wiec do rzeczy…
problem nr 1) caly czas nie wiem jak sprawdzic czy poprawnie sie wczytuje nr telefonu… (poczynilem nieudane proby z isdigit…)
problem nr 2) 198 E:\PW\prmy\pro3\prog2.c syntax error before “Baza_wpisow”
problem nr 3) E:\PW\prmy\pro3\prog2.c In function `Sortowanie’:
106 E:\PW\prmy\pro3\prog2.c incompatible types in assignment
czyli ze sie cos wykrzacza w samym sortowaniu babelkowym dla struktury rob;
z gory dzieki za pomoc!
pozdrawiam.
edit: z 3 chyba sobie poradzilem… ale jeszcze prosze sprawdzcie czy to ma sens ; )
edit: z 2 tez sobie poradzilem.
program dziala (caly czas pkt 1 jest aktualny…) jednak sortuje tylko dla malych ilosci wpisow… pojecia zielonego nie mam czemu… tak wiec ponawiam prosbe, niech ktos spojrzy na to i podpowie, projekt jest na jutro (poniedzialek) !