Образцы решения типовых задач

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

Тема: Составление программ усложнённой структуры.

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

Оборудование и материалы: Методическое пособие, ручка, карандаш, линейка, ластик, шаблон А4.

Ход работы

Методические рекомендации.

Необходимая информация содержится в лекциях № 11.

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

Задание для лабораторной работы выбрать согласно варианту по приведённой таблице. Вариант определяется порядковым номером в журнале группы.

! При описании циклов с постусловием необходимо принимать во внимание следующее:

  • перед первым выполнением цикла условие его окончания (или продолжения) должно быть определено;
  • тело цикла должно содержать хотя бы один оператор, влияющий на условие окончания (продолжения), иначе цикл будет бесконечным;
  • условие окончания цикла должно быть в результате выполнено.

Внимательно изучите организацию вложенных циклов на примерах 6-10.

Образцы решения типовых задач.

Задача №1. Составить таблицу значений функции у = esin(х)cos(x) на отрезке [0;π] с шагом 0,1.

Входные данные: начальное значение аргумента - 0, конечное значение ар­гумента - π, шаг изменения аргумента - 0,1.

Выходные данные: множество значений аргумента X и соответствующее им множество значений функции Y.

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

 
 

 


Теперь решим задачу другим способом, используя циклический оператор for... do, предварительно определив количество повторений тела цикла n.

Если параметр цикла х принимает значения в диапазоне от хп до xk, изменяясь с шагом dx, то количество повторений тела цикла можно определить по формуле:

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

 

 

program Example_12 ;

var x,y:real,-n,i:integer;

Begin

x:=0; { Присвоение начального значения аргументу. }

n:=round((pi-0)/0.1)+l; {Расчет количества повторений цикла. Функция round округляет результат деления до целого}

for i:-l to n do { Тело цикла выполнится ровно n раз }

Begin

Y:=exp (sin(x))*cos(x); {Расчет значения функции для соответствующего значения аргумента X. }

Writeln (x:4:2,’ ’,y:8:4); {Печать значений функции и аргумента. }

х:=х+0.1; {Вычисление нового значения аргумента.}

end; { Конец цикла for... do }

End.

 

Пример 2. Дано натуральное число n. Подсчитайте количество цифр данного числа.

Решение. Подсчет количества цифр начнем с последней цифры числа. Увеличим счетчик цифр на единицу. Число уменьшим в 10 раз (тем самым мы избавляемся от последней цифры числа). Далее с получившимся числом проделаем ту же последовательность действий и т.д., пока число не станет равным нулю.

Program Example_2;

var m, n: Longint;

k: Integer; {счетчик цифр}

begin

writeln ('Введите целое число'); {вводим целое число n}

readln (n);

m:=n;

k:=0;

while m<>0 do {пока число m<>O делать }

Begin

Inc(k); {или k:=k+l;}

m:=m Div 10; {«уменьшаем» число на последнюю цифру}

end;

writeln ('В числе ', n, ' - ', к, ' цифр.'); {вывод количества цифр}

readln;

End.

Тестирование программы.

Рассмотрим выполнение этой программы в пошаговом режиме для числа 65387.

В результате работы программы на экране появится предложение:

В числе 65387 – 5 цифр.

n m k
     
     
     
     
     
     

 

Пример 3. Вычислить факториал числа N ().

Входные данные: N - целое число, факториал которого необходимо вычис­лить.

Выходные данные: factorial -значение факториала числа N.

Промежуточные данные: i - целочисленная переменная, принимающая зна­чения от 2 до N с шагом 1, параметр цикла.

Итак, вводится число N. Переменной factorial, предназначенной для хра­нения значения произведения последовательности чисел, присваивается на­чальное значение, равное единице. Затем организуется цикл, параметром ко­торого выступает переменная i. Если значение параметра цикла меньше или равно N, то выполняется оператор тела цикла, в котором из участка памяти с именем factorial считывается предыдущее значение произведения, умножа­ется на текущее значение параметра цикла, а результат снова помещается в участок памяти с именем factorial. Когда параметр i становится больше N, цикл заканчивается и на печать выводится значение переменой factorial, которая была вычислена в теле цикла.

 

Теперь рассмотрим текст программы вычисления факториала:   Program Example_3; var factorial, n, i: integer; begin write ('n='); readln (n); factorial:=1; {Стартовое значение.} for i:=2 to n do factorial:=factorial*i; writeln (factorial); end.  
Блок-схема:

 
 

 

 


Пример 4. Вычислить а (п > 0).

Входные данные: а - вещественное число, которое необходимо возвести в целую положительную степень n.

Выходные данные: р (вещественное число) - результат возведения веще­ственного числа а в целую положительную степень n.

Промежуточные данные: i - целочисленная переменная, принимающая зна­чения от 1 до n с шагом 1, параметр цикла.

Известно, что для того чтобы получить целую степень n числа а, нужно ум­ножить его само на себя n раз. Результат будет храниться в участке памяти с именем р. При выполнении очередного цикла из этого участка предыдущее зна­чение будет считываться, умножаться на основание степени а и снова записы­ваться в участок памяти р. Цикл выполняется n раз.

В таблице отображен протокол выполнения алгоритма при возведении числа 2 в пятую степень: а = 2, n = 5.

i          
P          

 

Блок-схема:

           
   
Текст программы: Program Example_4; var a,p:real; i,n:word; begin write ('Введите основание степени а='); readln (a); write( 'Введите показатель степени n='); readln (n); p:=l; for i:=l to n do P:=P*a; writeln ('P=',P:1:3); readln; end.    
   
 
 
 

 


Пример 5. Вычислить сумму натуральных четных чисел, не превышающих N.

Входные данные: N - целое число.

Выходные данные: S - сумма четных чисел.

Промежуточные данные: i - переменная, принимающая значения от 2 до N с шагом 2, следовательно, также имеет целочисленное значение.

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

Так как параметр цикла i изменяется с шагом 2, в блок-схеме использован цикл с предусловием, который реализуется при составлении программы с помощью оператора while... do.

Блок-схема:

 

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

Program Example_5;

var n, i, S:word;

Begin

write ('n='); readln (n);

S:=0; i:=2;

цhile i<=n do

Begin

S:=S+i;

i:=i+2;

end;

writeln ('S=', S);

End.

 

Эту же задачу можно решить иначе, используя цикл for... do:

 

Program Example_51;

var n, i, S: word;

Begin

write ('n=');

if i mod 2 = 0 then {Если остаток от деления параметра цикла на 2 равен 0, то это число

S: =S+i; четное. Следовательно, происходит накапливание суммы}

writeln (‘ S=’, S);

End.

В таблице приведены результаты тестирования программы для n = 7. Не­сложно заметить, что при нечетных значениях параметра цикла значение пе­ременной, предназначенной для накапливания суммы, не изменяется.

i              
s              

 

Пример 6. Даны натуральные числа n и k. Составить программу вычисления выражения 1k+2k+...+nk.

 

Для вычисления указанной суммы целесообразно организовать цикл с параметрами i, в котором, во-первых, вычислялось бы очередное значение y=ik и, во-вторых, осуществлялось бы накопление суммы прибавлением полученного слагаемого к сумме всех предшествующих (s=s+y).

 

program Example_6;

v ar n, k, y, i, s, m: integer;

Begin

writeln ('Введите исходные данные n и k`);

readln (n, k);

s:=0

for i:=1 to n do

Begin

y:=1

for m:=1 to k do y:= y*I; {нахождение степени k числа i}

s:=s+y;

end;

writeln (` Ответ: `, s);

End.

 

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

 

Пример 7. Модифицировать предыдущую программу так, чтобы она вычисляла сумму 11+22+…+nn.

 

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

program Example _7;

var n, y, i, s, m: integer;

Begin

writeln ('Введите начальное значение n`);

readln (n);

s:=0;

for i:=1 to n do

begin y:=1;

for m:=l to i do y:=y*i; {нахождение степени k числа i)

s:=s+y;

end;

wrlteln ('Ответ: ',s);

End.

 

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

Пример 8. Старинная задача. Сколько можно купить быков, коров и телят, если плата за быка 10руб., за корову — 5руб., за теленка — полтинник (0,5руб.), если на 100 руб. надо купить 100 голов скота.

 

Обозначим b — число быков; k— число коров; t — число телят.

После этого можно записать два уравнения:

10b + 5k + 0,5t = 100 и b + k + t = 100.

Преобразуем их: 20b + 10k + t = 200 и b + k + t = 100.

 

На 100 рублей можно купить:

· не более 10 быков, т. е. 0 < b < 10;

· не более 20 коров, т.е. 0 < k< 20;

· не более 200 телят, т.е. 0 < t < 200.

 

program Example _8;

var b, k, t: integer;

Begin

for b:=0 to 10 do

for k:=0 to 20 do

for t:=0 to 200 do

if (20*b+10*k+t=200) and (b+k+t=100) then writeln (`быков `, b, ` коров`, k,` телят `, t);

End.

 

Сколько раз будет проверяться условие в данной программе? Значение переменной b изменяется 11 раз (от 0 до 10), для каждого её значения переменная k изменяется 21 раз, а для каждого значения переменной k переменная t изменяется 201 раз. Таким образом, условие будет проверяться 11 21 201 раз. Но если известно число быков и коров, то число телят можно вычислить по формуле t = 100 - (b + k) и цикл по переменной t исключается.

program Example _81;

var b, k, t: integer;

Begin

for b:=0 to 10 do

for k:=0 to 20 do

Begin

t:=100-(b+k);

if (20*b+10*k+t=200) then writeln (`быков `, b, ` коров`, k,` телят `, t);

end;

End.

Пример 9. Дана непустая последовательность натуральных чисел, за которой следует 0. Составить программу поиска в данной непустой последовательности порядкового номера наименьшего элемента.

Обозначим через x, i – очередной член последовательности и его номер; min, k -минимальный член последовательности и его номер. Считывание членов последовательности производится до тех пор, пока не будет наеден 0, то есть пока x <>0. Начальное значение минимума определяется значением первого члена последовательности. Очередное вводимое число требуется сравнивать с текущим значением минимума, и если текущее значение min окажется больше очередного члена последовательности, то его надо изменить.

 

program Example_9;

var x, I, min, k: Longint;

Begin

writeln (`Введите первый член последовательности`);

read (x); k:=1;

min:=x; i:=2;

while x<>0 Do

begin

if x<min then

Begin

min:=x;

k:=i

end;

writeln (`Введите`, i, ` элемент последовательности`);

read (x);

inc (i);

end;

w riteln (` Номер минимального элемента - `, k);

end.

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

Обозначим через х, к соответственно цену и количество товара, через p – заданную предельную сумму, через s — общую стоимость покупки. Начальное значение общей стоимости покупки (s) равно нулю. Значение предельной суммы донесся с клавиатуры. Необходимо повторять запрос цены и количества выбранного товара, вычислять его стоимость, суммировать ее с общей стоимостью и выводить результат на экран до тех пор, пока она не превысит предельную сумму p. В этом случае на экран надо вывести сообщение о превышении.

program Example_10;

var х, k, p, s: integer;

Begin

writeln (`Предельная сумма -`); readln (p);

s:=0;

Repeat

writeln ('Введите цену товара и его количество`);

readln (x,к);

s:=s+x*k;

writeln ('Стоимость покупки равна ', s);

until s>p;

writeln ('Суммарная стоимость покупки превысила предельную сумму`);

End.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: