Занятие 2. Исследование таблицы значений функции
Существуют специальные приемы для нахождения некоторых величин, таких как наибольшее (наименьшее) значение функции, сумма значений функции, произведение значений функции, среднее арифметическое значений функции, количество значений функции.
1. Нахождение наибольшего max (наименьшего min) значения функции.
max=-10E10; for(x=xn; x<=xk; x=x+h){ f=…; if(f>max){ max=f; } } |
Примечание. Если нужно найти наименьшее значение функции, то следует сделать следующие замены: «max=-1010» поменять на «min=1010», «f>max» поменять на «f<min», «max=f» поменять на «min=f».
2. Нахождение суммы S значений функции
S=0; for(x=xn; x<=xk; x=x+h){ f=…; S=S+f; } cout<<”S=”<<S<<endl; |
3. Нахождение произведения P значений функции
P=1; for(x=xn; x<=xk; x=x+h){ f=…; P=P*f; } cout<<”P=”<<S<<endl; |
4. Нахождение среднего арифметического значения S и количества k значений функции
S=0; k=0; for(x=xn; x<=xk; x=x+h){ f=…; S=S+f; k=k+1; } S=S/k; cout<<”S=”<<S<<endl; cout<<”k=”<<k<<endl; |
Пример 4. Вычислить таблицу «x, f» значений функции f(x)=2x+1 при 0≤х≤4 с шагом 1. Найти сумму всех значений функции; произведение значений, меньших 6; минимальное значение функции.
Решение. Расчет значений функции, вывод таблицы значений на экран, а также нахождение всех необходимых величин реализуется в цикле по х. Поэтому в данной задаче будет организован один цикл по х, в теле цикла будем рассчитывать функцию, выводить на экран строку таблицы, насчитывать сумму, произведение, минимальное значение функции.
Введем обозначения:
S – сумма всех значений функции,
P – произведение значений, меньших 6,
min – минимальное значение функции.
Т.к. нужно найти произведение значений, меньших 6, то следует добавить условие «f<6» при вычислении произведения.
Будем реализовывать цикл с предусловием, используя оператор for.
Блок-схема с предусловием: | Код программы с оператором for: // proga26.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <iostream> #include <iomanip> using namespace std; int main() { double x,f,S,P,min; cout<<setw(10)<<"x"<<setw(10)<<"f"<<endl; S=0; P=1; min=10E10; for(x=0; x<=4; x=x+1){ f=2*x+1; cout<<setw(10)<<x<<setw(10)<<f<<endl; S=S+f; if(f<6){ P=P*f; } if(f<min){ min=f; } } cout<<"S="<<S<<endl; cout<<"P="<<P<<endl; cout<<"min="<<min<<endl; return 0; } |
Результат выполнения программы:
Ручной счет:
Диапазон значений х: 0, 1, 2, 3, 4.
при x=0 f=2x+1=2•0+1=1;
при x=1 f=2x+1=2•1+1=3;
при x=2 f=2x+1=2•2+1=5;
при x=3 f=2x+1=2•3+1=7;
при x=4 f=2x+1=2•4+1=9;
сумма всех значений:S=1+3+5+7+9=25;
произведение значений, меньших 6: P=1•3•5=15;
наименьшее значение функции: min=1.
Примечание. Если функция зависит от двух переменных, то следует реализовывать двумерный цикл, причем тело внутреннего цикла будет организовано так же, как в данном примере.
Пример 5. Нарисовать на экране бесконечную «змейку» символами «*».
Решение. Определим сначала внешний вид «змейки»:
*
*
*
*
*
*
*
*
*
Т.к. «змейка» должна быть бесконечной, то необходимо организовать бесконечный цикл. В этом случае будем использовать оператор while с всегда выполняемым условием true: while(true). Внутри этого бесконечного цикла будем рисовать один период «змейки», т.е. один холм. За счет бесконечного цикла на экране будет бесконечное число раз рисоваться наш холм.
Теперь стоит решить, какой ширины будет наша «змейка». Будем запрашивать ширину «змейки» у пользователя, т.е. с клавиатуры. Обозначим ширину переменной n. Холм состоит из двух частей – расширяющейся и сужающейся. Чтобы нарисовать расширяющуюся часть, будем использовать цикл for по переменной i от 1 до n и функцию setw(i). Чтобы нарисовать сужающуюся часть, будем использовать цикл for по переменной i от n до 1 и функцию setw(i).
Таким образом, внутри бесконечного цикла while вложены последовательно два цикла for – первый с увеличением переменной цикла, второй с уменьшением.
Код программы:
// snake.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int i, n;
cout<<"vvedi n=";
cin>>n;
while (true){
for(i=1; i<=n; i=i+1){
cout<<setw(i)<<"*"<<endl;
}
for(i=n; i>=1; i=i-1){
cout<<setw(i)<<"*"<<endl;
}
}
return 0;
}
Результат выполнения программы: при n=5:
Краткие итоги:
В любой задаче, где встречается повторение действий, необходимо использовать циклический алгоритм. От выбора оператора цикла результат не должен зависеть. Принципы вычислений таких величин, как сумма, произведение и т.д., использует циклический алгоритм в своей основе.
Упражнения:
1. Составьте блок-схему и программу для вычисления суммы всех целых чисел от 1 до 100 включительно.
2. Постройте таблицу значений функции y(x)=5x2-3x+4 при -20≤х≤20 с шагом 0,5. Определите наименьшее значение функции и значение х, при котором оно достигается.
3. Составьте блок-схему и программу для вычисления таблицы значений функций z1=arccos3(0,05x), z2=0,45|x3-x2|+2lg2,5x при 0,8≤х≤19 c шагом 1. Найдите сумму всех значений z1, количество значений z2, меньших 10, наимешьшее значение z1, наибольшее значение z2.
4. Составьте блок-схему и программу для вычисления таблицы значений функции при 0,5≤х≤1 c шагом 0,05; y задать с клавиатуры.
5. Составьте блок-схему и программу для вычисления таблицы значений функции Z(x,y)=min{max{sinx, siny},x,y} при -1,7≤х≤9,4 c шагом 9,3; 0≤y≤3 c шагом 0,75. Определите наибольшее отрицательное значение функции, наименьшее положительное значение функции, произведение ненулевых значений функции, количество значений функции, больших 1 или меньших -1.
6. Составьте программу, которая нарисует на экране геометрическую фигуру. Попробуйте разные варианты:
а) квадрат, б) треугольник, в) прямоугольник.
Модифицируйте программу таким образом, чтобы на экране появлялась фигура заданное число раз.