Vedel by prosim vas niekto zmenit tento program, aby na reprezentáciu zoznamu zákazníkov bolo použite DYNAMICKE pole smerníkov ???
Kód: Vybrať všetko
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct Zakaznik{
char *Meno;
char *Priezvisko;
char *ID;
char *Adresa;
char *Rok;
char *Tel;
char *Tovar;
int Cena;
}ZAKAZNIK;
#define MAX_POLOZIEK 500
#define STRUCT_SIZE sizeof(ZAKAZNIK)
ZAKAZNIK **Polozka;
int Pocet=0;
void UvolniPamat(void)
{ int i;
for(i=0;i<Pocet;i++){
free(Polozka[i]->Meno);
free(Polozka[i]->Priezvisko);
free(Polozka[i]->Adresa);
free(Polozka[i]->ID);
free(Polozka[i]->Tel);
free(Polozka[i]->Rok);
free(Polozka[i]->Tovar);
free(Polozka[i]);
}
free(Polozka);
Pocet = 0;
}
int Menu()
{ char akcia;
printf("\n\nZADANIE Z PROGRAMOVANIA\n\n");
printf(" 1. Pridaj zakaznika\n 2. Odober zakaznika\n 3. Usporiadaj podla ceny\n");
printf(" 4. Usporiadaj podla priezviska\n 5. Vypis zoznamu\n 6. Uloz do suboru\n");
printf(" 7. Nacitaj zo suboru\n 8. Ukonci program\n");
printf("\nZadaj cislo pozadovanej akcie: ");
do{
akcia = getchar();
}while(akcia > '8' || akcia < '1');
return (akcia);
}
char flushkbd(void)
{ char key;
do{}while((key = getchar()) == '\n');
return key;
}
char *fgetstr(FILE *fp)
{ char pom[1000], ch, *ret;
int i=0;
do{
ch = fgetc(fp);
pom[i] = ch;
i++;
}while(ch != '\n');
pom[i-1] = '\0';
ret = (char *)malloc(strlen(pom)+1);
strcpy(ret, pom);
return ret;
}
char *ReadStr()
{ char pom[1000]="", ch, *ret;
int index=1;
pom[0] = flushkbd();
do{
ch = getc(stdin);
if(ch != '\n') pom[index] = ch; else pom[index] = '\0';
index++;
}while(ch != '\n');
ret = (char *)malloc(strlen(pom)+1);
strcpy(ret, pom);
return ret;
}
void Pridaj()
{ char ch;
int len,i;
if(Pocet < MAX_POLOZIEK){
Polozka = (ZAKAZNIK **)realloc(Polozka, (Pocet+1)*8);
Polozka[Pocet] = (ZAKAZNIK *)malloc(STRUCT_SIZE);
printf("\nMeno: ");
Polozka[Pocet]->Meno = ReadStr();
printf("\nPriezvisko: ");
Polozka[Pocet]->Priezvisko = ReadStr();
printf("\nID Cislo: ");
Polozka[Pocet]->ID = ReadStr();
printf("\nAdresa: ");
Polozka[Pocet]->Adresa = ReadStr();
printf("\nTelefon: ");
Polozka[Pocet]->Tel = ReadStr();
printf("Rok posledneho odberu: ");
Polozka[Pocet]->Rok = ReadStr();
printf("\nNazov Tovaru: ");
Polozka[Pocet]->Tovar = ReadStr();
printf("\nCena: ");
scanf("%d", &Polozka[Pocet]->Cena);
Pocet++;
}
}
void Odober(int Index)
{ int i;
if(Index < Pocet){
free(Polozka[Index]->Meno);
free(Polozka[Index]->Priezvisko);
free(Polozka[Index]->Adresa);
free(Polozka[Index]->ID);
free(Polozka[Index]->Tel);
free(Polozka[Index]->Rok);
free(Polozka[Index]->Tovar);
free(Polozka[Index]);
for(i=Index;i<Pocet-1;i++) Polozka[i] = Polozka[i+1];
Pocet--;
Polozka = (ZAKAZNIK **)realloc(Polozka, Pocet*8);
}
}
void Uloz(const char *Nazov)
{ FILE *fp;
int i;
if((fp = fopen(Nazov,"w+")) != NULL){
fprintf(fp,"%d\n", Pocet);
for(i=0;i<Pocet;i++){
fprintf(fp,"%s\n%s\n%s\n%s\n%s\n%s\n%s\n%d\n", Polozka[i]->Meno, Polozka[i]->Priezvisko, Polozka[i]->Adresa,
Polozka[i]->ID, Polozka[i]->Tel,
Polozka[i]->Rok, Polozka[i]->Tovar,
Polozka[i]->Cena);
}
fclose(fp);
}
}
void Nacitaj(const char *Nazov)
{ FILE *fp;
char *pom;
int i;
if((fp = fopen(Nazov,"r")) != NULL){
Pocet = 0;
fscanf(fp,"%d\n", &Pocet);
Polozka = (ZAKAZNIK **)realloc(Polozka, Pocet*8);
for(i=0;i<Pocet;i++){
Polozka[i] = (ZAKAZNIK *)malloc(STRUCT_SIZE);
Polozka[i]->Meno = fgetstr(fp);
Polozka[i]->Priezvisko = fgetstr(fp);
Polozka[i]->ID = fgetstr(fp);
Polozka[i]->Adresa = fgetstr(fp);
Polozka[i]->Tel = fgetstr(fp);
Polozka[i]->Rok = fgetstr(fp);
Polozka[i]->Tovar = fgetstr(fp);
fscanf(fp,"%d\n", &Polozka[i]->Cena);
}
fclose(fp);
}
}
// podla = 1 (Priezv) 2 = (Cena)
void Tried(int podla)
{ int i,j,vymen=0;
ZAKAZNIK *Pom;
for(i=0;i<Pocet-1;i++){
for(j=0;j<Pocet-1;j++){
if(podla == 1){
if(strcmp(Polozka[j]->Priezvisko, Polozka[j+1]->Priezvisko) > 0) vymen = 1; else vymen = 0;
}else if(podla == 2){
if(Polozka[j]->Cena > Polozka[j+1]->Cena ) vymen = 1; else vymen = 0;
}
if(vymen){
Pom = Polozka[j];
Polozka[j] = Polozka[j+1];
Polozka[j+1] = Pom;
}
}
}
}
void Vypis(void)
{ int i;
for(i=0;i<Pocet;i++){
printf("--------------------------%3d -----------------------------", i+1);
printf("\nMeno zakaznika: %s %s", Polozka[i]->Meno, Polozka[i]->Priezvisko);
printf("\nIdentifikacne cislo: %s", Polozka[i]->ID);
printf("\nAdresa zakaznika: %s", Polozka[i]->Adresa);
printf("\nTelefon zakaznika: %s", Polozka[i]->Tel);
printf("\nRok posledneho odberu: %s", Polozka[i]->Rok);
printf("\nNazov tovaru: %s", Polozka[i]->Tovar);
printf("\nCena tovaru: %d\n", Polozka[i]->Cena);
if((i+1)%3 == 0){
printf("\n");
getchar();
}
}
printf("-----------------------------------------------------------\n");
printf("\n");
getchar();
}
int main(int argc, char *argv[])
{ char Volba, fname[500];
int idx;
while((Volba = Menu()) != '8'){
switch(Volba){
case '1': Pridaj();
break;
case '2': printf("\nZadaj index zakaznika: ");
scanf("%d", &idx);
Odober(idx-1);
break;
case '3': Tried(2);
break;
case '4': Tried(1);
break;
case '5': Vypis();
break;
case '6': printf("\nZadaj nazov suboru do ktoreho sa ma ulozt obsah zoznamu: ");
scanf("%s", &fname);
Uloz(fname);
break;
case '7': printf("\nZadaj nazov suboru z ktoreho sa ma nacitat obsah zoznamu: ");
scanf("%s", &fname);
Nacitaj(fname);
break;
}
}
UvolniPamat();
printf("\n");
return EXIT_SUCCESS;
}
DAKUJEM