программа. Программирование_Паскаль_ЛабРаб 1 семестр. Контроль обучения 4 Первое контрольное задание 5 Второе контрольное задание 31
Скачать 0.69 Mb.
|
СОДЕРЖАНИЕ Контроль обучения 4 Первое контрольное задание 5 Второе контрольное задание 31 Третье контрольное задание 65 Контроль обученияДисциплина «Программирование и основы алгоритмизации» изучается на протяжении одного семестра. В процессе дистанционного обучения дисциплине студент должен выполнить три контрольных заданий и компьютерную экзаменационную работу. Каждое контрольное задание требует создания нескольких программ. Студент должен выполнить свой вариант заданий. Составленные и отлаженные программы (обязательно с комментариями в тексте) студент по мере освоения программирования периодически пересылает в папку Гость/Отчеты/имя личной папки. При правильном выполнении программы студент получает подтверждение о том, что они зачтены. Если программа составлена неправильно, студент получает описание ошибок программы. В конце семестра студент выполняет экзаменационную работу. Первое контрольное заданиеПервое контрольное (текстовое) задание посвящено созданию программ с использованием простых управляющих структур: условного оператора, цикла. В этом задании используются простые типы данных и нет необходимости использовать массивы. Поэтому не засчитываются программы, написанные с использованием массивов. Кроме того, требуется писать программы в рамках структурного программирования. В частности, запрещается использовать операторы перехода и метки. Задание состоит из трех задач, вам требуется составить программы на языке Паскаль. В некоторых программах полезно определить какие-то вспомогательные функции. Многие задачи из этой контрольной имеют вид: «Дана последовательность из n (действительных) целых чисел. Определить (вычислить) …» или «Даны натуральное n и вещественные числа a1, a2, ..., an. Определить (вычислить) …» и подобного рода. Во всех этих задачах не требуется хранения исходных последовательностей значений. Вы вводите n, потом в цикле, работающем n раз, осуществляете пошаговый ввод чисел и каким-то образом постепенно вычисляете необходимый результат. Примеры задач с решением Вычислить: y = sin1 + sin1.1 + sin1.2 + ... + sin2. Первый вариант решения данной задачи. Анализируя данную формулу, видим, что аргумент функции sin очередного слагаемого отличается от предыдущего на 0.1. Поэтому для решения данной задачи можно составить следующий алгоритм. Переменные: с – очередное слагаемое; i – аргумент функции; y – сумма. Обнуляем начальное значение переменной y строка 5, в которой будем накапливать сумму. Начальное значение аргумента функции i равно 1 (строка 6). Проверяем, значение i меньше или равно 2, т.к. по заданию аргумент функции изменяется от 1 до 2 (строка 7). Если «да», то определяем очередное значение функции (строка 9). Сохраняем его в переменной с. Если «нет», то расчет суммы закончен – переходим на шаг 8. Добавляем это слагаемое в сумму (строка 10). Увеличиваем значение аргумента i на 0.1 (строка 11). Переходим на шаг 3. Выводим результат на экран (строка 13).
Второй вариант решения данной задачи. Анализируя данную формулу, видим, что каждое слагаемое данной суммы можно рассчитать по формуле sin(1 + 0.1 * i), где i изменяется от 0 до 10. Поэтому для решения данной задачи можно составить следующий алгоритм. Переменные: i – параметр цикла; y – сумма. Обнуляем начальное значение переменной y строка 6, в которой будем накапливать сумму. Организуем цикл для определения суммы (параметр данного цикла должен измениться от 0 до 10) . В данном цикле определяем очередное слагаемое по формуле и добавляем это слагаемое в сумму (строка 7). Выводим результат на экран (строка 8).
2. Вычислить: y = 1*3*5* ... *(2n–1), n>0; var y : real; i, n : integer; begin writeln('Введите количество чисел'); readln(n); y:=1; for i:=1 to n do y:=y*(2*i–1); writeln('Полученное значение y= ', y) end. 3. Дано натуральное число N. Разложить его на простые множители. Переменные: n исследуемое число; i, j переменные циклов; f вспомогательный флаг. Алгоритм решения задачи: 1. Вводим значение переменной n. Т.к. пользователь может случайно ввести отрицательное число, то необходимо дать ему возможность для повторного ввода значения переменной n. Поэтому организуем цикл (строки 3–6 текста программы). Лучше использовать цикл с постпроверкой условия (Repeat…Until). Тело цикла составляют два оператора: оператор вывода на экран приглашения для ввода значения переменной n (строка 4) и оператор чтения с клавиатуры – для непосредственного ввода значения переменной n (строка 5). Данный цикл будет выполняться до тех пор, пока пользователь не введет любое положительное число (срока 6). 2. Выводим на экран значение переменной n и начинаем формировать ответ. Ответ будет представлен в следующем виде (например, в качестве значения переменной n ввели 8): 8 = 1*2*2*2. Т.к. единица является простым множителем для любого числа, то выводим ее на экран (строка 7). В результате выполнения данной строки на экране появится: 8=1. 3. Вспомогательной переменной f присваиваем значение false. Данная переменная нам будет необходима для определения, были ли вообще найдены простые множители у заданного числа n. Запоминаем исходное значение переменной n в переменной j (строка 8). 4. В цикле по переменной i начинаем порождение натуральных чисел, не превосходящих середину заданного числа n, для определения делителей данного числа n (строка 9). Данный цикл начали с 2, т.к. единицу мы уже учли (шаг 2 данного алгоритма). Т.к. в цикле For можно использовать только целые переменные, поэтому воспользовались оператором целочисленного деления на 2 (n div 2). В данном цикле выполняем следующее. Определяем, является ли очередное i делителем числа n (в качестве n в данном цикле используем j). Для этого определяем остаток от деления j на i. Если остаток равен 0 (строка 10), т.е. число i является делителем j, то определяем, сколько таких делителей, уменьшая число n (строки 11–18). Переменной f присваиваем значение true (строка 12) – это означает, что у заданного числа n есть делители. Организуем цикл, пока остаток от деления j на i равен 0 (строка 13). В данном цикле выводим делитель на экран (строка 15) и уменьшаем заданное число, деля его целочисленно на делитель (строка 16). Повторяем цикл. После завершения этого цикла возвращаемся на цикл For (строка 9), изменяем i и повторяем те же действия для нового делителя. 5. Если у числа нет делителей (оно является простым), то данное число можно разложить только на 1 и само на себя. Вспомогательная переменная f и определяет, были ли делители у числа n. Если значение переменной f осталось false, то делителей не было, поэтому выводим само это число (строка 19).
4. Даны натуральное n и последовательность a1, a2,…,an вещественных чисел. Найдите знакочередующую сумму S = a1a2+ a3… + (1)n+1 an. Переменные: n – количество чисел; a – очередное число; p – булевский признак знака слагаемого; i – переменная цикла; S – знакочередующая сумма чисел. Алгоритм решения задачи: вводим длину последовательности n и устанавливаем начальное значение S; булевская переменная p первоначально истинна, она будет указывать на знак слагаемого в сумме; последовательно считываем числа и, если p = true, то прибавляем его к сумме S, иначе отнимаем; на каждом шаге цикла значение p меняем на противоположное; выводим результат. var n, i : integer; a, S : real; p: boolean; begin repeat write('Введите длину последовательности n='); readln(n); until n>0; p:= true; S:=0; for i:=1 to n do begin write('Введите a='); readln(a); if p then S:=S+a else S:=S–a; p:= not p end; writeln('Знакочередующая сумма чисел S= ', S); end. 5. Найти сумму первых n членов ряда y = 1 + x/2 + x2/3 + +x3/4+..., при |x|<1. Переменные: n – количество членов ряда; x – переменная ряда; z – вспомогательная переменная; i – переменная цикла; y – сумма ряда. Алгоритм решения задачи: 1) вводим количество членов ряда n и переменную x; 2) в цикле порождаем очередной член ряда и прибавляем его к сумме y; 3) выводим результат. var x, y, z : real; n, i : integer; begin repeat writeln('Введите переменную ряда x, |x|<1, x='); readln(x); write('Введите число членов ряда n='); readln(n); until (abs(x)<1) and (n>0); y:=1; z:=1; for i:=2 to n do begin z:=z*x; y:=y+z/i; end; writeln('Сумма первых n членов ряда y =', y); end. 6. Вводится последовательность из N целых чисел. Найти сумму всех отрицательных чисел. Переменные: n – количество чисел; x – очередное число; i – переменная цикла; sum – сумма отрицательных чисел. Алгоритм решения задачи: вводим длину последовательности n и устанавливаем начальное значение sum; последовательно считываем числа и, если число отрицательное, то прибавляем его к сумме sum; в зависимости от значения sum выводим результат. var n, x, sum, i : integer; begin repeat write('Введите длину последовательности n='); readln(n); until n>0; sum:=0; for i:=1 to n do begin write('Введите x='); readln(x); if x<0 then sum:=sum+x; end; if sum=0 then writeln('Отрицательных чисел нет') else writeln('Сумма отрицательных чисел sum= ', sum); end. 7. Вводится последовательность из N целых чисел. Найти наибольшее число. Переменные: n – количество чисел; x – очередное число; i – переменная цикла; max – наибольшее число. Алгоритм решения задачи: вводим длину последовательности n и устанавливаем начальное значение max по первому числу; последовательно считываем числа и, если очередное число x больше max, то изменяем значение max := x; выводим результат. var n, x, max, i : integer; begin repeat write('Введите длину последовательности n='); readln(n); until n>0; write('Введите x='); readln(x); max:=x; for i:=2 to n do begin write('Введите x='); readln(x); if (x>max) then max:=x; end; writeln('Наибольшее из чисел max=', max); end. 8. Вводится последовательность целых чисел, 0 – конец последовательности. Найти два наименьших числа. Переменные: x – очередное число; min1 – первое наименьшее число; min2 – второе наименьшее число (min2>=min1). Алгоритм решения задачи: устанавливаем начальные значения min1 и min2 по двум первым числам; последовательно считываем числа и, если очередное число x меньше или равно min1 (min1 если x попадает в интервал от min1 до min2, то изменяем только min2; выводим результат. var x,min1,min2:integer; begin write('Введите x='); readln(x); min1:=x; write('Введите x='); readln(x); min2:=x ; {min1<=min2} repeat if x<=min1 then begin min2:=min1; min1:=x; end else if (min1 write('Введите x='); readln(x); until (x=0); writeln( 'Два наименьших числа равны', min1, 'и', min2); end. 9. Вводится последовательность ненулевых чисел, 0 – конец последовательности. Определить, является ли последовательность возрастающей. Переменные: old – предыдущее число; new – рассматриваемое число; f – флаг. Решение данной задачи строится от противного. Математически для того, чтобы последовательность была возрастающей, для каждого очередного элемента new и предыдущего old должно выполнятся условие new > old. Любое нарушение данного условия приводит к тому, что последовательность не может быть возрастающей. Алгоритм решения задачи: вводим два первых числа как old и new, задаем начальное значение флага f; в цикле ищем нарушение свойства членов возрастающей последовательности; переприсваиваем значение old:=new и вводим новое – new; в зависимости от флага выводим результат. var old, new : real; f : boolean; begin write('Введите x='); readln(old); write('Введите x='); readln(new); f:=true; repeat if new<=old then f:=false; old:=new; write('Введите x='); readln(new); until new=0; if f then writeln( 'Последовательность возрастающая') else writeln( 'Последовательность не является возрастающей'); end. 10. Даны натуральное n и последовательность вещественных чисел a1, a2,…, an. Сколько отрицательных чисел в начале последовательности (до первого неотрицательного)? Переменные: k – счетчик; i – переменная цикла; n – количество членов последовательности; a – очередной член последовательности; p – признак отрицательного числа в начале последовательности. Алгоритм решения задачи: вводим длину последовательности, задаем начальное значение счетчика k; устанавливаем признак отрицательного числа p=true; в цикле вводим очередной член последовательности; если это отрицательное число и до этого неотрицательных чисел не было, то увеличиваем значение счетчика на единицу; в противном случае, если член последовательности неотрицателен, то полагаем p=false; в зависимости от k выводим результат. var a: real; p: boolean; k,n : integer; begin repeat write('Введите длину последовательности n='); readln(n); until n>0; k:=0; p:=true; for i:=1 to n do begin writeln('Введите число'); readln(a); if (a<0) and p then k:=k+1else if a>=0 then p :=false end; if k=0 then writeln('отрицательных чисел в начале нет') else writeln('последовательность начинается с ', k, ' чисел') end. 11. Дан прямоугольный бильярдный стол со сторонами А и В, где А, В – натуральные числа (бильярд Льюиса Кэрролла). Из угловой лузы вылетает шар под углом 45 градусов к боковым стенкам, ударяется о борт, отскакивает, ударяется еще раз и т.д., пока не вылетит через одну из угловых луз. Рассчитать количество отрезков в ломаной траектории шара. Считать угол падения равным углу отражения. Данная задача решается с помощью стандартных функций выделения целой части от деления y на x (y div x) и выделения остатка y mod x. При прохождении шаром прямоугольного стола и отражении его от боковых сторон происходит увеличение числа отрезков траектории на два, а обратный путь вычисляется как y:=a–x+y mod x, где y – обратный путь для шара, a – длинная сторона стола, x – короткая сторона стола. Переменные: а) в функции bill: x, y – два натуральных числа (формальные параметры); k – вспомогательная переменная (локальная переменная); a – длинная сторона стола (глобальная переменная); б) в основной программе: a, b – два натуральных числа (глобальные переменные). Алгоритм решения задачи: создаем описание функции bill; вводим два натуральных числа a и b (не кратные друг другу); вызываем функцию bill для определения количества отрезков; завершаем работу программы. var a, b : integer; function bill(y,x:integer):integer; var k:integer; begin k:=0; while y mod x <>0 do begin k:=k+y div x+2; y:=a–x+y mod x; end; bill:=k; end; begin repeat writeln('Введите два натуральных числа A>B'); readln(a,b); until a>=b; writeln('Количество отрезков в траектории :', bill(a,b)); end. 12. Пусть процедура maxmin(x,y) присваивает параметру x большее из вещественных чисел x и y, а параметру y – меньшее. Описать данную процедуру и использовать ее для перераспределения значений вещественных переменных a, b и c так, чтобы стало a>=b>=c. var a,b,c : real; procedure maxmin( var x,y:real); var r:real; begin if x writeln('Введите три числа a,b,c –'); readln(a,b,c); maxmin(a,b); maxmin(a,c); {a=max} maxmin(b,c); {c=min} writeln(a,b,c); end. 13. Если среди чисел sin(x n) (n = 1, 2, ... ,30) есть хотя бы одно отрицательное число, то логической переменной t присвоить значение true, а иначе – значение false. var y,x : real; n : integer; t : boolean; begin write('Введите значение x –'); readln(x); y:=1; n:=0; repeat n:=n+1; y:=x*y; t:=sin(y)<0 until t or (n=30); writeln(t); end. 14. Определить k – количество трехзначных натуральных чисел, сумма цифр которых равна n (1 var d1, d2, d3, k, n : integer; begin writeln('Введите число n, с которым будем сравнивать сумму цифр числа'); readln(n); k:=0; {d1 – левая, d2 – средняя, d3 – правая цифры числа} for d1:=1 to 9 do for d2:=0 to 9 do for d3:=0 to 9 do if d1+d2+d3=n then begin k:=k+1; write(d1,d2,d3, ' '); end; writeln('Количество искомых чисел равно –', k); end. Варианты заданий
0> |