Файл: Контроль обучения 4 Первое контрольное задание 5 Второе контрольное задание 31.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 12.01.2024

Просмотров: 139

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.




СОДЕРЖАНИЕ



Контроль обучения 4

Первое контрольное задание 5

Второе контрольное задание 31

Третье контрольное задание 65



Контроль обучения



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

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

Первое контрольное задание



Первое контрольное (текстовое) задание посвящено созданию программ с использованием простых управляющих структур: условного оператора, цикла. В этом задании используются простые типы данных и нет необходимости использовать массивы. Поэтому не засчитываются программы, написанные с использованием массивов. Кроме того, требуется писать программы в рамках структурного программирования. В частности, запрещается использовать операторы перехода и метки.

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

Многие задачи из этой контрольной имеют вид: «Дана последовательность из n (действительных) целых чисел. Определить (вычислить) …» или «Даны натуральное n и вещественные числа a1, a2, ..., an. Определить (вычислить) …» и подобного рода. Во всех этих задачах не требуется хранения исходных последовательностей значений. Вы вводите n, потом в цикле, работающем n раз, осуществляете пошаговый ввод чисел и каким-то образом постепенно вычисляете необходимый результат.
Примеры задач с решением



  1. Вычислить: y = sin1 + sin1.1 + sin1.2 + ... + sin2.

Первый вариант решения данной задачи.

Анализируя данную формулу, видим, что аргумент функции sin очередного слагаемого отличается от предыдущего на 0.1. Поэтому для решения данной задачи можно составить следующий алгоритм.
Переменные:

с – очередное слагаемое;

i – аргумент функции;

y – сумма.

  1. Обнуляем начальное значение переменной y  строка 5, в которой будем накапливать сумму.

  2. Начальное значение аргумента функции i равно 1 (строка 6).

  3. Проверяем, значение i меньше или равно 2, т.к. по заданию аргумент функции изменяется от 1 до 2 (строка 7).

  4. Если «да», то определяем очередное значение функции (строка 9). Сохраняем его в переменной с. Если «нет», то расчет суммы закончен – переходим на шаг 8.

  5. Добавляем это слагаемое в сумму (строка 10).

  6. Увеличиваем значение аргумента i на 0.1 (строка 11).

  7. Переходим на шаг 3.

  8. Выводим результат на экран (строка 13).




1)

var y, c, i : real;

2)

begin

3)

writeln('Полученное значение расчета формулы ',

4)

'y=sin1+sin1.1+sin1.2+ ... +sin2 = ');

5)

y:=0;

6)

i:=1;

7)

while i <=2 do

8)

Begin

9)

c := sin(i);

10)

y:=y+c;

11)

i:=i+0.1;

12)

end;

13)

writeln(y);

14)

end.


Второй вариант решения данной задачи.

Анализируя данную формулу, видим, что каждое слагаемое данной суммы можно рассчитать по формуле sin(1 + 0.1 * i), где i изменяется от 0 до 10. Поэтому для решения данной задачи можно составить следующий алгоритм.
Переменные:

i – параметр цикла;

y – сумма.


  1. Обнуляем начальное значение переменной y  строка 6, в которой будем накапливать сумму.

  2. Организуем цикл для определения суммы (параметр данного цикла должен измениться от 0 до 10) .

  3. В данном цикле определяем очередное слагаемое по формуле и добавляем это слагаемое в сумму (строка 7).

  4. Выводим результат на экран (строка 8).





1)

var y : real;

2)

i : integer;

3)

Begin

4)

writeln('Полученное значение расчета формулы ',

5)

'y=sin1+sin1.1+sin1.2+ ... +sin2 = ');

6)

y:=0;

7)

for i:=0 to 10 do y:=y+sin(1+0.1*i);

8)

writeln(y);

9)

end.


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).


1)

var i, n, j : integer; f: boolean;

2)

begin

3)

repeat

4)

write('Введите натуральное число N= ');

5)

readln(n);

6)

until n>0;

7)

write (N:6, '=1');

8)

f:=false; j:=n;

9)

for i:=2 to n div 2 do

10)

if j mod i = 0 then

11)

begin

12)

f:=true;




{цикл определят, сколько таких множителей i в нашем числе n}

13)

while j mod i=0 do

14)

begin

15)

write('*', i);

16)

j:=j div i;

17)

end;

18)

end;




{f определяет, были ли найдены простые множители,




большие единицы}

19)

if not f then writeln('*', n);

20)

writeln

21)

end.



4. Даны натуральное n и последовательность a1, a2,…,an вещественных чисел. Найдите знакочередующую сумму S = a1a2+ a3… + (1)n+1 an.
Переменные:

n – количество чисел;

a – очередное число;

p – булевский признак знака слагаемого;

i – переменная цикла;

S – знакочередующая сумма чисел.
Алгоритм решения задачи:

  1. вводим длину последовательности n и устанавливаем начальное значение S;

  2. булевская переменная p первоначально истинна, она будет указывать на знак слагаемого в сумме;

  3. последовательно считываем числа и, если p = true, то прибавляем его к сумме S, иначе отнимаем;

  4. на каждом шаге цикла значение p меняем на противоположное;

  5. выводим результат.


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 – сумма отрицательных чисел.
Алгоритм решения задачи:

  1. вводим длину последовательности n и устанавливаем начальное значение sum;

  2. последовательно считываем числа и, если число отрицательное, то прибавляем его к сумме sum;

  3. в зависимости от значения 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('Отрицательных чисел нет')