Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум1_2014.doc
Скачиваний:
19
Добавлен:
25.02.2016
Размер:
1.79 Mб
Скачать

Interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Grids, Buttons;

type

TForm1 = class(TForm)

lbl1: TLabel;

lbledt1: TLabeledEdit;

btn1: TButton;

sd: TStringGrid;

btn2: TBitBtn;

lbl2: TLabel;

procedure lbledt1KeyPress(Sender: TObject; var Key: Char);

procedure btn1Click(Sender: TObject);

procedure sdKeyPress(Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

var

n:Integer;

a:array[0..10] of Real;

s:Real;

procedure TForm1.lbledt1KeyPress(Sender: TObject; var Key: Char);

//Разрешено вводить только цифры и нажимать клавиши

//Backspace и Enter

var

i:Integer;

begin

case Key of

'0'..'9',#8:;

#13:begin

//Задание свойств компонента StringGrid

sd.ColCount:=strtoint(lbledt1.Text);

n:=sd.ColCount;

sd.Options:=sd.Options+[goEditing];

sd.Width:=n*(sd.DefaultColWidth+2);

for i:=0 to n-1 do

sd.Cells[i,0]:='Элемент '+inttostr(i);

sd.SetFocus;

end

else

key:=#0;

end;

end;

procedure TForm1.btn1Click(Sender: TObject);

var

i:Integer;

begin

for i:=0 to n-1 do

a[i]:= strtofloat(sd.Cells[i,1]);

s:=0;

for i:=0 to n-1 do

s:=s+a[i];

sd.ColCount:=sd.ColCount+1;

sd.Width:=(n+1)*(sd.DefaultColWidth+2);

sd.Cells[n,0]:='Сумма ';

sd.Cells[n,1]:=FloatToStrF(s,ffFixed,8,3);

end;

procedure TForm1.sdKeyPress(Sender: TObject; var Key: Char);

//обработка нажатых клавиш в ячейках StringGrid

begin

with sd do

case Key of

'0'..'9',#8:;

'-':begin

if (Cells[Col,Row]='') then

key:='-'

else

if (Cells[Col,Row]<>'') and ((copy(Cells[Col,Row],length(Cells[Col,Row]),1)='E') or

(copy(Cells[Col,Row],length(Cells[Col,Row]),1)='e'))then

key:='-'

else

key:=#0;

end;

'+':begin

if (Cells[Col,Row]='') then

key:='+'

else

if (Cells[Col,Row]<>'') and ((copy(Cells[Col,Row],length(Cells[Col,Row]),1)='E') or

(copy(Cells[Col,Row],length(Cells[Col,Row]),1)='e'))then

key:='+'

else

key:=#0;

end;

',','.':begin

key:=decimalseparator;

if pos(decimalseparator,Cells[Col,Row])<>0 then

key:=#0

end;

'E','e':begin

key:='E';

if ((pos('E',Cells[Col,Row])<>0) or (pos('e',Cells[Col,Row])<>0))

or ((length(Cells[Col,Row])=1)

and ((copy(Cells[Col,Row],1,1)='-') or

(copy(Cells[Col,Row],1,1)='+'))) or

((length(Cells[Col,Row])=0)

and

((pos('E',Cells[Col,Row])=0) or (pos('e',Cells[Col,Row])=0))) then

key:=#0;

end;

#13: if col<colcount-1 then

col:=col+1;

else

key:=#0;

end;

end;

end.

Задания

Составьте схему и программу для решения задачи обработки массива. Программу проверьте на ЭВМ. На экран выведите исходный массив и полученный результат обработки.

1. Вычислите А0 +А1x + А2x2 + А3x3 + ... + АNxN, используя схему Горнера. В соответствии со схемой Горнера данный многочлен преобразуется к виду:

(…((АN x + АN-1)x + АN-2)x + ... + А1)x + А0.

2. Вычислите А1x + А2x2 + А3x3 + ... + АNxN, не используя схему Горнера.

3. Вычислите А1 + А3 + А5 + ... + А2N-1.

4. Вычислите А1А2 + А3 – ... + (–1)N-1АN.

5. Вычислите А1А2А3 ... АN.

6. Вычислите А1 + 2А2 + 3А3 + ... + NАN.

7. Вычислите

8. Вычислите (|A1| –A1) + ... + (|AN| – AN).

9. Цилиндр объемом единица имеет высоту h. Определите радиус основания цилиндра для значений h, равных 0.5, 1, 1.5, ..., 5.

10. «Переверните» последовательность А1, А2, А3, ...,АN, т.е. поменяйте местами A1 с AN, A2 c AN-1 и т.д.

11. Получите таблицу температур от 0 до 100 оС и их эквивалентов по шкале Фаренгейта, используя для перевода формулу:

tFо = 1,8о + 32.

12. Вычислите таблицу значений функции у = ax2 + bx + c для значений x, изменяющихся от x0 до xn, с шагом h (x0 < xn).

13. Значения С1, ..., СN являются емкостями N-конденсато-ров. Определите емкости систем конденсаторов, которые получаются последовательным и параллельным соединением исходных конденсаторов.

14. Найдите периметр N-угольника, заданного координатами вершин на плоскости {(Xi; Yi)}, (i = 1, … < N).

15. Даны координаты {(xi; yi)}, (i = 1, ..., n) n заводов потребителей сырья и координаты места добычи сырья (хC; yC). Найдите расстояния от места добычи сырья до каждого завода, а также среднее арифметическое этих расстояний.

16. Дан массив A, состоящий из n элементов. Сформируйте «сглаженный» массив, заменив в исходном все элементы, кроме крайних, по формуле

При сглаживании используются лишь старые значения элементов массива.

17. Дан массив а, состоящий из n элементов. Вычислите a1, a1 + a2, a1 + a2 + a3, …, a1 + a2 + a3 + … an.

18. Дан массив а, состоящий из n элементов. Получите a1, -a2, a3, …, (-1)n-1 an.

19. Дан массив а, состоящий из n элементов. Получите массив b, где bk = ak + k!.

20. Дан массив а, состоящий из n элементов. Получите массив b, где bk = 2ak + k.

21. Даны массивы а и b, состоящие из n элементов каждый. Получите массив с, где ck = ak + bk.

22. Даны массивы а и b, состоящие из n элементов каждый. Получите массив с, где ck = ak · bk.

23. Дан массив а, состоящий из n элементов. Найдите сумму элементов массива, стоящих на нечетных местах.

24. Дан массив а, состоящий из n элементов, и число х. Вычислите значение полинома P = xn + a1xn-1 + … + an-1x + an.

25. Дан массив а, состоящий из n элементов. Получите новый массив, поменяв элементы, стоящие на четных местах, с элементами, стоящими на нечетных местах, т.е. a1 c a2, a3 c a4, a5 c a6 и т.д.

26. Даны массивы а и b, состоящие из n элементов каждый. Получите новые массивы a и b, элементы которых вычисляются по правилу: ai = ai + bi, bi = ai bi.

27. Даны массивы а и b, состоящие из n элементов каждый. Получите новые массивы a и b, элементы которых вычисляются по правилу: ai = bi, bi = ai.

28. Дан массив а, состоящий из n элементов. Найдите среднее арифметическое значение элементов массива, стоящих на четных местах.

29. Дан массив а, состоящий из n элементов. Найдите сумму a1 + 2a2 + 3a3 + … + nan.

30. Дан массив а, состоящий из n элементов. Найдите сумму a1 + 2!a2 + 3!a3 + … + n!an.

Лабораторная работа 5

Циклы с внутренними ветвлениями

Цель работы: формирование умений и навыков в разработке циклических программ с внутренними ветвлениями.

Что нужно знать для выполнения работы

1. Структуру цикла, назначение и порядок следования его отдельных частей.

2. Операторы цикла и условные операторы.

3. Описание и использование одномерных массивов.

Примеры выполнения задания лабораторной работы

Пример 1. Составьте программу нахождения наибольшего элемента данного массива а с указанием его номера.

Решение. Основная часть цикла – нахождение наибольшего из просмотренных элементов массива и очередного. Для нахождения наибольшего из всех элементов достаточно в блоке подготовки цикла положить наибольший элемент, равным а1, а затем повторить цикл, изменяя номер элемента массива от 2 до n с шагом 1 (рис. 5.1).

Рис. 5.1. Схема алгоритма программы

Текст программы

program lr5_1_1;

{Нахождение наибольшего элемента массива с указанием его номера}

{$APPTYPE CONSOLE}

uses

SysUtils;

const

maxn=100;

var

n,i,nommax:integer;

maxa:real;

a:array[1..maxn] of real;

begin

write(' Vvedite kolichestvo elementov massiva a ');

readln(n);

writeln('Vvedite elementi massiva a ');

for i:=1 to n do

begin

write('a[',i,']= ');

readln(a[i]);

end;

maxa:=a[1];

nommax:=1;

for i:=2 to n do

if maxa<a[i] then

begin

maxa:=a[i];

nommax:=i;

end;

writeln(' Massiv a ');

for i:=1 to n do

write(a[i]:8:2);

writeln;

writeln(' Naibolshiy element a [',nommax,']=',maxa:8:2);

readln;

end.

Возможен и другой подход к решению данной задачи. В цикле находится номер наибольшего, а за циклом и сам элемент по его номеру. Приведем только текст программы.

Текст программы

program lr5_1_2;

{Нахождение наибольшего элемента массива с указанием его номера}

{$APPTYPE CONSOLE}

uses

SysUtils;

const

maxn=100;

var

n,i,nommax:integer;

maxa:real;

a:array[1..maxn] of real;

begin

write('Vvedite kolichestvo elementov massiva a ');

readln(n);

writeln('Vvedite elementi massiva a');

for i:=1 to n do

begin

write('a[',i,']= ');

readln(a[i]);

end;

nommax:=1;

for i:=2 to n do

if a[nommax]<a[i] then

nommax:=i;

maxa:=a[nommax];

writeln('Massiv a');

for i:=1 to n do

write(a[i]:8:2);

writeln;

writeln('Naibolshiy element a[',nommax,']=',maxa:8:2);

readln;

end.

Задания

Разработайте алгоритм решения задачи и программу, его реализующую. Программу испытайте на контрольных примерах.

Как и в лабораторной работе 4 в данной работе можно считать заданиями повышенной сложности (второго уровня) задания, выполненные с использованием компонентов Delphi.

1. Проверьте, является ли данная числовая последовательность а1, a2, ..., an возрастающей.

2. Информация о температуре воздуха за месяц задана в виде массива. Определите, сколько раз температура опускалась ниже 0 оC. Число дней конкретного месяца введите с клавиатуры.

3. Информация о среднесуточной температуре воздуха за месяц задана в виде массива. Определите, сколько дней температура была ниже среднесуточной.

4. Дан числовой массив А, состоящий из n элементов. Найдите среднее арифметическое положительных элементов этого массива.

5. Дан числовой массив А, состоящий из n элементов. Все положительные элементы этого массива уменьшите на 0,5.

6. Дан числовой массив А, состоящий из n натуральных чисел. Определите количество элементов массива, которые больше заданного числа.

7. Дан числовой массив А, состоящий из n натуральных чисел. Определите количество элементов массива, являющихся нечетными числами.

8. Дан числовой массив А, состоящий из n натуральных чисел. Определите количество элементов массива, являющихся кратными 7.

9. Дан числовой массив А, состоящий из n натуральных чисел. Определите количество элементов массива кратных 3, но не кратных 5.

10. Дан числовой массив А, состоящий из n натуральных чисел. Определите количество элементов массива, удовлетворяющих условию Аi < (Ai-1 + Ai+1)/2.

11. Дан числовой массив А, состоящий из n натуральных чисел. Определите количество элементов массива, удовлетворяющих условию 2k < Ak < 3k.

12. Дан числовой массив А, состоящий из n натуральных чисел. Определите количество элементов массива, имеющих четные порядковые номера и являющихся нечетными числами.

13. Дан числовой массив А, состоящий из n натуральных чисел. Определите количество элементов массива, которые при делении на 7 дают остаток 1, 2 или 5.

14. Имеется n итоговых оценок студента. Определите, является ли студент отличником (все оценки не ниже 9).

15. Имеется n итоговых оценок студента. Определите, является ли студент неуспевающим (имеются оценки ниже 4).

16. Имеется n итоговых оценок студента. Определите количество шестерок, семерок, восьмерок, девяток и десяток.

17. Дана последовательность х1, х2, …, хn, упорядоченная в порядке возрастания, и вещественное у. Найдите такое k, что xk < yxk+1.

18. Имеется n итоговых оценок студента. Расположите эти оценки в следующем порядке: десятки, восьмерки, шестерки. Остальные оценки в произвольном порядке.

19. Дана последовательность х1, х2, …, хn. Определите количество таких троек, что xi-1 < xi < xi+1, (i = 2, n – 1).

20. Дана последовательность х1, х2, …, хn. Найдите номер элемента, который отличается от среднего арифметического значения элементов последовательности на минимальную величину.

21. Дана последовательность х1, х2, …, хn. Найдите наибольшую сумму подряд идущих элементов.

22. Дана последовательность х1, х2, …, хn. Определите количество элементов последовательности, больших среднего арифметического значения положительных элементов последовательности.

23. Дана последовательность натуральных чисел х1, х2, …, хn. Измените данную последовательность так, чтобы в начале стояли все четные, а затем – нечетные элементы последовательности.

24. Дана последовательность целых чисел х1, х2, …, хn. Измените данную последовательность так, чтобы в начале стояли все нулевые элементы, затем – отрицательные, а затем – положительные элементы последовательности.

25. Даны две последовательности чисел а1, а2, …, аn и b1, b2, …, bn. Определите, какое число раз встречается ситуация, когда аi > bi и аi+1 < bi+1, (i = 1, n – 1).

26. Даны две последовательности чисел а1, а2, …, аn и b1, b2, …, bn. Найдите i, при котором аi + bi – наибольшая из всех таких пар.

27. Даны две последовательности чисел а1, а2, …, аn и b1, b2, …, bn. Найдите количество пар аi, bi, (i = 1, n) таких, что оба числа в паре четные.

28. Дана последовательность х1, х2, …, хn. Найдите наибольший по модулю элемент последовательности с указанием его номера.

29. Дана последовательность х1, х2, …, хn. Поменяйте местами самый большой элемент с самым маленьким.

30. Дана последовательность х1, х2, …, хn. Найдите самый большой по модулю отрицательный элемент.

Дополнительные задания

1. Дана последовательность х1, х2, …, хn и число у. Определите количество элементов последовательности, которые меньше у.

2. Проверьте, является ли данная числовая последовательность а1, a2, ..., an убывающей.

3. Проверьте, является ли данная числовая последовательность а1, a2, ..., an невозрастающей.

4. Проверьте, является ли данная числовая последовательность а1, a2, ..., an неубывающей.

5. Проверьте, является ли данная числовая последовательность а1, a2, ..., an постоянной (все члены равны между собой).

6. Дана последовательность целых чисел a1, a2, ..., an. Найдите модуль наибольшего по модулю элемента последовательности.

7. Дана последовательность целых чисел a1, a2, ..., an. Найдите модуль наибольшего элемента последовательности.

8. Дана последовательность целых чисел a1, a2, ..., an. Найдите модуль наименьшего по модулю элемента.

9. Дана последовательность целых чисел a1, a2, ..., an. Найдите наименьший среди положительных элементов.

10. Дана последовательность целых чисел a1, a2, ..., an. Найдите наибольший среди отрицательных элементов.

11. Дана последовательность целых чисел a1, a2, ..., an. Найдите наибольший среди элементов, стоящих на четных местах.

12. Дана последовательность действительных чисел a1, a2, ..., an. Найдите сумму первых чисел, произведение которых меньше заданного числа b.

13. Дана последовательность действительных чисел a1, a2, ..., an. Получите из заданной последовательности другую, в которой сначала бы шли отрицательные члены исходной последовательности, а затем – неотрицательные.

14. Дана последовательность действительных чисел a1, a2, ..., an. Найдите сумму членов, удовлетворяющих условию |ak| > k.

15. Даны координаты xi и yi n точек на плоскости. Найдите количество точек, лежащих в первой четверти.

16. На плоскости заданы n точек своими координатами. Найдите наименьший радиус круга с центром в начале координат, которому принадлежат все n точек.

17. Многоугольник задан координатами своих вершин. Найдите длину самой короткой стороны.

Задания второго уровня

1. Многоугольник задан координатами своих вершин. Определите, находится ли точка с заданными координатами на одной из сторон многоугольника.

2. На плоскости заданы n точек своими координатами. Определите количество точек, которые не попали в круг заданного радиуса с центром в начале координат.

3. Многоугольник задан координатами своих вершин. Определите, является ли данный многоугольник выпуклым.

4. Многоугольник задан координатами своих вершин. Определите, принадлежит ли данная точка области многоугольника.

5. Многоугольник задан координатами своих вершин. Найдите площадь этого многоугольника.

6. Даны координаты концов n отрезков на числовой прямой. Определите отрезок, входящий в пересечение наибольшего количества заданных отрезков.

7. N треугольников заданы длинами своих сторон. Найдите треугольник максимальной площади.

8. N треугольников заданы длинами своих сторон. Найдите треугольник, у которого самый маленький радиус вписанной окружности.

9. N треугольников заданы длинами своих сторон. Найдите треугольник, у которого самый большой радиус описанной окружности.

10. N треугольников заданы длинами своих сторон. Найдите треугольник, у которого самая большая медиана.

Лабораторная работа 6

Подпрограммы (процедуры и функции)

Цель работы: формирование умений и навыков в разработке процедур и функций пользователя.

Что нужно знать для выполнения работы

1. Описание процедур и функций пользователя, типы параметров, использование процедур и функций.

Примеры выполнения задания лабораторной работы

Пример 1. Составьте программу нахождения числа сочетаний из n элементов по m по формуле

Решение. Для решения данной задачи составим процедуры Cnm и Fact (текст программы) (рис. 6.1).

На рис. 6.2 представлена схема алгоритма функции нахождения n!.

Рис. 6.1. Схема алгоритма головной программы

Рис. 6.2. Схема алгоритма функции нахождения n!

Текст программы

program lr6_1_1;

{Вычисление C из n по m =n!/(m!*(n-m)!)}

{$APPTYPE CONSOLE}

uses

SysUtils;

var

m,n:integer;

function fact(const n:integer):int64;

{Нахождение n!}

var

i:integer;

p:longint;

begin

p:=1;

for i:=1 to n do

p:=p*i;

fact:=p;

end;

begin

clrscr;

write('n и m = ');

readln(n,m);

writeln('n= ',n,' m= ',m,' Cmn= ',fact(n) div (fact(m)*fact(n-m)):6);

readln;

end.

Если нахождение n! оформить в виде подпрограммы-про-цедуры, то предыдущая программа могла бы быть следующей:

program lr6_1_2;

{Вычисление C из n по m =n!/(m!*(n-m)!)}

{$APPTYPE CONSOLE}

uses

SysUtils;

var

m,n:integer;

fn,fm,fn_m,Cnm:int64;

procedure fact(const n:integer;var p:int64);

{Нахождение n!}

var

i:integer;

begin

p:=1;

for i:=1 to n do

p:=p*i;

end;

begin

write('n и m = ');

readln(n,m);

fact(n,fn);{Обращение к процедуре Fact для нахождения}

fact(m,fm);{факториалов n,m,n-m}

fact(nm,fn_m);

Cnm:=fn div (fm*fn_m);{Нахождение числа сочетаний из n по m}

writeln('n= ',n,' m= ',m,' Cmn= ',Cnm:6);

readln;

end.

Оформим вычисление искомой величины в виде функции Cmn, содержащей внутри себя описание функции вычисления факториала.

program lr6_1_3;

{Вычисление C из n по m =n!/(m!*(n-m)!)}

{$APPTYPE CONSOLE}

uses

SysUtils;

var

m,n:integer;

function Cmn(const m,n:integer):int64;

function fact(const n:integer):int64;

var

i:integer;

p:int64;

begin

p:=1;

for i:=1 to n do

p:=p*i;

fact:=p;

end;

begin

Cmn:=fact(n) div (fact(m)*fact(n-m));

end;

begin

write('m и n = ');

readln(m,n);

writeln('m= ',m,' n= ',n,' Cmn= ',Cmn(m,n):6);

readln;

end.

Надо заметить, что приведенные примеры не очень удачны с точки зрения эффективности алгоритмов. Понятно, что трижды вычислять заново факториалы чисел n, m, n-m совсем не обязательно.

Рассмотрим следующий пример.

Пример 2. Составьте программу перевода натуральных чисел из одной системы счисления в другую. Переводимое число необходимо вводить в форме исходной системы счисления. Системы счисления, из которой и в которую выполняется перевод, должны принимать значения от двух до шестнадцати.

Обратите внимание на то, в качестве фактического параметра, передаваемого по значению, может быть выражение, в частности вызов функции.

Текст программы

program Project1;

//перевод натуральных чисел из одной системы счисления в другую

{$APPTYPE CONSOLE}

uses

SysUtils;

var

cs1,cs2:integer;

TD:string;

{функция перевода Dec числа в любую сс}

function FromDec(n:integer;const r:integer):string;

var

s:String;

const

digit:string[16]='0123456789ABCDEF';

begin

s:='';

repeat

s:=digit[(n mod r)+1]+s;

n:=n div r;

until n=0;

FromDec:=s;

end;

{функция перевода любой сс в Dec}

function ToDec(n:string;const r:integer):integer;

var

m,i:integer;

const

digit:string[16]='0123456789ABCDEF';

begin

m:=0;

while n[1]='0' do

delete(n,1,1);

for i:=1 to length(n) do

m:=m*r+pos(n[i],digit)-1;

ToDec:=m;

end;

{основная программа}

begin

writeln('Iz kakoy systemi: ');

repeat

readln(cs1);

until (cs1>=2) and (cs1<=16);

writeln('vvedite chislo v sootvetstvujushey systeme: ');

readln(TD);

writeln('V kakuju systemu: ');

repeat

readln(cs2);

until (cs2>=2) and (cs2<=16);

writeln('Perevod iz ',cs1,' ss --> ',cs2,' ss:');

writeln(FromDec(ToDec(TD,cs1),cs2));

Readln;

end.

Рассмотрим пример использования в качестве параметра функции элемента процедугного типа.

Пример 3. Составьте программу нахождения определенного интеграла на отрезке [a,b] методом трапеций с использованием функции в качестве параметра.

Текст программы

program Project1;

//Вычисление интеграла методом трапеций

{$APPTYPE CONSOLE}

uses

SysUtils;

type

tfunc=function(x:Real):Real; //процедурный тип

var

a,b,x:Real;

function f1(x:Real):Real; far;

begin

f1:=Sin(x);

end;

function f2(x:Real):Real; far;

begin

f2:=cos(x);

end;

function f3(x:Real):Real; far;

begin

f3:=sqr(x);

end;

function trap(func:tfunc;a,b:Real;n:Integer):real;

//Метод трапеций

var

h,y:Real;

begin

y:=(func(a)+func(b))/2;

h:=(b-a)/n;

x:=a+h;

while x<=b-h do

begin

y:=y+func(x);

x:=x+h;

end;

trap:=y*h;

end;

begin

Writeln('Integral ot sin(x)dx= ',trap(f1,0,pi/2,1000):8:4);

Writeln('Integral ot cos(x)dx= ',trap(f2,0,pi/2,1000):8:4);

Writeln('Integral ot sqr(x)dx= ',trap(f3,0,1,1000):8:4);

readln;

end.

Следующий пример иллюстрирует использование параметра процедуры без типа.

Пример 4. Составьте программу нахождения суммы элементов одномерного и двухмерного массивов с помощью одной процедуры с использованием параметра процедуры без типа.

Текст программы

program Project1;

//Пример использования нетипизпрованных параметров

//Нахождение суммы элементов массива

{$APPTYPE CONSOLE}

uses

SysUtils;

type

tmas1=array[1..100] of Real;

tmas2=array[1..10,1..10] of Real;

var

a1:tmas1;

a2:tmas2 absolute a1;

m,n:Integer;

s:Real;

procedure vvodm1(var mas;var n:integer);

//Ввод элементов одномерного массива

var

fin:TextFile;

i:Integer;

a:array[1..100] of Real absolute mas;

begin

AssignFile(fin,'File1.txt');

Reset(fin);

Readln(fin,n);

for i:=1 to n do

read(fin,a[i]);

CloseFile(fin);

end;

procedure vvodm2(var mas;var m,n:integer);

//Ввод элементов двухмерного массива

var

fin:TextFile;

i,j:Integer;

a:array[1..10,1..10] of Real absolute mas;

begin

AssignFile(fin,'File2.txt');

Reset(fin);

Readln(fin,m,n);

for i:=1 to m do

for j:=1 to n do

read(fin,a[i,j]);

CloseFile(fin);

end;

procedure sum(var mas;n:integer;var s:Real);

//Нахождение суммы элементов массива

var

i:Integer;

a:array[1..100] of Real absolute mas;

begin

s:=0;

for i:=1 to n do

s:=s+a[i];

end;

begin

vvodm1(a1,n);

sum(a1,n,s);

Writeln('s1= ',s:8:2);

vvodm2(a2,m,n);

sum(a2,m*n,s);

Writeln('s2= ',s:8:2);

readln;

end.

Задания

Разработайте алгоритм и программу, реализующую этот алгоритм.

При выполнении данного задания необходимо использовать процедуры и функции с параметрами.

1. Два натуральных числа заданы последовательностями своих цифр. Получите последовательность цифр, представляющую разность данных чисел.

2. Дано натуральное число m. Укажите все тройки натуральных чисел x, y и z, удовлетворяющие следующему условию: m = x3 + y3 + z3.

3. Дано натуральное число P. Определите, какая цифра в этом числе встречается чаще других.

4. Определите количество номеров машин, содержащих три одинаковые цифры (номер машины четырехзначный).

5. Определите количество номеров машин, содержащих две одинаковые цифры (номер машины четырехзначный).

6. Напишите программу нахождения следующего за данным совершенного числа.

Совершенным называется число, сумма делителей которого, не считая самого числа, равна этому числу. Первое совершенное число 6 (6 = 1 + 2 + 3).

7. Проверьте, является ли данное натуральное число простым.

8. Дано натуральное число Р. Напишите программу нахождения всех натуральных чисел, не превосходящих Р, которые можно представить в виде произведения двух простых чисел.

9. Дано натуральное число P, заданное в восмеричной системе счисления. Напишите программу перевода этого числа в двоичную систему счисления.

10. Дано натуральное число P, заданное в шестнадцатеричной системе счисления. Переведите его в двоичную систему счисления.

11. Дано натуральное число P. Найдите все «совершенные» числа, не превосходящие Р.

«Совершенными» называются натуральные числа, сумма делителей, не включая самого числа, которых равна самому числу.

12. Дано натуральное n-значное число P. Проверьте, является ли данное число палиндромом (перевертышем).

13. Дано натуральное n-значное число P. Верно ли, что данное число содержит три одинаковые цифры?

14. Дано натуральное n-значное число P. Верно ли, что данное число содержит две одинаковые цифры?

15. Дано натуральное число P. Проверьте, кратно ли P трем, используя признак делимости на 3.

16. Дано натуральное число P. Проверьте, кратно ли P одиннадцати, используя признак делимости на 11 (знакопеременная сумма его цифр делится на 11).

17. Дано натуральное число P. Разложите данное число на простые множители.

18. Дано натуральное число P. Найдите все простые числа, не превосходящие числа P.

19. Дано натуральное число P. Найдите все натуральные числа, не превосходящие Р, которые нельзя представить в виде суммы двух простых чисел.

20. Дано натуральное число P. Найдите все делители числа P.

21. Дано натуральное число P. Найдите сумму цифр числа P.

22. Дано натуральное число P. Выбросите из записи числа P цифры 0, оставив прежним порядок остальных цифр.

23. Дано натуральное число P. Проверьте, кратно ли число P девяти, используя признак делимости на 9.

24. Два натуральных числа заданы последовательностями своих цифр. Получите последовательность цифр, представляющую сумму данных чисел.

25. Дано натуральное число n. Вычислите Sn = 1·2 + 2·3·4 + + … + n · (n + 1) · … · 2n.

26. Дана обыкновенная дробь Сократите данную дробь.

27. Напишите программу сложения двух обыкновенных несократимых дробей и Результат представить в виде несократимой дроби.

28. Напишите программу вычитания двух обыкновенных несократимых дробей и Результат представить в виде несократимой дроби.

29. Напишите программу умножения двух обыкновенных несократимых дробей и Результат представить в виде несократимой дроби.

30. Напишите программу деления двух обыкновенных несократимых дробей и Результат представить в виде несократимой дроби.

Задачи второго уровня

1. Введите два натуральных числа m и n (m > n). Покажите на экране правило деления «уголком» числа m на число n.

2. Введите два натуральных числа m и n (m > n). Покажите на экране правило умножения «в столбик» числа m на число n.

3. Если последнюю цифру некоторого натурального числа n перенести и поставить перед первой цифрой этого числа, то получится число, в два раза больше, чем n. Найдите самое маленькое из таких чисел.

4. Найдите все решения числового ребуса.

МУХА

+ МУХА

МУХА

СЛОН

5. Дано натуральное число n. Выясните, можно ли представить данное число в виде произведения трех последовательных натуральных чисел.

6. Постройте n-ю строку треугольника Паскаля.

7. Результатом деления натурального числа m на натуральное число n является либо конечная десятичная дробь, либо бесконечная периодическая дробь. Напишите программу нахождения этого результата. Если дробь бесконечная, то найти все цифры до первого периода и цифры периода

8. Определите количество «счастливых» талонов для проезда в городском транспорте.

«Счастливым» считается талон, у которого сумма первых трех цифр равна сумме трех других цифр.

9. Два натуральных числа заданы последовательностями своих цифр. Получите последовательность цифр, представляющую произведение данных чисел.

10. Два натуральных числа заданы последовательностями своих цифр. Получите последовательность цифр, представляющую частное данных чисел.

11. Найдите все натуральные числа, которые в k раз больше суммы своих цифр.

12. Данное натуральное число N замените суммой квадратов его цифр. Произведите K таких замен.

13. Данное натуральное число N переведите из десятичной системы счисления в двоичную.

14. Данную десятичную дробь переведите в двоичную систему счисления.

15. Данную двоичную дробь переведите в десятичную систему счисления.

16. Дано натуральное число n. Найдите все меньшие n числа Мерсена.

Простое число называется числом Мерсена, если оно может быть представлено в виде 2р – 1, где р – тоже простое число.

17. Найдите все простые делители данного натурального числа.

18. Для данного натурального числа найдите произведение его простых делителей, взятых по одному разу.

19. На данном отрезке [a;b] найдите все числа «близнецы». Два простых числа называют «близнецами», если разность между ними равна 2.

20.Даны два натуральных числа N и M. Найдите все меньшие N натуральные числа, квадрат суммы цифр которых равны M.

21. Дано натуральное число N≤50. Найдите все способы выплаты данной суммы с помощью монет достоинством 1, 5, 10.

22. Дано натуральное число N. Найдите все составные натуральные числа, меньшие N.

23. Проверьте, является ли данное натуральное число палиндромом.

24. Дано натуральное число N. Найдите все автоморфные натуральные числа, меньшие N. Автоморфными называются числа, последние цифры квадрата которых совпадают с самим числом. Например: 52 = 25, 252 = 625.

25. На данном отрезке [a;b] найдите все пары дружелюбных чисел. Два натуральных числа называют дружелюбными, если каждый из них равен сумме всех делителей другого, за исключением самого числа.

Лабораторная работа 7

Сложные циклы. Обработка массивов

Цель работы: формирование умений и навыков в разработке сложных циклических алгоритмов обработки массивов с использованием процедур и функций пользователя; использование текстовых файлов для ввода-вывода.

Что нужно знать для выполнения работы

1. Структуру вложенного цикла.

2. Метод пошаговой детализации (последовательного уточнения) разработки алгоритмов.

3. Особенности использования массивов в качестве параметров в процедурах и функциях.

4. Объявление и использование текстовых файлов.

Примеры выполнения задания лабораторной работы

Пример 1. Составьте программу перемножения матриц Am×n и Bn×l. В результате должна получиться матрица Cm×l.

Решение. Для разработки алгоритма воспользуемся методом пошаговой детализации (рис. 7.1 – 7.5).

Рис. 7.1. Схема алгоритма

головной программы

(первый шаг

детализации)

Рис. 7.2. Схема алгоритма

процедуры ввода

исходных данных

(второй шаг детализации)

Выполним детализацию блока «Ввод матрицы А» (рис. 7.3).

Осталось выполнить детализацию блока «Ввод i-й строки матрицы А» (рис. 7.4).

Рис. 7.3. Схема алгоритма процедуры ввода исходных

данных (третий шаг детализации)

Рис. 7.4. Схема алгоритма процедуры ввода исходных

данных (четвертый шаг детализации)

Теперь нетрудно собрать детальную схему ввода матрицы (рис. 7.5).

Рис. 7.5. Схема алгоритма процедуры ввода исходных

данных (результат детализации)

Алгоритм процедуры вывода матрицы аналогичен алгоритму ввода, с той лишь разницей, что перед выводом матрицы выводится заголовок и после вывода очередной строки происходит переход на следующую.

Разработаем алгоритм процедуры перемножения матриц. Первый шаг детализации мы уже выполнили – рис. 7.1.

Для того чтобы умножить матрицу А на матрицу В достаточно умножить каждую строку матрицы А на матрицу В (рис. 7.6).

Выполним детализацию блока «Умножить i-ю строку А на В, получая i-ю строку С» (рис. 7.7).

Рис. 7.6. Схема алгоритма

процедуры

перемножения матриц

(второй шаг

детализации)

Рис. 7.7. Схема алгоритма

процедуры

перемножения матриц

(третий шаг

детализации)

Выполним детализацию блока «Умножить i-ю строку А на j-й столбец В, получая Сij» (рис. 7.8).

Рис. 7.8. Схема алгоритма процедуры перемножения

матриц (четвертый шаг детализации)

Собрав результаты детализации, получим детальную схему процедуры перемножения матриц (рис. 7.9).

Рис. 7.9. Схема алгоритма процедуры перемножения

матриц (результат детализации)

Текст программы

program lr7_1_1;

{Нахождение произведения матрицы Amxn на матрицу

Bnxl, получая матрицу Cmxl}

{$APPTYPE CONSOLE}

uses

SysUtils;

type

matr =array[1..10,1..10] of real;

stroka =string[30];

var

a,b,c:matr; {исходные матрицы и матрица результата}

i,j,k,l,m,n:integer;

flag:boolean;

procedure vvodmatr(var a:matr;const namefile:stroka;var m,n: integer;fl1,fl2:boolean);

{Ввод матрицы}

var

i,j:integer;

fin:text;

begin

if fl1 then

begin

assign(fin,namefile);

reset(fin);

end;

readln(fin,m,n);

for i:=1 to m do

begin

for j:=1 to n do

read(fin,a[i,j]);

readln(fin);

end;

if fl2 then

close(fin);

end;

procedure vivodmatr(namefile:stroka;const a:matr;const m,n:integer;zag: stroka; Const flag:boolean);

{Вывод матрицы}

var

i,j:integer;

fout:text;

begin

assign(fout,namefile);

if flag then

rewrite(fout)

else

append(fout);

writeln(fout,zag);

for i:=1 to m do

begin

for j:=1 to n do

write(fout,a[i,j]:8:2);

writeln(fout);

end;

if namefile='con' then {если вывод на экран}

readln

else

close(fout);

end;

procedure multmatr(const a,b:matr;var c:matr;const m,n,l:integer);

{Нахождение произведения матрицы}

var

i,j,k:integer;

s:real;

begin

for i:=1 to m do

for j:=1 to l do

begin

s:=0;

for k:=1 to n do

s:=s+a[i,k]*b[k,j];

c[i,j]:=s;

end;

end;

begin

vvodmatr(a,'matra.txt',m,n,True,false);

vvodmatr(b,'matra.txt',n,l,False,true);

flag:=true;

vivodmatr('matrc.txt',a,m,n,'Матрица A',flag);

flag:=false;

vivodmatr('matrc.txt',b,n,l,'Матрица B',flag);

multmatr(a,b,c,m,n,l);

flag:=false;

vivodmatr('matrc.txt',c,m,l,'Матрица C=A*B',flag);

end.

Решим данную задачу, используя компоненты Delphi. Упростим задачу, полагая, что матрицы будут квадратными и целочисленными. Но кроме произведения матриц найдем сумму и разность матриц.

Поскольку приложение будет иметь достаточно много функций, создадим меню с помощью компонента MainMenu. Для выбора файла для ввода данных воспользуемся компонентом OpenDialog, а для сохранения исходных матриц компонентом Savedialog страницы Dialogs. Для задания размерности матриц воспользуемся компонентом SpinEdit страницы Samples. Если исходные данные вводятся с клавиатуры, то сначала необходимо задать параметры соответствующих компонентов StringGrid. При вводе из файла эти параметры устанавливаются автоматически. Пока матрицы не определены, операции над ними выполнять нельзя, поэтому соответствующие функции не доступны.

Исходная форма имеет вид (рис. 7.10):

Рис.7.10 Форма приложения примера 7_1_2

Текст Unit1

unit Unit1;

//Операции над матрицами