Štruktúry (riešené príklady)
Š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:
- 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:
- 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“.
- 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“.
- 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).
- 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 }