Читайте также: |
|
Пример 1. Coставить программу перестановки значений переменных a, b, c в порядке возрастания, т.е. так, чтобы a ≤ b ≤ c.
Program Example_101;
Var a,b,c: Integer;
Procedure Swap(Var x,y: Integer); { Swap меняет значение переменных}
Var t: Integer;
Begin
t:=x; x:=y; y:=t
End;
Begin
Writeln('Введите три числа ');
Readln(a,b,c);
If a > b Then Swap(a,b);
If b > c Then Swap(b,c);
If a > c Then Swap(a,c);
Writeln(a:5,b:5,c:5);
Readln
end.
Найдите ошибку в этом решении. Требуется исправить имя одной переменной в одной строке программы. Составьте для поиска ошибки полную систему тестов.
Пример 2. Составим процедуры ввода и вывода данных. Пусть покупается n разных товаров. Известна цена ci и количество mi каждого товара. Требуется вычислить общую стоимость приобретенного товара.
Program Example_102;
const max=100;
type vect1=array[1..max] of real;
vect2=array[1..max] of integer;
var c:vect1; k:vect2;
n,s2:integer; s1:real;
procedure Data(var c:vect1;var k:vect2;var n:integer);
{ процедура ввода данных }
const text1='Вводите последовательно цену и количество купленного товара';
text2='Отрицательные значения одной из этих величин - конец покупок!';
var i:integer;
begin
writeln(text1);writeln(text2); i:=0;
repeat Inc(i);
writeln('цена c[',i:2,']=?'); readln(c[i]);
writeln('количество k[',i:2,']=?'); readln(k[i]);
until (c[i]<0.0) or (k[i]<0);
n:=i-1;
end;
procedure Print(x:vect1;y:vect2;n:integer);
{ процедура вывода данных }
const txt1='----------------------------';
txt2=' номер цена количество ';
var i:integer;
begin
writeln(txt1); writeln(txt2); writeln(txt1);
for i:=1 to n do writeln(' ',i:2,' ',x[i]:6:2,' ',y[i]:4);
writeln(txt1);
end;
procedure Sum(z:vect1;m:vect2;n:integer;var sc:real;var sm:integer);
{ процедура суммирования данных }
var i:integer;
begin
sc:=0.0; sm:=0;
for i:=1 to n do begin sc:=sc+z[i]*m[i]; sm:=sm+m[i] end;
end;
{ основная программа }
Begin
Data(c,k,n); Print(c,k,n); Sum(c,k,n,s1,s2);
writeln('Итого:',' ',s1:8:2,' ',s2:4);
readln
End.
Теперь дополним нашу программу процедурами вставки и удаления элементов в массиве. Для осуществления вставки числа z1 в массив z[i] после номера k необходимо:
1. первые k элементов сохранить без изменения;
2. все элементы массива, начиная с (k+1) – сдвинуть вправо;
3. на место элемента (k+1) записать число z1.
procedure Insert(k,m1:integer;z1:real;var z:vect1;var m:vect2;var n:integer);
var i:integer;
begin
for i:=n downto k+1 do begin z[i+1]:=z[i]; m[i+1]:=m[i] end;
z[k+1]:=z1; m[k+1]:=m1; n:=n+1;
end;
Здесь k – номер элемента после которого необходимо вставить числа:
m1 – количество товара, которое добавляется и
z1- его цена.
Аналогично составим процедуру удаления элемента с номером k из массива, при этом все элементы, начиная с номера k, необходимо сдвинуть влево.
procedure Delete(k:integer; var z:vect1;var m:vect2; var n:integer);
var i:integer;
begin
n:=n-1;
for i:=k to n do begin z[i]:=z[i+1]; m[i]:=m[i+1] end;
end;
Тогда в основной программе, после завершения процедур, осуществляющих формирование массивов цены с[i], количества k[i] и суммы купленного товара, можно организовать небольшой диалог для удаления или добавления определенного количества товаров, чтобы уложиться в определенную, наперед указанную сумму.
program Example_102m;
const max=100;
type vect1=array[1..max] of real;
vect2=array[1..max] of integer;
var c:vect1; k:vect2;
n,s2,j,mi:integer; s1,ci:real;
procedure Data(var c:vect1;var k:vect2;var n:integer);
........................
procedure Print(x:vect1;y:vect2;n:integer);
........................
procedure Sum(z:vect1;m:vect2;n:integer;var sc:real;var sm:integer);
........................
procedure Insert(k,m1:integer;z1:real;var z:vect1;var m:vect2;var n:integer);
........................
procedure Delete(k:integer; var z:vect1;var m:vect2; var n:integer);
........................
Begin
Data(c,k,n); Print(c,k,n);
Sum(c,k,n,s1,s2); writeln('Итого:',' ',s1:8:2,' ',s2:4);
writeln('Добавить покупки после номера j='); readln(j);
writeln('цена =?'); readln(ci); writeln('количество=?'); readln(mi);
Insert(j,mi,ci,c,k,n); Print(c,k,n);
Sum(c,k,n,s1,s2); writeln('Итого:',' ',s1:8:2,' ',s2:4);
writeln('Какой номер товара удалить?=',j); readln(j);
Delete(j,c,k,n); Print(c,k,n);
Sum(c,k,n,s1,s2); writeln('Итого:',' ',s1:8:2,' ',s2:4);
readln
End.
Заметим, что также можно организовать и процедуру обмена элементами в массиве.
procedure Swap(var a,b:real);
var z:real;
begin
z:=a; a:=b; b:=z
end;
И, при необходимости, вызывать ее в основной программе: Swap(c[k1],c[k2]);
Рассмотренный пример подсчета суммарной стоимости подсказывает эффективный способ формирования нового массива с помощью «массива-маски», состоящего из нулей и единиц. Действительно, если количество закупаемого товара равно нулю, то его стоимость уже неважна.
procedure Masca(с:vect1; m:vect2; var z:vect1; var n:integer);
var i,j:integer;
begin
j:=1;
for i:=1 to n do
if m[i]:=1 then begin z[j]:=c[i]; inc(j) end;
n:=j-1
end;
Разобравшись с приведенным текстом программ, проведите их отладку и тестирование. Поэкспериментировав с программой, проведите её улучшения по части сервиса и т.д.
Пример 3. Составим программу транспонирования матриц, вычисления произведения двух квадратных матриц
и преобразования двухмерной матрицы в одномерную. Пусть элементы исходных матриц a и b задаются с помощью датчика случайных чисел.
Program Example_103;
const nn=5;mm=5;
type matr=array[1..nn,1..mm] of integer;
vectr=array[1..nn*mm] of integer;
var a,b,c:matr; d:vectr;
procedure Data(var x:matr);
{ процедура ввода данных }
var i,j:integer;
begin
for i:=1 to nn do
for j:=1 to mm do
x[i,j]:=random(21)-10;
end;
procedure Print(x:matr);
{ процедура вывода данных }
var i,j:integer;
begin
for i:=1 to nn do begin
for j:=1 to mm do
write(x[i,j]:5); writeln; end
end;
procedure Tp(var x:matr);
{ процедура транспонирования матрицы }
var i,j,n,p:integer;
begin n:=nn;
for i:=1 to n-1 do
for j:=i+1 to n do
begin
p:=x[i,j]; x[i,j]:=x[j,i]; x[i,j]:=p
end
end;
procedure Tr(x:matr;var z:vectr);
{ процедура преобразования двумерной матрицы в одномерную }
var i,j,k:integer;
begin
for i:=1 to nn do
begin
for j:=1 to mm do
begin
k:=(i-1)*mm+j; z[k]=x[i,j]; write(z[k]:5)
end;
writeln
end
end;
procedure Dv(x,y:matr;var z:matr);
{ вычисление произведения двух квадратных матриц x*y=z }
var i,j,k:integer;
begin
for i:=1 to nn do
for j:=1 to nn do
begin s:=0;
for k:=1 to nn do
s:=s+x[i,k]*y[k,j]; z[i,j]:=s
end
end;
{ Основная программа }
Begin
writeln('массив а'); Data(a); Print(a);
Tp(a); Print(a);
writeln('массив b'); Data(b); Print(b);
Tp(b); Print(b);
Dv(a,b,c);
writeln('массив c'); Print(c);
Tr(c,d);
readln
End.
Проведите отладку и тестирование программы. Дополните её процедурами вычисления определителей и обращения матриц.
Пример 4. Разработаем программу решения системы из трех линейных уравнений методом Крамера.
program Example_103;
const n=3;
type vectr=array[1..n] of real;
matr= array[1..n,1..n+1] of real;
var I: integer; a: matr; z:vectr;
procedure Data(var a:matr);
........................
procedure Print(a:matr);
........................
procedure Swap(var a,b:real);
........................
function Det(a:matr):real;
{ вычисление определителя }
function Turn(k:integer):real;
var s:real; k1,k2,k3,k4: integer;
begin s:=0;
k1:=2-k; k2:=2; k3:=2+k;
for I:=1 to n do
begin
s:=s + a[1,k1]*a[2,k2]*a[3,k3];
k4:=k1; k1:=k2; k2:=k3; k3:=k4
end;
Turn:=s
end;
begin
Det:=Turn(1)-Turn(-1)
end;
procedure Solve_Kram(a:matr;var x:real);
{ процедура решения системы уравнений методом Крамера}
var d:real; I,j:integer;
begin
d:=Det(a);
if (abs(d) < 1.0e-6) then begin writeln(Error); Exit end;
for j:=1 to n do
begin
for I:=1 to n Swap(a[I,j],a[I,n+1]);
x[j]:=Det(a)/d;
for I:=1 to n Swap(a[I,n+1],a[I,j])
end;
end;
{ Основная программа }
Begin
Data(a); Print(a); Solve_Kram(a,z);
for I:=1 to n writeln(‘x[‘,I:2,’]=’,z[j];
readln
End.
Разобравшись с приведенным текстом программ, проведите их отладку и тестирование.
Дата добавления: 2015-07-26; просмотров: 205 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Отладка программы в среде Turbo Pascal. | | | Вычисление факториала. |