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
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.
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;
{----------}
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.
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.
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.
Uzupełnić program z punktu 5 o procedury (lub funkcje) wykonujące następujące zadania:
zmodyfikowana procedura Wprowadz_dane, nie powodująca usunięcia danych wprowadzonych wcześniej;
wyświetlanie danych wszystkich studentów;
wyznaczanie średniej arytmetycznej wszystkich ocen;
wyznaczenie średniego wieku studentów;
wyznaczenie procentowego udział liczby studentów w wieku powyżej średniej;
wyświetlenie danych studentów o nazwiskach zaczynających się od wskazanej litery;
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);
dodawanie do już istniejącego pliku danych nowej osoby.
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ć:
wprowadzanie nowych danych;
wyświetlanie zawartości magazynu;
wyświetlanie danych na temat towaru o wskazanej nazwie i roku produkcji;
usuwanie danych na temat towaru o wskazanej nazwie;
wyznaczenie łącznej wartości towarów w magazynie;
wyznaczenie łącznej wartości towarów o wskazanej nazwie;
wyznaczenie ilości jednostek towaru o wskazanej nazwie.
str. 6/6 Turbo Pascal - Instrukcja nr 7
Turbo Pascal - Instrukcja nr 7 str. 5/6