Ćwiczenia z Zastosowania informatyki w chemii-5

Transkrypt

Ćwiczenia z Zastosowania informatyki w chemii-5
CZEŚĆ A. Przykłady, cd.
1.Obliczanie wartości pierwiastka kwadratowego - algorytm Newtona-Raphsona
http://pl.wikipedia.org/wiki/Metoda_Newtona
(pierwszy przykład na stronach Wiki)
Dane: Liczba a (a>0) - liczba podpierwiastkowa; p - początkowe przybliżenie pierwiastka; maxiter - liczba
iteracji
Wynik: Przybliżona wartość pierwiastka kwadratowego z a
Kroki:
1. iter:=0;
2. x:=(p+a/p)/2; iter:=iter+1
3.Jeśli iter=maxiter to zakończ algorytm; przybliżona wartość pierwiastka kwadratowego z a jest równa x
4. Przyjmij, że p:=x i wróć do kroku 2
program NewtonRaphson;
var iter, Maxiter: integer;
a, p, x: real;
begin
write('podaj pierwiastkowana liczbe: ');
readln(a);
write('Podaj poczatkowe przyblizenie: ');
readln(p);write('Podaj liczbe iteracji: ');
readln(Maxiter);
iter:=0;
repeat
x:=(p+a/p)/2;
iter:=iter+1;
p:=x;
until iter=Maxiter;
writeln('Pierwiastek z ',a:0:2 ,' wynosi: ', x:0:10);
readln;
end.
2.Sprawdzanie czy podana liczba naturalna jest pierwsza
Liczba pierwsza to liczba podzielna tylko przez 1 i przez siebie.
Programy:
1) Lp1.pas - generuje liczby pierwsze dla zakresu 1..1000, wykorzystuje instrukcję goto na wyjście z pętli.
Wyniki tego programu są zapisywane do pliku Lp1.txt. Analogiczne nazwy mają pliki wyników pozostałych
programów - jak program, tylko z rozszerzeniem .txt.
2) Lp2a.pas - podaje się liczbę max do której obliczane są liczby pierwsze, 0 - kończy obliczenia. Max zakres
100000 (p=p+1).
3) Lp2b.pas - przy generowaniu liczb korzysta się z tablicy liczb wygenerowanych (p=p+2).
4. Liczp1.pas - podaje się ilość liczb a nie zakres
5. Liczp2.pas j.w.
6. Liczp3.pas j.w., obliczenia w pętli do podania 0.
7. Liczbyp.pas - program najprostszy pod wzgl. algorytm, nie korzysta z tablic ale efektywny, wyniki zapisuje
tylko do pliku.
Max ilość generowanych liczb ograniczona teoretycznie wielkością typu longint, w praktyce oczywiście
mniejsza.
2. Tablice
Tablica jest zbiorem elementów tego samego typu. Każdy element tablicy ma numer (indeks).
Tablicę stosujemy w przypadku, gdy chcemy przechowywać w jednej zmiennej (pod jedną nazwą)
większą ilość danych.
Deklaracja tablicy jednowymiarowej:
nazwa: array[rozmiar] of typ;
Przykład:
var T: array[0..3] of real; {deklaracja tablicy przechowującej 4 wartości typu rzeczywistego}
Przykład: 0, 1, 2, 3
var Dni: array[1..7] of string; {deklaracja tablicy typu łańcuch}
Tablic używa się w programie podając nazwę zmiennej tablicowej oraz numer elementu, którego
operacja ma dotyczyć ujęty w nawiasy kwadratowe.
Przykłady:
T[0] := 1.25; {przypisanie wartości 1.25 pierwszemu elementowi tablicy „T” }
writeln(Dni[7]); {wyświetlenie elementu tablicy Dni o indeksie 7}
Możliwe jest zadeklarowanie tablicy dwuwymiarowej (bądź wielowymiarowej):
nazwa: array[rozmiar1, rozmar2] of typ;
var tab: array[0..2,0..3] of integer; {deklaracja tablicy dwuwymiarowej 3x4 o wartościach całkowitych}
tab[0,0] := 32; {przypisanie wartości 32 do pierwszego elementu tablicy}
Wynik := tab[0,0]; {pobranie wartości z pierwszego elementu tablicy}
Przyklad
program tablica_liczb_calkowitych;
uses crt;
{Program wczytuje do tablicy 5 liczb całkowitych
a następnie wczytane liczby wyświetla}
var
Tab: array[1..5] of integer;
i: integer;
begin
for i:=1 to 5 do
begin
write('Podaj ', i, ' liczbe: ');
readln(Tab[i])
end;
write('Podales nastepujace liczby: ');
for i:=1 to 5 do write(Tab[i], ', ');
readln;
end.
CZĘŚĆ B – WE/WY DO PLIKU, FUNKCJE I PROCEDURY
Pliki
a) deklaracja zmiennej plikowej. Dla plików sformatowanych, sekwencyjnych:
var
plik:text;
b) nadanie zmiennej plikowej wartości (nazwnie pliku)
assign(zmienna_plikowa;AAAA); gdzie AAAA – zmienna typu łańcuchowego lub łańcuch
np.
assign(plik,'dane.dat'); {plik – zmienna zadeklarowana jako var plik:text}
LUB
aaa:='dane dat'; {aaa zmienna typu string}
assign(plik, aaa);
c) otwarcie pliku
reset(plik); - do odczytu
rewrite(plik); - odczyt/zapis
append(plik); - dopisywanie
d)
operacje na pliku
e) zamknięcie pliku
close(plik);
Przykład : odczytywanie pliku znak po znaku, aż do konca. FUNKCJA
EOF(plik) – end of file:
Program Odczyt;
var plik: text;
znak: array[1..1111] of char;
i: integer;
begin
assign(plik, 'dane.txt');
i:=0;
reset(plik);
while not eof(plik) do
begin
i:=i+1
read(plik, znak[i]);
write(znak[i]);
end;
close(plik);
end.
Funkcje i procedury
function nazwa_funkcji(lista_zmiennych): typ_funkcji;
np.
lista zmiennych „wyjsciowych” : x,y:real, i,j,k: integer, itp.
lista zmiennych „wejściowych” : var x,y :real; var i,j,k : integer; itp
function ff(x,y:real):real
procedure nazwa_procedury(lista zmiennych);
np. procedure calka(var a,b,delta:real; wynik:real);
PRZYKŁADY
P1. Obliczanie potęgi liczby rzeczywistej
program pote;
uses crt;
var liczba,wykladnik:real;
Function Potega(podst, wykl: real): real;
begin
if (podst>0) then Potega:= Exp(wykl * Ln(podst))
else Potega:= 0;
end;
begin
writeln('Porogram oblicza potegi liczb o rzeczywistym wykladniku');
write('Podaj podstawe potegi :');readln(liczba);
write('Podaj wykladnik potege :');readln(wykladnik);
writeln('Potega liczby ',liczba:0:4,' wynosi = ',Potega(liczba,wykladnik):0:4);
readln;
end.
P2. Obliczanie silni, funkcja + rekurencja
PROGRAM Obliczanie_silni;
USES Crt;
VAR
liczba, i, n : INTEGER;
FUNCTION Silnia(liczba : INTEGER) : LONGINT;
BEGIN
IF liczba > 1 THEN
Silnia:=liczba*Silnia(liczba-1)
ELSE
Silnia:=1;
END; {Silnia}
BEGIN {main}
ClrScr;
Writeln('Obliczanie silni z danej liczby calkowitej');
Writeln('Podaj liczbe');
Readln(n);
FOR i:=0 TO n DO
Writeln(' ', i , ' != ', Silnia(i));
REPEAT UNTIL KeyPressed;
END.
P3. Program z ozdobnikami. Przykład na to, jak skomplikować proste zadania.
Program oblicza objętość kuli. Dane: promień kuli. Wszystkie operacje
przeprowadzane są w procedurach.
PROGRAM KULA1; { naglowek programu}
{ poczatek BLOKu DEKLARACJI}
USES DOS,CRT;
CONST ESC=#27; {stala}
{Zmienne globalne}
VAR r : real; {promien - typu rzeczywistego}
v : real; {objetosc - typu rzeczywistego}
i: integer; { zmienna typu calkowitego}
z: char; {zmienna typu znak}
PROCEDURE dane (VAR x: real);
begin
textcolor(red);
writeln('Obliczenie NR ',i);
writeln;
textcolor(yellow);
write('Promien=');
readln(x);
end; {dane}
PROCEDURE obliczenia ( x: real; VAR y: real);
{ x,y - zmienne lokalne
x-promien - przekazywany przea wartosc
z programu glownego
y-objetosc - przekazywany przez zmiennana zewnatrz procedury do programu glown }
var x3: real; { r*r*r - promien do potegi 3 - zmienna lokalna}
Begin {pocz bloku operacji procedury obliczenia}
x3:=x*x*x;
y:=4.0/3.0*pi*x3;
End;
PROCEDURE wyniki(promien,objetosc: real);
Begin
writeln;
textcolor(green);
writeln('PI=',pi);
writeln;
textcolor(blue);
write('OBJETOSC KULI o promieniu ');
textcolor(magenta);
writeln(promien:7:3);
textcolor(green);
write(' wynosi ');
textcolor(lightcyan);
writeln(objetosc:10:3);
textcolor(white);
writeln;
writeln;
write('BY zakonczyc obliczenia nacisnij');
highvideo;
textcolor(yellow+blink);
writeln(' ESC...');
textcolor(white);
z:=Readkey;
normvideo;
writeln;
End; {wyniki}
{ Koniec bloku deklaracji}
{ Blok operacji - zacznie sie}
BEGIN { Kula }
clrscr;
textmode(c40);
i:=0;
repeat
i:=i+1;
dane(r);
obliczenia(r,v); { r wchodzi do procedury, a wychodzi z niej v}
wyniki(r,v);
until (z=ESC);
END. { Kula}
{Koniec bloku operacji}