Основы алгоритмизации и программирования
Методические указания к выполнению лабораторных работ
Фрейз И.И. |
Орск 2008
Содержание
Лабораторная работа №1. Линейные программы. 3
Лабораторная работа №2. Разветвляющиеся вычислительные процессы. Условный оператор IF. 8
Лабораторная работа №3. Организация циклов. 30
Лабораторная работа №4. Организация циклов.(продолжение) 33
Лабораторная работа №5. Одномерные массивы.. 39
Лабораторная работа №6. Преобразование массивов. 43
Лабораторная работа №7. Сортировка массива. 48
Лабораторная работа №8. Сортировка массива. 49
Лабораторная работа №9. Сортировка массива. 50
Лабораторная работа №10. Двумерные массивы. 52
Лабораторная работа №11: Подпрограммы. 54
Лабораторная работа №12. Использование подпрограмм в Паскале. 57
Лабораторная работа №13-14. Строки. 60
Лабораторная работа № 15. Исследовательско - практическая работа. 64
Лабораторная работа №16. Решение задач. 67
Лабораторная работа №17. Анализ самостоятельной работы. Работа над ошибками. 69
Лабораторная работа18. Использование множеств для решения задач в Паскале. 72
Лабораторная работа №19. Множества . (Продолжение) 74
Лабораторная работа №20. Тип данных Record (запись). 76
Лабораторная работа №21. Решение задач на типизированные файлы. 80
Лабораторная работа №22. Графика Турбо – Паскаля. 83
Лабораторная работа №23. Программирование в графическом режиме. 84
Содержание. 85
Лабораторная работа №1. Линейные программы.
Цель: Освоить работу в среде Turbo Pascal и научиться писать самые простые программы – линейные.
Ход работы.
Для начала рассмотрим программу, выполняющую расчет по простейшей формуле.
Программа перевода суммы в рублях в доллары и евро.
program valuta;
const
kurs_dollar=29.8;
kurs_evro=36.6;
var
rouble,dollar,evro:real;
begin
writeln('Введите сумму в рублях');
readln(rouble);
dollar:=rouble/kurs_dollar;
evro:=rouble/kurs_evro;
writeln('Рублей: ',rouble:8:2,
' Долларов: ',dollar:7:2,
'Евро: ',evro:7:2);
readln; end.
Пример программы расчета по заданной формуле:
program formula;
var
a,x,y:real; {Исходные данные и результат}
temp:real; {Промежуточная переменная}
begin
writeln('Введите a и x:');
readln(a,x);
writeln('Исходные данные:'); {Контрольный вывод исходных данных}
writeln(a= ',a:6:2.' x=',x:6:2);
temp:=2*sin(2*a)/cos(2*a);
y:=(sqrt(pi*x)-exp(0.2*sqrt(a))+temp+
1.6e3*ln(sqr(x))/ln(10))/
(temp*1/cos(x));
writeln('Результат: y=',y:6:2);
readln;
end.
Итоги
1. Приступая к написанию программы, четко определите, что является ее исходными данными и что требуется получить в результате.
2. Выбирайте тип переменных с учетом диапазона и требуемой точности представления данных.
3. Давайте переменным имена, отражающие их назначение.
4. Ввод с клавиатуры предваряйте приглашением, а выводимые значения – пояснениями. Для контроля сразу же после ввода выводите исходные данные на дисплей.
5. До запуска программы подготовьте тестовые примеры, содержащие исходные данные и ожидаемые результаты. Отдельно проверьте реакцию программы на неверные исходные данные.
6. При записи выражений обращайте внимание на приоритет операций.
7. Разделяйте данные при вводе пробелами, символами перевода строки или табуляции.
8. Тщательно форматируйте текст программы и снабжайте его содержательными комментариями.
Индивидуальное задание
Написать программу для расчета по двум формулам. Предварительно подготовьте тестовые примеры для второй формулы с помощью калькулятора (результаты вычисления по обеим формулам должны совпадать).
Вариант 1
…………………………………………………………………………………………………
Вариант 2
…………………………………………………………………………………………………
Вариант 3
…………………………………………………………………………………………………
Вариант 4
…………………………………………………………………………………………………
Вариант 5
…………………………………………………………………………………………………
Вариант 6
…………………………………………………………………………………………………
Вариант 7
…………………………………………………………………………………………………
Вариант 8
…………………………………………………………………………………………………
Вариант 9
…………………………………………………………………………………………………
Вариант 10
…………………………………………………………………………………………………
Вариант 11
…………………………………………………………………………………………………
Вариант 12
…………………………………………………………………………………………………
Вариант 13
…………………………………………………………………………………………………
Вариант 14
…………………………………………………………………………………………………
Вариант 15
…………………………………………………………………………………………………
Вариант 16
…………………………………………………………………………………………………
Вариант 17
…………………………………………………………………………………………………
Вариант 18
…………………………………………………………………………………………………
Вариант 19
…………………………………………………………………………………………………
Вариант 20
Цикл с предусловием while
В цикле с предусловием проверка условия продолжения цикла выполняется перед телом цикла
(Рис.2) Если при входе в цикл условие не выполняется, он не будет выполнен ни разу. Оператор цикла имеет вид
While выражение do оператор
Выражение должно быть логического типа. Если результат вычисления выражения равен true, выполняется расположенный после служебного слова do простой или составной оператор. Эти действия повторяются до того момента, пока результатом выражения не станет значение false. После окончания цикла управление передается следующему за ним оператору.
Задача 3.1. Печать таблицы значений функции
Написать программу печати таблицы значений функции sin для аргумента, изменяющегося в заданных пределах с заданным шагом.
Исходными данными являются начальное значение аргумента Х , конечное значение аргумента и шаг изменения аргумента dX. Все величины – вещественные и могут принимать любые значения на числовой оси. Результатом работы программы должна быть таблица, состоящая из двух столбцов – значений аргумента и соответствующих им значений функции.
program tabl_fun;
var
Xn,Xk:real; {Начальное и конечное значения аргумента}
dx:real; {Шаг изменения аргумента}
x,y:real; {текущие значения аргумента и функции}
begin
writeln('Vvedite Xn,Xk,dX'); {Приглашение ко вводу данных}
readln(Xn,Xk,dX); {ввод исходных данных}
writeln('___________________________'); {заголовок таблицы}
writeln('______X_____|_______Y______');
writeln('___________________________');
x:=Xn; {первое значение аргумента =Хn}
while x<=Xk do begin {заголовок цикла}
y:=sin(x); {вычисление значения функции}
writeln('|',x:7:2,' |',y:7:2,' |'); {вывод строки табл.}
x:=x+dx; {переход к следующему значению аргумента} end;
writeln('___________________________') ;
readln; end.
Выполнить программу для Хn=-4, Xk=4, dx=1.
Индивидуальные задания
Задание 1
Вычислить и вывести на экран в виде таблицы значения функции, заданной графически (см. задание 1 лабораторной работы №2), на интервале от до с шагом dx. Интервал и шаг задать таким образом, чтобы проверить все ветви программы. Таблицу снабдить заголовком и шапкой.
Задание 2
Для десяти выстрелов, координаты которых задаются с клавиатуры, вывести текстовые сообщения о попадании в мишень из задания 2 лабораторной работы «2.
Лабораторная работа №4. Организация циклов.(продолжение)
Задача 3.2. Вычисление суммы ряда
…………………………………………………………………………………………………………………
Написать программу вычисления значения функции sin с помощью степенного ряда с точностью по формуле
Этот ряд сходится на всей числовой оси. Для достижения заданной точности требуется суммировать члены ряда до тех пор, пока абсолютная величина очередного члена не станет меньше или равна .
Запишем в общем виде формулу для вычисления n – го члена ряда:
На первый взгляд может показаться, что придется организовать циклы для расчета факториала и степеней. При этом можно получить очень большие числа, при делении которых друг на друга произойдет потеря точности, поскольку количество значащих цифр, хранимых в ячейке памяти, ограничено. Кроме того, большие числа могут переполнить разрядную сетку.
Мы поступим по-другому. Легко заметить, что (n+1) – й член ряда вычисляется после n-го, поэтому программа получится более простой и эффективной, если находить член ряда не «с нуля», а умножением предыдущего члена на некоторую величину.
Найдем эту величину. Для этого сначала запишем формулу для (n+1)-го члена ряда, подставив в предыдущее выражение (n+1) вместо n:
Теперь найдем выражение, на которое надо будет умножить C , чтобы получить С :
=
Запишем алгоритм вычисления суммы ряда в словесной форме:
1. Ввести исходные данные (аргумент и точность).
2. Задать начальные значения номеру члена ряда, первому члену ряда и сумме ряда.
3. Организовать цикл в котором:
1) Вычислить очередной член ряда;
2) Добавить его к сумме ряда;
3) Перейти к следующему члену ряда;
4) Проверить, достигнута ли точность вычислений.
4. Вывести значение функции.
Определить заранее, сколько членов ряда потребуется просуммировать для достижения точности, невозможно, поскольку при анализе условия выхода используется переменная, вычисляемая на каждой итерации цикла. Такие циклы потенциально опасны, поэтому для предотвращения зацикливания полезно предусмотреть аварийный выход из цикла по достижении некоторого максимально допустимого количества итераций с печатью предупреждающего сообщения.
Ниже приведен текст программы с комментариями. На каждой итерации требуется хранить значение одного члена ряда, поэтому все члены ряда формируются в одной и той же переменной с:
program sinus;
const MaxIter=500; {максимально допустимое количество итераций}
var x,eps:double; {аргумент и точность}
c,y:double; {член ряда и его сумма}
n:integer; {номер члена ряда}
done:boolean; {признак достижения точности}
begin
writeln('Введите аргумент и точность:');
readln(x,eps);
done:=true;
c:=x; {первый член ряда}
y:=c; {начальное значение суммы}
n:=1;
while abs(c)>eps do begin
c:=-c*sqr(x)/2/n/(2*n+1); {очередной член ряда}
y:=y+c; {добавление члена ряда к сумме}
inc(n); {переход к следующему члену ряда}
if n<=MaxIter then continue;
writeln('ryd rasxoditsya');
done:=false;break {аварийный выход из цикла}
end;
if done then
writeln('Аргумент:',x:10:6,#13#10,
'Значение функции:',y:10:6,#13#10,
'Вычислено с точностью',eps:8:6,'за',n,'итераций');
readln;
end.
Первый член ряда равен х, поэтому, чтобы при первом проходе цикла значение второго члена вычислялось правильно, начальное значение n должно быть равно 1.Максимально допустимое количество итераций удобно задать с помощью именованной константы. Для аварийного выхода изх цикла применяется процедура break, которая обеспечивает переход к первому после цикла оператору. Символы #13#10 при выводе вызывают переход на следующую строку.
Контрольный пример для х=7.5 и eps=0,00001.
Индивидуальное задание
Вычислить и вывести на экран в виде таблицы значения функции, заданной с помощью ряда Тейлора, на интервале от до с шагом dx с точностью . Таблицу снабдить заголовком и шапкой. Каждая строка таблицы должна содержать значение аргумента, значение функции и количество просуммированных членов ряда.
1.
2.
3.
4.
5.
6.
7.
8. x>1.
9.
10. arthx=
11. arthx=
12.
13.
14.
15.
16.
17.
18.
19. arcsinx =
20.
21.
22.
23.
24.
25.
26.
27.
28. x>1.
29.
30. arthx=
31. arthx=
32.
Описание массива
Чтобы описать массив, надо сообщить компилятору:
o сколько в нем элементов;
o какого типа эти элементы;
o как они нумеруются.
Массив не является стандартным типом данных, поэтому он задается в разделе описания типов:
type имя_типа = аrrау [тип_индекса] of тип_элемента
Здесь tуре — признак начала раздела описания типов, array и of — ключевые слова, тип индекса задается в квадратных скобках, например:
type mas = аrrау [1 .. 10] of rеаl;
Здесь описан тип массива из вещественных элементов, которые нумеруются от 1 до 10. После задания типа его можно использовать точно так же, как любой стандартный тип, то есть описывать с его помощью переменные, например:
var a, b : mas;
Компилятор, встретив такой оператор, выделит по 60 байт под каждый из массивов а и b (10 элементов по 6 байт). К элементу массива обращаются, указав его имя, за которым в квадратных скобках записывается порядковый номер элемента:
а[4] b[i]
С элементом массива можно делать все, что допустимо для переменных того же типа.
ВНИМАНИЕ: Тип элементов массива может быть любым, кроме файлового, тип индексов — интервальным, перечисляемым или byte. При описании типа индексов можно использовать только константы или константные выражения. Переменные не допускаются, потому что место под массив резервируется до выполнения программы.
Если тип массива используется только в одном месте программы, можно задать тип прямо при описании переменных, например:
const n = 100:
var x,у : array [1 . . n] of integer;
С массивами в целом можно выполнять только одну операцию — присваивание. При этом массивы должны быть одного типа, например:
х := у;
Вариант 1.
1. Имеется двумерный массив целых положительных чисел. Найти номер строки, для которой среднеарифметическое значение ее элементов максимально.
2. Составить алгоритм, подсчитывающий для заданного текста частоту вхождения всех букв русского алфавита.
Вариант 2.
1. Найти номер строки и столбца двумерного массива для максимального элемента этого массива.
2. Написать программу, которая введенное с клавиатуры слово напечатает следующим образом:
школа
к л
О о
л л
алокш
Вариант 3.
1. Найти сумму элементов двумерного массива вещественных чисел с(15,15), расположенных на главной диагонали.
. 2. Написать программу, которая перевернет введенное с клавиатуры слово или фразу.
Домашнее задание на данном уроке не задается.
Лабораторная работа №17. Анализ самостоятельной работы. Работа над ошибками.
Цель: проанализировать наиболее характерные ошибки, развивать навыки самостоятельного анализа проблем и выбора метода их решения.
Ход урока:
На данном уроке необходимо проанализировать ошибки, допущенные студентами в ходе выполнения самостоятельной работы, разобрать причины, вызвавшие эти ошибки. Провести работу по исправлению допущенных ошибок. В том случае, если с какой-либо из задач не справилось большинство учащихся, ее выполнявших, то целесообразно привести решение этой задачи на доске с подробным анализом решения.'
После исправления ошибок предлагаем учащимся проверить работу их программ на компьютере (провести тестирование программ).
Примерные варианты решения задач:
Вариант 1.
1. program vll; uses crt;
var a:array[1..50,1..50] of integer; i,j,n,m,s,k:integer; sr:real; begin clrscr;
write('ввeдитe количество строк и столбцов'); readln (m,n); randomize; for i:=l to m do for j:=l to n do a[i,j]:=random(50); clrscr;
writeln ('исходный массив'); for i:=l to m do
begin forj:=l to ndo write(a[ij]:4); writeln; end; sr:=-5; {так как массив положительных чисел}
writeln; for i:=l to mdo \ begin .^' s:=0; ' forj:=l to ndo
J s:=s-i-a[i,j]; writeln(s/n:6:2); {распечатка средних арифметических для контроля} ifs/n>sr then begin
sr:=s/n; k:=i; end; end;
writeln;
writeln('иcкoмaя строка-' ,k); repeat until keypressed; end.
2.program vl 2;
uses crt;
var fr,bukv,z:string; a:array[l..32] of integer;
i,k: integer;
{определение номера буквы}
procedure por(var znach: integer;x:string;bukv:string); • var i: integer;
begin
znach:=0
i:=l;
while (i<=32) and (znach=0) do
if x=copy(bukv,i, 1) then znach:=i
else i:=i+l; end;
{исполняемая часть} begin clrscr;
wгiteln('ввeдитe фразу'); readln(fr);
Ьику:='абвгдежзийклмнопрстуфхцчшщъыьэюя'; for i:=l to 32 do a[i]:=0; for i:=l to length(fr) do begin por(k,copy(fr,i,l),bukv); {просмотр фразы и определение вхождения}
ifk>Othena[k]-a[k]+l;
end; writeln;
write ('абвгдежзийклмнопрстуфхцчшщъэюя'); writeln;
for i:=l to 32 do write(a[i]:2); repeat until keypressed; end.
Вариант 2.
1. program v21; uses crt;
vara:array[1..50,1..50] of real; i,j,n,m,k,l:integer; max:real;
begin : clrscr;
write('ввeдитe размер массива m,n'); readln(m,n); randomize; I for i:=l to mdo r forj:-l to n do ' a[ij]:=random(50); ' clrscr;
; writpln ('исходный массив'); 1; for i:=l to mdo •:■ begin
for j:=l ton do
write(a[ij]:6:2);
writeln;
end; max:=a[l,ll;
for i:=l to m do
forj.-l ton do
if max<a[i,j] then begin
max:=a[i,j];k:=i;l:=j; end;
writeln('мaкcимaльный элемент равен ',max:6:2,');
writeln( 'oh находится в ', к,'строке ', 1 'столбце');
repeat until keypressed;
end.
2.
program v22; uses crt;
yar fr:string;i,n,k:integer; begin clrscr
writeln('ввeдитe слово'); ; read(fr); gotoxy(4,12); write(fr);
for i:=2 to length(fr) do begin gotoxy (4,11 +i); write(copy(fr,i, 1)) gotoxy(4+length(fr)-l ,11+i); write(copy(fr,length(fi-)-i+1,1)); end; for i:=2 to length(fr)-l do begin
gotoxy(3+i,l l+length(fr)); write(copy(fr,length(fr)-i+l,l)); end; repeat until keypressed; end.
Вариант 3.
1. program v31;
uses crt; ,
var c:array[1..15,1..15] ofreal; ij:integer; s:real; begin clrscr; randomize; for i:=l to 15 do forj:=l to 15 do c[i,j]:=random(50); clrscr;
writeln ('исходный массив'); for i:=l to 15 do begin
forj:=l to 15 do
write(c[i,j]:6:2);
writeln; end; s:=0; fori:=l to 15 dp
s:=s+c[i,i]; '
writeln('Искомая сумма-,s: 10:2); repeat until keypressed; end.
2.
programv32 uses crt;
var fr:string;i: integer; begin
clrscr; .
vvrite('BBeflHTe слово или фразу'); readln(fr); writeln;
for i:=l to length(fr) do write(copy (fr,length(fr)-i+1,1)); repeat until keypressed; end.
Домашнее задание: повторить основные типы данных, строковые, массивы.
Содержание
1. Рапаков Г.Г., Ржеуцкая С.Ю. Turbo Pascal для студентов и школьников. - СПб.:БХВ -Петербург, 2005. - 352 с.:ил.
2. Павловская Т.А. Паскаль. Программирование на языке высокого уровня: Учебник для вузов. - СПб.:Питер,2003. -393 с.
3. Павловская Т.А. Паскаль. Программирование на языке высокого уровня: Практикум. - СПб.:Питер,2006. -317 с.:ил.
4. Фаронов В.В. Delphi. Программирование на языке высокого уровня: Учебник для вузов. - СПб.: Питер, 2003.-640 с.
5. Немнюгин С.А. Turbo Pascal: Учеб. - СПб.: Питре,2000. - 496 с.
6. Немнюгин С.А. Turbo Pascal: Практикум - СПб.: Питре,2002. - 256 с.
Основы алгоритмизации и программирования
Методические указания к выполнению лабораторных работ
Фрейз И.И. |
Орск 2008
Содержание
Лабораторная работа №1. Линейные программы. 3
Лабораторная работа №2. Разветвляющиеся вычислительные процессы. Условный оператор IF. 8
Лабораторная работа №3. Организация циклов. 30
Лабораторная работа №4. Организация циклов.(продолжение) 33
Лабораторная работа №5. Одномерные массивы.. 39
Лабораторная работа №6. Преобразование массивов. 43
Лабораторная работа №7. Сортировка массива. 48
Лабораторная работа №8. Сортировка массива. 49
Лабораторная работа №9. Сортировка массива. 50
Лабораторная работа №10. Двумерные массивы. 52
Лабораторная работа №11: Подпрограммы. 54
Лабораторная работа №12. Использование подпрограмм в Паскале. 57
Лабораторная работа №13-14. Строки. 60
Лабораторная работа № 15. Исследовательско - практическая работа. 64
Лабораторная работа №16. Решение задач. 67
Лабораторная работа №17. Анализ самостоятельной работы. Работа над ошибками. 69
Лабораторная работа18. Использование множеств для решения задач в Паскале. 72
Лабораторная работа №19. Множества . (Продолжение) 74
Лабораторная работа №20. Тип данных Record (запись). 76
Лабораторная работа №21. Решение задач на типизированные файлы. 80
Лабораторная работа №22. Графика Турбо – Паскаля. 83
Лабораторная работа №23. Программирование в графическом режиме. 84
Содержание. 85
Дата: 2019-12-22, просмотров: 421.