Procedurális programozás eszközei

Lokális válozók használata

Írjunk függvényt, ami adott n-re megnézi, hogy az 1+2+3+... összeg mikor lesz először legalább n, és kiírja, hogy mennyivel lépte túl.

f[n_] := 
      Module[{s = 0}, For[i = 1, s < n, i++, s = s + i]; 
        s - n]

{f[20], f[21], f[22]}

s = 3; Print[f[30]]; s

Block, With...

Logikai függvények

Map[NumberQ, {12, 3.5, Pi, N[Pi], a, p, {1}}]

Map[IntegerQ, {12, 3.5, Pi, N[Pi], a, p, {1}}]

Map[ListQ, {12, 3.5, Pi, N[Pi], a, p, {1}}]

Positive[{12, 3.5, Pi, N[Pi], a, p, {1}}]

EvenQ[Range[6]]

? *Q

Listaelemzés

l1 = {8  π, aa, ((23 )/5), α, 
          30.5};

Select[l1, NumberQ]

Select[l1, Positive]

Select[l1, NumericQ, 2]

f[x_] := If[x < 28, True, False]

Select[l1, f]

MemberQ[Range[10]^2 - 5, 31]

FreeQ[Range[15]^2 - 10, 8]

Position[Range[10], 6]

Position[{1, 1, {1, {{1}}}}, 1]

Gyakorlás

Írjunk  függvényt, ami egy beadott listáról ellenörzi, hogy minden elem pozitív-e.

f1[l_] := Apply[And, Map[Positive, l]]

f2[l_] := Length[Select[l, Positive]] == Length[l]

Írjunk  függvényt, ami megszámolja, hogy a beadott listában hány 3-mal osztható szám van. (Használjunk segédfv-t.)

seged[x_] := If[Mod[x, 3] == 0, True, False]

f3[l_] := Length[Select[l, seged]]

Csomagok

<< Graphics`ParametricPlot3D`

? ParametricPlot3D

ParametricPlot3D[{(4 + Sin[u]) Cos[v], (4 + Sin[u]) Sin[v], 
        Cos[u]}, 
{u, 0, 2  Pi}, {v, 0, 2  Pi}]

<< Miscellaneous`Calendar`

DayOfWeek[{2002, 11, 4}]

DaysBetween[{1900, 1, 1}, {1901, 1, 1}]

Órai feladatok

Írjunk függvényt,  ami adott n-re megadja, hogy n! végén hány 0 áll! Adjunk ész nélküli megoldást is, ami nem használja a képletet, csak leszámlálja a 0-kat! (Az IntegerDigits függvény segíthet...) Ábrázoljuk az első 100 értékre a függvényt, és vele együtt az n/4-et is!

f[n_] := Sum[Floor[n/5^k], {k, 1, Log[5, n]}]

ff[n_] := 
      Module[{i = -1, l = IntegerDigits[n!]}, 
        While[l[[i]] == 0, i = i - 1]; -1 - i]

{f[123], ff[123], 123!}

ListPlot[Map[f, Range[100]], PlotJoined -> True]

Plot[x/4, {x, 1, 100}]

Show[%, %%]

Tudjuk (volt hf...), hogy 10 egymást követő pozitív egész közül mindig kiválasztható egy, ami relatív prím a többi szorzatához. Írjunk függvényt, ami egy adott n pozitív egészhez kiválaszt egy ilyen számot az n, n + 1, n + 2,  ...  , n + 9számok közül! 
Mutassuk meg,  hogy az állítás 17 egymás utáni számra már nem igaz!

g[n_] := 
      Module[{i = n, p = Product[n + j, {j, 0, 9}]}, 
While[
          GCD[i, p/i] ≠ 1, i++]; i]

gg[n_] := 
      Module[{i = n, 
          p = Product[n + j, {j, 0, 16}]}, 
While[
          GCD[i, p/i] ≠ 1  ||  i == n + 17, i++]; 
        If[i < n + 17, i, -1]]

i = 1; While[gg[i] ≠ -1, i++]; i

Házi feladatok

Írjunk magyarázatot is a megoldás mellé! (Legalább pár szót...)

Hétfő

1.  Írjunk fv-t, ami két (nem feltétlenül 1-től 6-ig számozott) dobókockára kiadja, hogy milyen számok jöhetnek ki összegként, ha mindkettővel dobunk. (A bemenet két 6-elemű lista, a kimenet pedig a lehetséges összegek listája.)

2. Készítsünk egy véletlen egész számot 20 és 40 között, legyen ez a. Határozzuk meg a sin((1/x)) - x függvény 1/a-hoz legközelebb eső gyökét!

3. Egy n-jegyű számot (általánosított) Armstrong-számnak nevezünk, ha egyenlő a számjegyeinek n-dik hatványösszegével. Írjunk fv-t, aminek bemenő paramétere n, és megadja az összes n-jegyű Armstrong számot. Határozzuk meg az összes 3 illetve 4-jegyű Armstrong számot!

Segítség (nem muszáj elolvasni... ☺)

(Segítség egy lehetséges megoldáshoz:használjunk segédfüggvényt,ami eldönti,hogy egy adott szám A-szám,ehhez az IntegerDigits, Apply, Length függvények esetleg jól jöhetnek, ezután a Select és Range használatával válasszuk ki az n-jegyű A-számokat.)

Szerda

1. Melyek azok a 3 jegyű prímszámok, amelyek "palindromszámok" (visszafelé olvasva is ugyanazt kapjuk)?

2. Készítsünk egy véletlen egész számot 20 és 40 között, legyen ez a. Határozzuk meg a tan((1/x)) - x függvény 1/a-hoz legközelebb eső gyökét!

3. Nevezzünk kvázi-tökéletesnek egy pozitív egészt,  ha a pozitív osztóinak összege többszöröse a számnak. (A tökéletes számok egyben kvázi-tökéletesek is, de van más példa is...) Határozzuk meg az összes legfeljebb 5-jegyű kvázi-tökéletes számot, és azt is, hogy hányszorosa az osztóösszeg  a számnak! (Segítség: a Divisors[n] felsorolja az n szám pozitív osztóit egy listában.)