Министерство образования и науки РФ Федеральное агентство по образованию РФ Московский государственный областной универс...
112 downloads
279 Views
3MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Министерство образования и науки РФ Федеральное агентство по образованию РФ Московский государственный областной университет Елецкий государственный университет имени И. А. Бунина
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
Москва – Елец 2005
УДК 002 ББК 22.18 Т19
Печатается по решению редакционно-издательского совета Елецкого государственного университета им. И.А. Бунина протокол № 5 от 30 ноября 2005 года
Рецензенты: доктор физико-математичеких наук, профессор кафедры алгебры и геометрии Меренков Ю.Н. (ЕГУ им. И.А. Бунина); доктор физико-математических наук, профессор, ведущий сотрудник Вычислительного центра им. А.А. Дородницына – РАН Дикусар В.В. (Москва); кандидат физико-математических наук, старший преподаватель кафедры уравнений в частных производных и теории вероятностей Малютина О.П. (ВГУ, Воронеж) Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В. Т19 Практикум по решению задач на ЭВМ: Учебно-методическое пособие. – Елец: ЕГУ им. И.А. Бунина, 2005. – 194 с. ISВN 5-7017-0825-Х При изучении дисциплины «Практикум по решению задач на ЭВМ» студенты сталкиваются с трудностями, связанными с отсутствием необходимой литературы по отдельным темам в библиотеке. Данное учебное пособие содержит комплект лабораторных работ по дисциплине. Большое внимание уделяется разбору примеров решения задач. Прилагаются вопросы и задачи для самостоятельного решения. Для самопроверки в пособии приведены два варианта типовых контрольных работ в рамках изучаемого материала. Данное учебно-методическое пособие адресовано студентам дневного и заочного отделений физико-математических факультетов университетов.
ISВN 5-7017-0825-Х
УДК 002 ББК 22.18 © ЕГУ им. И.А.Бунина, 2005 © Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В., 2005 © МГОУ, 2005 © издательство МГОУ, 2005
Практикум по решению задач на ЭВМ
Содержание 5
ВВЕДЕНИЕ ЧАСТЬ I
Программирование на языке высокого уровня 9 семестр
Язык программирования Pascal. Теоретический материал 2 часа
7 25
2 часа 2 часа 2 часа 2 часа 2 часа 2 часа 2 часа 2 часа
27 31 35 39 42 46 51 56
2 часа 2 часа 2 часа 4 часа 4 часа
59 62 66 69 75
2 часа 4 часа 4 часа 6 часов 4 часа
79 81 88 96 99
2 часа 4 часа 4 часа 10 часов 4 часов 4 часа 2 часа 6 часов 2 часа
101 103 105 110 124 127 130 137 144
1. Арифметика действительных чисел Вычисления по формулам 2. Разветвления 3. Простейшая целочисленная арифметика 4. Простейшие циклы 5. Простейшие графические построения 6. Пошаговый ввод данных и вывод результатов 7. Сочетания цикла и развилки 8. Обработка последовательностей символов 9. Вычисления с хранением последовательностей значений 10. Вложенные циклы 11. Вложенные циклы в матричных задачах 12. Использование процедур 13. Файлы 14. Вычисления с хранением последовательностей, число членов которых зависит от исходных данных 15. Контрольная работа №1 16. Целые числа 17. Системы счисления 18. Геометрия 19. Сортировка массивов и файлов 10 семестр 20. Многочлены 21. Преобразование и построение матриц 22. Матричная алгебра 23. Численные методы 24. Случайные числа 25. Вычисления с некоторой точностью 26. Графика 27. Графика и движение 28. Игры ЧАСТЬ II
Математические вычисления в MathCAD
Математические вычисления в MathCAD. Теоретический материал. 29. Введение в MathCAD 4 часа 3
146 162
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
30. Контрольная работа №2 31. MathCAD Задачи линейной алгебры 32. MathCAD Задачи математического анализа 33. MathCAD Обыкновенные дифференциальные уравнения 34. MathCAD Задачи математической статистики
2 часа 10 часов 10 часов 10 часов
164 166 167 168
4 часа
170
ЗАКЛЮЧЕНИЕ
171
БИБЛИОГРАФИЯ
172
ПРИЛОЖЕНИЕ Рабочая программа по дисциплине «Практикум по решению задач на ЭВМ»
174
ВВЕДЕНИЕ Практикум по решению задач на ЭВМ изучается в девятом и десятом семестрах и является составной частью непрерывной компьютерной подготовки студентов. С одной стороны, он опирается на знания, полученные при изучении классических математических дисциплин (алгебра, геометрия, математический анализ, теория вероятностей), а с другой стороны, на знания основ информатики и вычислительной техники, приобретенные в процессе обучения дисциплинам: информатика, программирование, программное обеспечение ЭВМ. Основная цель практикума – сформировать у студентов практические умения и навыки в решении прикладных задач на персональных компьютерах. Перед студентами ставятся следующие задачи: ¾ закрепить и углубить навыки программирования для ПЭВМ (язык программирования Pascal); ¾ углубить и систематизировать представление о применении новых информационных технологий в приложениях математики; ¾ получить опыт построения простейших математических моделей и их реализации на ЭВМ (вычислительный эксперимент); ¾ научиться решать на ПЭВМ классические задачи геометрии, алгебры, матричной алгебры, а также сортировки массивов и файлов; ¾ получить навыки решения на ПЭВМ задач, относящихся к специальным разделам математики и информатики: численные методы; случайные числа; графика и движение; компьютерные игры. Данное учебно-методическое пособие состоит из двух частей: первая часть представляет собой набор из двадцати семи лабораторных работ, ориентированных на программирование на языках высокого уровня, вторая часть рассчитана на вычисления в математических пакетах и состоит из пяти лабоаторных работ. Всего пособие содержит тридцать две лабораторных работы, каждая из которых включает примеры решения заданий и задачи для самостоятельного решения. 4
Практикум по решению задач на ЭВМ
Для организации самопроверки в пособие включены две контрольные работы, рассчитанные на два варианта каждая. Обе части содержат теоретический материал, соответствующий их тематике. Учебно-методическое пособие основано на материале, изучаемом студентами в рамках дисциплины: «Практикум по решению задач на ЭВМ» в течение ряда лет. При составлении задач использовался сборник задач следующих авторов: С.А. Абрамов, Г.Г. Гнездилова, Е.Н. Капустина, М.И. Селюн. Авторы учебно-методического пособия выражают благодарность преподавателям и асситсентам кафедры вычислительной математики и информатики ЕГУ имени И.А. Бунина за помощь в постановке лабораторных работ. ЧАСТЬ I Программирование на языке высокого уровня Теоретический материал: Язык программирования Pascal Язык Паскаль создан Н. Виртом в 1971 году. Он играет особую роль и в практическом программировании и в его изучении. Существует много версий языка Паскаль. Любая программа на Паскале является текстовым файлом с собственным именем и расширением .pas. Она имеет вид последовательности символов латинских и русских букв, арабских цифр, знаков операций, скобок, знаков препинания и некоторых дополнительных символов. Схематически программа представляется в виде последовательности восьми разделов: 1. заголовок программы (начинается со слова program); 2. описание внешних модулей, процедур и функций; 3. описание меток; 4. описание констант (начинается со слова const); 5. описание типов переменных (начинается со слова var); 6. описание переменных; 7. описание функций и процедур; 8. раздел операторов (начинается со слова begin). Не в каждой программе обязательно присутствуют все разделы. Каждый раздел начинается со служебного слова, назначение которого зафиксировано так, что его нельзя употреблять для других целей. Программа заканчивается служебным словом end, после которого ставится точка. Описания величин и операторы отделяются друг от друга точкой с запятой. Для обозначения величин используются имена. Они состоят из латинских букв и цифр, причем первым символом должна быть буква. Имя программы выбирается автором и составляется по тому же правилу. Постоянные величины бывают числовыми или символьными. Значения символьных ве5
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
личин заключаются в апострофы. Постоянные величины описываются в разделе констант по схеме: const=. Данные, обрабатываемые программой, могут быть разных типов. Тип определяет область допустимых значений, а также операторы и функции, применимые к величине. В Паскале имеется несколько встроенных простых типов со стандартными именами. Скалярный тип – тип, значения которого можно перечислить в некотором списке. Для них определена порядковая функция ord(x) – номер значения х в списке (для целочисленного х ord(x)=x), pred(x) – значение в списке, предшествующее х, succ(x) – значение в списке, следующее за х. Упорядоченный тип – тип, значения которого упорядочены в обычном смысле. К ним применимы операции отношения ,=,. Для логических величин выполняется неравенство false<true. Переменные описываются в разделе описания переменных по схеме: var:. Имена в списке разделяются запятой. Над целыми величинами (тип integer) определены операции: *, div (деление нацело), mod (деление с остатком), +, - (приведены в порядке старшинства). Над вещественными величинами (тип real) определены: *, +, -, /, а также функции при вещественном или целом аргументе: abs(x), sqr(x), sin(x), cos(x), arctan(x), ln(x), exp(x), sqrt(x), int(x), random. Они дают вещественный результат. Над логическими величинами (тип string) определены операции: not отрицание, and - конъюнкция, or - дизъюнкция. Логическая функция odd(x) принимает значение true, если целочисленное х является нечетным, false если четным. Множество всех символов образуют символьные величины (тип char) которые являются упорядоченными. Выражения - это конструкции, которые задают правила вычисления значений переменных. Они строятся из переменных, констант, функций с помощью операций и скобок. Основные конструкции. Следование - реализовывается с помощью составного оператора: begin end. Развилка – реализовывается с помощью условного оператора и оператора варианта (выбора). Структура условного оператора: if then else Оператор варианта имеет форму: 6
Практикум по решению задач на ЭВМ
case of :; :; ……………… :< оператор N > end. Для реализации циклов имеются три оператора. Если число повторений известно заранее, то используют цикл с параметром: 1) for := to do , 2) for := downto do ; в других случаях используют цикл с предусловием: while do , (действие: вычисляется значение логического выражения, если оно истинно, то выполняется оператор, после чего снова вычисляется значение логического выражения, в противном случае действие заканчивается); или цикл с постусловием: repeat until , (действие: выполняется последовательность операторов, далее вычисляется значение логического выражения, если оно истинно, то действие заканчивается, в противном случае снова выполняется последовательность операторов). Массивы. Составные типы величин образуются из других типов, при этом существенную роль играет метод образования или структура составного типа. Часто используемый составной тип – массив. Массив – это последовательность, состоящая из фиксированного числа однотипных элементов. Все элементы массива имеют общее имя и различаются индексами. Индексы можно вычислять. При описании массивов используются слова: array и of. В описании массива указывается тип его элементов и типы индексов: type =array [] of . Число индексов называется размерностью массива. Обращение к элементу массива осуществляется с помощью задания имени переменной, за которым следует заключенный в квадратные скобки список индексов элемента. Пример. Рассмотрим задачу упорядочения членов числовой последовательности по какому-либо признаку (по возрастанию). Используем метод, носящий название «пузырек». Для этого будем рассматривать пары элементов последовательно слева направо и переставлять элементы в паре, если они стоят неправильно. В начале присвоим некоторой логической переменной значение p:=true, если при просмотре пар была хотя бы одна перестановка изменим значение логической переменной. Цикл заканчивается, если после очередного просмотра выполняется условие: p=true. 7
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
Программа: Program bubble; const a: array[1…10] of integer=(19,8,17,6,15,4,13,2,11,0); var b, I: integer; p: Boolean; begin clrscr; for I:=1 to 10 do while (a[I]:3); writeln; writeln; repeat p:=true; for I:=10 downto 2 do if a[I]=0 then begin x1:=(-b+sqrt(d))/(2*a); x2:=(-b-sqrt(d))/(2*a); writeln ('Корни уравнения:'); writeln ('x1=',x1:9:3); writeln ('x2=',x2:9:3); end else writeln ('Корней нет'); end.
22
Практикум по решению задач на ЭВМ
4)
Написать программу, которая запрашивает у пользователя время года и выводит соответствующее название времени года. В случае если пользователь укажет недопустимое число, программа должна вывести сообщение: «Ошибка ввода данных». {*Определение времени года по номеру месяца*} uses CRT; var month: integer; { номер месяца } begin clrscr; writeln ('введите номер месяца (от 1 до 12) и нажмите Enter'); write ('->'); readln(month); case month of 1,2,12:writeln ('зима'); 3..5:writeln ('весна'); 6..8:writeln ('лето'); 9..11:writeln('осень'); else writeln ('Число должно быть от 1 до 12'); end; readln; end.
5) Даны 3 числа A, B, C. Найти наименьшее из них. {Нахождение наименьшего} program min1 (input,output); uses CRT; var 23
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
A,B,C:real; {исходные числа} min:real; begin clrscr; writeln('Введите три числа'); read(A,B,C); min:=A; if B<min then min:=B; if C<min then min:=C; writeln ('минимум=',min); readln; end.
Лабораторная работа №3 Простейшая целочисленная арифметика 1) Дано действительное число x. Получить целую часть числа; число, округленное до ближайшего целого; число без дробной части. 2) Дано натуральное число n (n 0). Определить число сотен в выражении. {Определение количества сотен в числе} program sotni(input,output); uses CRT; {работа с экраном и клавиатурой} label 2; var r,n:integer; begin clrscr; {очистка экрана} 2: writeln('введите число а (а больше 100)'); read(n); if n>99 then begin r:=n div 100; writeln (r); end else begin writeln ('Введите другое число'); goto 2; end end.
5) Дано натуральное число n (n l then writeln ('Положительных элементов больше') else writeln('Отрицательных элементов больше'); if abs(max)>1 then writeln('Наибольший элемент по мод.>1') else writeln ('Наибольший элемент по мод < 1'); end.
5) Пусть a i =
i −1 (i − 1) 2 + Sin , i = 1,2...n Дано натуральное число n. Среди a1, i +1 i +1
a2,…an найти все положительные числа. Среди положительных выбрать наименьшее число. program polog (input,output); uses CRT; var n,i,b:integer;a,min:real; begin clrscr; write('Введите кол-во элементов последовательности:' ); read(n); for i:=1 to n do begin a:=(i-1)/(i+1)+sin((sqr(i-1)*(i-1))/(i+1)); if a>0 then writeln(a); if a>0 then b:=b+1; if b=1 then min:=a; if (a>0) and (b>1) and (a<min) then min:=a; end; writeln('Наименьший полож. элем послед.: ',min); 37
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
end.
Лабораторная работа № 8 Обработка последовательности символов 1) Дано натуральное число n и символы q1, q2, …, qn. Подсчитать, сколько раз среди данных символов встречается буква х. 2) Дано натуральное число n и символы q1, q2, …, qn. Преобразовать последовательность, заменив в ней: все восклицательные знаки точками; каждую точку - многоточием; каждую из групп стоящих рядом точек одной точкой. 3) Задана строка символов. Определить длину строки program stroca(input,output); uses CRT; var i:integer;s:string[15]; begin clrscr; writeln('Введите строку символов для определения длины: '); readln (s); i:=length(s); writeln('Длина: ',i,' символов'); readln; end.
4) В произвольно заданной строке выделить фрагмент длиной n символов, начиная с позиции m. program fragmstroc(input,output); uses CRT; 38
Практикум по решению задач на ЭВМ
var m,n:integer;s1,s2:string; begin clrscr; writeln('Введите строку символов: '); readln (s1); writeln('Введите позицию первого элемента фрагмента: '); readln (m);{ввод значения m} writeln('Введите длину фрагмента: '); readln (n); s2:=copy(s1,m,n); write('Фрагмент: '); writeln(s2); readln; end.
5) Выделить правую подстроку длиной n символов. program podstroca(input,output); uses CRT; var n,l1:integer;s1,s2:string[10]; begin clrscr; writeln('Введите строку символов: '); readln (s1); writeln('Введите количество символов правой подстроки: '); readln (n); l1:=length(s1); s2:=copy(s1,l1-n+1,n); writeln('Правая подстрока: ',s2); readln; end.
39
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
6) Задана строка символов. Определить содержится ли в ней буква е или а. program bukva(input,output); USES CRT; var s:string[10]; begin clrscr; writeln('Введите строку символов: '); readln (s); if (pos('e',s)0) then writeln('содержится e') else writeln('не содержится e'); if (pos('a',s)0) then writeln('содержится a') else writeln('не содержится a'); readln; end.
7) Задана строка символов. Заменить в ней все восклицательные знаки точками. program zamena(input,output); uses CRT; const n=7; var l,i,k:integer;s:string[n]; begin clrscr; writeln('Введите строку символов: '); readln (s); l:=length(s); for i:=1 to l do begin 40
Практикум по решению задач на ЭВМ
k:=pos('!',s); if k0 then s[k]:='.' end; writeln(s); readln; end.
Лабораторная работа №9 Вычисления с хранением последовательности значений 1) Даны действительные числа а1, а2, …, а15. Получить 15
s=
∑ (a i =1
i
− a~ ) 2
1 15 , a~ = ∑ ai 15 i =1
.
14
2) Даны действительные числа а1, а2, …, а17. Получить: а) а17, а1, а2, …, а16; б) а11, а12, …, а17, а1, а2, …, а10; в) а11, а12, …, а17, а10, а9, …, а1 3) Написать программу, которая вводит с клавиатуры массив из 7 чисел и выводит количество не нулевых элементов. uses CRT; const SIZE=7; {размер массива} var a:array[1..SIZE] of integer; n:integer; {колличество не нулевых элементов} i:integer; {индекс} begin clrscr; writeln('ввод массива целых чисел.'); write('после ввода каждого числа '); writeln('нажимайте <enter>'); 41
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
n:=0; for i:=1 to SIZE do begin write('a[',i,']->'); readln(a[i]); if a[i]0 then n:=n+1; end; writeln('в массиве ',n,' не нулевых элементов.'); end.
4) Даны целые числа a1,…,a12. Получить новую последовательность, исключив из исходной все члены со значением max(a1,…a12). uses CRT; const SIZE=5; {размер массива} var a:array[1..SIZE] of integer; b:array[1..SIZE] of integer; max:integer; i,p:integer; begin clrscr; p:=0; writeln('ввод массива целых чисел.'); write('после ввода каждого числа '); writeln('нажимайте <enter>'); for i:=1 to SIZE do readln(a[i]); max:=a[1]; for i:=2 to SIZE do if a[i]>max then max:=a[i]; for i:=1 to SIZE do begin if a[i]max then begin p:=p+1; 42
Практикум по решению задач на ЭВМ
b[p]:=a[i]; end; end; for i:=1 to p do writeln(i,'- элемент новой послед.-и: ',b[i]); readln; end.
Лабораторная работа №10 Вложенные циклы 100 50 1 ; б) 100 60 1) Вычислить: а) sin(i 3 + j 4 ) ;
∑∑ i + j i =1 j =1
в)
100 100
∑∑ i =1 j = i
j − i +1; i+ j 10
2) Вычислить
∑ k =1
г)
100
i
∑∑
2
i =1 j =1
1
∑∑ 2 j + i
.
i =1 j =1
15
k 3 ∑ (k − i ) 2 i =1
program summa(output); uses CRT; var k,l:integer; S1,sum,P:longint; begin clrscr; sum:=0; for k:=1 to 10 do begin S1:=0; for l:=1 to 15 do begin S1:=S1+((k-l)*(k-l)); end; P:=S1*k*k*k; sum:=sum+P; end; writeln('Сумма ряда равна: ',sum); 43
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
readln; end.
3) Дано натуральное число n. Можно ли представить его в виде суммы 3-х квадратов натуральных чисел. Если можно, то: a) указать тройку X, Y, Z для которой n=x2+y2+z2; b) указать все тройки X, Y, Z для которых n=x2+y2+z2. program zad(input, output); USES CRT; label a1; var s,n,k:longint; x,y,z:longint; begin clrscr; k:=0; write('Введите число для проверки: '); read(n); readln; for x:=1 to n do for y:=1 to n do for z:=1 to n do begin s:=(x*x)+(y*y)+(z*z); if s=n then begin k:=k+1; writeln(' x=',x,' y=',y,' z=',z); goto a1; end; end; a1: if k=0 then writeln('таких троек нет'); readln; end.
44
Практикум по решению задач на ЭВМ
Лабораторная работа № 11 Вложенные циклы в матричных задачах 1) Даны целые числа а1, а2, а3. Получить целочисленную матрицу [bij]i,j=1,2,3 , для которой bij=ai-3aj. 2) Дано натуральное число n. Получить действительную матрицу [aij]i,j=1,…,n
⎧ sin(i + j ), при i < j, ⎪ для которой ⎪ aij = ⎨ 1, при i = j, ⎪ i+ j в остальных ⎪arcsin 2i + 3 j ⎩
случаях.
3) Написать программу, которая вводит с клавиатуры двумерный массив и вычисляет сумму его элементов по столбцам. uses CRT; const m=2; n=5; var a:array[1..m,1..n] of integer; s:array[1..n] of integer; i,j:integer; begin clrscr; writeln( 'введите массив'); write('после ввода элементов каждой строки, ',n,' целых чисел, '); writeln('нажмите <enter>'); for i:=1 to m do begin write ('->'); for j:=1 to n-1 do read (a[i,j]); readln (a[i,n]); end; writeln ('Результат сложения по стобцам: '); for j:=1 to n do for i:=1 to m do s[j]:=s[j]+a[i,j]; writeln('-------------------'); for i:=1 to n do 45
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
write(s[i]:4); writeln; readln; end.
4)
Дана
действительная матрица размером m на n в которой не все элементы равны нулю. Получить новую матрицу путем деления всех элементов данной матрицы на наибольший по модулю элемент. const m=3; n=4; var a:array[1..m,1..n] of real; b:array[1..m,1..n] of real; i,j:integer; max:real; begin writeln('введите массив'); writeln('после ввода элементов каждой строки ,', n,' целых чисел,); writeln(' нажимайте enter'); for i:=1 to m do begin write('->'); for j:=1 to n-1 do read(a[i,j]); readln(a[i,n]); end; max:= abs(a[1,1]); for i:=1 to m do begin for j:=1 to n do if abs(a[i,j])>max then max:=abs(a[i,j]); end; for i:=1 to m do 46
Практикум по решению задач на ЭВМ
begin for j:=1 to n do b[i,j]:=a[i,j]/max; end; writeln; writeln('Новый массив: '); for i:=1 to m do begin for j:=1 to n do write(b[i,j]:4); writeln(' '); end; writeln; writeln('Максимальный элемент массива равен:', max); readln; end.
Лабораторная работа № 12 Использование процедур 1) Даны действительные числа s,t. Получить f (t ,−2s,1.17) + f (2.2, t , s − t ), где
f (a, b, c) =
2a − b − sin c 5+ c
2) Даны действительные числа a,b,c. Получить max(a, a + b) + max(a, b + c) 1 + max(a + bc,1.15)
3) Составить программу для вычисления площади выпуклого четырехугольника, заданного длинами 4-х сторон и диагональю (определить процедуру для вычисления площади). I. Процедура без параметров program F1(input,output); uses CRT; var AB,BC,CD,AC,DA:real; a,b,c,p,s1,s:real; 47
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
procedure str1; {заголовок процедуры} begin {тело процедуры} p:=(a+b+c)/2; s:=sqrt(p*(p-a)*(p-b)*(p-c)); end; {конец описания процедуры} begin {ввод исходных данных} clrscr; writeln('Введите длины сторон 4-х угольника и длину диагонали: '); readln(AB,BC,CD,DA,AC); a:=AB; b:=BC; c:=AC; str1; s1:=s; a:=DA; b:=AC; c:=CD; str1; s1:=s1+s; write('Площадь 4-х угольника равна: ',s1); readln; end. II. Процедура с параметрами – переменными program F1(input,output); var AB,BC,CD,AC,DA:real; s1,s2:real; procedure str2(var a,b,c,s:real); {заголовок процедуры} var p:real;{объявление локальной переменной p} begin {тело процедуры} p:=(a+b+c)/2; s:=sqrt(p*(p-a)*(p-b)*(p-c)); end; {конец описания процедуры} begin {ввод исходных данных} readln(AB,BC,CD,DA,AC); str2(AB,BC,AC,s1); {первое обращение к процедуре} str2(CD,DA,AC,s2); {второе обращение к процедуре} write(s1+s2); readln; end. III. Процедура с параметрами – значениями program F3(input,output); var y1,y2:real; procedure str3(a,b,c:real; var s:real); {заголовок процедуры} var p:real;{объявление локальной переменной p} begin {тело процедуры} p:=(a+b+c)/2; s:=sqrt(p*(p-a)*(p-b)*(p-c)); end; {конец описания процедуры} 48
Практикум по решению задач на ЭВМ
begin {ввод исходных данных} str3(3,4,1+4,y1); {первое обращение к процедуре} str3(3,4,6-1,y2); {второе обращение к процедуре} write(y1+y2); readln; end. IV. Функция program F4(input,output); var AB,CD,BC,DA,AC:real; function triangl(a,b,c:real):real;{заголовок функции с возвращаемым значением типа REAL} var p:real; begin p:=(a+b+c)/2; triangl:=sqrt(p*(p-a)*(p-b)*(p-c)); end; begin readln(AB,BC,CD,DA,AC); write(triangl(AB,BC,AC)+triangl(CD,DA,AC)); readln; end.
Лабораторная работа № 13 Файлы 1) Дан файл f, компонентами которого являются действительные числа. Найти: а) сумму компонент файла; б) произведение компонент файла; в) сумму квадратов компонент файла; г) модуль суммы и квадрат произведения компонент. 2) Дан файл f, компонентами которого являются целые числа. Найти: а) количество четных чисел среди компонент; б) количество удвоенных нечетных чисел среди компонент; в) количество нечетных чисел среди компонент.
49
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
3) Написать программу, которая на диске D: создаст файл numbers.txt и запишет в него 5 введенных пользователем отдельных числа. Просмотреть при помощи редактора текста созданный файл. Убедиться, что каждое число находиться в отдельной строке. {Создает на диске D: файл и записывает в него 5 целых чисел, введенных пользователем} uses CRT; var f: text; {Текстовый файл} n: integer; {число} i: integer; {счетчик чисел} begin clrscr; writeln('создание файла'); writeln('Введите пять целых чисел'); writeln('После ввода каждого числа нажимайте <Enter>'); Assign (f,'D:\Общая\numbers.txt'); Rewrite (f); {открыть в режиме записи} for i:=1 to 5 do begin write('->'); readln(n); writeln(f,n); end; close (f); {закрыть файл} writeln ('Введенные числа записаны в файл', 'D:\Общая\numbers.txt'); readln; end. {записывает в файл D:\Soft\numbers.txt 5 введенных пользователем целых чисел} var f: text; {Текстовый файл} n: integer; {число} i: integer; {счетчик чисел} begin writeln('добавление в файл D:\Soft\numbers.txt'); writeln('Введите пять целых чисел'); writeln('После ввода каждого числа нажимайте <Enter>'); Assign(f,'D:\Общая\numbers.txt'); {связывание файловой переменной a с файлом} Append(f); {открыть файл в режиме добавления} for i:=1 to 5 do 50
Практикум по решению задач на ЭВМ
begin write('->'); readln(n); writeln(f,n); end; close (f); {закрыть файл} writeln ('Введенные числа дабавлены в файл', 'D:\Общая\numbers.txt'); readln; end.
Типизированные файлы 4) Просмотр созданного файла. {выводит на экран содержимое файла D:\Soft\ number.txt } uses CRT; var f: text; { текстовый файл } n: integer; { число } begin clrscr; writeln('содержимое файла D:\Общая\ numbers.txt'); writeln('-----------------------------------'); Assign(f, 'D:\Общая\numbers.txt'); Reset(f); {открыть файл для чтения} While not EOF(f) do {пока не достигнут конец файла} begin readln(f,n); {прочитать число из файла} writeln(n); {вывести прочитанное число на экран} end; Close(f); { закрыть файл } writeln('-----------------------------------'); readln; end.
51
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
5) Написать программу, которая создает файл complex1.txt и записывает в него 5 комплексных чисел (действительную и мнимую часть) {создание файла complex.1} uses CRT; type t=record {объявление типа данных "запись"} re: real; {вещественная часть} im: real; {мнимая часть} end; var a: t; {объявление переменной типа "запись"} i: integer; {счетчик чисел} f: file of t; {объявление файловой переменной с компонентами типа "запись"} begin clrscr; writeln(' создание файла '); writeln(' Введите пять комплексных чисел '); writeln('после каждого числа нижмите <Enter> '); Assign( f, 'D:\Общая\complex1.txt '); Rewrite (f); for i:=1 to 5 do begin write (' -> '); read (a.re, a.im); write (f,a); end; Close (f); writeln ('Данные числа записаны в файл', 'D:\Soft\complex1.txt '); readln; end.
6) Написать программу, которая выводит на экран содержимое файла complex1.txt.
52
Практикум по решению задач на ЭВМ
{просмотр файла complex.1} type t=record {объявление типа данных "запись"} re: real; {вещественная часть} im: real; {мнимая часть} end; var a: t; {объявление переменной типа "запись"} f: file of t; {объявление файловой переменной с компонентами типа "запись"} begin writeln(' содержимое файла complex1.txt '); writeln(' ----------------------------------- '); Assign( f, 'D:\Общая\complex1.txt '); Reset (f); {открыть файл для чтения} While not EOF(f) do {пока не достигнут конец файла} begin read (f, a); writeln (a.re, ' ' , a.im); end; Close (f); {закрыть файл} writeln (' ----------------------------------- '); readln; end.
Лабораторная работа №14 Вычисления с хранением последовательностей, число членов которых зависит от исходных данных 1) Даны натуральное число n и действительные числа а1, а2, …, аn. Если последовательность упорядочена по неубыванию, то оставить ее без изменений, иначе получить последовательность аn, аn-1, …, а1. 2) Даны натуральное число n и действительные числа а1, а2, …, а2n. Получить: а) (a1 − a 2 n )(a3 − a 2 n − 2 )(a5 − a 2 n − 4 )...( a 2 n −1 − a 2 ) ;
53
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
б) a1 a 2 n + a 2 a 2 n −1 + ... + a n a n +1 ; в) min( a1 + a n +1 , a 2 + a n + 2 ,..., a n + a 2 n ) ; г) max(min(a1 , a2 n ), min(a2 , a2 n−1 ),..., min(an , an+1 )) . 3) Дано натуральное число n и действительные числа x1,…,xn. Получить последовательность x1-xn, x2-xn,…, xn-1-xn. {вычисления с хранением последовательностей, число членов которых зависит от исходных данных} uses CRT; const SIZE=100;{max размер массива} var a:array[1..SIZE] of real; b:array[1..SIZE] of real; i:integer;{индекс} n:integer; begin clrscr; writeln('Ввод массива целых чисел'); write('после ввода каждого числа '); writeln('нажимайте <enter>'); readln(n); {ввод количества элементов в нашей последовательности } for i:=1 to n do begin write('a[',i,']->'); readln(a[i]); end; writeln('Новая последовательность: '); for i:=1 to n do begin b[i]:=a[i]-a[n]; writeln(b[i]); end; readln; end.
54
Практикум по решению задач на ЭВМ
4) Даны натуральное число n, действительные числа a1,…,an. Преобразовать данную последовательность расположив сначала отрицательные, а потом положительные элементы. Притом: a) порядок, как для отрицательных, так и для положительных элементов сохраняется. b) порядок отрицательных чисел остается прежним, а для не отрицательных изменяется на обратный. {преобразование последовательности по условию} uses CRT; const SIZE=100;{max размер массива} var a:array[1..SIZE] of real; b:array[1..SIZE] of real; i:integer;{индекс} n:integer;{колличество элементов последовательности} k:integer; {счетчик упорядоченных по знаку элементов} begin clrscr; k:=0; {начальная установка счетчика} writeln('Ввод массива вещественных чисел'); write('После ввода каждого числа '); writeln('нажимайте <Enter>'); readln(n); {ввод n} for i:=1 to n do {ввод массива} begin write('a[',i,']->'); readln(a[i]); end; for i:=1 to n do if a[i]=0 then begin k:=k+1; b[k]:=a[i]; end; for i:=1 to n do 55
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
writeln(b[i]); readln; end.
Лабораторная работа №15 Контрольная работа Вариант 1 Вариант 2 Зад.1. (многочлены: схема Горнера) Дано натуральное число n, действительные числа an, an-1, … , a0. Вычислить, используя схему Горнера, значение многочлена P(x) = anxn + an-1xn-1 + … + a0. Зад.2. (системы счисления: суммиро- Зад.2. (целые числа: гипотеза Гольдбаха). вание десятичных цифр). Дано длин- Дано четное число n. Проверить для этоное целое число n. Подсчитать сумму го числа гипотезу Гольдбаха. В 1742 г. десятичных цифр числа n. (Определить Христиан Гольдбах высказал предполофункцию sum _ dig (n) для нахождения жение, что любое четное число можно суммы). представить в виде суммы двух простых чисел. Эта гипотеза до сих пор не опровергнута и не доказана. Необходимо составить программу, которая находит все возможные разложения числа n на сумму двух простых чисел. (Определить процедуру, позволяющую распознавать простые числа). Зад.3. (графика: секторная диаграмма). Зад.3. (графика: столбчатая диаграмма). Секторная (круговая) диаграмма – это Столбчатая диаграмма (гистограмма) круг, площади секторов которого про- представляет собой набор прямоугольнипорциональны соответствующим чи- ков, основания которых равны, а высоты словым величинам, взятым из некото- пропорциональны числовым величинам, рой совокупности. взятым из некоторой совокупности. Даны 7 действительных положитель- Даны 7 действительных положительных ных чисел а1, …, а7. Построить круго- чисел а1, …, а7. Построить гистограмму вую диаграмму для этих значений. для этих значений. Зад.4. (геометрия: задача о медианах Зад.4. (геометрия: принадлежность точки 56
Практикум по решению задач на ЭВМ
множества точек). Медианой множества, состоящего из четного числа точек плоскости, никакие три точки из которых не лежат на одной прямой, называется прямая, соединяющая две точки множества, с обеих сторон от которой лежит равное число точек. Даны действительные числа х1, у1, х2, у2, … , хn, уn (n – четное число). Найти число медиан множества точек с координатами (х1, у1), (х2, у2), … , (хn, уn). Зад.5. (файлы: стандартные операции). Дан файл f, компоненты которого являются действительными числами. Найти: а) сумму компонент файла; б) последнюю компоненту файла; в) наибольшее из значений компонент.
заданной области). На плоскости задана точка М (х, у) и треугольник с вершинами (х1, у1), (х2, у2), (х3, у3). Определить, лежит ли точка М внутри треугольника.
Зад.5. (файлы: перестановка компонент в обратном порядке). Дан файл f, компоненты которого – целые числа. Записать в файле g компоненты файла f в обратном порядке.
Лабораторная работа № 16 Целые числа Простые и составные числа 1) Дано натуральное число n. Получить первые n строк треугольника Паскаля. 2) Дано натуральное число n. Получить все пифагоровы тройки натуральных чисел, каждое из которых не превосходит n. 3)Дано натуральное число n. Найти все меньшие n простые числа, используя решето Эратосфена. 4)Найти все пары дружественных чисел, лежащих в диапазоне от 200 до 300. 5)Найти все меньшие 100 натуральные числа, которые при возведении в квадрат дают палиндром. 6) Даны три целых числа A, B, C, найти НОД(A,B,C) (вариант 1 обычный, вариант 2 с процедурой или функцией). Вариант I program nod1(input,output); var A,B,C,D:integer; function nod(a,b:integer):integer; 57
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
var d:integer; begin while ab do if a>b then a:=a-b else b:=b-a; d:=a; nod:=d; end; begin readln(A,B,C); D:=nod(A,B);{1-е обращение к функции} D:=nod(D,C);{2-е обращение к функции} writeln('nod(A,B,C)=',D); readln; end. Вариант II program nod1(input,output); var A,B,C,D:integer; procedure nod(var a,b,d:integer); begin while ab do if a>b then a:=a-b else b:=b-a; d:=a; end; begin writeln('Введите три числа А, В, С: '); readln(A,B,C);{ввод исход данных} nod(A,B,D);{первое обращение к процедуре} nod(C,D,D);{второе обращение к процедуре} writeln('D=',D); readln; end.
7) Дано натуральное число n. Определить является ли оно простым. program prost(input,output); 58
Практикум по решению задач на ЭВМ
uses CRT; var k,n,i:integer; begin clrscr; write('Введите число для проверки: '); readln(n); k:=0; for i:=2 to n-1 do if n mod i=0 then k:=k+1; if k=0 then writeln('число ',n,' простое') else writeln('число ',n,' составное'); writeln('число делителей, отличных от единицы и самого себя=',k); readln; end.
8) Дано натуральное число n. Определить НОД этого числа. program prost(input,output); uses CRT; label 10; var n,i:integer; begin clrscr; write('Введите число для поиска НОД: '); readln(n); for i:=n-1 downto 2 do if n mod i=0 then begin writeln('наибольший делитель=',i); goto 10; end; writeln('наибольший делитель - само число ',n); 10: readln; end.
59
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
Каноническое разложение 9) Дано натуральное число n. Найти все его простые делители. program prost_deliteli(input,output); uses CRT; label 1; var N:integer;{исходное число} var i:integer; {делители числа N} var p1:boolean; {процедура для распознования простого числа} procedure prost1(var num:integer;var p:boolean); var i,k:integer;{объявление локальных переменных в процедуре} begin k:=0; p:=false; for i:=2 to num-1 do if num mod i=0 then k:=k+1; {счетчик количества делителей} if k=0 then begin p:=true; writeln('число',num,'-простое'); end; end;{конец описания процедуры} begin clrscr; write('Введите для проверки число N: '); readln(N); prost1(N,p1); if p1=true then goto 1; {анализ исходного числа на простоту} writeln('вывод простых делителей числа N '); for i:=2 to N do if N mod i=0 then prost1(i,p1); 1: readln; end.
10) Определить является ли данное число простым. 60
Практикум по решению задач на ЭВМ
program deliteli(input,output); uses CRT; var N:integer; var p1:boolean; procedure prost1(var num:integer;var p:boolean); {процедура для распознования простого числа} var i,k:integer;{объявление локальных переменных в процедуре} begin k:=0; p:=false; for i:=2 to num-1 do if num mod i=0 then k:=k+1; {счетчик количества делителей} if k=0 then begin p:=true; writeln('число ',num,'-простое'); end; end;{конец описания процедуры} begin clrscr; write('Введите число для проверки: '); readln(N); prost1(N,p1); if p1=false then writeln('число',N,' не является простым'); readln; end.
61
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
Лабораторная работа № 17 Системы счисления перевод целых чисел из одной системы в другую 1) Получить последовательность d k , d k −1 ,..., d 0 десятичных цифр числа 2200, т.е. целочисленную последовательность, в которой каждый член di удовлетворяет условию 0 ≤ d i ≤ 9 и, дополнительно,
d k ⋅10 k + d k −1 ⋅10 k −1 + ... + d 0 ⋅10 0 = 2 200 . 2) Получить последовательность d k , d k −1 ,..., d 0 десятичных цифр числа 100!, т.е. целочисленную последовательность, в которой каждый член di дополнительно, удовлетворяет условию 0 ≤ d i ≤ 9 и,
d k ⋅ 10 k + d k −1 ⋅ 10 k −1 + ... + d 0 ⋅ 10 0 = 100!. 3) Получить последовательность d k , d k −1 ,..., d 0 десятичных цифр чисел 100!+2100 и 100!-2100, т.е. целочисленную последовательность, в которой каждый член di удовлетворяет условию 0 ≤ d i ≤ 9 и, дополнительно,
d k ⋅ 10 k + d k −1 ⋅ 10 k −1 + ... + d 0 ⋅ 10 0 = 100!+2100
или
d k ⋅ 10 k + d k −1 ⋅ 10 k −1 + ... + d 0 ⋅ 10 0 = 100!−2100 . 4) Дано целое число n. Преобразовать это число в двоичную систему счисления. a) program num_to_str(input,output); uses CRT; var N,Q,r:longint; a:string[33]; b:string[2]; begin clrscr; writeln('*Перевод числа в из десятичной в двоичную систему*'); write('Введите число: '); readln(N); Q:=N; a:='';{начальное значение строки-пусто} while Q0 do begin r:=Q mod 2; str(r,b);{преобразование числа в символьный формат} a:=b+a;{подключение символа к строке} Q:=Q div 2;{частное от целочисленного деления исходного числа на 2} end;
62
Практикум по решению задач на ЭВМ
writeln(N,'=',a); readln; end.
b) program num_to_str1(input,output); uses CRT; var N:longint;k1:integer; function num_to_str (num:longint;k:integer):string; var Q,r:longint;b:string[1];a:string[33]; begin Q:=num; k:=0;{счетчик количества двоичных цифр в преобразованном числе} a:='';{начальное значение строки-пусто} while Q0 do begin r:=Q mod 2;{нахождение очередного остатка} str (r,b);{преобразование числа в строковый формат} a:=b+a;{подключение символа к строке результата} Q:=Q div 2;{частное от целочисленного деления исходного числа на 2} k:=k+1; end; writeln('длина числа в двоичном формате=',k); write('двоичная запись числа: '); num_to_str:=a; end; begin clrscr; write('Введите число: '); readln(N); writeln(num_to_str(N,k1)); readln; end.
63
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
5) Дано натуральное число n. Преобразовать число n в систему с основанием j (j=10 then begin writeln('ошибка ввода'); goto 1; end; writeln(num_to_str1(M)); readln; end.
65
Тарова И.Н., Терехов Ю.П., Масина О.Н., Скоков А.В.
2) Дано натуральное число n. Представить это число в смешной системе счисления. program num_to_str4(input,output); uses CRT; label 1; var N:longint; k,l,i,p:integer; s1:string[15];{строковое представление исходного числа N} a1:string[4]; s:string[33];{строка результата} function num_to_str1 (num:integer):string; var Q,r,i:integer;b:string[1];a:string[4]; begin Q:=num; a:='';{начальное значение строки-пусто} for i:=1 to 4 do begin r:=Q mod 2;{нахождение очередного остатка} str (r,b);{преобразование числа в строковый формат} a:=b+a;{подключение символа к строке результата} Q:=Q div 2;{частное от целочисленного деления исходного числа на 2} end; num_to_str1:=a; end;{конец описания функции} begin clrscr; s:=''; write('Введите число: '); readln(N); str(N,s1); l:=length(s1);{определение длины исходного числа N} for i:=1 to l do begin val(s1[i],k,p); {преобразование символа в числовой формат} a1:=num_to_str1(k);{обращение к функции и присваивание значения переменной а1-четверка двоичных цифр} s:=s+a1;{формирование строки результата} end; writeln(N,'=',s); readln; end. 66
Практикум по решению задач на ЭВМ
Лабораторная работа № 18 Геометрия 1) Даны действительные положительные числа a,b,c,d. Выяснить, можно ли построить четырехугольник с такими длинами сторон. 2) Даны действительные числа x1,y1,x2,y2 (x1≠ x2), которые определяют две точки A(x1,y1) и B(x2,y2). На оси абсцисс найти такую точку, сумма расстояний от которой до точек A и B – наименьшая для всех точек этой оси. 3) Даны действительные числа x, y. Определить принадлежит ли точка с координатами (x, y) заштрихованной части плоскости. program strelok(input,output); var x,y:real; begin write('Введите координаты x и y: '); readln(x,y); if (x*x+y*y