Как составить алгоритмы функций примеры

11. Типовые алгоритмы табулирования
функций, вычисления количества, суммы и произведения

Итак, основное назначение циклов — обработка большого
объема данных. Математически эта обработка зачастую сводится к поиску, выбору и
статистической обработке нужных величин. Практически в любой реальной задаче мы
ищем максимальные и минимальные значения в наборе данных, суммируем или перемножаем
требуемые данные, определяем арифметическое среднее или количество элементов, отвечающих
условию. Для решения всех этих распространенных задач существуют типовые алгоритмы,
задающие правила выполнения соответствующих расчетов. Изучением этих алгоритмов
мы займемся в гл.
11 и 12.

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

11.1. Алгоритм табулирования

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

В общем виде алгоритм можно описать так:

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

2.    
в теле цикла на каждом шаге вычисляется
очередное значение функции, зависящее от управляющей переменной, затем формируется
строка таблицы;

3.    
в конце шага цикла значение управляющей
переменной (обозначим ее
x) изменяется оператором вида x:=x+d;, где d — заданный шаг по управляющей
переменной.

В качестве примера составим таблицу синусов в пределах
от
0 до π с шагом по аргументу 0.25. Обозначим аргумент как x, значение синуса от x обозначим
как
y. В простейшем случае программа табулирования может выглядеть
так:

var x,y:real;

begin

 writeln(‘x’:10,’sin(x)’:10);

  {печать заголовка таблицы до
цикла}

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

 while x<=pi+1e-6 do begin

   y:=sin(x); {вычисление функции}

   writeln (x:10:2, y:10:2);

    {печать строки таблицы}

   x:=x+0.25; {шаг по x}

 end;

end.

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

,  значения
a, b вводятся пользователем.

Напишем текст программы, сопроводив его соответствующими
комментариями.

var x,f,a,b,dx:real;

 n:integer; {счетчик выведенных
строк}

begin

 repeat {Цикл ввода с контролем

  правильности значений: a,dx,b должны быть

  числами, dx>0, a+dx должно быть меньше b}

  writeln (‘Введите a,dx,b:’);

  {$I-}read (a,dx,b);{$I+}

  if IoResult <> 0 then
begin

   writeln (‘Вы не ввели 3 числовых ‘,

    ‘значения, попробуем еще раз’);

   continue;

  end;

  if (dx<=0) or (a+dx>=b)
then begin

   writeln (‘Вы не ввели допустимые
‘,

    ‘данные, попробуем еще раз’);

   continue;

  end

  else break;

 until false;

 {Печать заголовка таблицы}

 writeln;

 writeln (‘x’:10,’f(x)’:10);

 x:=a;

 n:=2; {2 строки уже использованы}

 while x<=b+1e-6 do begin

   {в условии цикла учитываем возможную

    погрешность работы с real!}

  if x<=0 then f:=sqr(x)*x

  else f:=exp(1/3*ln(abs(x)));

   {корень 3 степени взяли через
exp и ln}

  writeln (x:10:2,f:10:2);

  n:=n+1;

  if n=24 then begin

  {На экране консоли по умолчанию 25 строк}

   write (‘Нажмите Enter…’);

   reset (input); readln;

   n:=1;

  end;

  x:=x+dx;

 end;

 writeln (‘Таблица выведена‘);

 reset (input); readln;

end.

Как видно из примера, основной порядок действий — такой
же, как в предыдущей задаче. Так как экран консоли по умолчанию содержит всего 25
строк, с помощью
переменной
n мы дополнительно
контролируем число уже выведенных строк и делаем по заполнении экрана паузу до нажатия
пользователем клавиши
Enter.

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

Известна стоимость единицы товара. Составить таблицу стоимости
1,
2, …, K единиц товара, значение
K вводится.

Так как число единиц товара заведомо целое, при программировании задачи будет удобен
цикл
for:

 var t:real;

    i,k:integer;

begin

 writeln;

 writeln (‘Стоимость единицы
товара:’);

 read (t);

 writeln (‘Количество единиц
товара:’);

 read (k);

 writeln (‘Единиц’:10,’Стоимость’:10);

 for i:=1 to k do

  writeln (i:10,(i*t):10:2);

end.

Здесь для простоты мы исключили сделанные в предыдущем
примере проверки. Стоимость единицы товара обозначена
t, переменная i необходима для
перебора возможных значений единиц товара в цикле
for. Поскольку счетчик цикла for автоматически меняется с шагом 1, а оператором writeln можно выводить не только значения переменных, но и выражения,
основной цикл программы состоит из одного оператора и не нуждается в операторных
скобках.

11.2. Алгоритм организации счетчика

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

1.    
в разделе var описать переменную целочисленного типа, с помощью которой
будет вестись подсчет;

2.    
до цикла присвоить ей начальное значение
0;

3.    
в теле цикла, если очередной элемент
данных отвечает условию подсчета, увеличить эту переменную на
1 оператором вида k:=k+1;.

Необходимость присваивания начальных значений на шаге 2
этого и последующих алгоритмов связана с тем, что после описания в разделе
var значение переменной еще не определено. «Пока мы не
начали подсчитывать количество, оно равно нулю» — этот очевидный для человека
факт не очевиден для компьютера! Поэтому любой переменной, которая может изменяться
в теле цикла, необходимо присвоить до цикла начальное значение, что и делает оператор
вида
k:=0;.

Рассматриваемый нами алгоритм очень часто встречается в
самых различных задачах, поэтому для «быстрой» записи операции по увеличению
счетчика (она называется инкремент) или его уменьшению (декремент)
существуют специальные стандартные процедуры:

Inc(X,N); — увеличивает значение переменной.

Здесь параметр X — переменная порядкового типа, а N — переменная или выражение целочисленного типа. Значение
X увеличивается
на
1, если параметр N не определен, или
на
N, если параметр N определен, то есть
Inc(X); соответствует X:=X+1;, а Inc(X,N); соответствует X:=X+N;.

Dec(X,N);  — уменьшает значение переменной.

Параметр X — также
переменная порядкового типа,
N — целочисленное
значение или выражение. Значение
X уменьшается на 1, если параметр
N не определен,
или на
N, если параметр N определен, то есть
Dec(X); соответствует X:=X-1;, а Dec(X,N); соответствует X:=XN;.

С помощью Inc и Dec генерируется более
оптимизированный код, особенно полезный в сложных циклах. Возможно, мы будем использовать
их не во всех примерах, но вам советую о них не забывать.

В качестве примера реализации алгоритма рассмотрим следующую
задачу.

 Последовательность z(i) задана
соотношениями ,
i=1,2,…,100. Найти количество элементов последовательности,
больших значения 0.5.

Обозначив искомое количество за k, составим программу:

var z:real;

 i,k:integer;

begin

 k:=0;

 for i:=1 to 100 do
begin

  if i mod 2 = 0 then
z:=sqr(i)*cos(i)

  else z:=sin(i/2);

  if z>0.5 then
inc(k);

 end;

 writeln (‘Количество=’,k);

end.

Так как шаг по переменной i равен 1, в программе
использован цикл
for, для проверки того, является ли значение i четным, использована операция mod.

В следующей задаче займемся обработкой данных по мере их
ввода пользователем.

Известны оценки за экзамен по информатике для группы из
n студентов, 2≤n≤25.
Оценить количественную и качественную успеваемость группы по формулам:

, , где k1 — количество
«троек», «четверок» и «пятерок»,
k2 —
количество только «четверок» и «пятерок».

Для ввода текущей оценки используем целочисленную переменную
a, в качестве счетчика цикла for введем переменную i («номер
студента»), остальные величины описаны в условии задачи. При вводе значения
n и очередного значения a для простоты
не будем контролировать корректность вводимых данных.

var a,i,n,k1,k2:integer;

    ykol,ykach:real;

begin

 writeln;

 writeln (‘Введите количество
студентов:’);

 read (n);

 k1:=0;

 k2:=0;

 for i:=1 to n do
begin

  write (‘Введите оценку ‘,i,’
студента:’);

  read (a);

  if a>2 then begin

   inc(k1);

   if a>3 then
inc(k2);

  end;

 end;

 ykol:=k1/n*100;

 ykach:=k2/n*100;

 writeln

(‘Количественная успеваемость=’,ykol:6:2);

 writeln

(‘Качественная успеваемость 
=’,ykach:6:2);

 reset (input); readln;

end.

11.3. Алгоритмы накопления суммы и произведения

Данные алгоритмы применяются, когда требуется сложить или
перемножить выбранные данные. В общем виде эти широко применяемые алгоритмы можно
описать так:

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

2.    
до цикла переменной-сумме присвоить
начальное значение
0, а произведению — значение 1;

3.    
в теле цикла, если очередной элемент
данных
t отвечает условию суммирования или перемножения, сумма накапливается
оператором вида
s:=s+t;, а произведение — оператором вида p:=p*t;

Очевидно, почему начальное значение произведения — 1, а не 0. После оператора
p:=0; оператор p:=p*t;, расположенный в теле цикла, будет возвращать только нули.

Рассмотрим типовую задачу. Для функции ,  найти арифметическое среднее ее положительных
значений и произведение ненулевых значений.

Для поиска арифметического среднего необходимо сначала
найти сумму
s и количество k положительных
значений функции. Составим следующую программу:

var x,f,s,p:real;

    k:integer;

begin

 s:=0; k:=0; p:=1;

 x:=-5;

 while x<=5+1e-6
do begin

  if x<0 then f:=sqr(ln(abs(x)))

  else if x>0 then
f:=sin(sqr(x))

  else f:=0;

  if f>0 then begin

   s:=s+f;

   k:=k+1;

  end;

  if f<>0 then
p:=p*f;

  x:=x+0.5;

 end;

 s:=s/k; {теперь в s — искомое
среднее}

 writeln

 (‘Среднее положительных =’,s:10:6);

 writeln

 (‘Произведение ненулевых=’,p:10:6);

 reset (input); readln;

end.

В следующей задаче также применяется алгоритм накопления
суммы.

Требуется написать программу, имитирующую работу кассового
аппарата: пользователь в цикле вводит цену очередного товара или 0 для завершения
ввода, программа суммирует цены. По завершении цикла ввода программа начисляет скидку
с общей стоимости товара по правилам: скидки нет, если общая стоимость покупки
— менее 10000 руб.; скидка равна 5%, если общая стоимость — от 10000 до 20000
руб.; скидка равна 7%, если общая стоимость — свыше 20000 руб. После начисления
скидки выводится окончательная стоимость покупки.

Обозначив общую стоимость покупки s, а цену очередного товара — t, напишем следующую программу:

var s,t:real;

begin

 writeln;

 s:=0; {начальное значение суммы!}

 repeat

  writeln (‘Введите стоимость
товара или ‘

   ‘0 для завершения ввода:’);

  {$I-}read(t);{$I+}

  if (IoResult<>0)
or (t<0) then begin

   writeln (‘Ошибка! Повторите ввод’);

   continue;

  end;

  if t=0 then break;

  {Округляем t до 2 знаков после
запятой —

   на случай, если есть копейки}

  t:=round (t*100) / 100;

  s:=s+t; {накопление суммы}

 until false;

 {Начисление скидки и вывод ответа}

 writeln (‘Стоимость без скидки:’,s:8:2);

 if s>20000 then s:=s-s*0.07

 else if s>10000
then s:=s-s*0.05;

 writeln (‘Стоимость со скидкой:’,s:8:2);

 writeln (‘Спасибо за покупку!’);

 reset (input); readln;

end.

Тип данных real выбран для s и t не случайно выбор integer ограничил бы диапазон обрабатываемых значений и не позволил
в удобном виде ввести копейки. Проверки корректности ввода, делаемые программой,
знакомы по предыдущим примерам и поэтому не закомментированы.

Рейтинг@Mail.ru

Hosted by uCoz

Алгоритм-процедура

— +

Используем этот
алгоритм при описании основного
алгоритма
.

Ответы:
max(a+b,a-b)=c

max(a2,b2
)= d

max(a,b)=c

При описании
основного алгоритма

обращение к
процедуре записывают в блоке:

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

z

1)

2)

3)

p

M

a+b

a-b

c

a2

b2

d

a

b

c

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

Алгоритм-функция.

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

Пример:
Напишем для рассмотренной выше задачи
алгоритм-функцию,
вычисляющий max(z,p).
В отличие от процедуры значение результата
присваивается имени
функции
.

В основном
алгоритме

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

2вариант:

z

p

1

a+b

a-b

2

a2

b2

3

a

b

Здесь 2 формальных
параметра — z,
p.
Это параметры-значения. Результат
присваивается имени.

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

Программирование с использованием процедур и функций. Описание подпрограммы-процедуры.

Процедуры
используются в тех случаях, когда в
подпрограмме нужно вычислить значение
или совокупность значений величин, а
также проводятся действия, вообще не
связанные с вычислением, например: ввод,
вывод данных; построение графика.
Структура описания процедуры аналогична
структуре основной программы. Она
состоит из заголовка
описания процедуры и блока
описания.
За заголовком следуют такие же разделы,
как и в основной программе, т.е. 5 разделов
(если они нужны). В отличие от основной
программы процедура завершается не
точкой, а точкой с запятой. Заголовок
имеет вид:

Procedure<имя
процедуры>(<список формальных
параметров>);

Имя процедуры —
идентификатор. Список формальных
параметров — это перечень идентификаторов,
обозначающих исходные
данные (параметры-значения) и результаты
(параметры-переменные)

с указанием их типов.

Пример:
Записать процедуру, вычисляющую функцию:
y=xn,
n
€ Z

Procedure
Stepen (x:real; n:integer; var y:real);

Var
i:integer;

Begin

y:=1;

for
i:=1 to
n do

y:=y*x;

end;

Параметры х, y,
n
являются формальными, причем x,
n
– параметры-значения (исходные данные),
y
– параметр-переменная (результат),
поэтому у в списке параметров описывается
по-особому с использованием слова var,
то есть: var
y:real

Кроме того, в этой
процедуре используется переменная i.
Она описана вне заголовка, в описательном
разделе блока процедуры – разделе
описания переменных процедуры var.

Переменная i
является локальным
параметром
,
который описан внутри данной процедуры
и действует только
внутри ее

локально.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Занятие 2. Программная реализация разветвляющегося алгоритма

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

Будут приведены примеры вычисления функций, заданных на разных промежутках кусочно. Также приведены принцип и примеры расчетов для кусочных функций, заданных на двух промежутках и на трех промежутках.

Пример 5. Даны числа a=2, b=7. Вычислить сумму S и разность R чисел a и b. Сравнить полученные значения S и R и указать большее из них.

Блок-схема представлена на рис. 4.5.

Блок-схема для примера 5

Рис.
4.5.
Блок-схема для примера 5

Код программы (Visual Studio):

// proga14.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	double a, b, S, R;
	a=2;
	b=7;
	S=a+b;
	R=a-b;
	cout<<"S="<<S<<" R="<<R<<endl;
	if(S>R) cout<<"Max S"<<endl;
	else cout<<"Max R"<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double a, b, S, R;
	a=2;
	b=7;
	S=a+b;
	R=a-b;
	cout<<"S="<<S<<" R="<<R<<endl;
	if(S>R) cout<<"Max S"<<endl;
	else cout<<"Max R"<<endl;
	return 0;
}

Результат выполнения программы:

Пример 6. Составить блок-схему и программу для вычисления значений функций y=sin x и z=ln x при различных значениях аргумента. Учесть область определения функций.

Решение. Рассмотрим области определения функций y и z. Синус имеет неограниченную область определения, т.е. считается при любом действительном х. Поэтому на расчет функции y не будет никаких условий. Логарифм же существует при положительном значении аргумента, т.е. считается при x>0. Поэтому, прежде чем считать функцию z, необходимо проверить условие «x>0«. Если условие верно, то можно считать z. Если ложно, то z считать нельзя, и в этом случае мы напишем в ответ, что z не существует фразой «z net«.

Блок-схема представлена на рис. 4.6.

Блок-схема для примера 6

Рис.
4.6.
Блок-схема для примера 6

Код программы (Visual Studio):

// proga15.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
	double x, y, z;
	cout<<"vvedi x=";
	cin>>x;
	y=sin(x);
	cout<<"y="<<y;
	if(x>0){
		z=log(x);
		cout<<" z="<<z<<endl;
	}
	else cout<<" z net"<<endl;
	return 0;
}

Результат выполнения программы:

Код программы (Borland C++):

#include <iostream.h>
#include <math.h>
int main(){
	double x, y, z;
	cout<<"vvedi x=";
	cin>>x;
	y=sin(x);
	cout<<"y="<<y;
	if(x>0){
		z=log(x);
		cout<<" z="<<z<<endl;
	}
	else cout<<" z net"<<endl;
	return 0;
}

Результат выполнения программы:

Пример 7. Вычислить значение функции Z=begin{cases}x+3,&x<1\4x,&xge 1end{cases} при различных значениях аргумента х (аргумент х считать с клавиатуры).

Решение: Функция Z задана как кусочная функция, т.е. при разных значениях х она считается по-разному. Следует отметить, что при одном значении аргумента функция будет иметь лишь одно значение, т.е. функция однозначная. График функции Z представлен на рис. 4.7.

График кусочной функции

Рис.
4.7.
График кусочной функции

Посчитаем значение функции Z при х=0. Прежде всего необходимо проверить, какое условие верно: «х<1» или «хge 1«. Условие для первой ветки функции верно, значит считаем Z=x+3=0+3=3.

Посчитаем значение функции Z при х=4. Прежде всего необходимо проверить, какое условие верно: «х<1» или «хge 1«. Условие для второй ветки функции верно, значит считаем Z=4x=4cdot 4=16.

При расчете кусочной функции так или иначе сначала проводится проверка условия, поэтому вычисление таких функций реализуется через разветвляющийся алгоритм. В данном примере будет один блок разветвления (соответственно один оператор if в программе). Условием будет служить проверка «х<1«. Если условие верно, то функция считается по первой ветке, если ложно, то по второй ветке. Второе условие «хge 1» будет лишним, т.к. оно соответствует стрелке «нет» от первого условия «х<1«.

Примечание. Функция Z – это функция, которая имеет один аргумент. Не следует путать запись кусочной функции с системой уравнений или системой неравенств, уравнения или неравенства которых также объединены фигурной скобкой. При расчете кусочной функции не решается никакая система уравнений, система неравенств, а просто подставляется конкретное значение аргумента и вычисляется значение функции.

Примечание. При расчете функции Z не следует сразу рассчитывать обе ветки функции, т.к. в ответ нам нужен только один результат. Корректно составленный алгоритм не должен быть избыточен. Не следует повторять одно и то же по сути условие.

Блок-схема для примера 7 представлена на рис. 4.8.

Блок-схема для примера 7

Рис.
4.8.
Блок-схема для примера 7

Код программы (Visual Studio):

// proga16.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(){
	double x, Z;
	cout<<"x=";
	cin>>x;
	if(x<1){
		Z=x+3;
	}
	else {
		Z=4*x;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы:

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double x, Z;
	cout<<"x=";
	cin>>x;
	if(x<1){
		Z=x+3;
	}
	else { Z=4*x;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы:

Пример 8. Вычислить значение функции Z=begin{cases}x^2,&text{если} x<0\|x|,&text{если} 0le xle 5\5,&text{если} x> 5end{cases} при различных значениях аргумента х (аргумент х считать с клавиатуры).

Решение: Функция Z задана как кусочная функция, определенная на трех промежутках. График функции Z представлен на рис. 4.9.

График кусочной функции

Рис.
4.9.
График кусочной функции

В данной задаче будем использовать два условия для определения нужной ветви функции. Первое условие «x<0» определяет, следует ли рассчитывать по первой ветви функции. Второе условие «xle 5» определяет, следует ли рассчитывать по второй ветви. Если и первое, и второе условия оказались ложными (не выполнились), то следует рассчитывать по третьей ветви. Следовательно, в блок-схеме будем использовать два блока разветвления, а в программе два оператора условия if.

Например, нужно вычислить Z при х=-2. Первое условие «x<0» выполняется верно, т.к. -2<0. Следовательно, считать следует по первой ветви, а именно: Z=x^2=(-2)^2=4.

Например, нужно вычислить Z при х=2,5. Первое условие «x<0» выполняется неверно, т.к. 2,5>0. Проверяем второе условие «xle5«: 2,5≤5 – верно. Следовательно, считать следует по второй ветви, а именно: Z=|x|=|2,5|=2,5.

Например, нужно вычислить Z при х=10. Первое условие «x<0» выполняется неверно, т.к. 10>0. Проверяем второе условие «xle 5«: 10≤5 – неверно. Следовательно, ни первое, ни второе условия не выполнились, и считать следует по третьей ветви, а именно: Z=5.

Блок-схема представлена на рис. 4.10.

Блок-схема для примера 8

Рис.
4.10.
Блок-схема для примера 8

Код программы (Visual Studio):

// proga17.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main(){
	double x,Z;
	cout<<"x=";
	cin>>x;
	if(x<0){ Z=pow(x, 2.0);
	}
	else {if(x<=5){
			Z=fabs(x);}
		else {
			Z=5.0;}
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
#include <math.h>
int main(){
	double x, Z;
	cout<<"x=";
	cin>>x;
	if(x<0){
		Z=pow(x, 2.0);
	}
	else {
		if(x<=5){
			Z=fabs(x);
	}
	else {
		Z=5.0;
		}
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Примечание. В качестве второго условия можно, конечно, взять «0le xle 5«. Но при проверке первого условия мы уже знаем, будет ли x<0. Поэтому можно пропустить повторную проверку на положительность переменной x. Также в качестве второго условия можно взять условие «x>5«. Если оно выполнится верно, то считать следует по третьей ветви, если неверно – то по второй.

Пример 9. Вычислить значение функции Z=begin{cases}x+y,&xy<1\x-y,&xyge 1end{cases} при различных значениях аргументов х и у (аргументы х и у считать с клавиатуры).

Решение: Данный Пример аналогичен Примеру 7. Отличие состоит в том, что сейчас функция Z зависит от двух переменных x и y. Для реализации алгоритма разницы нет, поэтому за основу возьмем блок-схему и программу из Примера 7.

Блок-схема представлена на рис. 4.11.

Блок-схема для примера 9

Рис.
4.11.
Блок-схема для примера 9

Код программы (Visual Studio):

// proga18.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(){
	double x, y, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	if(x*y<1){ Z=x+y;
	}
	else {Z=x-y;
	}
	cout<<"Z="<<Z<<endl;
	return 0;}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double x, y, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	if(x*y<1){
		Z=x+y;
	}
	else {
		Z=x-y;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Ручной счет.

при х=-3; у=0,5 ху=-3·0,5=-1,5 <1 Z=x+y=-3+0,5=-2,5.
при x=0,8; y=2 xy=0,8·2=1,6≥1 Z=x-y=0,8-2=-1,2.

Пример 10. Вычислить значение функции Z(x,y)=begin{cases}x+y,&text{если} xy<0\x-y,&text{если} 0le xyle 5\y,&text{если} xy>5end{cases} при различных значениях аргументов х и у (аргументы х и у считать с клавиатуры).

Решение. В данном примере функция Z определена на трех промежутках, как в Примере 8. Отличие состоит в том, что Z зависит от двух переменных x и y. Для реализации алгоритма разницы нет, поэтому за основу возьмем блок-схему и программу из Примера 8.

Блок-схема представлена на рис. 4.12.

Блок-схема для примера 10

Рис.
4.12.
Блок-схема для примера 10

Код программы (Visual Studio):

// proga19.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(){
	double x, y, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	if(x*y<0){ Z=x+y;}
	else {
		if(x*y<=5){
			Z=x-y;
		}
		else {
			Z=y;
		}
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double x, y, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	if(x*y<0){
		Z=x+y;
	}
	else {
		if(x*y<=5){
			Z=x-y;
	}
	else {
		Z=y;
		}
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Ручной счет:

при х=-1,5; у=2   ху=-1,5·2=-3 <0   Z={по первой ветви}=x+y=-1,5+2=0,5.
при x=1,2; y=2   xy=1,2·2=2,4≤5   Z={по второй ветви}=x-y=1,2-2=-0,8.
при x=3; y=7   xy=3·7=21 >5   Z={по третьей ветви}=y=7.

Пример 11. Найти наибольшее (максимальное) из трех чисел.

Решение. Обозначим три числа буквами a, b, c. Числа a, b, c будем считывать с клавиатуры. Для нахождения наибольшего из трех чисел введем еще одну переменную max, которая будет хранить наибольшее значение. Принцип нахождения наибольшего значения заключается в следующем. Сначала принимаем max как первое число а. Потом поочередно сравниваем с оставшимися числами b и c. Если окажется, что b больше уже запомненного max, то следует перезаписать max, изменив его значение на значение b. Если же b<max, то max изменять не нужно, поэтому ветвь «нет» будет пустой. Аналогично сравниваем с и max. После двух сравнений в переменной max будет лежать наибольшее из трех чисел.

Примечание. Если чисел будет больше трех, например, пять чисел, то следует сделать четыре сравнения.

Примечание. Если нужно определить наименьшее из трех чисел, то вводят переменную min, приравнивают к первому числу. Затем поочередно сравнивают оставшиеся числа: «b<min«, «c<min«.

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

Блок-схема представлена на рис. 4.13.

Блок-схема для примера 11

Рис.
4.13.
Блок-схема для примера 11

Выполнение блок-схемы (при вводимых значениях чисел 23,7; -0,4; 34,28)

Начало
ввод данных a=23,7; b=-0,4; c=34,28
max=a=23,7
b>max   -0,4>23,7  нет
c>max   34,28>23,7  да
max=c=34,28
вывод max
Экран
a=23,7
b=-0,4
c=34,28
max=34,28

Код программы (Visual Studio):

// proga20.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	double a, b, c, max;
	cout<<"a=";
	cin>>a;
	cout<<"b=";
	cin>>b;
	cout<<"c=";
	cin>>c;
	max=a;
	if(b>max){
		max=b;
	}
	if(c>max){
		max=c;
	}
	cout<<"max="<<max<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double a, b, c, max;
	cout<<"a=";
	cin>>a;
	cout<<"b=";
	cin>>b;
	cout<<"c=";
	cin>>c;
	max=a;
	if(b>max){
		max=b;
	}
	if(c>max){
		max=c;
	}
	cout<<"max="<<max<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Пример 12. Найти значение функции Z(x)=max{3x; 10-x; |x|} при различных значениях аргумента х (аргумент х считать с клавиатуры).

Решение. Функция Z считается как наибольшее из трех выражений. Задача схожа с Примером 11. Введем обозначения: a=3x, b=10-x, c=|x|. Тогда наша задача максимально будет похожа на Пример 11.

Блок-схема представлена на рис. 4.14.

Блок-схема для примера 12

Рис.
4.14.
Блок-схема для примера 12

Выполнение блок-схемы (при вводимом x=1)

a=3x=3·1=3
b=10-x=10-1=9
c=|x|=|1|=1
Z=a=3
b>Z   9>3  да
Z=b=9
c>Z   1>9  нет
вывод Z

Код программы (Visual Studio):

// proga21.cpp: определяет точку входа для консольного приложения.
//	
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int main(){
	double x, a, b, c, Z;
	cout<<"x=";
	cin>>x;
	a=3.0*x;
	b=10.0-x;
	c=fabs(x);
	Z=a;
	if(b>Z){Z=b;}
	if(c>Z){Z=c;}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
#include <math.h>
int main(){
	double x, a, b, c, Z;
	cout<<"x=";
	cin>>x;
	a=3.0*x;
	b=10.0-x;
	c=fabs(x);
	Z=a;
	if(b>Z){
		Z=b;
	}
	if(c>Z){
		Z=c;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Пример 13. Найти значение функции, заданной по формуле Z(x,y)=max{x+y, x-y, xy} при различных значениях аргументов х и у (аргументы х и у считать с клавиатуры).

Блок-схема представлена на рис. 4.15.

Блок-схема для примера 13

Рис.
4.15.
Блок-схема для примера 13

Код программы (Visual Studio):

// proga22.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	double x, y, a, b, c, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	a=x+y;
	b=x-y;
	c=x*y;
	Z=a;
	if(b>Z){
		Z=b;
	}
	if(c>Z){
		Z=c;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Visual Studio):

Код программы (Borland C++):

#include <iostream.h>
int main(){
	double x, y, a, b, c, Z;
	cout<<"x=";
	cin>>x;
	cout<<"y=";
	cin>>y;
	a=x+y;
	b=x-y;
	c=x*y;
	Z=a;
	if(b>Z){
		Z=b;
	}
	if(c>Z){
		Z=c;
	}
	cout<<"Z="<<Z<<endl;
	return 0;
}

Результат выполнения программы (Borland C++):

Краткие итоги

Одна и та же блок-схема может быть использована при написании разных программ С++. Результат выполнения программы из-за этого не должен меняться.

Упражнения

  1. Составьте блок-схему и программу для вычисления значений функций z1=arccos^3(2,5x-0,6y), z2=0,45|x^3-y^2|+2lg^{2,5}y при различных значениях аргументов x и y.
  2. Составьте блок-схему и программу по нахождению корней квадратного уравнения через дискриминант. Коэффициенты квадратного уравнения считывайте с клавиатуры.
  3. Составьте блок-схему и программу, которая спрашивает у пользователя возраст и в соответствии с возрастной группой («дошкольник», «школьник», «взрослый», «пожилой») выдает соответствующую фразу на экран.
  4. Составьте блок-схему и программу для вычисления значения функции Z(x,y)=begin{cases}sin^{0.4}(4^{4y})+lgsqrt{y-frac{x}{y-0.8}},&text{если} x+y<-2\2.3,&text{если} -2le x+yle 0\frac{sqrt[3]{x}-sqrt[3]{y}}{x}-y,&text{если} x+y>0end{cases} при разных значениях аргументов x и y.
  5. Составьте блок-схему и программу для вычисления значений функции Z(x,y)=min{max{sin x, sin y},x,y} при разных значениях аргументов x и y.

Понравилась статья? Поделить с друзьями:
  • Как найти производную уравнения в степени
  • Как найти число молей зная массу
  • Как ты меня нашел по французски
  • Как найти квадратный корень в программировании
  • Как начинающему стилисту найти клиентов