экзамен / Primery_zkzamenats_zadach_i_reshenia (2)
.docxРазбор задач в экзаменационных билетах
Задача 1
Определите и объясните результат работы программы (возможно и сообщение об ошибке):
Задача 1.1
x |
y |
в main до вызова func |
|
23 |
10 |
в func |
|
28 |
12 |
в main после вызова func |
|
23 |
12 |
Ответ: 23+12 = 35 |
void func(int x, int& y)
{
x = x + 5; y = y + 2;
}
void main()
{
int x = 23, y = 10;
func(x, y);
cout<<(x + y);
}
Задача 1.2
void func(int x, int& y)
{
x = x + 5; y = y + 2;
return x;
}
void main()
{
int x = 23, y = 10;
func(x, y);
cout<<(x + y);
}
ОТВЕТ: Ошибка в func: тип возвращаемого значения не соответствует типу функции
Задача 2
1) Разработать функцию на языке C++ с типом возвращаемого значения double, вычисляющую медиану треугольника со сторонами a, b, c (входные параметры функции), проведенную к стороне a, по формуле
2) Написать фрагмент кода для вычисления всех медиан треугольника со сторонами x, y, z.
Решение:
Медианы к двум оставшимся сторонам вычисляются по формулам
// первый по порядку параметр - сторона,
// медиана к которой вычисляется
double med(double a, double b, double c)
{
double ma = 0.5*sqrt(2.0*b*b + 2.0*c*c - a*a);
return ma;
}
……………………..
double x = 3, y= 4, z = 5;
double mx = med(x,y,z); // медиана к стороне x
double my = med(y,x,z); // медиана к стороне y
double mz = med(z,x,y); // медиана к стороне z
cout<<mx;
cout<<my;
cout<<mz;
……………………..
ИЛИ
1) Разработать функцию на языке C++ с типом возвращаемого значения void, вычисляющую медиану треугольника со сторонами a, b, c (входные параметры функции), проведенную к стороне a, по формуле
2) Написать фрагмент кода для вычисления всех медиан треугольника со сторонами x, y, z.
Решение:
// первый по порядку параметр - сторона,
// медиана к которой вычисляется
void med(double a, double b, double c, double& ma)
{
ma = 0.5*sqrt(2.0*b*b + 2.0*c*c - a*a);
}
……………………..
double x = 3, y= 4, z = 5;
double mx, my, mz;
med(x, y, z, mx); // медиана к стороне x
med(y, x ,z, my); // медиана к стороне y
med(z,x,y, mz); // медиана к стороне z
cout<<mx;
cout<<my;
cout<<mz;
Еще пример задачи 2:
Задача 3
Разработать схему алгоритма и функцию с типом double на языке C++ для вычисления
с применением базового алгоритма поиска минимума (максимума) из нескольких значений без использования дополнительных функций. Написать фрагмент кода для вызова разработанной функции.
double Branch(double x, double y, double c, double d)
{
double r;
if (x*y > 3.0)
{
double r1 = c*x;
r = d*y;
if (r1 > r) r = r1;
if (x < r) r = x;
if (y < r) r = y;
r = 3.0*r;
}
else
if (x*y >= 0.0)
{
double r1 = x*x*x;
double r2 = log10(pow(x*y, c*d));
if (r1 > r2)
r = r1;
else
r = r2;
}
else
r = pow(2.0, c*d) - x;
return r;
}
…………………………………………………..
double x, y, c, d;
cin>>x;
cin>>y;
cin>>c;
cin>>d;
double r = Branch(x, y, c, d);
cout<<r<<endl;
……………………………………………………………………….
Задача 4.1
Разработать схему алгоритма и функцию на языке C++, с типом возвращаемого значения void, которая находит наименьшее значение функции Y=3∙cos2(2x+1) и соответствующее значение аргумента на отрезке [a;b] с шагом h, где a, b, h – входные параметры функции. В качестве параметра цикла использовать переменную целого типа.
Написать фрагмент кода для вызова разработанной функции.
Решение:
// табулируемая функция
float func(float x)
{
return 3.*pow(cos(2.*x + 1.), 2);
}
void GetMin(float a, float b, float h, float& xmin, float& ymin)
{
float x, y;
int n = int((b + h/2. - a)/h) + 1;
ymin = 1e38;
for (int i=1; i<=n; i++)
{
x = a + float(i-1)*h;
y =func(x);
if (y < ymin)
{
ymin = y;
xmin = x;
}
}
}
………………………………….
float a = -3., b = 3., h = 0.375, ym, xm;
GetMin(a, b, h, xm, ym);
cout<<xm<<endl;
cout<<ym<<endl;
Задача 4.2
Разработать схему алгоритма и функцию на языке C++ , с типом возвращаемого значения int, которая находит сумму и количество положительных значений функции
при изменении x на отрезке [a;b] с шагом h1 и y на отрезке [c;d] с шагом h2 (a, b, h1, c, d, h2 – входные параметры функции). В качестве параметра цикла использовать переменную целого типа.
Написать фрагмент кода для вызова разработанной функции.
Решение:
// табулируемая функция
float f(float x, float y)
{
if (x>0 && x<1 && y>0 && y<1)
return x*x + y*y;
else
return x + y;
}
int GetPos(float a, float b, float h1, float c, float d,
float h2, float& sPos)
{
int n1 = int((b+h1/2-a)/h1) + 1;
int n2 = int((d+h2/2-c)/h2) + 1;
sPos = 0.0;
int nPos = 0;
float x, y, z;
for (int i=1; i<=n1; i++)
{
x = a + (i-1) * h1;
for (int j =1; j<=n2; j++)
{
y = c + (j-1) * h2;
z = f(x,y);
if (z > 0)
{
sPos+=z;
nPos++;}
}
}
}
return nPos;
}
…………………………………………………………………………………….
float a=0, b=2, h1=0.25, c=0.5, d=1.5, h2=0.25;
float sPos;
int nPos;
nPos = GetPos(a, b, h1, c, d, h2, sPos);
cout<<sPos<<endl;
cout<<nPos<<endl;
…………………………………………………………………………………….
Задача 5
Разработать алгоритм и программный код функции, с типом возвращаемого значения double, реализующей вычисление суммы членов бесконечного ряда с заданной точностью ε. Предварительно вывести рекуррентную формулу для нахождения значения очередного слагаемого суммы.
.
Написать фрагмент кода для вызова разработанной функции.
1. Вывод рекуррентной формулы
Формула для n–го члена ряда
Формула для (n+1)-го члена ряда an+1, заменив в предыдущей формуле всюду n на n+1
Вычисление знаменателя геометрической прогрессии, подставив (n+2)! = (n+1)!*(n+2)
Тогда рекуррентная формула будет иметь вид:
Первый член ряда a=x-1, его номер n=0.
2. Схема алгоритма
3. Программный код
double SumPos(double x,double e)
{
int n=0;// номер первого слаг.
double a, s;
a = x-1;// знач. первого слаг.
s = 0;
while (abs(a) > e)
{
s = s + a;//добавление в сумму
a = -a * (x - 1) / (n + 2);
n++;// номер след. слаг-го
}
return s;
}
…………………………………………………………………………..……….
double arg = 0.5, eps = 1e-6;
double s = SumPos(arg, eps);
cout<<s;
……………………………………………………………………………………..
Еще пример задачи 5
Вывод рекуррентной формулы для нахождения значения очередного слагаемого суммы
Схема алгоритма:
double Sum (double x,double e)
{
int n=2;// номер первого слаг.
double a, s;
a = x*x/24.0;// знач. первого слаг.
s = 0;
while (abs(a) > e)
{
s = s + a;//добавление в сумму
a = -a *x*x/((3*n-1)*3*n*(3*n+1));
n++;// номер след. слаг-го
}
return s;
}
…………………………………………………………………………..……….
double arg, eps;
cin >> arg >> eps;
double s = SumPos(arg, eps);
cout<<s;
……………………………………………………………………………………..