Podstawy Informatyki - Laboratorium

Politechnika Świętokrzyska, Wydział Elektrotechniki, Automatyki i Informatyki

Turbo Pascal

Instrukcja laboratoryjna nr 7

Opracował: dr inż. Grzegorz Słoń

listopad 2003 r.

Operacje na rekordach i przetwarzanie plików

  1. Napisać program zapisujący w pliku tekstowym liczby.txt ciąg n liczb rzeczywistych, a następnie pobierający liczby z pliku i wyświetlający je na ekranie monitora. Nie stosować zmiennych tablicowych.

program z7_1;

uses Crt;

var plik: Text;

n: integer;

{----------}

procedure Wprowadz_liczby(n:integer; var p:Text);

var i:integer;

liczba:real;

begin

Rewrite(p);

for i:=1 to n do

begin

write(i,' liczba: '); readln(liczba);

writeln(p,liczba);

end;

Close(p);

end;

{----------}

procedure Wyswietl_liczby(var p:Text);

var liczba:real;

begin

Reset(p);

while not eof(p) do

begin

readln(p,liczba);

writeln(liczba:7:3);

end;

Close(p);

end;

{----------}

procedure Koniec;

begin

writeln;

TextColor(14); writeln('Nacisnij dowolny klawisz...'); TextColor(7);

ReadKey;

end;

{----------}

begin

ClrScr;

write('Ile bedzie liczb?: '); readln(n);

Assign(plik,'liczby.txt');

Wprowadz_liczby(n,plik);

writeln;

Wyswietl_liczby(plik);

Koniec;

end.

  1. Uzupełnić program z punktu 1 o procedurę wyświetlającą tylko te liczby, których wartość jest większa od średniej arytmetycznej wszystkich liczb.

{----------}

function Srednia(var p:Text):real;

var n:integer;

liczba,s:real;

begin

n:=0; s:=0;

Reset(p);

while not eof(p) do

begin

readln(p,liczba);

n:=n+1;

s:=s+liczba;

end;

if n>0 then Srednia:=s/n

else Srednia:=s;

Close(p);

end;

{----------}

procedure Wieksze_od_sredniej(var p:Text);

var liczba,s_a:real;

begin

s_a:=Srednia(p);

Reset(p);

while not eof(p) do

begin

readln(p,liczba);

if liczba>s_a then writeln(liczba:7:3);

end;

Close(p);

end;

{----------}

  1. Dany jest zestaw informacji o n studentach: nazwisko i imię, rok urodzenia, średnia ocen. Napisać program, który umożliwi wprowadzenie tych danych do tablicy jednowymiarowej a, a następnie wyświetli na ekranie monitora dane studentów urodzonych w podanym roku.

program z7_3;

uses Crt;

type student = record

naz_im : string[30];

rok_ur : integer;

srednia : real;

end;

tab_rec = array[1..50] of student;

var a: tab_rec;

n,rok: integer;

{----------}

procedure Wprowadz_osobe(var x:student);

begin

write('Nazwisko i imie: '); readln(x.naz_im);

write('Rok urodzenia: '); readln(x.rok_ur);

write('Srednia ocen: '); readln(x.srednia);

end;

{----------}

procedure Wprowadz_dane(n:integer; var a:tab_rec);

var i:integer;

begin

for i:=1 to n do

begin

TextColor(15); writeln(i,' student:'); TextColor(7);

Wprowadz_osobe(a[i]);

end;

end;

{----------}

procedure Wyswietl_osobe(x:student);

begin

with x do

begin

write(naz_im); GoToXY(32,WhereY);

writeln(rok_ur:4,' ',srednia:4:2);

end;

end;

{----------}

procedure Wyswietl_z_roku(rok,n:integer; a:tab_rec);

var i,ile:integer;

begin

ile:=0;

for i:=1 to n do

if a[i].rok_ur=rok then begin

ile:=ile+1;

Wyswietl_osobe(a[i]);

end;

if ile=0 then writeln('Brak studentow urodzonych w roku ',rok,'.');

end;

{----------}

procedure Koniec;

begin

writeln;

TextColor(14); writeln('Nacisnij dowolny klawisz...'); TextColor(7);

ReadKey;

end;

{----------}

begin

ClrScr;

write('Ilu bedzie studentow?: '); readln(n);

Wprowadz_dane(n,a);

writeln;

write('Podaj rocznik: '); readln(rok);

Wyswietl_z_roku(rok,n,a);

Koniec

end.

  1. Zmodyfikować program z punktu 3 tak, aby do przechowywania danych wykorzystywał plik tekstowy o nazwie dane.txt (zamiast tablicy jednowymiarowej).

program z7_4;

uses Crt;

type student = record

naz_im : string[30];

rok_ur : integer;

srednia : real;

end;

plik = Text;

var p: plik;

n,rok: integer;

{----------}

procedure Wprowadz_osobe(var x:student);

begin

write('Nazwisko i imie: '); readln(x.naz_im);

write('Rok urodzenia: '); readln(x.rok_ur);

write('Srednia ocen: '); readln(x.srednia);

end;

{----------}

procedure Wprowadz_dane(n:integer; var p:plik);

var i:integer;

x:student;

begin

Rewrite(p);

for i:=1 to n do

begin

TextColor(15); writeln(i,' student:'); TextColor(7);

Wprowadz_osobe(x);

writeln(p,x.naz_im);

writeln(p,x.rok_ur);

writeln(p,x.srednia);

end;

Close(p);

end;

{----------}

procedure Wyswietl_osobe(x:student);

begin

with x do

begin

write(naz_im); GoToXY(32,WhereY);

writeln(rok_ur:4,' ',srednia:4:2);

end;

end;

{----------}

procedure Wyswietl_z_roku(rok,n:integer; var p:plik);

var i,ile:integer;

x:student;

begin

ile:=0;

Reset(p);

while not eof(p) do

begin

readln(p,x.naz_im);

readln(p,x.rok_ur);

readln(p,x.srednia);

if x.rok_ur=rok then begin

ile:=ile+1;

Wyswietl_osobe(x);

end;

end;

Close(p);

if ile=0 then writeln('Brak studentow urodzonych w roku ',rok,'.');

end;

{----------}

procedure Koniec;

begin

writeln;

TextColor(14); writeln('Nacisnij dowolny klawisz...'); TextColor(7);

ReadKey;

end;

{----------}

begin

ClrScr;

Assign(p,'dane.txt');

write('Ilu bedzie studentow?: '); readln(n);

Wprowadz_dane(n,p);

writeln;

write('Podaj rocznik: '); readln(rok);

Wyswietl_z_roku(rok,n,p);

Koniec

end.

  1. Zmodyfikować program z punktu 4 tak, aby zamiast pliku tekstowego wykorzystywał plik rekordowy o nazwie dane.dat.

program z7_5;

uses Crt;

type student = record

naz_im : string[30];

rok_ur : integer;

srednia : real;

end;

plik = file of student;

var p: plik;

n,rok: integer;

{----------}

procedure Wprowadz_osobe(var x:student);

begin

write('Nazwisko i imie: '); readln(x.naz_im);

write('Rok urodzenia: '); readln(x.rok_ur);

write('Srednia ocen: '); readln(x.srednia);

end;

{----------}

procedure Wprowadz_dane(n:integer; var p:plik);

var i:integer;

x:student;

begin

Rewrite(p);

for i:=1 to n do

begin

TextColor(15); writeln(i,' student:'); TextColor(7);

Wprowadz_osobe(x);

write(p,x);

end;

Close(p);

end;

{----------}

procedure Wyswietl_osobe(x:student);

begin

with x do

begin

write(naz_im); GoToXY(32,WhereY);

writeln(rok_ur:4,' ',srednia:4:2);

end;

end;

{----------}

procedure Wyswietl_z_roku(rok:integer; var p:plik);

var i,ile:integer;

x:student;

begin

ile:=0;

Reset(p);

while not eof(p) do

begin

read(p,x);

if x.rok_ur=rok then begin

ile:=ile+1;

Wyswietl_osobe(x);

end;

end;

Close(p);

if ile=0 then writeln('Brak studentow urodzonych w roku ',rok,'.');

end;

{----------}

procedure Koniec;

begin

writeln;

TextColor(14); writeln('Nacisnij dowolny klawisz...'); TextColor(7);

ReadKey;

end;

{----------}

begin

ClrScr;

Assign(p,'dane.dat');

write('Ilu bedzie studentow?: '); readln(n);

Wprowadz_dane(n,p);

writeln;

write('Podaj rocznik: '); readln(rok);

Wyswietl_z_roku(rok,p);

Koniec

end.

  1. Uzupełnić program z punktu 5 o procedury (lub funkcje) wykonujące następujące zadania:

    1. zmodyfikowana procedura Wprowadz_dane, nie powodująca usunięcia danych wprowadzonych wcześniej;

    2. wyświetlanie danych wszystkich studentów;

    3. wyznaczanie średniej arytmetycznej wszystkich ocen;

    4. wyznaczenie średniego wieku studentów;

    5. wyznaczenie procentowego udział liczby studentów w wieku powyżej średniej;

    6. wyświetlenie danych studentów o nazwiskach zaczynających się od wskazanej litery;

    7. znalezienie studentów: najstarszego i najmłodszego (jeśli znajdzie się kilka osób z tego samego rocznika, to należy wyświetlić dane ich wszystkich);

    8. dodawanie do już istniejącego pliku danych nowej osoby.

  2. Napisać program pełniący rolę bazy danych magazynu towarów. Dane powinny obejmować: nazwę towaru, rok produkcji, cenę jednostkową i ilość. Program powinien umożliwiać:

    1. wprowadzanie nowych danych;

    2. wyświetlanie zawartości magazynu;

    3. wyświetlanie danych na temat towaru o wskazanej nazwie i roku produkcji;

    4. usuwanie danych na temat towaru o wskazanej nazwie;

    5. wyznaczenie łącznej wartości towarów w magazynie;

    6. wyznaczenie łącznej wartości towarów o wskazanej nazwie;

    7. wyznaczenie ilości jednostek towaru o wskazanej nazwie.

str. 6/6 Turbo Pascal - Instrukcja nr 7

Turbo Pascal - Instrukcja nr 7 str. 5/6