Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

II. Экспериментальный раздел работы.

Читайте также:
  1. D) Раздел общего имущества
  2. I. Накопление в подразделении I - добавочный постоянный капитал
  3. I. Накопление в подразделении I образование сокровища
  4. I. Организационно - методический раздел
  5. II. Два подразделения общественного производства
  6. II. Накопление в подразделении II

 

Пример 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.| Вычисление факториала.

mybiblioteka.su - 2015-2024 год. (0.033 сек.)