Лекция 5


Массивы



Задача 1. Обменять значения двух переменных без использования дополнительной памяти

int x, y;

printf("Input two numbers\n");

scanf("%d", &x); /* 3 */

scanf("%d", &y); /* 5 */

x = x + y; /* 8 */

y = x – y; /* 3 */

x = x – y; /* 5 */


Задача 2. Обменять значения двух переменных с использованием дополнительной памяти

int x, y, buffer;

printf("Input two numbers\n");

scanf("%d", &x); /* 3 */

scanf("%d", &y); /* 5 */

buffer = y; /* 5 */

y = x; /* 3 */

x = buffer; /* 5 */


Задача 3. Симметрично перевернуть массив (без использования других массивов)


Индекс

0

1

2

3

4

5

6

Содержимое

-1

5

11

-12

7

2

0

Массив array



Индекс

0

1

2

3

4

5

6

Содержимое

0

2

7

-12

11

5

-1

Массив array


Описание типа массива:

1) double array[] - array – имя массива

2) double *array - array – адрес вещественного числа


Адрес массива === имя массива


Пример 1.

int n; /* n – целая переменная */

int *p; /* p – адрес целого числа */

p = &n; /* p – адрес переменной n */

n = 1; /* в n положили 1 */

*p = 2; /* по адресу p положили 2 => положили 2 в n */

printf("n: %d\n", n); /* напечатается 2 */




#include <stdio.h>


void mirror(double *array, int size);

void mirror(double *array, int size) {

double buffer;

int i;

for (i = 0; i < size/2; i++) {

buffer = array[i];

array[i] = array[size – 1 – i];

array[size – 1 – i] = buffer;

}

}


int main(void) {

double array[100];

int i;

for (i = 0; i < 100; i++) {

array[i] = i;

}

mirror(array, 100);

for (i = 0; i < 100; i++) {

printf("%lf ", array[i]);

}

printf("\n");

return 0;

}






Задача 4. Циклически сдвинуть массив на 1 элемент вправо

(проход по массиву справа налево)


Индекс

0

1

2

3

4

5

6

Содержимое

-1

5

11

-12

7

2

0

Массив array



Индекс

0

1

2

3

4

5

6

Содержимое

0

-1

5

11

-12

7

2

Массив array

buffer = 0


void shift(double *array, int size);

void shift(double *array, int size) {

double buffer;

int i;

buffer = array[size – 1];

for (i = size – 1; i > 0; i--) {

array[i] = array[i – 1];

}

array[0] = buffer;

}


Задача 5. Циклически сдвинуть массив на k элементов лево)

(нельзя пользоваться дополнительными массивами)


Индекс

0

1

2

3

4

5

6

Содержимое

-1

5

11

-12

7

2

0


k = 2

buffer = array[0]

array[0] = array[2]

array[2] = array[4]

array[4] = array[6]

array[6] = array[1]

array[1] = array[3]

array[3] = array[5]

array[5] = buffer


Индекс

0

1

2

3

4

5

6

Содержимое

11

-12

7

2

0

2

5

buffer = -1




Индекс

0

1

2

3

4

5

Содержимое

-1

5

11

-12

7

2

Массив array1


k = 2

buffer = array1[0]

array1[0] = array1[2]

array1[2] = array1[4]

array1[4] = buffer (array1[0])


Индекс

0

1

2

3

4

5

Содержимое

11

5

7

-12

-1

2

buffer = -1


buffer = 5 (array1[1])

array1[1] = array1[3]

array1[3] = array1[5]

array1[5] = buffer



Индекс

0

1

2

3

4

5

Содержимое

11

-12

7

2

-1

5




Два способа:

1) Элемент с индексом 0 — в буфер. Элемент с индексом k – в ячейку 0, 2*k – в ячейку k, …, m*k – в ячейку m*k-1

Цикл сдвига распадается на несколько орбит, после прохождения каждой орбиты переходим к следующей и так, пока не сдвинем все элементы

2)

a) Симметрично отобразить массив => первые два элемента стали последними, а четыре последних — первыми

b) Симметрично отобразить каждую из двух частей: 0...k-1 и k...size-1


Индекс

0

1

2

3

4

5

Содержимое

-1

5

11

-12

7

2


а)

Индекс

0

1

2

3

4

5

Содержимое

2

7

-12

11

5

-1



#include <stdio.h>


void mirror(double *array, int size);

void mirror(double *array, int size) {

double buffer;

int i;

for (i = 0; i < size/2; i++) {

buffer = array[i];

array[i] = array[size – 1 – i];

array[size – 1 – i] = buffer;

}

}


int main(void) {

double array[100];

int i, k;

printf("Input k\n");

scanf("%d", &k);

for (i = 0; i < 100; i++) {

array[i] = i;

}

mirror(array, 100);

mirror(&array[k], size – k);

mirror(array, k);

for (i = 0; i < 100; i++) {

printf("%lf ", array[i]);

}

printf("\n");

return 0;

}


Вопрос. Почему программа сдвигает вправо, а не влево, и как ее исправить?