Zde

Transkript

Zde
Základy programování
Úloha: Eratosthenovo síto
Autor:
Datum:
Josef Hrabal
28.11.2009
Číslo:
Předmět:
HRA0031
ZAP
Obsah
1 Zadání úkolu:
1.1 Zadání: . . . . . . .
1.2 Neformální zápis: .
1.3 Příklad: . . . . . .
1.4 Tabulka: . . . . . .
1.5 Odkazy k projektu:
.
.
.
.
.
3
3
3
3
4
4
2 Uživatelské rozhraní
2.1 Program: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Výstupní soubor: . . . . . . . . . . . . . . . . . . . . . . . . .
5
5
7
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Zdrojový kód:
8
3.1 V jazyce C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3.2 Vývojový diagram: . . . . . . . . . . . . . . . . . . . . . . . . 10
4 Závěr
11
4.1 Seznam použitého software: . . . . . . . . . . . . . . . . . . . 11
4.2 Seznam zdrojů informací: . . . . . . . . . . . . . . . . . . . . . 11
2
1
Zadání úkolu:
1.1
Zadání:
Vaším úkolem je naprogramovat klasický algoritmus pro nalezení všech
prvočísel z daného intervalu. Tento algoritmus je znám od starověku a za
autora je pokládán matematik a filozof Eratosthénés z Kyrény. Princip algoritmu je velice jednoduchý spočívá v postupné eliminaci násobků čísel posloupnosti přirozených čísel tak, že nakonec v ní zůstanou jen prvočísla.
1.2
Neformální zápis:
1. Zapíšeme do posloupnosti všechna přirozená čísla od 2 do zvoleného n.
Čísla 0 a 1 nejsou považována za prvočísla.
2. První neoznačené číslo v posloupnosti je prvočíslo. Toto číslo si označíme.
3. Z posloupnosti vyškrtámev šechny jeho násobky.
4. Pokud je v posloupnosti nějaké neoznačené číslo, pokračuj bodem 2.
1.3
Příklad:
Pro n=20 je postup výpočtu zobrazen v tabulce. Z tabulky je dále vidět,
že Počínaje číslem 5 již nedojde k žádnému vyškrtávání násobků, protože
případné Násobky již byly vyloučeny jako násobky čísel nižších, například 15
bylo vyloučeno jako násobek čísla 3. Obecně nemusíme√odstraňovat násobky
čísel větších než odmocnina z n, v našem případě 5 > 2 20.
V programu můžeme reprezentovat posloupnost nejjednodušeji polem logických hodnot. Jednotlivá čísla v posloupnosti nereprezentují hodnoty prvků
v poli, ale indexy v tomto poli. Hodnota true pak znamená, že číslo odpovídající danému indexu je stále zařazeno v posloupnosti. Na hodnotu false
prvek nastavíme při jeho vyškrtnutí z posloupnosti. Dále pro zjednodušení
implementace se v poli ponechávají prvky s indexy 0 a 1, které označíme
ihned jako vyškrtnuté, false .
3
Další možností implementace posloupnosti je pole bitů. Jednotlivá čísla
jsou reprezentována bity. V případě, že pro uchování bitů použijeme typ int,
který má 32 bitů, budou čísla 0 až 31 uložena jako bity 0 až 31 prvního prvku
pole čísel typu int, čísla 32 až 63 bude uloženo jako bity 0 až 31 druhého prvku
pole čísel typu int a tak dále. Dojde tedy k osminásobnému snížení paměťových nároků.
1.4
Tabulka:
2
3
2
2
2
5
6
3
5
označíme číslo 2 a vyloučíme jeho násobky
7
9
11
13
15
17
19
3
5
označíme číslo 3 a vyloučíme jeho násobky
7
11
13
15
17
19
5
označíme číslo 5 a vyloučíme jeho násobky
7
11
13
17
19
5
označíme číslo 7 a vyloučíme jeho násobky
7
11
13
17
19
3
2
3
1.5
4
7
8
9
10 11 12 13 14 15 16 17 18 19 20
Odkazy k projektu:
• Webová prezentace k projektu: www.kilodelta.wz.cz/x-files
• Wikipedia: www.cs.wikipedia.org/wiki/Eratosthenovo síto
4
2
2.1
Uživatelské rozhraní
Program:
Uživatelské rozhrani je velmi jednoduché a intuitivní. Je napsáno kompletně v textovém režimu. Po spuštění se vás program zeptá, do kterého čísla
chcete, aby se prvočísla generovala. Platná volba je od 2 do 32767. Názorně
to lze vidět na obr.1.
obr.1
Po potvrzení volby se vypíšou vygenerované čísla oddělené čárkou. Po
výpisu se zobrazí celkový počet nalezených prvočísel a volba, jestli chcete
zapsat vygenerovaná prvočísla do souboru. Pokud ano zadáme Y(y), pokud
ne, stačí napsat jakékoliv jiné písmeno. Viz. obr.2.
5
obr.2
Pokud jste zvolili, že chcete výsledek zapsat do souboru, program se vás
zeptá na název souboru. Název souboru se musí zadat i s příponou. Název
souboru jde zadat i s cestou pro případ, že byste chtěli soubor uložit jinam,
než do složky s programem. Zadání názvu souboru jde vidět na obr.3.
obr.3
6
Nyní program ukončíte stisknutím jakékoliv klávesy.
obr.4
Webová prezentace k projektu je na adrese: www.kilodelta.wz.cz/x-files
2.2
Výstupní soubor:
Tady je ukázka výstupního souboru:
Eratosthenovo sito, generuje prvocisla od 2 do n. (c)Josef Hrabal 24.11.2009
Zvolene n=100
Prvocisla : 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,
53, 59, 61, 67, 71, 73, 79, 83, 89, 97,
Konec vypisu.
7
3
3.1
Zdrojový kód:
V jazyce C++
#include <iostream>;
#include <math.h>;
using namespace std;
int main()
{
double max=0;
//Proměnná pro načtění hodnoty do které se budou prvočísla generovat.
int next=2;
//Proměnná určující další nevyřazené prvočíslo v pořadí.
int num=0;
//Proměnná uchovává celkový počet nalezených prvočísel.
bool primenumber[32768]; //Pole proměnných typu boolean určuje zda je dané čislo prvočíslo.
cout « ”Eratosthenovo sito, generuje prvocisla od 2 do n. (c)Josef Hrabal 24.11.2009” « endl;
//V následujícím cyklu se načítá proměnná max, která určuje do jakého čísla se budou prvočísla generovat.
//Cyklus je použit z důvodu ošetření proti zadání chybné hodnoty. Přípustné hodnoty jsou čísla mezi 2 a 32767.
//Při zadání chybného čísla se cyklus opakuje a zároveň je vypsána chybová hláška.
do
{
cout « ”Do ktereho cisla ? (max 32767) : ”;
cin » max;
if ((max<2)||(max>32767))
{
cout « ”Zadane cislo je mimo rozsah!” « endl;
}
}
while ((max<2)||(max>32767));
//Zde celé pole nastavíme na true.
for (int i=2; i<=max; i++)
{
primenumber[i]=true;
}
//Nyní přichází na řadu vlastní algoritmus na vyhledání prvočísel.
//Pracuje na principu postupné eliminace všech násobků prvočísel,
//dokud následující prvočíslo není větší než odmocnina z čísla do kterého prvočísla hledáme.
while(next<=sqrt(max))
{
//Odstraníme všechny násobky prvočísla.
for (int i=(next*2); i<=max; i=i+next)
{
primenumber[i]=false;
}
int i=next;
//Nyní vyhledáme další nevyřazené prvočíslo v pořadí.
do
{
i++;
next=i;
}
8
while(primenumber[i]==false);
}
//Přichází na řadu výpis nalezených prvočísel. Zároveň zjistíme i jejich počet.
for (int i=2; i¡=max; i++)
{
if (primenumber[i]==true)
{
cout « i « ”, ”;
num++;
}
}
//Zde již vypíšeme počet prvočísel a zároveň se uživatele zeptáme, zda chce nalezená prvočísla zapsat do souboru.
cout « endl « ”Pocet prvocisel : ” « num « endl;
cout « ”Zapsat vysledek do souboru? (Y/n): ”;
char chr;
cin » chr;
//Pokud uživatel chce zapsat nalezená prvočísla pokračujeme v programu, jinak se následující část programu přeskočí.
if ((chr==’Y’)——(chr==’y’))
{
char soubor[255]; //Proměnná pro uložení názvu souboru, připadně i cesty k souboru.
cout « ”Zadejte nazev souboru i s priponou : ”;
cin » soubor;
FILE *fr;
//Otevřeme soubor pro zápis. Pokud soubor existuje, bude přepsán. Pokud neexistuje bude vytvořen.
//Následně do souboru zapíšeme všechna prvočísla v podobném stylu jako na obrazovku.
fr = fopen(soubor, ”wb”);
fprintf(fr, ”Eratosthenovo sito, generuje prvocisla od 2 do n. (c)Josef Hrabal 24.11.2009\n”);
fprintf(fr, ”Zvolene n=”);
fprintf(fr, ”%.0f”, max);
fprintf(fr, ”\nPrvocisla : ”);
for (int i=2; i¡=max; i++)
{
if (primenumber[i]==true)
{
fprintf(fr, ”%i”, i);
fprintf(fr, ”, ”);
num++;
if (num%15==0)//Rozdělení maximálně 15 čísel na řádek.
{
fprintf(fr, ”\n”);
}
}
}
fprintf(fr, ”\nKonec vypisu.”);
fclose(fr);//Uzavření souboru.
}
cin.get();
return 0; }
9
3.2
Vývojový diagram:
10
4
Závěr
4.1
Seznam použitého software:
• Microsoft Windows 7 Professional
• Microsoft Visual C++ 2008 Express Edition
• TeX Live! 2009
• PSPad version 4.5.4
• DiaCZE version 0.95-1
• Foxit Reader version 3.1.2.1013
• EasyPHP version 1.8.0.1
• Mozilla Firefox version 3.5.5
4.2
Seznam zdrojů informací:
• Webová prezentace k projektu: www.kilodelta.wz.cz/x-files
• Zadání projektu: www.cs.vsb.cz
• Ne příliš stučný úvod od systému LATEX2e: Tobias Oetiker
• Příručka LATEX: www.cstug.cz/latex/lm
• Wikipedia: www.cs.wikipedia.org
• Jak Psát Web: www.jakpsatweb.cz
11

Podobné dokumenty

3. Software

3. Software Sqrt -> vypočítá druhou odmocninu z čísla na obrazovce. 1 / x -> vypočítá převrácenou hodnotu zobrazeného čísla.

Více

U 581 Manuál - europecon, sro

U 581 Manuál - europecon, sro V případě, že nebyly nalezeny žádné chybové kódy zobrazí se „ NENALEZENY CHYBOVÉ KÓDY (“NO CODES ARE FOUND” ) ▲ Pokud se zobrazí chybová hlášení, veškeré informace uvidíte na displeji

Více

Úvod do Php Úvod do Php

Úvod do Php Úvod do Php – proměnné pouze použijeme, přetypování probíhá automaticky

Více

stáhnout soubor

stáhnout soubor VY_42_INOVACE_1ZLA20 Autor: Mgr. Alena Zlámalová Datum: 4. 5. 2012 Ročník: 6. Vzdělávací oblast: Matematika a její aplikace Vzdělávací obor: Matematika Tematický okruh: Číslo a proměnná Téma: Dělit...

Více

ZÁKLADY PROGRAMOVACÍHO JAZYKA TURBO PASCAL

ZÁKLADY PROGRAMOVACÍHO JAZYKA TURBO PASCAL Řádek {1} je jeho záhlaví. Určuje, že program se jmenuje Nasobeni. Řádek {2} obsahuje deklaraci konstanty a řádek {3} obsahuje deklaraci proměnné. Konstantu označujeme pi a proměnnou a. Konstanta b...

Více