Задача 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;
}
Вопрос. Почему программа сдвигает вправо, а не влево, и как ее исправить?