Похожие презентации:
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;
}