sortowanie qsort w strukturach

0

Mam do napisania program spis płyt cd i dvd. Wszystko działa mam problem z posortowaniem alfabetycznie. Co jest nie tak? Co zmienić?

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>
#define BUFOR 100
struct katalog_CD
{
    char NAZWA[20];
    char WYKONAWCA[20];
    char SERIA[15];
}katc[30];

struct katalog_DVD
{
    char NAZWAD[20];
    char WYKONAWCAD[20];
    char SERIAD[15];
}katd[30];




char rodzaj[3]={'\0'};
int ro;
int r,p,i,j,dlugosc=0,dlugosc1=0;

FILE *plik;
char nazwa[20];


        void WyborSpisuCD()
{
int wybor1=0, dzialanie;

do
{
          printf("Podaj nazwe pliku do otworzenia na spis CD\n");
          scanf("%s",nazwa);
          printf("\n\nPodales nazwe pliku: %s\n",nazwa);
          printf("Chcesz otworzyc ten plik?\n");
          printf("\n1-tak\n2-nie (wpisz jeszcze raz)\n");
          printf("Jesli plik nie istnieje zostanie utworzony!\n");
          scanf("%d",&wybor1);
}
     while(wybor1!=1);
}

FILE *plik1;
char nazwa1[20];

    void WyborSpisuDVD()
{
int wybor2=0, dzialanie;

do
{
          printf("Podaj nazwe pliku do otworzenia na spis DVD\n");
          scanf("%s",nazwa);
          printf("\n\nPodales nazwe pliku: %s\n",nazwa1);
          printf("Chcesz otworzyc ten plik?\n");
          printf("\n1-tak\n2-nie (wpisz jeszcze raz)\n");
          printf("Jesli plik nie istnieje zostanie utworzony!\n");
          scanf("%d",&wybor2);
}
     while(wybor2!=1);
}




    void WyswietlCD()
{
     char *BuffFile;
     plik=fopen(nazwa,"a+");
     if((BuffFile=(char*)malloc(BUFOR))==NULL)
     {
          printf("Nie moge przydzielic pamieci!\n");
          exit(1);
     }
     fscanf(plik, "%d", &dlugosc);
     system("cls");
     for (i=0; i<dlugosc; i++)
     {
          fscanf(plik, "%s", &katc[i].NAZWA);
          fscanf(plik, "%s", &katc[i].WYKONAWCA);
          fscanf(plik, "%s", &katc[i].SERIA);
     }
        fclose(plik);
     for( i=0; i<dlugosc; i++)
     {
          printf("Dane CD%2d:\n\tNazwa: %s\n\tWykonawca %s \n\tSeria: %s\n",
                 i+1,katc[i].NAZWA,katc[i].WYKONAWCA,katc[i].SERIA);
     }

}



   void WyswietlDVD()
{
     char *BuffFile;
     plik1=fopen(nazwa1,"a+");
     if((BuffFile=(char*)malloc(BUFOR))==NULL)
     {
          printf("Nie moge przydzielic pamieci!\n");
          exit(1);
     }
     fscanf(plik1, "%d", &dlugosc1);
     system("cls");
     for (j=0; j<dlugosc1; j++)
     {
          fscanf(plik1, "%s", &katd[j].NAZWAD);
          fscanf(plik1, "%s", &katd[j].WYKONAWCAD);
          fscanf(plik1, "%s", &katd[j].SERIAD);
     }
        fclose(plik1);
     for( j=0; j<dlugosc1; j++)
     {
          printf("Dane DVD%2d:\n\tNazwa: %s\n\tWykonawca %s \n\tSeria: %s\n",
                 j+1,katd[j].NAZWAD,katd[j].WYKONAWCAD,katd[j].SERIAD);
     }

}


    void DodajPozycje()
{

printf("Jakiego formatu jest plyta ? (CD/DVD)\n");
scanf("%s",&rodzaj);

ro=strlen(rodzaj);


if(ro<3)
{
    printf("Podaj ile pozycji chcesz dodac: \n");
    scanf("%d",&r);
        for(i=0;i<r;i++)
    {
    printf("Podja nazwe plyty: \n");
    scanf("%s",&katc[dlugosc].NAZWA);

    printf("Podaj autora plyty: \n");
    scanf("%s,",katc[dlugosc].WYKONAWCA);

    printf("Podaj serie: \n");
    scanf("%s",&katc[dlugosc].SERIA);
    dlugosc=dlugosc+1;
    }

    plik =fopen(nazwa,"w");
     fprintf(plik, "%d\n", dlugosc);
     for(i=0; i<=dlugosc; i++)
{
    fprintf(plik, "%s %s %s\n",
            katc[i].NAZWA, katc[i].WYKONAWCA, katc[i].SERIA);
}
     fclose(plik);
     skok1:;


    printf("\n");
    printf("Spis plyt CD:\n\n");

        for(i=0;i<=dlugosc;i++)
{
    printf("Nazwa: %s \n Wykonawca: %s \n Seria: %s \n",
       katc[i].NAZWA,katc[i].WYKONAWCA,katc[i].SERIA);
}
}


else
{

    printf("Podaj ile pozycji chcesz dodac: \n");
    scanf("%d",&p);
        for(j=0;j<p;j++)
    {
    printf("Podja nazwe plyty: \n");
    scanf("%s",&katd[dlugosc1].NAZWAD);

    printf("Podaj autora plyty: \n");
    scanf("%s,",katd[dlugosc1].WYKONAWCAD);

    printf("Podaj serie: \n");
    scanf("%s",&katd[dlugosc1].SERIAD);
    dlugosc1=dlugosc1+1;
    }

    plik1=fopen(nazwa1,"w");
     fprintf(plik1, "%d\n", dlugosc1);
     for(j=0; j<=dlugosc1; j++)
{
    fprintf(plik1, "%s %s %s\n",
            katd[j].NAZWAD, katd[j].WYKONAWCAD, katd[j].SERIAD);
}
     fclose(plik1);
     skok2:;


    printf("\n");
    printf("Spis plyt DVD:\n\n");


        for(j=0;j<=dlugosc1;j++)
    {
    printf("Nazwa: %s \n Wykonawca: %s \n Seria: %s \n",
       katd[j].NAZWAD,katd[j].WYKONAWCAD,katd[j].SERIAD);
    }
}

}



        void EdytujPozycje()
{

int e;
char BuffFile;

printf("Jakiego formatu jest plyta ? (CD/DVD)\n");
scanf("%s",&rodzaj);

ro=strlen(rodzaj);


if(ro<3)
{
//EDYCJA CD
for( i=0; i<dlugosc; i++)
{
    printf("%2d: %s %s %s\n",
    i+1, katc[i].NAZWA, katc[i].WYKONAWCA, katc[i].SERIA);
}
printf("Podaj ktora pozycje chcesz edytowac \n");
scanf("%d",&e);
e=e-1;
    printf("Podj nowa nazwe plyty: \n");
    scanf("%s",&katc[e].NAZWA);

    printf("Podaj autora plyty: \n");
    scanf("%s,",katc[e].WYKONAWCA);

    printf("Podaj serie: \n");
    scanf("%s",&katc[e].SERIA);

    plik =fopen(nazwa,"w");
     fscanf(plik, "%d", &dlugosc);
     for(i=0;i<=e;i++)
     {
          fprintf(plik, "%s %s %s\n", katc[i].NAZWA, katc[i].WYKONAWCA, katc[i].SERIA);
     }
     fclose(plik);
     skok3:;

}
else
 {

int f;
char BuffFile;

//EDYCJA DVD
for( j=0; j<dlugosc; j++)
{
    printf("%2d: %s %s %s\n",
    j+1, katd[j].NAZWAD, katd[j].WYKONAWCAD, katd[j].SERIAD);
}
printf("Podaj ktora pozycje chcesz edytowac \n");
scanf("%d",&f);
f=f-1;

    printf("Podj nowa nazwe plyty: \n");
    scanf("%s",&katd[f].NAZWAD);

    printf("Podaj autora plyty: \n");
    scanf("%s,",katd[f].WYKONAWCAD);

    printf("Podaj serie: \n");
    scanf("%s",&katd[f].SERIAD);

    plik1 =fopen(nazwa1,"w");
     fscanf(plik1, "%d", &dlugosc1);
     for(j=0;j<=f;j++)
     {
          fprintf(plik1, "%s %s %s\n", katd[j].NAZWAD, katd[j].WYKONAWCAD, katd[j].SERIAD);
     }
     fclose(plik1);
     skok4:;


}
}



       void UsunPozycje()
{
     printf("Jakiego formatu jest plyta ? (CD/DVD)\n");
    scanf("%s",&rodzaj);

    ro=strlen(rodzaj);

    if(ro<3)

 {

     int u,x;
     usun:
     for( i=0; i<dlugosc; i++)
     {
          printf("%2d: %s %s %s\n",
                 i+1, katc[i].NAZWA, katc[i].WYKONAWCA, katc[i].SERIA);
     }
     printf("Ktora pozycje skasowac:");
     scanf("%d", &u);
     if(u>dlugosc)
     {
          printf("\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!Nie ma takiej pozycji !!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
          printf("Wybierz numer od 1 do %d:\n", dlugosc);
          goto usun;
     }
     printf("Pozycja %d: %s %s %s - zostanie usunieta\nCzy kontynuowac?(tak-1)",
             u, katc[u-1].NAZWA, katc[u-1].WYKONAWCA, katc[u-1].SERIA);
     scanf("%d", &x);

     if (x==1)
     {
          plik =fopen(nazwa,"w");
             fprintf(plik, "%d\n", dlugosc-1);
             for(i=0; i<dlugosc; i++)
          {
               if(i==u-1)
               {
                    printf("\nUSUNIETO\n");
                }
                else fprintf(plik, "%s %s %s\n",
                katc[i].NAZWA, katc[i].WYKONAWCA, katc[i].SERIA);
          }
            fclose(plik);
     }
     else printf("\nAnulowano usuwanie.\n");
 }

 else
 {
     int v,y;
     usun1:
     for( j=0; j<dlugosc1; j++)
     {
          printf("%2d: %s %s %s\n",
                 j+1, katd[j].NAZWAD, katd[j].WYKONAWCAD, katd[j].SERIAD);
     }
     printf("Ktora pozycje skasowac:");
     scanf("%d", &v);
     if(v>dlugosc1)
     {
          printf("\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n!!!Nie ma takiej pozycji !!!\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
          printf("Wybierz numer od 1 do %d:\n", dlugosc1);
          goto usun;
     }
     printf("Pozycja %d: %s %s %s - zostanie usunieta\nCzy kontynuowac?(tak-1)",
             v, katd[v-1].NAZWAD, katd[v-1].WYKONAWCAD, katd[v-1].SERIAD);
     scanf("%d", &y);

     if (y==1)
     {
          plik1 =fopen(nazwa1,"w");
             fprintf(plik1, "%d\n", dlugosc1-1);
             for(j=0; j<dlugosc1; j++)
          {
               if(j==v-1)
               {
                    printf("\nUSUNIETO\n");
                }
                else fprintf(plik1, "%s %s %s\n",
                katd[j].NAZWAD, katd[j].WYKONAWCAD, katd[j].SERIAD);
          }
            fclose(plik1);
     }
     else printf("\nAnulowano usuwanie.\n");
}
}



        void Sortuj()

{
int sortowanie;

printf("Według jakiego ktyterium chcesz sortowac? \n1.Nazwy \n2.Wykonawcy \n3.Serii? \nWybierz (1-3): ");

    void Naz()
{
int sortujNAZWA(const void *a, const void *b)
{
    const katc *el1 = a;
    const katc *el2 = b;
    if(el1->NAZWA<el2->NAZWA)
        return -1;
    else
        if(el1->NAZWA==el2->NAZWA)
        return 0;
    else
        return 1;

}
qsort(nazwa,30, sizeof(katc),sortuj_NAZWA)
printf("Dane posortowane\n");

}

    void Wykon()
{

}

    void Ser()
{

}



switch(sortowanie)
    {
    case 1:Naz();
    case 2:Wykon();
    case 3:Ser();
    }

}



int main()
{

printf("Program sluzy do katalogowania plyt CD i DVD \n\n");


WyborSpisuCD();
WyborSpisuDVD();
int dzialanie;
while (dzialanie!=0)
{
        printf("\n\nMenu uzytkownika. Wybierz dzialanie:\n");
         printf("\t1. Wyswietl spis CD\n");
         printf("\t2. Wyswietl spis DVD\n");
         printf("\t3. Dodaj pozycje do spisu CD/DVD\n");
         printf("\t4. Edytuj pozycje w spisie CD/DVD\n");
         printf("\t5. Usun pozycje ze spisu CD/DVD\n");
         printf("\t6. Sortowanie\n");
         printf("\t0. Wyjscie\n");
         scanf("%d",&dzialanie) ;

switch(dzialanie)
         {
             case 1:WyswietlCD(); break;
             case 2:WyswietlDVD(); break;
             case 3:DodajPozycje(); break;
             case 4:EdytujPozycje(); break;
             case 5:UsunPozycje(); break;
             case 6:Sortuj(); break;
             case 0:printf("Do zobaczenia!\n");break;
             default: printf("Wybrales nieistniejace dzialanie!\n"); break;
         }
}


    return 0;
}
 
0

ktoś cokolwiek?

0
  1. Zacznij od podstaw, ten projekt ewidentnie przerasta twoje możliwości.
  2. Zapoznaj się z pojęciem formatowanie kodu, bez tego nikt nie będzie chciał grzebać w tym twoim bigosie.
  3. Definicja funkcji wewnątrz innej funkcji o ile to nie lambda - zapomnij.
0

taki dostałem projekt do zrobienia i staram się jakoś go wykonać . Chodzi mi tylko o posortowanie struktur, reszta śmiga. Udało mi się coś takiego zrobić

struct katalog_CD
{
    char NAZWA[20];
    char WYKONAWCA[20];
    char SERIA[15];
}katc[30];
typedef struct katalog_CD kat;
 

i

void Naz()
{
int sortuj_NAZWA (const void * a, const void * b)
{

    const kat* el1=a;
    const kat* el2=b;

       return strcmp(el1->NAZWA,el2->NAZWA);
       return 0;

}
kat tablica_nazw[T];
qsort(tablica_nazw,T, sizeof(kat),sortuj_NAZWA);
printf("Dane posortowane\n");
 for(i=0;i<=dlugosc;i++)
{
    printf("Nazwa: %s \n Wykonawca: %s \n Seria: %s \n",
       katc[i].NAZWA,katc[i].WYKONAWCA,katc[i].SERIA);
}
 

Oczywiście T jest zdefiniowane. Zrobiłem tak , i powinno śmigać ale nic z tego

0

No to powiedz którego słowa nie rozumiesz w tym poście: http://4programmers.net/Forum/1097935

0

To twoim zdaniem mam zaczynać od nowa?

0

Nie, od przeczytania i ogarnięcia jakichś podstaw (właśnie to napisałem).
Po czym sam dojdziesz do wniosku że należy kod wywalić i zacząć od nowa (dokładnie jak to zrozumiałeś - tak a propos gratuluje dobrej intuicji).

0

Siedzę nad tym programem od paru dni , przed napisaniem programu starałem się ogarnąć trochę podstawy, nie ukrywam programowanie to dla mnie magia , ale niestety muszę zrobić ten projekt. Jeżeli chodzi o te struktury to zrobiłem identycznie jak nasz wykładowca na slajdzie, więc niby powinno śmigać,ale nie działa. Liczyłem ,że ktoś na forum pomoże mi zrobić z tego bigosu coś działającego.

0

Podałem ci już rozwiązanie twego problemu, skoro nie rozumiesz to wracaj do podstaw, lub zamów rozwiązanie w dziale Praca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1