Algoritmy pro učitele matematiky
 
Jitka Laitochová, Zdeněk Halas 
Univerzita Palackého, Pedagogická fakulta, Katedra matematiky  
e-mail: jitka.laitochova@upol.cz 

Abstrakt 

V tomto článku ukážeme několik algoritmů zapsaných v programovacím jazyku C, které se dají použít při výuce nově koncipovaného povinně volitelného předmětu Algoritmizace. Tento předmět je určen studentům druhého semestru bakalářského studijního programu  B7507 „Specializace v pedagogice“ studijního oboru „Matematika se zaměřením na vzdělávání“ na Pedagogické fakultě Univerzity Palackého v Olomouci. 

1. Úvod 

Nově koncipovaný povinně volitelný předmět Algoritmizace by měl u studentů učitelství matematiky 2. stupně ZŠ rozvíjet algoritmické myšlení a zprostředkovat jim představu, jak vzniká a pracuje počítačový program. Jsou vybrány jednoduché algoritmy především z učiva matematiky základních, případně středních a vysokých škol a jsou implementovány v programovacím jazyce C. Úlohy k algoritmizaci jsou zaměřeny tak, aby byly přínosné pro budoucí učitele matematiky 2. stupně ZŠ.

2. Předmět Algoritmizace 

Při přechodu na dvojstupňový systém vysokoškolského studia dochází k výrazným změnám v obsahu a struktuře výuky. Předmět Algoritmizace je nově vytvářený předmět, který se dosud na fakultě nevyučoval. 
Je pravda, že koncem 80. a počátkem 90. let minulého století se studenti učitelství seznamovali se základy algoritmizace a učili se programovat v konkrétním programovacím jazyku (Basic na IQ151, později Pascal apod.), aby si mohli vytvářet svůj software, který by používali ve školách na prvních mikropočítačích. Později, když byl dostatek kvalitního softwaru, počítačová gramotnost se většinou zúžila na učení se návodů, jak který program používat.
Zařazením předmětu Algoritmizace do výše uvedeného studijního oboru se sleduje, aby se u budoucích učitelů matematiky pěstovalo algoritmické myšlení, aby studenti měli základní představu o tvorbě programů a také, aby si propojili určité znalosti z různých oblastí matematiky (algebra, matematická analýza, numerické metody) s nově získanými znalostmi o algoritmech a programování. 
V současné době vytváříme učební text k tomuto předmětu, jehož součástí bude CD, na kterém budou zdrojové kódy v C všech úloh řešených v semináři.

3. Obsah předmětu

Předmět Algoritmizace je vyučován formou semináře, a to dvě hodiny týdně v jednom semestru. Výuka probíhá v počítačové učebně.
Úvod semináře je věnován seznámení studentů se základními pojmy jako formální problém a algoritmus, dále s druhy akcí, které se vyskytují v algoritmech při zpracování na počítači, tj. přiřazení, větvení algoritmu, cyklus. Potom bude následovat 12 tématicky zaměřených seminářů. 
V každém jednotlivém tématu bude vždy zadán problém, kterým se budeme zabývat, k němu bude uvedeno ukázkové řešení pomocí algoritmu zapsaném v jazyku C. Budou zde uvedeny také vysvětlující poznámky týkající se příkazů jazyka. Není totiž cílem tohoto předmětu naučit se programovat v uvedeném programovacím jazyku, jen pochopit, jakým způsobem se programy vytvářejí a zapisují.

Primárně jsme se zaměřili na algoritmy ilustrující učivo základní školy a zpracováváme například následující témata:
•	výpis tabulky 
o	druhých a třetích mocnin přirozených čísel 
o	převrácených hodnot na 50 míst – sledování periody
•	tvorba programů pro tvorbu typových úloh
o	kvadratická rovnice – zadají se kořeny a do souboru se tiskne zadání i s řešením ve zvolené úpravě
o	lineární rovnice a rovnice s neznámou ve jmenovateli
o	generování pythagorejských trojic
•	dělitelnost
o	najít všechny dělitele zadaného čísla
o	určování nejmenšího společného násobku, největšího společného dělitele
o	rozhodování, zda je zadané číslo prvočíslo
o	rozklad čísla na součin prvočísel
o	Je dané číslo A beze zbytku dělitelné číslem B?
o	najít číslo, které lze dělit zároveň 5 a 8 a … 
•	písemné dělení 
•	geometrické úlohy
o	Kdy je trojúhelník pravoúhlý?
o	Lze daný trojúhelník sestrojit?
o	Kolikrát se změní objem (obvod, obsah), zvětšíme-li hranu krychle (čtverce,…) 
o	Jak se změní váha dřevěného hranolu o daných rozměrech, je-li vyroben z buku, dubu, smrku,… (závislost hmotnosti na hustotě látky)
•	faktoriál [dvojitý cyklus]
•	obsah kruhu 
•	odmocniny (posloupnosti zadané rekurentně)
•	kořeny nelineárních rovnic: metoda půlení intervalu 

Vytvářený učební text bude doplněn určitými teoretickými poznatky jako např. vhodnými numerickými metodami řešení problému. 
V každém tématu semináře budou uvedeny úlohy k samostatnému řešení, které bezprostředně navazují na uvedený algoritmus. 

4. Zápis algoritmů 

Vhodné vybrané algoritmy z výše uvedených oblastí jsou zapisovány v programovacím jazyku C++. Při kompilaci bude používáno Dev-C++ 5.0 beta 9.2 (4.9.9.2) (9.0 MB) with Mingw/GCC , GNU GENERAL PUBLIC LICENCE C++, které lze zdarma distribuovat a kopírovat (www. bloodshed.net). Studenti tedy budou mít možnost kdykoli bezplatně tento kompilátor použít i při samostatném studiu a případně ve své budoucí praxi. Použití tohoto kompilátoru je velmi jednoduché. 
Zdůrazněme ještě, že cílem předmětu Algoritmizace není vychovat odborníky na programovací jazyk C++, a že cílem vznikajícího učebního textu není popis jazyka C. Nebude ani učebnicí programování v C (viz (1), (2), (3) a (5)). Chce být spíše malou ukázkou toho, jak se programy píší a ukázat na možnosti využití programování v práci učitele ZŠ. 

5.	Příklady
Pro ilustraci uvedeme tři úvodní jednoduché algoritmy zapsané v C, které studenty mají seznámit s tím, jak vypadá zápis algoritmu v uvedeném jazyce. Tyto zápisy jsou pro snadnější pochopení doplněny komentáři, které vysvětlují význam jednotlivých příkazů.
Dále jsou uvedeny dva algoritmy pro výpočet faktoriálu. První algoritmus používá dvojitý cyklus, druhý jednoduchý cyklus. První algoritmus můžeme studentům dát k prostudování a druhý zadat k samostatné práci.
Poslední dva algoritmy řeší úlohu z integrálního počtu, jejíž analytické řešení studenti znají z hodin matematické analýzy, viz skripta (4).
Ve všech algoritmech jsou uvedeny komentáře, které popisují podrobně vše, co studenti potřebují znát: Zadání úlohy, postup řešení, vysvětlivky příkazů jazyka C a další poznámky.

5.1  Příklad 1.

/* První program

Vypíšeme jednoduchý text. 
A až si jej přečteme, tak stiskem Enter ukončíme program. 
*/

#include<stdio.h> 
/* zpřístupnění funkcí standardního vstupu a výstupu, 
které zajišťují např. vypisování na obrazovku či do souboru,
dáváme zde tedy najevo, že budeme tyto funkce používat 
*/

main()	//tak vždy začíná hlavní program 
{		// ve složených závorkách jsou příkazy, ze kterých se program skládá
	printf("Toto je muj prvni program v C.");	//vypisujeme text (tzv. řetězec); musí být v uvozovkách
	getchar();	// čekáme na Enter
}	// tady tedy končí program

/* Všimněme si: 
každý příkaz musí být ukončen středníkem
každá funkce má závorky, i když nemá žádné parametry, tedy main(), printf(), getchar() 
*/

5.2  Příklad 2.

/* První program 2
pracujeme s proměnnou

Vypíšeme jednoduchý text a hodnotu proměnné i. 
A až si to přečteme, tak stiskem Enter ukončíme program. 
*/

#include<stdio.h>

main()
{
	int i; /*Počítači sdělujeme, že budeme pracovat s celočíselnou proměnnou, 
		     kterou jsme nazvali i, provádíme tedy definici proměnné i. 
			 int je zkratka angl. integer - celé číslo
		   */
	i = 5; // proměnné i zde přiřadíme hodnotu 5	
	
	printf("Toto je hodnota promenne int: %d", i); 
				 /* Hodnota proměnné i je vypsána na místo, které je v řetězci označeno %d. 
				 pro celá čísla (tedy i pro proměnnou typu int) máme formátovou specifikaci d (z angl. decimal)
				 formátová specifikace začíná znakem %
	 			 */
	getchar();
}

/* Tip:
příkazy int i; i = 5; lze stručně zapsat jediným příkazem int i = 5; 
při definici proměnné tedy můžeme rovnou provést i její inicializaci

I kdybychom chtěli vypsat pouze hodnotu proměnné i, 
nesmíme zapomenout na uvozovky:	printf("%d", i);
*/ 

5.3  Příklad 3.

//Tvorba tabulky druhých mocnin (čísel od 1 do N)
#include<stdio.h>

main()
{
	double i, N;
          /*
			Počítači sdělujeme, že budeme pracovat s reálnými proměnnými (tj. typu double), 
			které jsme nazvali i, N. 
          */
			 
	FILE *fw;	//definujeme nový soubor, budeme se na něj odvolávat "zkratkou" fw
	
	fw = fopen("NaDruhou.txt", "w");	
	   	 /* soubor fw zde otevíráme, bude se jmenovat NaDruhou.txt
 		    a bude určen pro zápis 
 		 */

	printf("Zadejte, do kolika maji byt pocitany druhe mocniny: \n"); 
 					 // výpis na obrazovku
	scanf("%lf", &N);	// načtení zadané žádané hodnoty, tj. do kolika se bude počítat tabulka druhých mocnin

	fprintf(fw, "Číslo a jeho druhá mocnina \n\n");	// vytvoření nadpisu v souboru

	for(i=1; i<=N; i++)		// cyklus for od 1 do N s krokem 1
	{		
		fprintf(fw, "%g\t%g \n", i, i*i);	//do souboru vypisujeme postupně vedle sebe i a i*i
	}
	
	fclose(fw);	//uzavření souboru 
}

5.4	  Příklad 4.

// Vypsat do souboru tabulku faktoriálů od 1 do zadaného N

#include <stdio.h>

main(){

	FILE*fw; fw=fopen("Faktorialy.txt", "w");	//založíme a otevřeme soubor

	double i, fakt, N, k;
	scanf("%lf", &N);	//načteme číslo N, kterým bude celá tabulka končit

	for (k=1; k<=N; k++)	//tady volíme čísla od 1 do N
	{
	 	fakt = 1;		// proměnnou, ve které bude nový výsledek před dalším výpočtem "vynulujeme"
 		for (i=1; i<=k; i++) fakt = fakt*i;	//zde vypočítáme faktoriál; for obsahuje jediný příkaz
 		
 		fprintf(fw, "%g! = %g \n", k, fakt);	//vytiskneme faktoriál
    }

	fclose(fw);	 //soubor po práci zavřeme
}

/*
K samostatné práci:

1. Modifikujte program tak, aby vypisoval výsledky na více míst

řešení: fprintf(fw,"%g! = %.17g \n",k,fakt);  
//s tím počtem je dobré experimentovat, více než 17 nemá smysl, doplní se totiž nulami

2. Je zbytečné počítat pokaždé faktoriál násobením "od začátku". 
Předchozí výsledek stačí vynásobit o jedničku větším číslem. 
Modifikujte program s použitím této myšlenky. 

řešení: viz „Jiné řešení příkladu 4.“ Faktorialy.cpp
*/

Jiné řešení Příkladu 4.

/*
Samostatná práce:
Je zbytečné počítat pokaždé faktoriál násobením "od začátku". 
Předchozí výsledek stačí vynásobit o jedničku větším číslem. 
Modifikujte program s použitím této myšlenky. 
*/

#include <stdio.h>

main(){

	FILE*fw; fw=fopen("Faktorialy1.txt", "w"); //založíme a otevřeme soubor

	double i, fakt=1, N;
	scanf("%lf", &N);	//načteme číslo N, kterým bude celá tabulka končit

	for (i=1; i<=N; i++)	//tady volíme čísla od 1 do N
	{
 		fakt *= i;		// počítáme faktoriál s využitím předchozího výsledku
 			 			// je to rychlejší zápis příkazu  fakt = fakt * i;
 			 			
 		fprintf(fw,"%g! = %.17g\n", i, fakt);
	}							    //a zde vytiskneme faktoriál

	fclose(fw);	 //soubor po práci zavřeme
}

5.5  Příklad 5.

Vypočítejte obsah rovinného obrazce ohraničeného osou x a obloukem sinusoidy y=sinx, kde 0x, viz (4).

// Př. 4 ve skriptech z matematické analýzy, str. 15: 
// vypočtěte integrál funkce sinus od -pí do pí 

#include <stdio.h>
#include <math.h>

main()
{
 	   FILE*fa; fa=fopen("IntegralSinu-+.txt", "a"); //založíme a otevřeme soubor pro přidávání

  	   fprintf(fa,"Integrál sinu od -pí do pí.\nPočítáme obdélníkovou metodou.\nDělíme na N dílů.\n");  // nadpis souboru

	   double k, integ = 0, N, Delta;
	   printf("Pocitame integral sinu od -pi do pi \nobdelnikovou metodou.\nZadejte pocet delicich intervalu:\n");
	   scanf("%lf", &N);	//načteme číslo N; interval <-pí,pí> budeme dělit na N stejných dílů
	   Delta = 2*M_PI/N;			//délka elementu dělení = délka celého intervalu / N
	   
 	   for (k=0; k<N; k++)	
	   {		//sčítáme obsahy obdélníků, základna = Delta, výška = funkční hodnota ve středu elementu dělení
	   	   integ += Delta * sin(Delta/2 + k*Delta);	
	   }
	   
	   fprintf(fa,"Při N = %g vyšel integrál\t%.13g\n\n", N, integ);	//vypíšeme výsledek
	   
	   fclose(fa);	 //soubor po práci zavřeme
}

/*
2. Modifikujte program tak, aby nebylo potřeba jej stále spouštět 
a počítal integrál pro opakovaně zadávané hodnoty N, 
dokud nezadáme nulu či záporné číslo
řešení viz „Jiné řešení Příkladu 5.“ IntegralSinu-while.cpp
*/
Jiné řešení Příkladu 5.

// Př. 4 ve skriptech z matematické analýzy, str. 15: 
// vypočtěte integrál funkce sinus od 0 do pí 
// děláme pokusy s N - počtem dělicích intervalů, dokud nezadáme 0 nebo záporné číslo

#include <stdio.h>
#include <math.h>

main()
{
 	   FILE*fw; fw=fopen("IntegralSinu-while.txt", "w"); //založíme a otevřeme soubor
 	   
 	   // informační výpisy
   	   printf("Pocitame integral sinu od 0 do pi obdelnikovou metodou.\n");
	   printf("Zadavejte pocet delicich intervalu.\n");
	   printf("Vysledky se budou zapisovat do souboru IntegralSinu-while.txt.\n");
	   printf("Zadavani ukoncite zadanim nuly ci zaporneho cisla. \n\n");
	   	  
  	   // nadpis souboru:
	   fprintf(fw,"Integrál sinu od 0 do pí.\nPočítáme obdélníkovou metodou.\nDělíme na N dílů.\n\n");  

	   double k, integ, N, Delta;
do{
   	   integ = 0;		//integ je potřeba pokaždé vynulovat, jinak by se v něm kumulovaly předchozí výsledky
	   printf("Zadejte pocet delicich intervalu: ");
	   scanf("%lf", &N);	//načteme číslo N; interval <0,pí> budeme dělit na N stejných dílů
	   Delta = M_PI/N;			//délka elementu dělení = délka celého intervalu / N
	   
 	   for (k=0; k<N; k++)	
	   {		//sčítáme obsahy obdélníků, základna = Delta, výška = funkční hodnota ve středu elementu dělení
	   	   integ += Delta * sin(Delta/2 + k*Delta);	
	   }
	   
	   fprintf(fw,"Při N = %g vyšel integrál\t%.13g\n", N, integ);	//do souboru vypisujeme výsledek
	   
}while(N>0);
	   
	   fclose(fw);	 //soubor po práci zavřeme
}

/*
Problém pro zvídavé: jak se zbavit posledního nadbytečného výpisu v souboru: 
Při N = 0 vyšel integrál	0
*/

6.	Závěr

V předmětu Algoritmizace se propojují poznatky studentů získané v matematice na základních a středních školách a také na přednáškách matematické analýzy a algebry v prvním ročníku vysokoškolského studia, navíc jsou vysvětleny vybrané numerické metody a sestavovány algoritmy úloh, které jsou zaměřeny tak, aby byly přínosné pro budoucí učitele matematiky 2. stupně ZŠ.
Uvedenou problematiku řešíme v letošním roce v rámci projektu FRVŠ č. 1045/2008. Hlavním cílem projektu je u budoucích učitelů matematiky rozvíjet algoritmické myšlení, upevnit a provázat jejich znalosti matematiky a výpočetní techniky.

References 

[1]      R. Chalupa. 1001 tipů a triků pro Visual C++. Computer Press, a.s., 2003. ISBN 80-      7226-824-2.
[2]      V. Kadlec. Učíme se programovat v Jazyce C. Computer Press, a.s., 2005. ISBN 80- 7226-715-9.
[3]      B. Kerninghan, D. Ritchie. Programovací jazyk C. Computer Press, a.s., 2006, ISBN 80-251-0897-X.
[4]      J. Laitochová. Matematická analýza 2. Integrální počet. Olomouc: Vydavatelství UP 2001. ISBN 80-244-0288-2.
[5] 	M. Virius. Pasti a propasti jazyka C++. Computer Press, a.s., 2005, ISBN 80-251-0509-1.