Obsah fóra
PravidláRegistrovaťPrihlásenie




Odpovedať na tému [ Príspevkov: 14 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.06.13
Prihlásený: 09.05.16
Príspevky: 8
Témy: 2
Príspevok NapísalOffline : 12.06.2013 14:17

Potrebujem vyriešiť problém s triedením v nasledujúcom programe, program síce triedi podľa ID ale podľa dátumu netriedy kde je chyba ?

Spoiler: zobraziť
Kód:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct Objednavka{
         char *ID;
         char *Datum;
         char *Adresa;
         char *Ulica_cislo;
         char *PSC_cislo;
         char *Krajina;
         char *Telefon;
         char *Nazov;
         int Cena;
        }OBJEDNAVKA;

#define MAX_POLOZIEK 500
#define STRUCT_SIZE  sizeof(OBJEDNAVKA)

OBJEDNAVKA **Polozka;
int Pocet=0;

void UvolniPamat(void)
{ int i;

 for(i=0;i<Pocet;i++){
  free(Polozka[i]->ID);
  free(Polozka[i]->Datum);
  free(Polozka[i]->Adresa);
  free(Polozka[i]->Ulica_cislo);
  free(Polozka[i]->PSC_cislo);
  free(Polozka[i]->Krajina);
  free(Polozka[i]->Telefon);
  free(Polozka[i]->Nazov);
  free(Polozka[i]);
 }
 free(Polozka);
 Pocet = 0;
}

int Menu()
{ char akcia;

    printf("\n\nZADANIE Z PROGRAMOVANIA\n\n");
    printf(" 1. Pridat objednavku\n 2. Zmazat objednavku\n 3. Usporiadat podla datumu\n");
    printf(" 4. Usporiadat podla ID\n 5. Vypis zoznamu\n 6. Ulozit do suboru\n");
    printf(" 7. Nacitat zo suboru\n 8. Ukoncit program\n");
     printf("\nZadajte 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 = (OBJEDNAVKA **)realloc(Polozka, (Pocet+1)*8);
   Polozka[Pocet] = (OBJEDNAVKA *)malloc(STRUCT_SIZE);
   printf("\nID Cislo: ");
   Polozka[Pocet]->ID = ReadStr();
   printf("\nDatum vystavenia: ");
   Polozka[Pocet]->Datum = ReadStr();
   printf("\nDodacia adresa: ");
   Polozka[Pocet]->Adresa = ReadStr();
   printf("\nUlica cislo: ");
   Polozka[Pocet]->Ulica_cislo = ReadStr();
   printf("\nPSC cislo: ");
   Polozka[Pocet]->PSC_cislo = ReadStr();
   printf("\nKrajina: ");
   Polozka[Pocet]->Krajina = ReadStr();
   printf("Telefon: ");
   Polozka[Pocet]->Telefon = ReadStr();
   printf("\nNazov objednavky: ");
   Polozka[Pocet]->Nazov = ReadStr();
   printf("\nCena: ");
   scanf("%d", &Polozka[Pocet]->Cena);
   Pocet++;
  }
}

void Odober(int Index)
{ int i;
 if(Index < Pocet){
  free(Polozka[Index]->ID);
  free(Polozka[Index]->Datum);
  free(Polozka[Index]->Adresa);
  free(Polozka[Index]->Ulica_cislo);
  free(Polozka[Index]->PSC_cislo);
  free(Polozka[Index]->Krajina);
  free(Polozka[Index]->Telefon);
  free(Polozka[Index]->Nazov);
  free(Polozka[Index]);
  for(i=Index;i<Pocet-1;i++) Polozka[i] = Polozka[i+1];
  Pocet--;
  Polozka = (OBJEDNAVKA **)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]->ID, Polozka[i]->Datum, Polozka[i]->Adresa,
                                           Polozka[i]->Ulica_cislo, Polozka[i]->PSC_cislo,
                                           Polozka[i]->Krajina, Polozka[i]->Telefon,Polozka[i]->Nazov,
                                           Polozka[i]->Cena);
  }
  fclose(fp);
 }
}

void Nacitaj(const char *Nazov)
{ FILE *fr;
  char *pom;
  int i;

 if((fr = fopen("abc.txt","r")) != NULL){
  Pocet = 0;
  fscanf(fr,"%d\n", &Pocet);
  Polozka = (OBJEDNAVKA **)realloc(Polozka, Pocet*8);
  for(i=0;i<Pocet;i++){
   Polozka[i] = (OBJEDNAVKA *)malloc(STRUCT_SIZE);
   Polozka[i]->ID = fgetstr(fr);
   Polozka[i]->Datum = fgetstr(fr);
   Polozka[i]->Adresa = fgetstr(fr);
   Polozka[i]->Ulica_cislo = fgetstr(fr);
   Polozka[i]->PSC_cislo = fgetstr(fr);
   Polozka[i]->Krajina = fgetstr(fr);
   Polozka[i]->Telefon = fgetstr(fr);
   Polozka[i]->Nazov = fgetstr(fr);
   fscanf(fr,"%d\n", &Polozka[i]->Cena);
  }
  fclose(fr);
 }
}

// podla = 1 (Datum)    2 = (Cena)
void Tried1(void)
{ int i,j;
  OBJEDNAVKA *pom;

  for(i=0;i<Pocet;i++){
   for(j=0;j<Pocet-1;j++){

    {
     if(strcmp(Polozka[j]->Datum, Polozka[j+1]->Datum) > 0)


    {
     pom = Polozka[j];
     Polozka[j] = Polozka[j+1];
     Polozka[j+1] = pom;
    }
   }
  }
  }
}

void Tried2(void)
{ int i,j;
  OBJEDNAVKA *Pom;

  for(i=0;i<Pocet;i++){
   for(j=0;j<Pocet-1;j++){

    {
     if(strcmp(Polozka[j]->ID, Polozka[j+1]->ID) > 0)

    {
     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("\nID objednavky:           %s", Polozka[i]->ID);
  printf("\nDatum vystavenia:        %s", Polozka[i]->Datum);
  printf("\nDodacia adresa:          %s", Polozka[i]->Adresa);
  printf("\nUlica cislo:             %s", Polozka[i]->Ulica_cislo);
  printf("\nPSC cislo:               %s", Polozka[i]->PSC_cislo);
  printf("\nKrajina:                 %s", Polozka[i]->Krajina);
  printf("\nTelefonne cislo:         %s", Polozka[i]->Telefon);
  printf("\nNazov objednavky:        %s", Polozka[i]->Nazov);
  printf("\nCena objednavky:           %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("\nZadajte index objednavky: ");
               scanf("%d", &idx);
               Odober(idx-1);
               break;
     case '3': Tried1();
               break;
     case '4': Tried2();
               break;
     case '5': Vypis();
               break;
     case '6': printf("\nZadajte nazov suboru do ktoreho sa ma ulozit obsah zoznamu: ");
               scanf("%s", &fname);
               Uloz(fname);
               break;
     case '7': printf("\nZadajte nazov suboru z ktoreho sa ma nacitat obsah zoznamu: ");
               scanf("%s", &fname);
               Nacitaj(fname);
               break;
    }
   }
    UvolniPamat();
    printf("\n");
    return EXIT_SUCCESS;
    }


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 12.06.2013 14:35

No perfekto, najprv zruš to farebné písmo a hneď potom sa nauč používať tag CODE, kto to má takto čítať.
No a potom sa z hlboka nadýchni a porozmýšĺaj, čo vlastne chceš. Že tu capneš celý program je pekné, ale 90% z neho funguje správne a iba zvyšok je chybný. Takže miesto tých milión riadkov zbytočného kódu vyber relevantný kus, pošli ho sem (do tagu CODE!) a popíš čo kde a ako robíš a čo nejde.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.06.13
Prihlásený: 09.05.16
Príspevky: 8
Témy: 2
Príspevok Napísal autor témyOffline : 12.06.2013 17:33

Konkrétne v tom programe nefunguje triedenie, podľa dátumu, keď sa pridá niekoľko objednáviek a chcem to zotriediť podľa dátumu, tak mi to netriedi, preto som hodil celý program aby ste to mohli lepšie pochopiť, ĎAKUJEM za pomoc.

Kód:

void Tried1(void)
{ int i,j;
  OBJEDNAVKA *pom;

  for(i=0;i<Pocet;i++){
   for(j=0;j<Pocet-1;j++){

    {
     if(strcmp(Polozka[j]->Datum, Polozka[j+1]->Datum) > 0)


    {
     pom = Polozka[j];
     Polozka[j] = Polozka[j+1];
     Polozka[j+1] = pom;
    }
   }
  }
  }
}

void Tried2(void)
{ int i,j;
  OBJEDNAVKA *Pom;

  for(i=0;i<Pocet;i++){
   for(j=0;j<Pocet-1;j++){

    {
     if(strcmp(Polozka[j]->ID, Polozka[j+1]->ID) > 0)

    {
     Pom = Polozka[j];
     Polozka[j] = Polozka[j+1];
     Polozka[j+1] = Pom;
    }
    }
   }
    }
}


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 12.06.2013 18:26

No vidíš, hneď sa na to lepšie pozerá :)

A čo znamená, že to netriedi? Triedi to zle, alebo sa nič nestane, alebo čo? Na prvý pohľad to vyzerá správne, tak neviem, čo tam hľadať.
(A oprav si, prosím, aj prvý príspevok, nech sa v tom dá orientovať)







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.06.13
Prihlásený: 09.05.16
Príspevky: 8
Témy: 2
Príspevok Napísal autor témyOffline : 12.06.2013 18:35

Problém je v tom že triedenie podľa dátumu nefunguje, Problém s triedením v programe
Usporiadanie podľa dátumu je nefunkčné


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 12.06.2013 18:41

Áha! :)

Ale áno, ono to zoradené je. Je to zoradené tak, ako to robíš - cez strcmp. Pozri sa na dátumy ako na reťazec a naozaj to ide od najmenšieho po najväčší (prvá je 1..., potom ide 20.3., potom 20.4. a potom šestka)
Ak by si dátum ukladal ako mesiac.deň.rok, tak by to šlo aj cez strcmp (Ale vo formáte 09.06.2013 pre šiesteho septembra)
Ak to chceš mať uložene takto, musíš vymyslieť iné porovnávanie, nie strcmp.

//edit: blbosť, ak by si to chcel cez strcmp, musel by si mať formát rok.mesiac.den aj s počiatočnými nulami.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.06.13
Prihlásený: 09.05.16
Príspevky: 8
Témy: 2
Príspevok Napísal autor témyOffline : 12.06.2013 18:51

To chápem to mi odporučili viacerí kamaráti ale či by si to vedel napísať alebo resp. prepísať v tom kóde aby to fungovalo toto usporiadavanie, proste aby to robilo správne a fungovalo.


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 12.06.2013 19:01

Keby si tam mal tie počiatočné nuly, dalo by sa to nejako ofejkovať.
Takto bude asi najjednoduchšie zobrať si funkciu sscanf, načítať si deň, mesiac a rok a tie porovnávať.
Nejako takto
Kód:
int porovnajDatumy( char * d1, char * d2) // vrati 1 ak d1 < d2, 0 ak d2 < d1 a -1 ak nie je dodrzany format
{
    int den1, mesiac1, rok1;
    int den2, mesiac2, rok2;
    if ( sscanf( d1, "%d.%d.%d", &den1, &mesiac1, &rok1) != 3 )
        return -1;

    if ( sscanf( d2, "%d.%d.%d", &den2, &mesiac2, &rok2) != 3 )
        return -1;

    if ( rok1 < rok2 )
       return 1;
    if ( rok2 < rok1 )
       return 0;
//roky sa rovnaju
    if ( mesiac1 < mesiac2 )
       return 1;
    if ( mesiac2 < mesiac1 )
       return 0;
//mesiace sa rovnaju
    if ( den1 < den2 )
       return 1;
    if ( den2 < den1 )
       return 0;
// datumy su rovnake, mozes a nemusis specialne osetrovat
    return 0;
}


Je to len tak z hlavy a nie som si úplne istý, čo som napísal, lebo som sa pred chvílou zobudil. Ale pointa je jasná. Vlastná funkcia na porovnávanie dátumov (tú použiješ miesto strcmp), funkcia sscanf a správne poradie porovnávania.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.06.13
Prihlásený: 09.05.16
Príspevky: 8
Témy: 2
Príspevok Napísal autor témyOffline : 12.06.2013 19:58

Prosím ťa mohol by si sa mi pozrieť na ten program, ja som tam tú tvoju funkciu skúšal umiestniť program spustilo ale to zoradovanie stále je s ním problém :(
http://www.ulozisko.sk/618881/Internetovy_obchod_program1.rar


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 12.06.2013 20:09

nevidím, že by si ju tam mal







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.06.13
Prihlásený: 09.05.16
Príspevky: 8
Témy: 2
Príspevok Napísal autor témyOffline : 12.06.2013 20:26

chcel som aby si tú tvoju funkciu tam umiestnil aby to fungovalo


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 12.06.2013 20:30

A ja chcem, aby si to skúsil sám :)







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 12.06.13
Prihlásený: 09.05.16
Príspevky: 8
Témy: 2
Príspevok Napísal autor témyOffline : 12.06.2013 20:49

no skusil som ale vyhadzuje mi chybu, prosím ťa pomôž už fakt som zúfalý

http://uloz.to/xAC7D6Tk/pokus2-rar


Offline

Skúsený užívateľ
Skúsený užívateľ
Obrázok užívateľa

Registrovaný: 17.07.11
Prihlásený: 29.12.20
Príspevky: 1516
Témy: 3
Príspevok NapísalOffline : 12.06.2013 21:20

Chápeš, čo som ja urobil? Ja som ti urobil funkciu na porovnávanie dátumov, nie funkciu na zoradenie prvkov. Tú si mal správne, len strcmp si mal nahradiť tou mojou.







_________________
Na súkromné správy týkajúce sa problémov, ktoré sa riešia vo fóre, neodpovedám!
Odpovedať na tému [ Príspevkov: 14 ] 


Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy. Problem s triedenim v Pascale

v Assembler, C, C++, Pascal, Java

3

405

02.04.2010 15:06

chrono Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Problém CPU v programe FL studio 10

v Intel - Integrated Electronics

2

575

27.06.2011 8:49

shiro Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. C++ a praca s triedenim struktur

v Assembler, C, C++, Pascal, Java

2

804

01.06.2008 17:39

capricorn7 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Založky v programe...

v Assembler, C, C++, Pascal, Java

1

367

01.10.2012 11:36

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Otvoriť v programe...

v Operačné systémy Microsoft

12

1523

24.05.2011 19:48

MARTINKO99 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. V akom programe??

v Webdesign

3

637

11.04.2008 0:08

shaggy Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Grafika v C++ programe

v Assembler, C, C++, Pascal, Java

26

2242

27.08.2010 6:34

reDo Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Pomoc v programe C

v Assembler, C, C++, Pascal, Java

5

548

09.05.2009 16:01

neutronmind Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. ornamenty v kresliacom programe

v Grafické programy

8

10236

23.08.2008 18:57

capricorn7 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. v akom programe(?) otvorit?

v Ovládače

2

568

02.11.2011 10:50

BlackDog600 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. V ktorom programe vytvoriť tablo

v Ostatné programy

2

546

13.02.2016 12:25

Miso122 Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Otvaranie suboru priamo v programe

v Delphi, Visual Basic

1

636

01.03.2009 17:06

Fico Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Excellovske tabulky vo vlastnom programe

v Delphi, Visual Basic

1

726

13.09.2009 11:20

mysacek Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Chyba v programe Pascal (Lazarus)

v Assembler, C, C++, Pascal, Java

5

485

12.11.2016 19:15

BX Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. Hanojske veze v programe C

v Assembler, C, C++, Pascal, Java

9

1745

25.12.2007 0:06

TrSek Zobrazenie posledných príspevkov

V tomto fóre nie sú ďalšie neprečítané témy. prehravanie zvuku v programe (delphi)

v Delphi, Visual Basic

3

568

09.11.2011 17:00

Fico Zobrazenie posledných príspevkov


Nemôžete zakladať nové témy v tomto fóre
Nemôžete odpovedať na témy v tomto fóre
Nemôžete upravovať svoje príspevky v tomto fóre
Nemôžete mazať svoje príspevky v tomto fóre

Skočiť na:  

Powered by phpBB Jarvis © 2005 - 2024 PCforum, webhosting by WebSupport, secured by GeoTrust, edited by JanoF
Ako väčšina webových stránok aj my používame cookies. Zotrvaním na webovej stránke súhlasíte, že ich môžeme používať.
Všeobecné podmienky, spracovanie osobných údajov a pravidlá fóra