Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 05. 04. 2010 13:22 — Editoval RePRO (05. 04. 2010 13:23)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Struktura

Ahoj,

dejme tomu, že si vytvořím strukturu pro evidenci knihy. Dále si vytvořím asi nějaké pole struktur? Potřeboval bych tu alespoň nastínit, jak by vypadala funkce pro přidávání knih. Děkuji mnohokrát za nápady.

Programovací jazyk: C/C++


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

  • (téma jako vyřešené označil(a) byk7)

#2 05. 04. 2010 13:32

Pavel Brožek
Místo: Praha
Příspěvky: 5694
Škola: Informatika na MFF UK
Pozice: Student
Reputace:   194 
 

Re: Struktura

Asi bych si vytvořil nějakou třídu "Data", která bude spravovat data, nejjednodušeji asi formou spojového seznamu, pole asi nebude nejlepší řešení. Ale dejme tomu, že máš takovou třídu a v ní pole knih "pole" a "posledniZaznam" je index poslední přidané knihy v poli. Pak by metoda třídy "Data" mohla vypadat:

Code:

public void PridejKnihu(Kniha kniha)
{
this.posledniZaznam++;
this.pole[posledniZaznam] = kniha;
}

Ještě by to chtělo ošetřit, abys nepřekročil maximální velikost pole.

Offline

 

#3 05. 04. 2010 13:37

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

↑ BrozekP: Jasně, ale myslel jsem to řešit přes struktury, ne přes třídy. :-)


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#4 05. 04. 2010 13:42 — Editoval BrozekP (05. 04. 2010 13:44)

Pavel Brožek
Místo: Praha
Příspěvky: 5694
Škola: Informatika na MFF UK
Pozice: Student
Reputace:   194 
 

Re: Struktura

Tak pole a posledniZaznam budou globální proměnné, obejdeš se bez třídy Data. Tam je snad nějaký háček?

A ještě asi budu muset zařídit předávání ukazatele na knihu, místo knihy samotné, ale to by neměl být problém, ne?

Offline

 

#5 05. 04. 2010 13:55 — Editoval RePRO (05. 04. 2010 13:57)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

Dobře, zkusím něco sepsat: (napsal jsem to z fleku, takže syntaktická chyba tam může být)

Code:

typedef struct knihaStruktura        
{
    char    jmeno[11];        
    int    pocetStran;                
    float    cena;
}
a_kniha;

knihaStruktura knihy[20];
int pocitadlo = 0;

knihaStruktura * pridejKnihu(char * Xjmeno, int Xstrany, float Xcena)            
{
    knihaStruktura *A;                                    

    A = (knihaStruktura*)malloc( sizeof(knihaStruktura) );        
    strcpy(A->jmeno, Xjmeno);                    
    A->pocetStran = Xstrany;                                    
    A->cena = Xcena;
                                                
    return A;
}

knihy[pocitadlo++] = pridejKnihu("Pepa", 222, 250.8);

Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#6 05. 04. 2010 14:27

Pavel Brožek
Místo: Praha
Příspěvky: 5694
Škola: Informatika na MFF UK
Pozice: Student
Reputace:   194 
 

Re: Struktura

Nerozumím, jaký význam tam má "a_kniha", když to dál nikde nepoužiješ. Asi bych si strukturu nepojmenoval knihaStruktura, není to zbytečné? Podle mě by stačilo Kniha (s velkým k) a bude to přehlednější.

Code:

typedef struct Kniha
{
    char    jmeno[11];        
    int    pocetStran;                
    float    cena;
};

Kniha* knihy[20];
int pocitadlo = 0;

void pridejKnihu(char * Xjmeno, int Xstrany, float Xcena)
{
    Kniha *A;                                    

    A = (Kniha*)malloc( sizeof(Kniha) );        
    strcpy(A->jmeno, Xjmeno);
    A->pocetStran = Xstrany;                                    
    A->cena = Xcena;
    knihy[pocitadlo] = A;
    pocitadlo++;
}

pridejKnihu("Pepa", 222, 250.8);

Offline

 

#7 05. 04. 2010 16:03

septolet
Příspěvky: 334
Reputace:   
 

Re: Struktura

↑ RePRO: Kdyby jen syntaktická. To co si napsal je s prominutím hloupost. Asi by bylo vhodné, aby si pochopil pointery, bez nich je ti programování v C/C++ k ničemu.

Offline

 

#8 05. 04. 2010 18:30

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Struktura

↑ septolet: Prosím, zkus být konstruktivní nebo mlčet.


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#9 05. 04. 2010 19:12 — Editoval Kondr (05. 04. 2010 20:32)

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

↑ septolet:
Kondrův edit: takhle se u nás kriket nehraje!



Je tu někdo jiný (smířlivější), kdo by se mi podíval na mojí implementaci a poradil dodatečná řešení? Děkuji.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#10 05. 04. 2010 20:31

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Struktura

↑ RePRO: Když se koukneš na implementaci od Pavla, tak tam vidíš opravu těch dvou chyb -- knihy mají být pole pointerů na strukturu a pole charů se musí kopírovat přes "strcpy".


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#11 05. 04. 2010 20:37

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

↑ Kondr: Určitě. :-) To strcpy jsem si uvědomil, to tam myslím i mám. Pavel mi to hodil do Void tu funkci a vlastně mám v té funkci to pole, což mi nepřijde moc praktické. Na druhou stranu jsem to zkoušel zkompilovat a běželo to bez problémů. Trošku jsem to poupravil, a dokonce se mi povedlo to upravit tak, že ta funkce vrací ukazatel na tu strukturu, takže v pořádku.

Myslím si, že toto téma můžeme prohlásit za vyřešené a můžeš ho Kondře uzavřít, děkuji.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#12 05. 04. 2010 21:14

Kondr
Veterán
Místo: Linz, Österreich
Příspěvky: 4246
Škola: FI MU 2013
Pozice: Vývojář, JKU
Reputace:   38 
 

Re: Struktura

↑ RePRO: Zavírat téma není třeba, věřím, že další diskuse bude k věci.

Pokud jde o to, zda na pole "knihy" sahat v metodě nebo vně: to, co navrhuješ ty je konstruktor. Pokud se metoda jmenuje pridejKnihu, měla by někam přidávat knihu. Že ji přidává do globální proměnné není návrhově nejčistší, korektnější by bylo mít třídu Knihovna, která v sobě drží pole knih a počítadlo a má všechny potřebné metody na přidávání/odebírání. Tvorbou takové třídy ale akorát znovu objevíme kolo (resp. šablonu vector).


BRKOS - matematický korespondenční seminář pro střední školy

Offline

 

#13 05. 04. 2010 21:47

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

↑ Kondr: Plno lidí mi napsalo, že bych si s použitím třídy ušetřil mnoho práce.

Takhle jsem si vytvořil pole o 20 ukazatelích. Ale vlastně nevím, jak docílit toho (teď, když už to mám takto rozdělané), abych to naimplementoval nějak jinak, co by mi vlastně neurčovalo "přesný počet prvků", ale mohl bych tam vkládat neomezený počet prvků (na to se ale určitě hodí již zmiňovaný spojový seznam). Šlo by to nějak jinak z této pozice?


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#14 05. 04. 2010 22:22

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

A jinak bych se chtěl zeptat, jak byste řešili ukládání (asi do souboru)? Můj zdrojáč můžete náhlednout tady:

knihy.h:

Code:

typedef struct Kniha
{
    char   jmeno[11];        
    int    pocetStran;                
    float  cena;
} tKniha;

Kniha * pridejKnihu(char * Xjmeno, int Xstrany, float Xcena);
void tiskKnihy(Kniha * kniha);

knihovna.cpp:

Code:

#include "stdafx.h"
#include "stdlib.h"            
#include "string.h"
#include "stdio.h"
#include "knihy.h"

Kniha * pridejKnihu(char * Xjmeno, int Xstrany, float Xcena)
{
    Kniha *A;                                    

    A = (Kniha*)malloc( sizeof(Kniha) );        
    strcpy(A->jmeno, Xjmeno);
    A->pocetStran = Xstrany;                                    
    A->cena = Xcena;

    return A;
}

void tiskKnihy(Kniha * kniha)
{
    printf("Autor: %15s Pocet stran: %4d Cena: %7.2f\n", kniha->jmeno, kniha->pocetStran, kniha->cena);
    
}

main.cpp:

Code:

#include "stdafx.h"
#include "stdio.h"
#include "knihy.h"

using namespace System;

int main(void)
{
    int pocitadlo = 0;
    Kniha * knihy[20];

    knihy[0] = pridejKnihu("Alois Jiras", 250, 250.8);
    tiskKnihy(knihy[0]);

    knihy[1] = pridejKnihu("Bozena Nemcova", 145, 140.6);
    tiskKnihy(knihy[1]);
    
    getchar();
    return 0;
}

Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#15 05. 04. 2010 22:22

Pavel Brožek
Místo: Praha
Příspěvky: 5694
Škola: Informatika na MFF UK
Pozice: Student
Reputace:   194 
 

Re: Struktura

↑ RePRO:

Můžu se zeptat, proč tak trváš na tom, že nepoužiješ třídu?

Cokoliv (alespoň myslím, možná budou existovat výjimky) se dá přepsat bez použití tříd. Jen to není tak elegantní.

Když vytvoříš pole (v tomto případě ukazatelů), tak se naalokuje nějaká paměť. Pokud vím, tak tuto paměť němůžeš zvětšovat (tady možná nemám pravdu, tak mě prosím opravte). Pokud bys chtěl pole dynamicky zvětšovat, tak když bys přesáhl jeho velikost, musel bys vytvořit nové pole o větší velikosti, tam položky nakopírovat a zbavit se starého pole.

Přijde mi to ale jako nesmyslné řešení, když můžeš použít spojový seznam, který je na implementaci poměrně jednoduchý.

Offline

 

#16 05. 04. 2010 22:31

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

↑ BrozekP: Je to jeden projekt do školy, takže mám zakázáno používat třídy. Nechci to řešit, ale prostě to nechápu. Spojový seznam jde už v C++ řešit hodně elegantně, dokonce tam myslím na to existuje i komponenta.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#17 06. 04. 2010 01:17

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

↑ Kondr: Aha, dobrá poznámka, díky. Vůbec jsem si to neuvědomil, že mám naprosto špatně pojmenovanou funkci přidej. Nic nepřidává, ale pouze jaksi inicializuje do toho pole ty hodnoty.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#18 06. 04. 2010 09:51

plisna
Místo: Brno
Příspěvky: 1503
Reputace:   
 

Re: Struktura

↑ RePRO: pokud chces mit "knihovnu", ktera se bude "nafukovat" dle poctu ulozenych knih, tak lze pouzit pointer na pole pointeru, respektive pointer na pointer:

Code:

typedef struct KNIHA { udaje o knize ...};

KNIHA ** knihovna;

...

chce to ale dobre rozumnet ukazatelum. pokud mas zajem, tak to pripadne vice rozepisu. jinak pole lze zvetsovat pomoci funkce realloc(.), viz pavluv prispevek vyse, http://www.cplusplus.com/reference/clib … /realloc/.

Offline

 

#19 06. 04. 2010 12:03 — Editoval septolet (06. 04. 2010 12:04)

septolet
Příspěvky: 334
Reputace:   
 

Re: Struktura

Pokud máš funkci vracející pointer na a_kniha:

Code:

knihaStruktura * pridejKnihu(char * Xjmeno, int Xstrany, float Xcena)

poté toto pole:

Code:

knihaStruktura knihy[20];

tak do tohoto pole prostě nemůžeš přiřazovat onu návratovou hodnotu funkce pridejKnihu:

Code:

knihy[pocitadlo++] = pridejKnihu("Pepa", 222, 250.8);

Program v tomto případě ani nepřeložíš, protože právě špatně pracuješ s pointery.


Důvod proč jsem to nenapsal hned je jednoduchý. Myslím si, že pokud někdo přijde na svojí chybu sám, tak ho to posune daleko dál, než když mu to někdo donese na stříbrném podnose. Ale jak vidím, tak ne všichni jsou ochotni/schopni svojí chybu vůbec hledat, takže pak nic jiného než ten stříbrný podnos nezbývá. Myslím si, že trochu více samostatné práce by některým neuškodilo.

Normálně bych asi nereagoval, nicméně když se tu někdo, kdo o sobě prohlašuje, že umí programovat ptá na takovéto triviální věci a ještě v nich dělá základní chyby (navíc to není poprvé), tak mi to prostě nedá. Navíc nejsem první, kdo se na RePRa na tomto fóru ohladil, na tom také něco bude.

Omlouvám se, pokud jsem mými příspěvky nekoho pobouřil, mým jediným záměrem bylo donutit RePRO, aby se nad svým kódem lépe zamyslel.

Offline

 

#20 06. 04. 2010 12:59

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

↑ septolet: Ano, u toho pole má být hvězdička. Bude to 20 ukazatelů na strukturu.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#21 06. 04. 2010 13:15

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: Struktura

↑ plisna: Nedá se říct, že bych ukazatele nechápal. 

Code:

 KNIHA ** knihovna;

Toto chápu tak, že mám nějaký ukazatel, který ukazuje na to pole a potom další ukazatel, který ještě jakoby ukazuje na strukturu. (ukazatel na ukazatel)

Problematiku ukazatelů jsme brali někdy na střední škole, tak bych to snad vědět mohl. :-) Byl bych rád, kdyby si mi to více rozepsal. Aspoň budu zase o něco chytřejší. Zkus to nějak sbelhat s tím, co už mám hotové, díky.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#22 06. 04. 2010 18:56

plisna
Místo: Brno
Příspěvky: 1503
Reputace:   
 

Re: Struktura

↑ RePRO:

Toto chápu tak, že mám nějaký ukazatel, který ukazuje na to pole a potom další ukazatel, který ještě jakoby ukazuje na strukturu. (ukazatel na ukazatel)

muzes toto svoje tvrzeni rozepsat a upresnit? mam totiz pocit, ze uz radek KNIHA ** knihovna ti zrejme neni moc jasny. ona totiz problematika ukazatelu v c++ neni vubec trivialni vec, jak by se mohlo zpocatku zdat.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson