| | |
| Stránka: 1 z 1
| [ Príspevkov: 14 ] | |
Autor | Správa |
---|
Registrovaný: 12.06.13 Prihlásený: 09.05.16 Príspevky: 8 Témy: 2 |
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 ? 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; }
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 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! |
|
Registrovaný: 12.06.13 Prihlásený: 09.05.16 Príspevky: 8 Témy: 2 |
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; } } } } }
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 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! |
|
Registrovaný: 12.06.13 Prihlásený: 09.05.16 Príspevky: 8 Témy: 2 |
Problém je v tom že triedenie podľa dátumu nefunguje, Usporiadanie podľa dátumu je nefunkčné
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 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! |
|
Registrovaný: 12.06.13 Prihlásený: 09.05.16 Príspevky: 8 Témy: 2 |
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.
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 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! |
|
Registrovaný: 12.06.13 Prihlásený: 09.05.16 Príspevky: 8 Témy: 2 | |
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 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! |
|
Registrovaný: 12.06.13 Prihlásený: 09.05.16 Príspevky: 8 Témy: 2 |
chcel som aby si tú tvoju funkciu tam umiestnil aby to fungovalo
|
|
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 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! |
|
Registrovaný: 12.06.13 Prihlásený: 09.05.16 Príspevky: 8 Témy: 2 | |
Registrovaný: 17.07.11 Prihlásený: 29.12.20 Príspevky: 1516 Témy: 3 | Napísal BX: 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! |
|
| Stránka: 1 z 1
| [ Príspevkov: 14 ] | |
Podobné témy | Témy | Odpovede | Zobrazenia | Posledný príspevok |
---|
| Problem s triedenim v Pascale v Assembler, C, C++, Pascal, Java | 3 | 405 | 02.04.2010 15:06 chrono | | Problém CPU v programe FL studio 10 v Intel - Integrated Electronics | 2 | 575 | 27.06.2011 8:49 shiro | | C++ a praca s triedenim struktur v Assembler, C, C++, Pascal, Java | 2 | 804 | 01.06.2008 17:39 capricorn7 | | Založky v programe... v Assembler, C, C++, Pascal, Java | 1 | 367 | 01.10.2012 11:36 Fico | | Otvoriť v programe... v Operačné systémy Microsoft | 12 | 1523 | 24.05.2011 19:48 MARTINKO99 | | V akom programe?? v Webdesign | 3 | 637 | 11.04.2008 0:08 shaggy | | Grafika v C++ programe v Assembler, C, C++, Pascal, Java | 26 | 2242 | 27.08.2010 6:34 reDo | | Pomoc v programe C v Assembler, C, C++, Pascal, Java | 5 | 548 | 09.05.2009 16:01 neutronmind | | ornamenty v kresliacom programe v Grafické programy | 8 | 10236 | 23.08.2008 18:57 capricorn7 | | v akom programe(?) otvorit? v Ovládače | 2 | 568 | 02.11.2011 10:50 BlackDog600 | | V ktorom programe vytvoriť tablo v Ostatné programy | 2 | 546 | 13.02.2016 12:25 Miso122 | | Otvaranie suboru priamo v programe v Delphi, Visual Basic | 1 | 636 | 01.03.2009 17:06 Fico | | Excellovske tabulky vo vlastnom programe v Delphi, Visual Basic | 1 | 726 | 13.09.2009 11:20 mysacek | | Chyba v programe Pascal (Lazarus) v Assembler, C, C++, Pascal, Java | 5 | 485 | 12.11.2016 19:15 BX | | Hanojske veze v programe C v Assembler, C, C++, Pascal, Java | 9 | 1745 | 25.12.2007 0:06 TrSek | | prehravanie zvuku v programe (delphi) v Delphi, Visual Basic | 3 | 568 | 09.11.2011 17:00 Fico |
| 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
|
|