Двумерные массивы. Ввод и вывод
Задача 1. Написать программу формирования одномерного массива В, содержащего k наибольших среди элементов квадратной
Задача 1. Написать программу с использованием подпрограммы для вычисления одномерного массива, содержащего заданное число
Задача 3. Упорядочить элементы матрицы по всем строкам (по возрастанию). Дополнительный массив не использовать. Вычисления
Алгоритм решения задачи (вычислительная часть, усовершенствованный метод пузырька)
Если указатель изменяется в функции, то необходимо передавать указатель на указатель. Задача 4. Поменять местами два первых
339.00K
Category: programmingprogramming

Lecture_2_2_2024___

1. Двумерные массивы. Ввод и вывод

void vv_matr(int a[][10], int *n, int *m) //или int (*a)[10]
{ //передаем массив указателей на строки, n и m – по адресу
int i, j;
printf("n = "); scanf("%d", n);
printf("m = "); scanf("%d", m);
printf("Введите матрицу размера %d на %d \n“,*n,*m);
for(i=0; i<*n; i++)
for(j=0; j<*m; j++)
scanf("%d", a[i]+j);
}
//передаем n и m по значению
int main()
void viv_matr(int a[][10], int n, int m) {int i, j;
{int a[10][10], n, m;
for(i=0; i<n; i++)
{
vv_matr(a,&n,&m);
for(j=0; j<m; j++)
viv_matr(a,n,m);
printf("%4d", a[i][j]);
return 0;
printf("\n");
}
}
}

2. Задача 1. Написать программу формирования одномерного массива В, содержащего k наибольших среди элементов квадратной

целочисленной матрицы
A[n][n], расположенных выше главной диагонали.
Использовать функции для
- ввода исходных данных;
- вычисления В;
-. вывода результата.
Обобщенный алгоритм:
ввод исходных данных;
инициализация b[i]=INT_MIN;
перебор элементов a[i][j] выше главной
диагонали
если a[i][j]>минимального в В то
замена минимального элемента В на a[i][j]
поиск нового минимального элемента в В
всё

3. Задача 1. Написать программу с использованием подпрограммы для вычисления одномерного массива, содержащего заданное число

наибольших элементов среди элементов квадратной
целочисленной матрицы, расположенных выше главной
диагонали.
A[0:n-1, 0:n-1], k=3
1 2 3 5
0 4 7 -9
B[0:k-1]
INT_MIN
INT_MIN
INT_MIN
2
INT_MIN
INT_MIN
2
3
INT_MIN
2
3
5
7
3
5
2 3 4 1
1 2 5 3

4.

#include <stdio.h>
#include <limits.h>
void in_matr(int *kb, int *na, int ma[][20])
{ int maxkb, res, i, j, n;
do
printf("Введите 0<n<=20 n = ");
while (!scanf("%d", na) || *na<=1 || *na>20);
maxkb=(*na**na-*na)/2;
do
printf("Введите 0<k<=%d k = ", maxkb);
while (!scanf("%d", kb) || *kb<=0 || *kb>maxkb);
n=*na;
for (i=0; i<n; i++)
for (j=0; j<n; j++)
do
{ printf("Введите a[%d][%d] = ", i, j);
if (!(res=scanf("%d", ma[i]+j))) printf("Ошибка!\n");
while(getchar()!=‘\n’);
}
while (!res);
}

5.

void form(int kb, int na, int ma[][20], int mb[])
{
int i, j, l, imin;
/* Инициализация B */
for (i=0; i<kb; mb[i++]=INT_MIN);
imin=0;
for (i=0; i<na-1; i++)
for (j=i+1; j<na; j++)
if (ma[i][j]>mb[imin])
{
mb[imin]=ma[i][j];
/*Поиск минимума в В*/
for (l=0; l<kb; l++)
if (mb[l]<mb[imin]) imin=l;
}
}

6.

void out(int b[ ], int k)
{ int i;
for (i=0; i<k; i++)
printf("%7d", b[i]);
}
int main()
{
int a[20][20], b[180], k, n;
in_matr(&k, &n, a);
form(k, n, a, b);
out(b,k);
return 0;
}

7.

Оператор return в языке С обеспечивает
досрочный выход из функции.
Задача 2. Бинарный (двоичный) поиск номера
элемента в массиве, упорядоченном по
неубыванию.
На каждом шаге количество рассматриваемых
элементов уменьшается в 2 раза.

8.

//двоичный поиск в массиве, упорядоченном по возрастанию
int search(int a[ ], int n, int number)
{int left, right, middle;
left=0; //левая граница
right=n-1; //правая граница
middle=(left+right)/2; //середина
while(left<=right)
{ if(a[middle]==number)return middle; //элемент найден
//если элемент левее середины, уменьшаем правую границу
if(a[middle]>number)right=middle-1;
//иначе увеличиваем левую границу
else left=middle+1;
//ищем середину подмассива с новыми границами
middle=(left+right)/2;
}
return -1; } //элемент не найден

9.

int main()
{int n, a[20], pos, num,*ua;
printf("Введите 0<n<=100 n = "); scanf("%d", &na);
printf("Введите элементы массива, по
неубыванию\n");
scanf("%d", a);
for (ua=a+1;ua< a+na; ua++)
do scanf("%d", ua);
while (*ua<*(ua-1));
printf("Введите число для поиска"); scanf("%d", &num);
pos = search(a, n, num) ;
if (pos==-1) printf(" не найдено“ );
else printf(" номер равен:%d“, pos);
return 0;
}

10. Задача 3. Упорядочить элементы матрицы по всем строкам (по возрастанию). Дополнительный массив не использовать. Вычисления

оформить как отдельную функцию.
Метод:
Рассматриваем матрицу как одномерный массив,
содержащий n*m элементов. В сортировке
«пузырьком» сравниваем 2 соседних элемента: a[i][j]
и следующий за ним a[i1][j1]. Индексы i1 и j1
вычисляются в зависимости от местоположения a[i][j]
в матрице:
если j=m -1 /* a[i][j] находится в последнем столбце i-ой
строки */
то i1:=i+1; j1:=0; /* в качестве a[i1][j1] берётся первый
элемент следующей строки */
иначе j1:=j+1; i1:=i; /*в качестве a[i1][j1] берётся
следующий элемент i-ой строки */
все
Кодируем с использованием индексов

11. Алгоритм решения задачи (вычислительная часть, усовершенствованный метод пузырька)

f:=1; m1:=n*m-1;
Цикл-пока (f)
f:=0; m2:=m1; i:=0; j:=0;
цикл от k:=0 до m2-1
/* определение пары сравниваемых элементов, т.е. вычисление
индексов следующего элемента i1, j1; сравниваем a[i][j] c a[i1][j1] */
если j=m-1 то
i1:=i+1; j1:=0;
a[0:n-1][0:m-1]
иначе
0 1
. . .
m-1
j1:=j+1; i1:=i; всё
если a[i][j]>a[i1][j1] то 0
b:=a[i][j];
1
a[i][j]:=a[i1][j1];
a[i1][j1]:=b;
f:=1; m1:=k; всё

i:=i1; j:=j1;
кц
n-1
кц

12.

#include<stdio.h>
int sort(int n, int m, int a[][20])
{ int m1, m2, i , k, j, i1, j1, b;
int f=1, f1=0;
m1 = n*m-1;
while(f)
{ f =0;
i = j = 0;
m2 = m1;
for (k = 0; k < m2; k++) {
if (j == m-1)
{ i1 = i + 1;
j1 = 0;
}
else
{ j1 = j +1;
i1 = i;
}

13.

if (a[i][j] > a[i1][j1])
{ b = a[i][j];
a[i][j] = a[i1][j1];
a[i1][j1] = b;
f = 1;
f1=1;
m1 = k;
}
i = i1;
j = j1;
}
}
return f1;
}

14.

int main()
{
int n, m, i = 0, j;
int f1;
int a[20][20];
printf("Кол-во строк: ");
scanf("%d", &n); // n =
printf("Кол-во столбцов: ");
scanf ("%d", &m); // m =
printf("Введите элементы матрицы : ");
for (i = 0; i < n; i++)
for(j = 0; j < m; j++)
scanf("%d", (*(a+i)+j));
f1=sort(n,m,a);

15.

if(f1)
{printf("Матрица после сортировки\n");
for ( i = 0; i < n; i++)
{
printf("\n");
for (j = 0;j< m; j++)
printf("%7d", *(*(a+i)+j));
}
}
else printf("Cортировки не было\n");
return 0;
}

16. Если указатель изменяется в функции, то необходимо передавать указатель на указатель. Задача 4. Поменять местами два первых

четных
элемента матрицы. Для поиска и обмена использовать
отдельные функции.
#include <stdio.h>
void adress(int a[ ][10],int n,int m, int **u1, int **u2)
{int i,*j;
//*u1 - указатель на первый четный элемент.*u2 - на второй четный
//элемент
*u1=*u2=NULL; //инициализация указателей
for(i=0;i<n&&*u2==NULL;i++) //поиск адресов первых двух четных
//элементов
for(j=a[i];j<a[i]+m&&*u2==NULL;j++)
if (!(*j%2))
{if (*u1==NULL)
*u1=j;
else *u2=j;
}
}

17.

//перестановка
void changes(int *u1, int *u2)
{
int t; //переменная для перестановки
t=*u1;
*u1=*u2;
*u2=t;
}
void in_matr(int a[ ][10],int*n,int*m); //прототип, текст см.выше
void out_matr(int a[ ][10],int n,int m)
{int *i,*j;
printf (" матрица А\n");
for (i=*a;i<*a+(n*10);i+=10)
{for(j=i;j<i+m;j++)
printf("%7d",*j);
printf("\n");
}
}

18.

int main ()
{int a[10][10], n, m, *u1, *u2;
in_matr(a, &n, &m);
adress(a, n, m, &u1, &u2);
if(u2)
{changes (u1,u2);
out_matr(a,n,m);
}
else printf("нет перестановки");
return 0;
}
English     Русский Rules