Сортировка массивов
Сортировка вставками
Многомерные массивы
Обращение к элементу матрицы x[i,j]
Инициализация элементов матрицы. Ввод данных с клавиатуры.
Получение значений случайным образом
Печать элементов матрицы
1.74M
Категория: ПрограммированиеПрограммирование

Массив из n элементов

1.

Дан массив из n элементов. Написать
программу, передвигающюю все четные
элементы массива в начало.
int n;
printf("Введите размер массива: ");
scanf("%d",&n);
int *x = (int*)malloc(n*sizeof(int));
int i,m=0,j;
for(i=0;i<n;i++)
{x[i] = rand()%20;
printf("%4d",x[i]);}
printf("\n");

2.

for(i=1;i<n;i++)
if(x[i]%2==0)
{m= x[i];
for(j=i-1;j>=0&&x[j]%2;j--)
x[j+1]=x[j];
x[j+1]= m;
}
printf("Результат \n");
for(i=0;i<n;i++)
{printf("%4d",x[i]);}
system("PAUSE");
printf("\n");

3.

Дан массив из n элементов. Найти самую
длинную последовательность элементов,
которые расположены по неубыванию
значений и вывести ее на экран.
ii = 0; d = 1; m=1;
for(i=0;i<n-1;i++)
if(x[i]<=x[i+1])
{m++;
} else {if (d<m){d=m;ii=i;}
m=1;}
if (d<m){d=m;ii=i;}
printf("Результат %d\n",d);
for(i=ii-d+1;i<=ii;i++)
{printf("%4d",x[i]);}

4.

Дан массив из n элементов. Изменить размер
массива следующим образом: если в массиве
есть повторения первого элемента, то удалить
все элементы между ними. Дополнительный
массив не использовать.
12341213456
1113456
ii = 0;
for(i=1;i<n;i++)
{ while(i<n&&x[i]!=x[0])i++;
if(x[i]==x[0]){
m = i-ii-1;
for(d=i;d<n;d++)
x[d-m] = x[d];

5.

ii++;
i = ii+1;
n-=m;
}
}
printf("\n");
for(i=0;i<n;i++)
{printf("%4d",x[i]);}

6.

ДИНАМИЧЕСКИЕ МАССИВЫ
int *x,n,i;
printf("n = ");
scanf("%d",&n);
x=(int*)calloc(n,sizeof(int));
for(i=0;i<n;i++){
printf("%3d",x[i]);
}
printf("\n");
free(x);

7.

ДИНАМИЧЕСКИЕ МАССИВЫ
Найти индекс первого минимального элемента
массива
int *x,n,i;
printf("n = ");
scanf("%d",&n);
srand(time(NULL));
x=(int*)malloc(sizeof(int)*n);
for(i=0;i<n;i++){
*(x+i) = rand()%50;
printf("%3d",*(x+i));
}

8.

printf("\n");
int imin = 0;
for(i=1;i<n;i++){
if(*(x+imin)>*(x+i)) imin = i;
}
printf("imin = %d \n", imin);
free(x);

9.

ДИНАМИЧЕСКИЕ МАССИВЫ.
ПЕРЕРАСПРЕДЕЛЕНИЕ ПАМЯТИ
• Выполняет перераспределение блоков памяти.
• Размер блока памяти, на который ссылается
параметр ptrmem изменяется на size байтов.
• Блок памяти может уменьшаться или
увеличиваться в размере.

10.

ДИНАМИЧЕСКИЕ МАССИВЫ.
ПЕРЕРАСПРЕДЕЛЕНИЕ ПАМЯТИ
• Функция может перемещать блок памяти на
новое место, в этом случае возвращается
указатель на новое место в памяти.
• Содержание блока памяти сохраняется даже
если новый блок имеет меньший размер, чем
старый.
• Отбрасываются только те данные, которые не
вместились в новый блок.
• Если новое значение size больше старого, то
содержимое вновь выделенной памяти будет
неопределенным.

11.

ДИНАМИЧЕСКИЕ МАССИВЫ.
ПЕРЕРАСПРЕДЕЛЕНИЕ ПАМЯТИ
ptrmem = NULL, функция
ведет себя как malloc.
• В случае, если size равен 0, ранее
• В случае, если
выделенная память будет освобождена, и
возвращается нулевой указатель.
С клавиатуры осуществляется ввод данных
до первого отрицательного числа. Написать
программу, которая сохраняет введенные
данные в динамическом массиве
(отрицательное число в массиве не
сохраняется)

12.

ДИНАМИЧЕСКИЕ МАССИВЫ.
ПЕРЕРАСПРЕДЕЛЕНИЕ ПАМЯТИ

13. Сортировка массивов

Сортировка обменом (пузырьковая
сортировка)
5
3
5
2
5
0
5
1
5
4
x[i]>x[i+1]

14.

3
2
3
0
3
1
4
5
2
0
2
1
3
4
5
x[i]>x[i+1]

15.


for (i=0; i<n-1; i++){
flag = 0;
for (j=0; j<n-i-1; j++)
if (x[j]>x[j+1]) {
flag = 1;
temp = x[j];
x[j]=x[j+1];
x[j+1]=temp; }
if (flag==0) break;

16.

Сортировка выбором
5
3
2
0
1
5
5
3
2
0
0
i=0
4
Поиск
минимального
элемента на
текущую
позицию

17.

0
3
2
5
1
i=1
3
2
2
1
0
1
2
5
3
2
2
2
2
5
3
4
5
3
3
i=2
0
i=3
1
4
1
4

18.

0
1
2
i=4
3
5
4
5
4

for(int i=0;i<n-1;i++)
{ int k = i;
for (int j=i+1;j<n;j++)
if (x[k]>x[j]) k=j;
if(k!=i) { int temp=x[i]; x[i]=x[k] ;
x[k]=temp;}
}…

19. Сортировка вставками

5
3
2
0
1
4
3
vs =x[1]
j=-1
j=0
Пока vs<x[j] и
j>=0

20.

5
2
vs =x[2]
2
3
0
1
4
j=-1
j=1
j=0
Пока vs<x[j] и
j>=0

21.

2
3
vs =x[3]
5
0
1
4
0
j=-1
j=2
j=1
j=0
Пока vs<x[j] и
j>=0

22.

0
2
vs =x[4]
3
5
1
4
1
j=3
j=0
j=1
j=2
Пока vs<x[j] и
j>=0

23.

0
1
vs =x[5]
2
3
5
4
4
j=4
j=3
Пока vs<x[j] и
j>=0

24. Многомерные массивы

Инициализация матриц
i
j
00
01

0n-2 0n-1
10
11

1n-2 1n-1




m-20
m-21

m-2n-2 m-2n-1
m-10
m-11

m-1n-2

m-1n-1

25.

Механизм
выделения
памяти
int **x, i;
x=(int**)malloc(sizeof( int*)*n);
for(i=0;i<n;i++)
x[i] = (int*)malloc(sizeof(int)*m);
x[0]
x00
x01 … X0m-1
x[1]
x10
x11 … X1m-1
x[2]
x20
x21 … X2m-1
xi0
xi1 … Xim-1

x[i]

x[n-1]
Xn-10 Xn-11 … Xn-1m-1

26.

Механизм
освобождения
памяти
for(i=n-1;i>=0;i--)
free (x[i]);
free(x);
x[0]
x00
x01 … X0m-1
x[1]
x10
x11 … X1m-1
x[2]
x20
x21 … X2m-1
xi0
xi1 … Xim-1

x[i]

x[n-1]
Xn-10 Xn-11 … Xn-1m-1

27. Обращение к элементу матрицы x[i,j]

фиксируется строка
for(i=0;i<n;i++)
фиксируется столбец
for(j=0;j<m;j++)

индекс строки
индекс столбца
X[i][j]

28.

i
j
00
01

0m-2 0m-1
10
11

1m-2 1m-1




n-20
n-21

n-2m-2 n-2m-1
n-10
n-11

n-1m-2

n-1m-1

29.

for(i=0;i<m;i++)
for(j=0;j<n;j++)
… x[j][i]
фиксируется строка
фиксируется столбец
i
j
00
01

0m-2 0m-1
10
11

1m-2 1m-1




n-20
n-21

n-2m-2 n-2m-1
n-10
n-11

n-1m-2 n-1m-1

30. Инициализация элементов матрицы. Ввод данных с клавиатуры.


float **A;
int n,m,i,j;
printf ("Введите количество строк матрицы: ");
scanf("%d",&n);
printf ("Введите количество столбцов матрицы: ");
scanf("%d",&m);
A = (float**) malloc(sizeof(float*)*n);

31.

for(i=0;i<n;i++)
A[i] = (float*) malloc(sizeof(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]));
}

32. Получение значений случайным образом


float **x;
int n,m,i,j;

x = (float**) malloc(sizeof(float*)*n);
for( i=0;i<n;i++)
x[i] = (float*)malloc(sizeof(float)*m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
x[i][j] = rand()%200/(rand()%100+1.);

33. Печать элементов матрицы

i
j
00
01
… 0m-2 0m-1 “/n”
10
11
… 1m-2 1m-1 “/n”



n-20
n-21

n-2m-2 n-2m-1
n-10
n-11

n-1m-2 n-1m-1


34.


for(i=0;i<n;i++)
{
for( j=0;j<m;j++)
printf("%8.3f ",x[i][j]);
// переход на новую строку экрана
printf("\n");
}

English     Русский Правила