Sekvenčné zisťovanie parity čísel
Vytvorte program, ktorý v danej postupnosti zistí počet a súčet všetkých párnych čísel a počet a súčet všetkých nepárnych čísel. Postupnosť čísel načítavajte sekvenčne a vkladanie ukončite vložením hodnoty nula.
Špecifikácia
VSTUP:
- vstupné premenné: a
- vstupná podmienka: a != 0
VÝSTUP:
- výstupné premenné: z, v, u, c, d, e
- výstupné podmienky:
a/ pre (a%2) != 0 : z = z + a
v = v * a
u = u + 1
b/ pre (a%2) = 0 : c = c + a
d = d * a
e = e + 1
Analýza
V tomto programe je podstatné vyselektovať z pomedzi platných vstupov, ktoré splnia vstupnú podmienku, párne a nepárne čísla. Toto som vyriešil veľmi jednoducho tým, že som vstupnú premennú celočíselne vydelil číslom 2 a zvyšok po tomto delení som porovnával s císlom 0. Keď je tento zvyšok po celočíselnom delení rovný číslu 0, tak je vstupné číslo párne a keď nie je rovný číslu 0, tak je vstupné číslo nepárne.
Ďalej sa už pracovalo pomerne jednoducho. Pre jednotlive druhy čísel som urobil ich súčet, súčin (samoiniciatívne) a celkový počet. Pri súčine som ale musel osetriť stav, keď ako prvé číslo zadáme 0.
Samozrejme som mohol zvoliť aj inú metódu výpočtu, ale táto sa mi javý ako najefektívnejšia. Tá druhá, o ktorej viem využíva na zistenie zvyšku po celočíselnom delení rozdiel deleného čísla deliteľom, až pokiaľ sa nepriblíži k číslu, ktoré je vlastne tento zvyšok. Ten rozpozná tak, ze nie je možné od neho odpočítať deliteľa bez toho, aby výsledné číslo bolo menšie ako je číslo 0. Ak je to 0, tak číslo je párne.
Ako príklad môžem uviesť 7 : 3 à 7 – 3 = 4, 4 – 3 = 1; 1 je zvyšok po celočíselnom delení čísla 7 číslom 3. Akonáhle je ako vstupné číslo 0, cyklus sa ukončí a vypíše aktuálny stav jednotlivých výstupných premenných.
Týmto sa ukončí aj celý beh programu.
Návrh
Pseudojazyk:
Začiatok
z := 0; u := 0; v := 0; a := 0; b := 0; c := 0; d := 0; e := 0;
vstup (a);
ak a != 0 potom
začiatok
pokiaľ a != 0 opakuj
začiatok
ak (a%2) != 0 potom
začiatok
ak v < 1 potom
v := 1;
z := z + a;
v := v * a;
u := u + 1;
koniec
inak
začiatok
ak d < 1 potom
d := 1;
c := c + a;
d := d * a;
e := e + 1;
koniec
vstup (a);
koniec
koniec
výstup (z, v, u, c, d, e)
Koniec
Zdrojový text programu
// Zadanie cislo: 1 & uloha cislo: 9
//___________________________________
//kniznice
#include
#include
void main(void)
//zaciatok tela programu
{
//deklaracia premennych
int z,u,v,a,b,c,d,e;
clrscr();
//nulovanie premennych (pre istotu)
z=0; a=0; v=0; u=0; c=0; d=0; e=0;
// nacitanie prveho vstupu
printf("zadaj cislo a");
1 scanf("%d", &a);
//testovanie na 0 zadanu ako prve cislo
if(a!=0)
{
//testovanie cyklu na nulu zadanu ako n+1 cislo :)
2 while(a!=0)
{
//podmienka so zvyskom po celociselnom deleni
3 if((a%2)!=0)
{
//testovanie premennej pre sucin nep. c.
4 if(v<1)
5 v=1;
// pocitadla vystupnych premennych
6 z=z+a;
7 v=v*a;
8 u=u+1;
}
else
//pre parne cisla ked sa zvysok = 0
{
9 if(d<1)
10 d=1;
11 c=c+a;
12 d=d*a;
13 e=e+1;
}
//nacitavanie vstupu v cykle (druhy az n-ty)
printf("zadaj cislo a");
14 scanf("%d", &a);
//koniec cyklu samo ak neplati podmienka
}
}
//konecny vypis vystupnych premennych
15 printf("n sucet neparnych=%dn sucin neparnych=%dn"
" pocet neparnych=%dn"
" sucet parnych=%dn sucin parnych=%dn"
" pocet parnych=%d",z,v,u,c,d,e);
getch();
Testovanie
TRASOVACIA TABUĽKA
Postupnosť čísel: 1,2,3,4,0
Krok a c d e u v z
1 1 0 0 0 0 0 0
2 1 0 0 0 0 0 0
3 1 0 0 0 0 0 0
4 1 0 0 0 0 0 0
5 1 0 0 0 0 1 0
6 1 0 0 0 0 1 1
7 1 0 0 0 0 1 1
8 1 0 0 0 1 1 1
14 2 0 0 0 1 1 1
2 2 0 0 0 1 1 1
3 2 0 0 0 1 1 1
9 2 0 0 0 1 1 1
10 2 0 1 0 1 1 1
11 2 2 1 0 1 1 1
12 2 2 2 0 1 1 1
13 2 2 2 1 1 1 1
14 3 2 2 1 1 1 1
2 3 2 2 1 1 1 1
3 3 2 2 1 1 1 1
4 3 2 2 1 1 1 1
6 3 2 2 1 1 1 4
7 3 2 2 1 1 3 4
8 3 2 2 1 2 3 4
14 4 2 2 1 2 3 4
2 4 2 2 1 2 3 4
3 4 2 2 1 2 3 4
9 4 2 2 1 2 3 4
11 4 6 2 1 2 3 4
12 4 6 8 1 2 3 4
13 4 6 8 2 2 3 4
14 0 6 8 2 2 3 4
2 0 6 8 2 2 3 4
15 0 6 8 2 2 3 4
Záver
Matematicky je takmer celý program rozanalyzovaný v časti Analýza. K pôvodnemu zadaniu som si ešte pridal výpočet súčinu párnych a nepárnych čísel, čo program mierne skompliovalo. Je ošetrený aj na vstup 0 ako prvého čísla. Program je funkčný len v kladných číslach, nakoľko som zistil, že Borland C nevie násobit záporné čísla.
|