Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Практикум по основам программирования. Массивы. Строки. Подпрограммы. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
printf(“%d ”, F); getch( ); }
int fact(int a) { int i, y; if (!a) return 1; for(i = 2, y = 1; i < = a; i++) y *= i; return y; }
г) По заданным вещественным векторам x, y, z размером m (m 20)
каждый, вычислить величину (a, a) – (b, c), где a обозначает тот
из векторов, в котором самый большой минимальный элемент
(считать, что такой вектор единственный), b и c обозначают два
других вектора, а (p, q) – скалярное произведение p и q.
#include <stdio.h > #include <conio.h >
const int n = 20;
void input(float a[ ], int n); float minx(float a[ ], int n); float scal(float p[ ], float q[ ], int n);
void main( ) { int m, i; float a, b, c, s, x[n], y[n], z[n]; printf("Введите размер вектора: "); scanf("%d ", &m);
71
printf("Введите три вектора: "); input(x, m); input(y, m); input(z, m); a = minx(x, m); b = minx(y, m); c = minx(z, m); if (a > b) if (a > c) s = scal(x, x, m) - scal(y, z, m); else s = scal (z, z, m) - scal (y, x, m); else if (b > c) s = scal (y, y, m) - scal (x, z, m); else s = scal (z, z, m) - scal (y, x, m); printf("\n%f", s); getch ( ); }
void input(float a[ ], int n) { int i; for (i = 0; i < n; i++ ) scanf("%f ", &a[i]); }
float minx(float a[ ], int n) { int i; float min =a[0]; for (i = 1; i < n; i++ ) if (a[i] < minx) minx = a[i]; return minx;
72
}
float scal(float p[ ], float q[ ], int n) { int i; float s = 0; for ( i = 0; i < n; i++ ) s += p[i] * q[i]; return s; }
д) Даны три матрицы размером n×m (n, m ⩽ 20) каждая. Напечатать
ту из них, где больше упорядоченных по возрастанию строк (ес-
ли таких матриц несколько, то напечатать любую из них).
#include <stdio.h> #include <conio.h>
const int p = 20;
void input(float x[ ][p], int n, int m); int count(float x[ ][p], int n, int m); int order(float *x, int n); void write(float x[ ][p], int n, int m);
void main( ) { int n, m, i, j; float q1, q2, q3, s, a[p][p], b[p][p], c[p][p]; printf("Введите размер матрицы: "); scanf("%d %d", &n, &m); printf("Введите три матрицы: "); input( a, n, m); input( b, n, m); input( c, n, m);
73
q1 = count(a, n, m); q2 = count(b, n, m); q3 = count(c, n, m); if (q1 > q2) if (q1 > q3) write(a, n, m); else write(c, n, m); else if (q2 > q3) write(b, n, m); else write(c, n, m); getch( ); }
void input(float x[ ][p], int n) { int i, j; for (i = 0; i < n; i++ ) for (j = 0; j < m; i++ ) scanf("%f ", &x[i][j]); }
int count(float x[ ][p], int n, int m) { int i, k = 0; for (i = 0; i < n; i++ ) k += order (x[i], m); return k; }
int order(float *x, int n) { int i; for (i = 0; i < n - 1 && x[i] < x[i + 1]; i++ );
74
6
2
3
7
1
13
aa
a


n+1 n
-yy
if (i == n - 1) return 1; else return 0; }
void write(float x[ ][p], int n, int m) { int i, j; for (i = 0; i < n; i++ ) { for (j = 0; j < m; i++ ) printf("%f ", x[i][j]); printf("\n"); } }
е) По заданному числу a > 0 вычислить величину
Корни вычислять с заданной точностью 0 < ɛ < 1 по следующей
итерационной формуле: y0 = 1; y
2, …), результатом считать приближение y
= yn + (x / y
n+1
– yn) / k (n = 0, 1,
nk-1
, для которого
n+1
.
#include <stdio.h > #include <conio.h >
float eps; float sgrtk(float x, int k) { int i; float y, yn = 1, s; do {
75
y = yn; for(i = 1, s = y; i < k; i++) s *= y; yn = y + (x / s - y) / k; } while (fabs(yn - y) >= eps) return yn; }
void main ( ) { float a, y; scanf("%f %f", &a, &eps); y = (sqrtk(a, 3) - sqrtk(a * a + 1, 6) ) / ( 1. + sqrtk(a + 3, 7)); printf(" %f", y); getch( ); }
ж) Используя рекурсию вычислить сумму элементов последова-
тельности положительных вещественных чисел, оканчивающей-
ся отрицательным числом).
#include <stdio.h> #include <conio.h>
float sum( ) { float x; scanf("%f ", &x ); if (x < 0) return 0; else return sum( ) + x; }
76
void main( ) { float y; y = sum( ); printf("%f", y); getch( ); }
з) Дана непустая последовательность символов, являющаяся пра-
вильной записью формулы вида:
< формула > ::= < цифра > | (< формула > < знак > < формула > ) < знак > ::= + | - | * < цифра > ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Вычислить алгебраическое значение формулы.
#include <stdio.h> #include <conio.h>
int formula( ) { int x, y; char sym, op; scanf("%c", &sym); if (sym >= 0 && sym <= 9) return sym - 0; else { x = formula ( ); scanf("%c", &op ); y = formula ( ); scanf("%c", &sym ); switch(op) { case +: return x + y; break; case -: return x - y; break;
77
case *: return x * y; break; } } }
void main ( ) { printf(" %d ", formula( )); getch ( ); }
ПРАКТИЧЕСКОЕ ЗАДАНИЕ «ПОДПРОГРАММЫ» Тема
Программирование с использованием подпрограмм.
Цели
Уметь разбивать (структурировать) программу на программные
модули (подпрограммы), уметь определять подпрограммы и использо­вать их при решении задач, знать способы передачи данных в подпро­граммы.
Содержание работы
1. Изучить технологию нисходящего программирования.
2. Изучить организацию подпрограмм (понятие подпрограммы, оп-
ределение подпрограммы, вызов подпрограммы, способы передачи данных в подпрограмму).
3. Спроектировать структуру программы решения задачи, выделив
в ней подзадачи, которые необходимо оформить в виде подпрограмм. Определить исходные данные и результаты подпрограмм, способы пе­редачи данных в подпрограммы и типы формальных параметров.
4. Написать и отладить программу решения задачи.
Требования к выполнению задания
1. В п. 2.3. «Анализ задачи» описывается решение задачи в целом.
Затем найденное решение задачи надо разделить на подзадачи. Подзадача должна выполнять одну функцию - крупное дейст­вие в решаемой задаче (например, вычислить сумму всех эле-
78
ментов последовательности; найти наибольшее значение среди элементов матрицы; найти наибольшее значение среди элемен­тов строки матрицы). У подзадачи должны быть входные дан­ные и выходные. Таких подзадач может быть несколько в зави­симости от сложности решаемой задачи. В п.2.3. подзадача описывается кратко: ее имя, назначение (т. е. выполняемое ею действие), входные и выходные данные. На­пример, в решаемой задаче выделим подзадачу SUM. Назначе­ние SUM: вычисление суммы элементов последовательности. Входные данные: А – последовательность вещ. чисел, n – коли­чество элементов в А. Выходные данные: s – вещ. число сумма элементов А.
2. Алгоритм решения нужно описать как всей задачи в целом, ис-
пользуя ее разбиение на подзадачи, так и каждой подзадачи.
3. Для реализации подзадачи можно использовать подпрограмму
процедуру или подпрограмму функцию, исходя из знания каж­дого из этих видов подпрограмм, выходных данных подзадачи и ее использования в общем решении.
4. Для передачи данных в подпрограмму использовать механизм
формальных параметров (т. е. не используем глобальные пара­метры).
5. В программе желательно использовать прототипы подпро-
грамм. В этом случае порядок следования определений под­программ может быть произвольным.
6. Обязательно выделяется подзадача ввода и подзадача вывода
данных, если они имеют сложную природу.
7. Если решаемая задача простая, то все ее решение оформляется
как одна подзадача.
8. Указанные в условии задачи ограничения на размер входных
данных – это ограничение сверху (т. е. максимальное количест­во элементов сложной величины). Если ограничения в условии задачи не указаны, вы сами должны их задать (максимальное количество элементов)
79
1
,,
n
aa
1
,,
m
bb
1
,,
p
cc
1 1 1
2
1
min , , min , , , при min , , 10,
1 max , , , в противном случае.
m p n
p
b b c c a a
L
cc

 
24
( , ) max( ( , ), ( , )) (1,1)h S T h S T ST h S T S T h
3
22
( , ) ( )
11
ab
h a b a b
ba

1 1 0 0
, , , , , ,
n n n n
a b a b a b

1
1 1 0 0
( )( ) ( )( ) ( )
nn
n n n n
a ib x iy a ib x iy a ib

1
,,
n
aa
Варианты заданий
1 Даны координаты вершин двух треугольников. Определить, какой
из них имеет большую площадь.
2 Даны натуральные числа n, m, p, целые числа
,
. Получить
3 Даны действительные числа S, T. Получить
,
где
4 Даны натуральное число n, действительные числа x, y,
. Вычислить по схеме Горнера значение мно-
гочлена с комплексными коэффициентами
.
.
5 Определить подпрограммы выполнения арифметических действий
над комплексными числами.
6 Даны натуральное число n, целые числа
резки идущих подряд членов данной последовательности, состоя­щие из:
. Рассмотреть от-
,
а) полных квадратов; б) степеней пятерки; в) простых чисел;
80
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]