Подпрограммы
Перегрузка функций
Решение нелинейного уравнения
437.37K
Category: programmingprogramming

Программирование на языке высокого уровня C++. Лекция 6. Подпрограммы и функции

1.

Богатов Р.Н.
Программирование
на языке высокого уровня
C++ ► Лекция 6 ► Подпрограммы и функции
Кафедра АСОИУ ОмГТУ, 2017

2. Подпрограммы

const
int N=10;
void
main()
{int a[N];
const int N=10; int a[N];
void massiv_sluchaino(int A, int B);
void//
massiv();
1. Случайное заполнение
voidsrand(time(0));
massiv_sort();
voidfor(int
massiv_perevorot();
i=0; i<N; i++)
Подпрограммы
Предварительное объявление
(forward
... declaration)
const int N=10;
int a[N];
a[i] = rand() % 100;
void main()
{
// вывод
...
for(int i=0; i<N; i++)
}
printf("%d ", a[i]);
printf("\n\n");
void massiv_sluchaino(int
A, int B)
{
//
2. Сортировка
for(int
i=0; i<N; i++)
for(int
i=0;
i++)% (B-A);
a[i] = Ai<N-1;
+ rand()
for(int j=i+1; j<N; j++)
}
void massiv() if (a[i]>a[j]) swap(&a[i], &a[j]);
{
//
вывод i=0; i<N; i++)
for(int
for(int i=0; i<N; i++)
printf("%d ", a[i]);
printf("%d ", a[i]);
printf("\n\n");
printf("\n\n");
_getch();
}
...
}
3. Переворот
void//
massiv_sort()
{
for(int i=0; i<N/2; i++)
for(int
i=0; i<N-1;
i++)
swap(&a[i],
&a[N-1-i]);
for(int j=i+1; j<N; j++)
// вывод
if (a[i]>a[j]) swap(&a[i], &a[j]);
for(int i=0; i<N; i++)
printf("%d ", a[i]);
void massiv_perevorot()
printf("\n\n");
{
void main()
{
massiv_sluchaino(0, 100);
massiv();
massiv_sort();
massiv();
massiv_perevorot();
massiv();
Определение
(definition)
}
}
}
for(int i=0; i<N/2; i++)
_getch();
swap(&a[i], &a[N-1-i]);
Замечания:
1. Предварительное объявление не обязательно. Вместо этого
можно все определения перенести наверх (до функции main).
2. Массив пришлось объявить глобально (вне main). Почему?

3. Перегрузка функций

...
...
...
int min(int x, int y)
intmin(int
min(int x,int
inty)y)
int
{ min(int x,
int
x, int y)
{{
return x<y? x: y;
{
returnx<y?
x<y? x:y;y;
return
} return x<y? x:
x: y;
}}
}
1>------ Построение начато: -----double min(double 1>
x, double
y)
main.cpp
double
min(double
x,
double
y)
void
{ main()
void
main()
1> .\main.cpp(29): error C2666: min: для 2 перегрузок есть
{{
return x<y? x:подобные
y;
преобразования
{
return x<y? x: y;
...
1> .\main.cpp(12): может быть "double min(double,double)"
} ...
} // найти минимальное
из 4 чисел
1> .\main.cpp(7):
или
"int min(int,int)"
// найти минимальное
из 4 чисел
int main()
a, b, c, d; 1> при попытке сопоставить список аргументов "(int, double)"
void
double a, b, c, d;
==========
Построение: успешно: 0, с ошибками: 1 ==========
void
main()
4 числа: ");
{ printf("Введите
printf("Введите 4 вещественных числа: ");
{ scanf("%d%d%d%d", &a, &b, &c, &d);
int a;
scanf("%lg%lg%lg%lg",
&a, &b, &c, &d);
// найти минимальное из 4 чисел
printf("Введите целое число: ");
double a, b, c, d; из них: %d", min(a, min(b, min(c, d))) );
printf("Минимальное
scanf("%d", &a); из них: %lg", min(a, min(b, min(c, d))) );
printf("Минимальное
printf("Введите 4 вещественных числа: ");
_getch();
double b;
_getch();
scanf("%lg%lg%lg%lg", &a, &b, &c, &d);
}
printf("Введите дробное число: ");
}
scanf("%lg", &b);
printf("Минимальное из них: %lg", min(a, min(b, min(c, d))) );
_getch();
printf("Минимальное из них: %lg", min(
min(a,
(double)a,
b) );
b) );
}
_getch();
}
Перегрузка функций

4.

Вычисляем НОД и НОК
// прямой перебор делителей
int НОД = 1;
for (int i = 2; i <= min(A, B); i++)
if (A % i == 0 && B % i == 0)
НОД = i;
// обратный поиск наибольшего делителя
int НОД = 0;
for (int i = min(A, B); НОД == 0; i--)
if (A % i == 0 && B % i == 0)
НОД = i;
// прямой перебор общих кратных
int НОК = 0;
for (int i = max(A, B); НОК == 0; i++)
if (i % A == 0 && i % B == 0)
НОК = i;
int НОД(int A, int B)
{
for (int i = min(A, B); ; i--)
if (A % i == 0 && B % i == 0)
return i;
}
int НОК(int A, int B)
{
for (int i = max(A, B); ; i++)
if (i % A == 0 && i % B == 0)
return i;
}

5.

Вычисляем НОД по алгоритму Евклида
void
main() A, int B);
int НОД(int
{int НОК(int A, int B);
int a, b;
voidprintf("Введите
main()
два целых числа: ");
{ scanf("%d%d", &a, &b);
int a, b;
printf("Введите
два целых числа: ");
while
(b)
{scanf("%d%d", &a, &b);
printf("НОД(%d, %d) =\n", a, b );
printf("НОД(%d,
%d) = %d\n", a, b, НОД(a, b) );
int t = b;
printf("НОК(%d, %d) = %d\n", a, b, НОК(a, b) );
b = a % b;
}
a = t;
int НОД(int A, int B)
int }НОД(int A, int B)
{
{
if (B == 0) return A;
while (B)
printf("= %d\n", a );
else return НОД(B, A % B);
{
}
}
int t = B;
B = A % B;
int НОК(int A, int B)
A = t;
{
}
return abs(A*B)/НОД(A, B);
http://ru.wikipedia.org/wiki/Алгоритм_Евклида
return A;
}
}

6. Решение нелинейного уравнения

...
double y(double x);
char *ystring(void);
void metod_del_popolam(double a, double b, double eps, int N);
Решение
нелинейного
уравнения
printf("\nПоиск корня методом деления пополам:\n");
void main()
{
setlocale(LC_ALL,
"Russian"); a, double b, double eps, int N)
void
metod_del_popolam(double
printf("Поиск корней функции %s.\n", ystring());
{
double x1=0, x2=1;
double c = 0,
fc = 0;поиска [x1; x2]: ");
printf("Введите
интервал
double fa = &x1,
y(a);&x2);
scanf("%lg%lg",
... double fb = y(b);
// +здесь ещё должна быть проверка на наличие корней if (fa*fb>=0)
int i = 1;
metod_del_popolam(x1,
x2, eps, N);
//metod_iteraziy((x1+x2)/2,
eps, N);
for (; i < N; i++)
//metod_Newtona((x1+x2)/2,
eps, N);
{
//metod_hord(x1,
c = (a + x2,
b) /eps,
2; N);
_getch();
fc = y(c);
}
// +вывод протокола итерации (если нужно)
double y(double x)
{
if (b - c < eps) break;
return cos(x) - pow(x, 3);
if (fa * fc < 0)
}
b = c, fb = fc;
char *ystring(void)
else
{
c, fa -= x^3";
fc;
return "y(x)a == cos(x)
}
}
void metod_del_popolam(double a, double b, double eps, int N)
{
// +вывод результата
} ...
}

7.

Домашнее задание
Реализовать генератор псевдо-случайных чисел в виде
собственных функций, аналогичных rand() и srand(), добавив
перегрузку rand(int min, int max) и отдельную функцию
rand_double(), возвращающую случайное число из [0; 1).
English     Русский Rules