Štruktúry (riešené príklady)

Z Kiwiki
Verzia z 20:56, 11. február 2010, ktorú vytvoril Juraj (diskusia | príspevky) (Vytvorená stránka „Kategória:Študijné materiály Kategória:Programovanie Kategória:Informatika {{Draft}} ==Štruktúra Zlomok== '''Úloha:''' Zostavte program, ktorý pomô…“)
(rozdiel) ← Staršia verzia | Aktuálna úprava (rozdiel) | Novšia verzia → (rozdiel)
Skočit na navigaci Skočit na vyhledávání
Imbox draft.png
Toto je projekt, na ktorom sa ešte stále pracuje!!

Aj keď sú v tomto dokumente použiteľné informácie, ešte nie je dokončený. Svoje návrhy môžete vyjadriť v diskusii o tejto stránke.

Štruktúra Zlomok

Úloha:

Zostavte program, ktorý pomôže pri práci so zlomkami – bude vedieť zlomok skrátiť a vypísať ho v čo najvhodnejšom tvare. Program načíta dva zlomky, každý hneď po načítaní upravene vypíše, ďalej vypíše ich súčin, súčet a podiel:

  1. Zostavte funkciu na načítanie zlomku z klávesnice a funkciu, ktorá vypíše zlomok na obrazovku v tvare „a/b“, napr. „3/4“. Postupne ju zdokonaľujte:
    1. V prípade, že zlomok má celú časť, vypíše ho v tvare „a b/c“, napr. namiesto „9/4“ bude písať „2 1/4“.
    2. V prípade, že jeho zvyšná časť je nulová, nebude ju vypisovať, napr. namiesto „6/2“ nebude písať „3 0/2“, ale iba „3“ a podobne, namiesto „0/2“ iba „0“.
  2. Vytvorte si pomocnú funkciu, ktorá zjednoduší (skráti) zlomok, napr. „36/48“ prevedie na „3/4“ a obohaťte ňou funkciu pre vypísanie zlomku (aby sa zlomok vypisoval už v zjednodušenom tvare).
  3. Zostavte funkcie, ktoré vypočítajú súčin, súčet a podiel dvoch zlomkov a použite ich v hlavnom programe.

Vzorový vstup:

5 4
1 1/4
6 8
3/4

Vzorový výstup:

sucin: 15/16
sucet: 2
podiel: 1 2/3

Cieľom je precvičiť si prácu so štruktúrou – bolo by vhodné ju v programe využiť. Funkcia na načítanie zlomku môže využiť referenciu alebo štruktúru ako návratovú hodnotu. Pre krátenie zlomku môžeme využiť referenciu a pre matematické operácie so zlomkami zase návratovú hodnotu.

Pre krátenie zlomku treba funkciu na najväčší spoločný deliteľ – použijeme Euklidov algoritmus postupného odpočítavania menšieho čísla od väčšieho a jeho zdokonalenie cez operáciu modulo. Pri matematických funkciách môžeme využiť akýsi „akoby konštruktor“ na vytvorenie zlomku, no nie je to nutné.

Možné riešenie:

 1 #include <iostream.h>
 2 #include <conio.h>
 3 struct TZlomok { int citatel, menovatel; };
 4 void CitajZlomok(TZlomok &z)
 5 {
 6    cin >> z.citatel;
 7    cin >> z.menovatel;
 8 }
 9 
10 int NSD(int a, int b)
11 {
12    while (b)
13    {
14       int c = a % b;
15       a = b;
16       b = c;
17    }
18    return a;
19 }
20 
21 void SkratZlomok(TZlomok &z)
22 {
23    int nsd = NSD(z.citatel, z.menovatel);
24    z.citatel /= nsd;
25    z.menovatel /= nsd;
26 }
27 
28 void VypisZlomok(TZlomok z)
29 {
30    SkratZlomok(z);
31    int cela_cast = z.citatel / z.menovatel;
32    if (cela_cast)
33    {
34       cout << cela_cast;
35       int zvysok = z.citatel % z.menovatel;
36       if (zvysok) cout << " " << zvysok << "/" << z.menovatel;
37    }
38    else
39    {
40       cout << z.citatel;
41       if (z.citatel) // ak je nula, napise len ju a nie napr. 0/1
42       cout << "/" << z.menovatel;
43    }
44    cout << endl;
45 }
46 
47 TZlomok Zlomok(int cit, int men)
48 {
49    TZlomok z;
50    z.citatel = cit;
51    z.menovatel = men;
52    SkratZlomok(z);
53    return z;
54 }
55 
56 TZlomok SucinZlomkov(TZlomok z1, TZlomok z2)
57 {
58    return Zlomok(z1.citatel * z2.citatel, z1.menovatel * z2.menovatel);
59 }
60 
61 TZlomok SucetZlomkov(TZlomok z1, TZlomok z2)
62 {
63    return Zlomok(z1.citatel * z2.menovatel + z2.citatel * z1.menovatel,
64    z1.menovatel * z2.menovatel);
65 }
66 
67 TZlomok PodielZlomkov(TZlomok z1, TZlomok z2)
68 {
69    return Zlomok(z1.citatel * z2.menovatel, z1.menovatel * z2.citatel);
70 }
71 
72 void main()
73 {
74    TZlomok z1, z2;
75    CitajZlomok(z1); VypisZlomok(z1);
76    CitajZlomok(z2); VypisZlomok(z2);
77    cout << "sucin: "; VypisZlomok(SucinZlomkov(z1, z2));
78    cout << "sucet: "; VypisZlomok(SucetZlomkov(z1, z2));
79    cout << "podiel: "; VypisZlomok(PodielZlomkov(z1, z2));
80    getch();
81 }

Zásobník - pamäť typu LIFO

implementácia zásobníka pri vyhodnocovaní postfixových zápisov