ЗФ_ОАиП / ЭУМК_ОАиП__PDF / курс лекций
.pdfТаблица 11.3 – Таблица соответствия:
Переменные в |
Имя на языке |
Тип |
Комментарий |
задаче |
Си |
|
|
K |
K |
int |
Искомое количество |
|
|
|
элементов |
B |
B |
float |
Двумерный статический |
|
|
|
массив |
A |
A |
float |
Заданное число |
- |
i |
int |
Номер строки |
- |
j |
int |
Номер столбца |
/* Определение количества элементов, больших заданного А и расположенных в строках с нечетными номерами */
#include <stdio.h>
#include <math.h> void main ( )
{
int i, j, m, n, K; float B [10][10];
float A; //Описание переменных
printf (― Введите число строк и столбцов‖); scanf (―%d %d‖, &m, &n);
for(i=0; i<m; i++) for(j=0; j<n; j++)
{
printf(―Введите B[%d, %d]=‖, i, j); scanf(―%f‖, &B[i] [j]);
}
puts("Матрица B:"); for(i=0;i<m;i++)
{ for(j=0;j<n;j++) printf("%8.2f",B[i][j]);
printf("\n");
}
puts (― введите число A‖); scanf (―%f‖, &A);
K=0;
for ( i=1; i<m; i=i+2) for ( j=0; j<n; j++)
if( B[i][j]>A) K=K+1; printf(―%d \n‖, K); }//конец main
116
Тесты: |
|
-3; 8; -2; 10; 7; 82; -4 |
|
1) В= -9; 0; -3; 85; 3; 40; -9 |
A= 4; K=7. |
-1; 8; 7; -95; 4; -5; 67 |
|
-4; -7; 8; 9; 2; -8; -5 |
|
2) B= -2; 10; 0; 9; -8; 7; -5 |
A=10; K=0. |
-7; 6; -9; 7; 0; -3; 7 |
|
117
2.3Поиск в матрице строки с максимальной суммой
Графическая схема алгоритма
Начало Ввод m,n,x[]
Вывод x[]
max=s; nmax=0
i=1 |
|
i<m |
Нет |
|
|
|
Да |
s=0
j=0
j<n Нет Да
s=s+x[i][j]
j=j+1
Да |
s>max |
Нет |
|
|
max=s; nmax=i
i=i+1
Вывод max, nmax
Конец
s=0; j=0
j<n Нет Да
s=s+x[0][j]
j=j+1
Рисунок 11.25 – Графическая схема алгоритма
118
Текст программы /* Строка с максимальной суммой*/
#include <stdio.h> main()
{
int m, n, nmax, i, j; float max, s, x[10][10]; puts("Введите m, n");
scanf("%d %d", &m, &n);
for(i=0;i<m;i++) for(j=0;j<n; j++)
{ printf ("Введите x[%d][%d]=", i, j); scanf ("%f", &x[i][j]);
}
puts("Матрица x:"); for(i=0;i<m; i++)
{ for(j=0;j<n; j++) printf("%8.2f",x[i][j]);
printf("\n");
}
s=0;
for(j=0; j<n; j++)
s =s+x[0][j]; //Нач. знач. мax – сумма элем. 0-ой стр.
max=s; nmax=0; for(i=0;i<m;i++)
{ s=0;
for(j=0;j<n;j++) s+=x[i][j]; // Сумма элем. строк if(max<s)
{ max=s; nmax=i;}
}
printf("Максимальная сумма %.2f в строке %d\n",max,nmax); fflush(stdin); getchar();
return(0);
}
119
2.4 Пример обработки динамического двумерного массива Задача. Определить количество строк матрицы, в которых суммы всех элементов отрицательные. Массив объявить как динамический. Решение.
0
Начало
1
Ввод A,K
2
Вывод A
3 K=0
4
i=0
|
|
5 |
Нет |
|
|
i<n |
|
|
|
|
|
|
|
Да |
|
|
6 |
S=0 |
|
|
|
|
|
|
7 |
j=0 |
|
|
|
|
|
|
|
8 |
Нет |
|
|
j<m |
|
|
|
Да |
|
|
9 |
|
|
|
S=S+A[i] [j] |
|
|
|
10 |
j=j+1 |
|
|
|
|
|
Да |
|
11 |
Нет |
|
S<0 |
||
|
|
|
|
12 K=K+1 |
|
|
|
|
|
13 i=i+1 |
|
|
14 Вывод K |
|
|
|
|
15 |
|
|
|
Конец |
|
Рисунок 11.26 – Графическая схема алгоритма
120
Таблица 11.4 – Таблица соответствия.
Переменные |
Имя на языке Си |
Тип |
Комментарий |
в задаче |
|
|
|
S |
S |
float |
Сумма элементов i-той |
|
|
|
строки |
A |
A |
float |
Двумерный динамический |
|
|
|
массив |
K |
K |
float |
Количество искомых строк |
- |
n |
int |
Количество всех строк в |
|
|
|
матрице |
- |
m |
int |
Количество столбцов |
- |
i |
int |
Номер строки |
- |
j |
int |
Номер столбца |
/*Пример обработки двумерного динамического массива*/
#include <stdio.h>
#include <math.h> void main ( )
{
int i, j, m, n;
float K, S; //Описание переменных
puts (― введите n, m‖); // Вывод сообщения
scanf (―%d %d‖, &n, &m); // Ввод исх.числа строк и столбцов float**A=new float*[n];
for(i=0; i<n; i++) A[i]=new float[m];
for(i=0; i<n; i++) for(j=0; j<m; j++)
{
printf(―Введите A[%d; %d]=‖, i, j); scanf(―%f‖, &A[i] [j]);
}
K=0;
for(i=0; i<n; i++)
{
S=0;
for(j=0; j<m; j++) S=S+A[i] [j]; if(S<0) K=K+1;
}
printf(―%f \n‖, K);
for(i=0; i<n; i++) //Освобождение динамической памяти delete[]A[i];
121
delete[]A;
} |
|
|
|
|
|
Тесты: |
|
|
|
|
|
|
-3 |
|
-2 |
2 6 -3 |
|
1) A= |
6 |
|
7 |
-1 20 -4 |
K=2. |
|
-4 |
|
-2 -3 6 -1 |
|
|
|
-4 |
-2 4 6 4 |
|
||
2) A= |
3 |
5 |
7 2 0 |
K=0. |
|
|
5 |
0 -2 9 0 |
|
122
2.5 Определить, есть ли в матрице столбец, содержащий хотя бы один нулевой элемент Решение.
Введем две вспомогательные переменные t и w:
1, если столбец не найден; t
0, если столбец найден .
1, |
если в столбце |
íå найден элемент, равный нулю; |
|
|||
w |
|
|
|
|
|
|
0, |
если в столбце |
найден элемент, равный нулю . |
|
|||
|
|
|
Начало |
|
||
|
|
|
Ввод m,n,x |
|
||
|
|
|
Вывод x |
|
||
|
|
|
|
|
|
Столбец еще |
|
|
|
|
|
|
|
|
|
|
t=1 |
|
|
|
|
|
|
|
|
не найден |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
j=0 |
|
|
|
|
|
Нет |
|
j<n и t |
||
|
|
||
|
Да |
|
|
|
|
|
|
|
w=1 |
|
|
|
|
|
|
|
i=0 |
|
|
|
i<m и w |
|
Нет |
|
|
|
|
|
Да |
|
|
Да |
xij=0 |
Нет |
|
|
|
w=0 |
i=i+1 |
Да |
w |
Нет |
|
|
j=j+1 |
t=0 |
В столбце не найден элем., равный нулю
Да |
t |
Нет |
|
|
|
|
|
|
|
" |
" |
Вывод "Нет столбца" |
|
Вывод "Есть столбец" |
|
|
|
|
Конец
Рисунок 11.27 – Графическая схема алгоритма
123
Текст программы
#include <stdio.h> #include <conio.h> main()
{
int m,n,i,j,t,w; float x[10][10];
puts("Введите m,n"); scanf("%d %d",&m,&n); for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
printf("Введите x[%d][%d]=",i, j); scanf("%f", &x[i][j]);
}
puts("Матрица x:"); for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%8.2f",x[i][j]);
printf("\n");
}
t=1; j=0; //Столбец еще не найден while(j<n && t)
{
w=1; i=0; //В столбце не найден элем., равный нулю while(i<m && w)
if(x[i][j]==0) w=0; else i++;
if(w) j++; // В столбце нет равного 0 элем. else t=0; // В столбце есть равный 0 элем.
}
if(t) printf("Нет\n");
else printf("Есть %d %d\n",i,j); getch();
return(0);
}
124
2.5 Обработка элементов квадратных матриц относительно главной и побочной диагоналей /* "Разминка". Фомирование матрицы */
#include <stdio.h>
main() |
|
|
{ |
|
|
const m=10; |
|
|
int i,j,N; |
|
|
int x[m][m]; |
|
|
/* Обнуление матрицы */ |
|
|
for(i=0;i<m;i++) |
|
|
for(j=0;j<m;j++) |
|
|
x[i][j]=0; |
|
|
puts("Номер варианта?"); |
|
|
scanf("%d",&N); |
|
|
printf("Вариант %d:\n",N); |
|
|
switch(N) |
|
|
{ case 1:{ |
/* Вариант 1 |
*/ |
for(i=0;i<m;i++) |
|
|
|
for(j=0;j<i+1;j++) |
|
|
x[i][j]=i-j+1; |
|
break;} |
|
|
case 2:{ |
/* Вариант 2 |
*/ |
for(j=0;j<m;j++) |
|
|
|
for(i=j;i<m;i++) |
|
|
x[i][j]=j+1; |
|
break; } |
|
|
case 3: { |
/* Вариант 3 |
*/ |
for(i=0;i<m;i++) |
|
|
|
for(j=i;j<m;j++) |
|
|
x[i][j]=i+1; |
|
break; } |
|
|
case 4: { |
/* Вариант 4 |
*/ |
for(i=0;i<m;i++) |
|
|
|
for(j=i;j<m;j++) |
|
|
x[i][j]=j-i+1; |
|
break; } |
|
|
case 5:{ |
/* Вариант 5 |
*/ |
for(i=0;i<m;i++) |
|
|
|
for(j=0;j<m;j++) |
|
x[i][j]=i+1; break; }
125