Массивы и матрицы
Удаление путем сдвига
Закодируем данный алгоритм с использованием указателей
#include <stdio.h> int main() {float a[50], *i, b,l; int k, n; printf("Введите 0<k<=50 k = "); scanf("%d", &k); printf("Введите
if (n==0) printf ("Полное удаление"); else if(n==k) printf ("Нет удаления"); else {printf("Массив A после удаления: "); for
Задача 2. Найти адреса первого и второго отрицательного элемента одномерного массива. Поменять местами значения этих элементов.
Задача 3. Даны два одномерных массива целых чисел A и B. Сформировать массив С, состоящий из повторяющихся элементов массива А,
/* Сформировать массив С, состоящий из повторяющихся элементов массива А, отсутствующих в массиве В. */
/* Сформировать массив С, состоящий из повторяющихся элементов массива А, отсутствующих в массиве В. Используем указатель для
Задача 4. В данной целочисленной матрице поменять местами первый положительный и последний отрицательный элемент. Вычислять
Определение индексов элементов матрицы, расположенных на, над и под главной и побочной диагоналями
Задача 7. Дана последовательность целых чисел A[0:n-1]. Найти длину максимальной последовательности из нулей и начало этой
Пример. Ввод матрицы. Суммирование элементов матрицы различными способами.
339.00K
Category: programmingprogramming

Lecture1_8_2024

1. Массивы и матрицы

Нумерация элементов массива начинается с нуля. Имя
массива – указатель на его первый элемент, т.е.
mas==&mas[0].
int mas[10];
mas
0 1

i

9
Значение i-ого элемента массива можно представить двумя
способами: mas[i]; или *(mas+i).
Для матрицы при объявлении указывается число строк и
столбцов.
Нумерация элементов также начинается с нуля.
0 1 …
19
int b[10][20].
0
Обращение к элементу
b
1
b[i][j]

*(b[i]+j)
*(*(b+i)+j)
9
**int
*int
int

2. Удаление путем сдвига

Задача 1. Удалить из массива A[0:k-1] все элементы,
удовлетворяющие условию B<A[i]≤L, i=0,k-1 путем
сдвига, т.е. без формирования нового массива.

3. Закодируем данный алгоритм с использованием указателей

Алг «удаление путем сдвига»
если n=0 то
Нач
вывод(«полное
ввод(k, A[0:k-1], B, L)
удаление»)
n:=0 {количество оставшихся
иначе
элементов массива}
если n=k то
цикл от i:=0 до k-1
вывод(«нет
удаления»)
если A[i]>L или
иначе
A[i]<=B то {остается}
вывод(A[0:n-1])
A[n]:=A[i]
всё
n:=n+1
всё
всё
кон
кц
Закодируем данный алгоритм с использованием
указателей

4. #include <stdio.h> int main() {float a[50], *i, b,l; int k, n; printf("Введите 0<k<=50 k = "); scanf("%d", &k); printf("Введите

#include <stdio.h>
int main()
{float a[50], *i, b,l; int k, n;
printf("Введите 0<k<=50 k = ");
scanf("%d", &k);
printf("Введите элементы массива\n");
for (i=a; i<a+k; i++)
scanf("%f", i);
do{
printf("Введите b, l (b<l) "); n=scanf("%f%f", &b,&l);
while(getchar()!=‘\n’);
}
while(n<2||b>=l);
for (i=a,n=0; i<a+k; i++)
if (*i>l || *i<=b) //элемент остается
*(a+n++)=*i;

5. if (n==0) printf ("Полное удаление"); else if(n==k) printf ("Нет удаления"); else {printf("Массив A после удаления: "); for

if (n==0) printf ("Полное удаление");
else
if(n==k) printf ("Нет удаления");
else
{printf("Массив A после удаления: ");
for (i=a; i<a+n; i++)
printf("%10.5f",*i);
printf ("\n");
}
return 0;
}

6. Задача 2. Найти адреса первого и второго отрицательного элемента одномерного массива. Поменять местами значения этих элементов.

#include <iostream>
#include <stdio.h>
int main ()
{setlocale(LC_ALL,"RUS");
int a[10],na,*u1,*u2,k,*t;
//u1 и u2 - указатели на два первых отрицательных элемента
//t - указатель на текущий элемент массива
printf ("введите длину массива А:"); scanf("%d",&na);
printf ("введите массив А\n");
for (t=a;t<a+na;t++) scanf("%d",t);
u1=u2=NULL; //инициализация указателей
for(t=a;t<a+na&&u2==NULL;t++) //поиск адресов
// цикл завершится когда будет найден второй отрицательный
//элемент
if (*t<0)
if(!u1)
u1=t;
else
u2=t;

7.

// перестановка и вывод результата
if (!u2)
printf(" Нет двух отрицательных элементов");
else
{printf("1 отрицательный %d\n 2 отрицательный%d\n",*u1,*u2);
k=*u1,*u1=*u2,*u2=k;
printf ("Получен массив А\n");
for (t=a;t<a+na;)
printf("%5d",*t++);}
return 0;
}

8. Задача 3. Даны два одномерных массива целых чисел A и B. Сформировать массив С, состоящий из повторяющихся элементов массива А,

отсутствующих в массиве В.
1. Есть новый массив
A
B
1 2 1 2 2 3 4
1 3 0 -5
C
2 2 2
2. Нет нового массива
A
B
1 2 3 3 3 4
1 2 3 4

9. /* Сформировать массив С, состоящий из повторяющихся элементов массива А, отсутствующих в массиве В. */

if (j<na) //повторяется
#include <stdio.h>
{ //проверка отсутствия a[i] в b
#include <iostream>
for (j=0;j<nb&&a[i]!=b[j];j++);
//для setlocale
//цикл закрыт
int main ()
if (j==nb) //условие отсутствия
c[nc++]=a[i];
{ setlocale(LC_ALL,”RUS”);
}
int a[10], b[10], c[10], na, nb, nc=0, i, j;
}
printf ("введите длину массива А:");
//вывод результата
scanf("%d",&na);
if (nc==0)
printf ("введите массив А\n");
printf("массив C пуст\n");
else
for (i=0;i<na;i++)
{
scanf("%d",&a[i]);
printf("Массив C");
//ввод массива b аналогично
for (i=0;i<nc;i++)
for(i=0;i<na;i++)
printf("%7d",c[i]);
printf ("\n");
{ //проверка повторения a[i]
}
for(j=0;j<na&&(a[i]!=a[j]||i==j);j++);
return 0;
}

10. /* Сформировать массив С, состоящий из повторяющихся элементов массива А, отсутствующих в массиве В. Используем указатель для

обращения к элементам */
#include <stdio.h>
if (ua1<a+na) //повторяется
#include <iostream>
{ //проверка отсутствия *ua в b
int main ()
for
(ub=b;ub<b+nb&&*ua!=*ub;ub++);
{ setlocale(LC_ALL,"RUS");
if (ub==b+nb) //условие отсутствия
int a[10], b[10], c[10], na, nb,
nc=0,*ua,
*uc=*ua, uc++, nc++;
*ua1, *ub, *uc=c;
}
printf ("введите длину массива А:");
}
scanf("%d",&na);
//вывод результата
printf ("введите массив А\n");
if (nc==0)
for (ua=a;ua<a+na;ua++)
printf("массив C пуст\n");
scanf("%d",ua);
else
//ввод массива b аналогично
{ printf("Массив C");
for(ua=a;ua<a+na;ua++)
for (uc=c;uc<c+nc;uc++)
printf("%7d",*uc);
{ //проверка повторения *ua
for(ua1=a;ua1<a+na&&(*ua!=*ua1 printf ("\n");
||ua==ua1);ua1++);
}
return 0;}

11. Задача 4. В данной целочисленной матрице поменять местами первый положительный и последний отрицательный элемент. Вычислять

адреса
элементов.
#include <iostream>
#include <stdio.h>
int main()
{ int a[10][10],n,m,i,j,*u1,*u2,c;
setlocale(LC_ALL,"RUS");
do
{ printf("Введите количество строк"); scanf("%d",&n);
}
while (n<=0||n>10);
do
{ printf("Введите количество столбцов"); scanf("%d",&m);
}
while (m<=0||m>10);

12.

printf("Введите матрицу\n");
for (i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&a[i][j]);
u1=u2=NULL;
for (i=0;i<n;i++)
for(j=0;j<m;j++)
{
if (a[i][j]>0&&u1==NULL)
u1=&a[i][j];
if (a[i][j]<0)
u2=&a[i][j];
}

13.

if (!u1)
printf("нет положительных");
else
if (!u2)
printf("нет отрицательных");
else
{ c=*u1,*u1=*u2,*u2=c;
for (i=0;i<n;i++)
{ for(j=0;j<m;j++)
printf("%3d",a[i][j]);
printf("\n");
}
}
return 0;
}

14. Определение индексов элементов матрицы, расположенных на, над и под главной и побочной диагоналями

Главная диагональ
printf("на главной i=j\n");
for (i=0;i<n;i++)
printf("%7d",a[i][i]);
printf("\n");
printf("над главной\n");
for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
printf("%7d",a[i][j]);
printf("\n");
printf("под главной\n");
for (i=1;i<n;i++)
for (j=0;j<i;j++)
printf("%7d",a[i][j]);
printf("\n");

15.

Побочная диагональ
printf("на побочной i+j=n-1");
for (i=0;i<n;i++)
printf("%7d",a[i][n-1-i]);
printf("\n");
printf("над побочной");
for (i=0;i<n-1;i++)
for (j=0;j<n-i-1;j++)
printf("%7d",a[i][j]);
printf("\n");
printf("под побочной");
for (i=1;i<n;i++)
for (j=n-i;j<n;j++)
printf("%7d",a[i][j]);
printf("\n");

16. Задача 7. Дана последовательность целых чисел A[0:n-1]. Найти длину максимальной последовательности из нулей и начало этой

последовательности. Используем указатели и форматный ввод-вывод
Обозначения:
dtp – длина текущей последовательности из нулей
maxdp – максимальная длина последовательности
npmax – начало максимальной последовательности из нулей
nte - номер текущего элемента
//Алгоритм – вычислительная часть
maxdp:=0; dtp:=0;
цикл от nte:=0 до n-1
если a[nte]=0 то dtp:=dtp+1;
иначе
если dtp>maxdp то maxdp:=dtp; npmax:=nte-dtp;
всё
dtp:=0
всё
кц
если dtp>maxdp то maxdp:=dtp; npmax:=nte-dtp;
всё

17.

#include <iostream>
#include <stdio.h>
int main()
{
setlocale(LC_ALL, “RUS”);
int a[100], n, *ua, dtp, maxdp, npmax;
printf("Введите 0<n<=100 n = "); scanf("%d", &n);
printf("Введите элементы массива\n");
for (ua=a;ua< a+n; ua++) scanf("%d", ua);
maxdp=dtp=0;
for (ua=a; ua<a+n; ua++)
if (*ua==0) dtp++;
else
{
if (dtp>maxdp) maxdp = dtp, npmax = (ua-a)-dtp;
dtp=0;
}
if (dtp>maxdp) maxdp = dtp, npmax = (ua-a)-dtp;
if (!maxdp) printf(“Нет нулей”);
else
printf(“Maxdp=%d\nnpmax=%d\n “, maxdp ,npmax);
return 0;
}

18. Пример. Ввод матрицы. Суммирование элементов матрицы различными способами.

int
a[10][20],n,m,i,j,*ui,*uj,(*u)[20]
,s;
printf ("введите n и m :");
scanf("%d%d",&n,&m);
printf ("введите матрицу А\n");
for (i=0;i<n;i++)
for (j=0;j<m;j++)
scanf("%d",&a[i][j]);
//1
for (i=0,s=0;i<n;i++)
for (j=0;j<m;j++)
s+=a[i][j];
printf("s=%10d ",s);
//2
for(ui=*a,s=0;ui<*a+n*20;ui+=20)
for (uj=ui;uj<m+ui;uj++)
s+=*uj;
printf("s=%10d ",s);
//3
for (u=a,s=0;u<a+n;u++)
for (uj=*u;uj<*u+m;uj++)
s+=*uj;
printf("s=%10d ",s);
//4 вариант обхода матрицы –
//см. задачу 3
English     Русский Rules