Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Практикум по основам программирования. Массивы. Строки. Подпрограммы. Учебное пособие
.pdf
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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
