Středoškolská technika 2017 PROGRAM NA GENEROVÁNÍ PRVOČÍSEL

Podobné dokumenty
Algoritmizace a programování

C# konzole Podíl dvou čísel, podmínka IF

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Tabulková data. budeme pracovat s CSV soubory položky oddělené středníkem, např.

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Jazyk C# a platforma.net

Pro kontrolu správného formátu hodnoty N použijeme metodu try-catch.

Indexové seznamy. známe už pole, kde ale musí být předem známa velikost indexové seznamy umí růst dynamicky

Řídicí struktury. alg3 1

1. Téma 12 - Textové soubory a výjimky

Poslední nenulová číslice faktoriálu

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Jazyk C# (seminář 5)

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

Objekty jako zapozdření dat. začneme vytvářet vlastní objekty a třídy

C# konzole Program emoce

Úvod do programování - Java. Cvičení č.4

PŘETĚŽOVÁNÍ OPERÁTORŮ

Metodický list k didaktickému materiálu

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

5 Přehled operátorů, příkazy, přetypování

Paměť počítače. alg2 1

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

5 Rekurze a zásobník. Rekurzivní volání metody

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

KTE / ZPE Informační technologie

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Seminář z IVT Proměnné a operátory. Slovanské gymnázium Olomouc 11. září 2014 Tomáš Kühr

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Rozklad problému na podproblémy

Svobodná chebská škola, základní škola a gymnázium s.r.o. Dělitelnost Rozklad na součin prvočísel. Dušan Astaloš

Úvod do programovacích jazyků (Java)

Ošetřování chyb v programech

Zápis programu v jazyce C#

9. přednáška - třídy, objekty

Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)

Metodický list k didaktickému materiálu

Rozklad na prvočinitele. 3. prosince 2010

Moravské gymnázium Brno s.r.o.

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

5. přednáška - Rozklad problému na podproblémy

Algoritmizace a programování

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

Dělitelnost čísel, nejmenší společný násobek, největší společný dělitel

Prvočísla a čísla složená

Svobodná chebská škola, základní škola a gymnázium s.r.o. Dušan Astaloš. samostatná práce, případně skupinová práce. pochopení znaků vztahů mezi čísly

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.

VY_32_INOVACE_CTE_2.MA_04_Aritmetické operace v binární soustavě Střední odborná škola a Střední odborné učiliště, Dubno Ing.

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

Programování v jazyce JavaScript

NPRG031 Programování II --- 2/2 Z, Zk

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické

3 KTE / ZPE Informační technologie

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Datové struktury. alg12 1

Podmíněné vykonávání

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Algoritmy a datové struktury

Programování v C++ 1, 1. cvičení

Základy algoritmizace a programování

C# bez předchozích znalostí

Spojové struktury. Spojová struktura (linked structure):

5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina

Násobení pomocí sčítání

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Metodický list k didaktickému materiálu

Objektově orientované programování

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

URČITÝM ZPŮSOBEM PODOBNÉ

Operátory. Základy programování 1 Tomáš Kühr

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Základy algoritmizace. Hašování

KTE / ZPE Informační technologie

Základní pojmy. Matice(řádky, sloupce) Matice(4,6) sloupce

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Algoritmizace a programování

Vstupní požadavky, doporučení a metodické pokyny

Generické programování

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Přednáška 7. Celočíselná aritmetika. Návratový kód. Příkazy pro větvení výpočtu. Cykly. Předčasné ukončení cyklu.

NPRG031 Programování II 1 / :47:55

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

ÚVODNÍ ZNALOSTI. datové struktury. správnost programů. analýza algoritmů

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Transkript:

Středoškolská technika 2017 Setkání a prezentace prací středoškolských studentů na ČVUT PROGRAM NA GENEROVÁNÍ PRVOČÍSEL Vojtěch Pchálek Střední škola technická Kouřílkova 8, Přerov

ANOTACE Bratr, který studuje na gymnáziu, dělal na ročníkovém projektu, v němž hledal souvislosti mezi prvočísly a binární soustavou. Díky tomuto vznikl program, který pouze počítal prvočísla v řádu devíti nul, což je maximální rozsah 32 bitového čísla. Přesné číslo je: 2 147 483 647. Cílem vytvoření tohoto programu bylo předložit bratrovi již vyhledaná prvočísla, a to i v binární soustavě, s nimiž mohl dále pracovat.

Obsah Úvod... 4 Prvočíslo... 5 Rozklad na součin prvočinitelů... 5 Program... 5 Základní algoritmus... 5 Rozšířený algoritmus... 5 Verze programu... 6 Verze 1.0... 6 Verze 1.1... 6 Verze 1.2... 6 Verze 1.3... 6 Závěr... 8 Použitá literatura... 9 Použité obrázky... 10 Seznam příloh... 11

Úvod Program Prvočísla vznikl jako pomoc bratrovi při tvorbě jeho ročníkové práce. Je naprogramován v jazyce C#, ale jen jako konzolová aplikace. Zálkadní část programu tvoří algoritmus pro rozklad čísla na součin prvočísel. S tímto algoritmem se pak dále pracuje. Je rozřiřován o různé podmínky, další cykly atp. Tento projekt je rozdělen na dvě hlavní části: 1. Teorie použitého algoritmu 2. Pohled na vývoj program Na závěr zde také uvedu zdrojový kód program i s vysvětlivkami.

Prvočíslo Prvočíslo je celé kladné číslo, které se dá vydělit beze zbytku jen sebou samým nebo jedničkou. Většinou to bývá číslo liché. Jsou to také čísla, která nelze rozdělit na součin prvočinitelů. Prvočíslem nazýváme každé přirozené číslo, které má právě dva různé přirozené dělitele.[1] Rozklad na součin prvočinitelů Celé kladné číslo a vydělíme dělitelem b 2. Pokud je zbytek z roven 0, pokračujeme dělením, pokud ne, dělitele zvětšíme vždy o 1 a mezivýsledek znovu vydělíme zvětšeným dělitelem. Dělíme tak dlouho, dokud se číslo a nerovná 1. Program Základní algoritmus Celý základní algoritmus provádí operaci rozkladu na šoučin, a to tak, že máme definovány dvě lokální proměnné typu int: 1. Celé číslo: no 2. Dělitel: dělitel Program vejde do cyklu (while), v němž zjišťuje, zda je no > 1. V těle cyklu vyhodnocuje, zda se zbytek dělení (no/dělitel) rovná nule. Pokud ano, provede dělení. Pokud ne, zvětší dělitele o 1. Toto vyhodnocování se provádí v podmíněném příkazu (if-else). Rozšířený algoritmus Rozříření původního algoritmu spočívá v tom, že je zde přidána další proměnná typu bool a další proměnná typu int, a také další podmíněné příkazy (if-else). Tento podmíněný příkaz se vykoná v případě, že je zbytek dělení nulový a vyhodnocuje, zda je počet kroků dělení daného čísla menší než 1. Pokud ano, zapíše do proměnné typu bool hodnotu true. Pokud ne, zapíše do té samé proměnné hodnotu false. Poté pokračuje přičtením hodnoty 1 do proměnné typu int. Po vykonání cyklu while je zde další podmínka, která vyhodnocuje proměnnou typu bool. Pokud je pravdivá, znamená to, že dělitel je stejný jako původní číslo no (no/dělitel = 1) a program to oznámí. Dále je tento rozšířený algoritmus v těle cyklu for, kterým se provádí automatické generování čísel. Na kocni program zapíše výstup do tabulkového csv souboru a čeká na zavření.

Verze programu Verze 1.0 Program je závislý na uživatelském vstupu. Uživatel zadá celé kladné číslo a program jej pomocí základního algoritmu rozloží na součin prvočísel. Výstupem je sloupec dělitelů. Verze 1.1 Obr 1: Výstup program (Verze 1.0) Program je stále závislý na uživatelském vstupu. Program však už upozorní na to, zda je dané číslo prvočíslem, na základě rozšířeného algoritmu (pokud je počet kroků dělení roven jedné, je dané číslo prvočíslem). Pokud je zadané číslo prvočíslem, program to ohlásí, pokud ne, program nezobrazí žádný výstup. Verze 1.2 Program již nepotřebuje uživatelský vstup. Čísla jsou automaticky generována pomocí cyklu for, ale pouze do 1000. Dále program pokračuje zjišťováním prvočísel. Výstupem tedy jsou řádky prvočísel. Verze 1.3 Program počítá všechna prvočísla menší než maximální hodnota 32 bitové proměnné typu int (int.maxvalue = 2 147 483 647) a zobrazuje je i v binární soustavě. Algoritmus je rozšířen o zápis výsledků do seznamu. Po ukončení počítání program vypíše počet nalezených prvočísel a vytvoří CSV soubor (jednotlivé hodnoty jsou odděleny středníkem), do kterého zapíše výtah ze seznamu výsledků.

Obr 2: Výsledný program (Verze 1.3)

Závěr Program byl vyvinut docela pozdě, takže svůj přímý úděl nesplnil. Každopádně může posloužit nadšencům, kteří mají rádi prvočísla a chtějí je mít i v binární podobě. Nicméně jsem si vývojem tohoto programu ověřil, že dokáži zapsat i složitější algoritmy a danou problematiku vyřešit.

Použitá literatura [1.] VESELÝ, František. O dělitelnosti čísel celých. 1. Vydání. Praha: Mladá fronta, 1966. 120 stran.

Použité obrázky Obr. 1. Obr. 2. Archiv autora Archiv autora

Seznam příloh Příloha. 1. Zdrojový kód programu

Příloha 1. using System; using System.Collections.Generic; using System.IO; using System.Text; namespace Prvočísla class Program static void Main(string[] args) bool jeprvocislo = false; //Logická proměnná, která uchová informaci o tom, že bylo nalezeno prvočíslo int počet_kroků = 0; //Počet proběhnutých dělení int počet_čísel = 0; //Počet nalezených prvočísel string řádek = null; //Proměnná pro zápis jednotlivých řádků výstupu List<string> řádky = new List<string>(); //Seznam řádků, z nichž se bude později zapisovat do souboru /*Cyklus pro "generování" čísel do maximální hodnoty proměnné typu int: * Setrvej v cyklu tak dlouho, dokud nedosáhneš maximální hodnoty proměnné typu int*/ for (int inno = 0; inno < int.maxvalue; inno++) int no = inno; //Dělenec int dělitel = 2; //Dělitel while (no > 1) //Je zbytek dělení čísla dělitelem nulový? if (no % dělitel == 0) no /= dělitel; //Vydělení čísla dělitelem //Je počet provedených dělení menší než 1? if (počet_kroků < 1) jeprvocislo = true; //Dané číslo je prvočíslem else jeprvocislo = false; //Dané číslo není prvočíslem počet_kroků++; else

dělitel++; //Zbytek dělení není nulový, a tak zvětším dělitele o 1 počet_kroků = 0; //Vynulování čítače kroků dělení //Výstup if (jeprvocislo) Console.WriteLine("Prvočíslo: 0, binárně: 1", dělitel, Convert.ToString(dělitel, 2)); //Zápis výstupu do seznamu řádek = dělitel + ";" + Convert.ToString(dělitel, 2); řádky.add(řádek); //Počet nalezených čísel se zvětší o 1 počet_čísel++; //Nakonec je k výstupu přidán i údaj o počtu nalezených prvočísel Console.WriteLine("Počet prvočísel: 0", počet_čísel); //Zápis do souboru CSV // Vytvoření prázdného souboru "prvocisla.csv" StreamWriter soubor = new StreamWriter("prvocisla (" + počet_čísel.tostring() + ").csv", false, Encoding.Default); soubor.writeline("prvocislo;binarne"); //Hlavička souboru foreach (string line in řádky) soubor.writeline(line); //Postupné zapisování výsledných řádků do souboru soubor.close(); Console.WriteLine("Done"); //Zpráva o dokončení zápisu do souboru Console.ReadKey(); //Program čeká na stisknutí jakéhokoliv tlačítka