Ëåêöèÿ 6 (11.10.2021)


Ìàññèâû: ñèììåòðè÷íîå îòîáðàæåíèå, ñäâèã



Çàäà÷à 1. Ñèììåòðè÷íî ïåðåâåðíóòü (îòîáðàçèòü) ìàññèâ

1 2 3 4 5 | 6 7 8 9 10 → 10 9 8 7 6 5 4 3 2 1

1 2 3 4 5 6 7 8 9 → 9 8 7 6 5 4 3 2 1



Óñëîâèå: íå èñïîëüçîâàòü äîïîëíèòåëüíûå ìàññèâû



Çàäà÷à 2. Îáìåíÿòü çíà÷åíèÿ äâóõ ïåðåìåííûõ, íå èñïîëüçóÿ äîïîëíèòåëüíûõ ïåðåìåííûõ

x = 1 → x = 2

y = 2 → y = 1

x := x + y (= x0 + y0)

y := x – y (= x0)

x := x – y (= y0)

Íà Ñ:

int x, y;

printf(“Input x and y\n”);

scanf(“%d%d”, &x, &y);

x += y;

y = x – y;

x -= y;

Ðåçóëüòàò ðàáîòû ïðîãðàììû:




Çàäà÷à 3. Îáìåíÿòü çíà÷åíèÿ äâóõ ïåðåìåííûõ ñ èñïîëüçîâàíèåì äîïîëíèòåëüíûõ ïåðåìåííûõ

int x, y, buf;

buf = x; x = y; y = buf;

Ðåøåíèå çàäà÷è 1:

Àäðåñ ïåðåìåííîé èçâëåêàåòñÿ ïðè ïîìîùè îïåðàòîðà &, èçâëå÷ü ñîäåðæèìîå ïî àäðåñó — ïðè ïîìîùè îïåðàòîðà *

int x = 1, y, *px; /* * èñïîëüçóåòñÿ äëÿ óêàçàíèÿ òîãî, ÷òî px èìååò òèï «àäðåñ öåëîãî» */

px = &x;

y = *px; /* * - îïåðàöèÿ èçâëå÷åíèÿ ñîäåðæèìîãî ïî àäðåñó; y ïðèñâîèòñÿ ñîäåðæèìîå ïàìÿòè ïî àäðåñó px, òî åñòü çíà÷åíèå x */

(Âûðîæäåííàÿ ñèòóàöèÿ, òî åñòü ìîæíî ïðîñòî «y = x”. Äàëåå áóäóò ðàññìîòðåíû ïîëåçíûå ïðèìåíåíèÿ *)

int x, y, *px;

px = &x; /* px óêàçûâàåò íà ÿ÷åéêó ñ 1 */

x = 2; /* px óêàçûâàåò íà ÿ÷åéêó ñ 2 */

y = *px; /* y ñòàíåò ðàâíûì 2 */



Àäðåñ ìàññèâà — àäðåñ ïåðâîãî ýëåìåíòà.

int array[100];

int *parray1 = &array[0], *parray2 = array; /* èìÿ ìàññèâà — ýòî òîæå åãî àäðåñ */

*parray1 = 0; /* ïðèñâîèëè 0 ïåðâîìó ýëåìåíòó ìàññèâà array, òî åñòü ìàññèâ array ïîìåíÿëñÿ */

parray1 = 0; /* ïðèñâîèëè 0 ïåðåìåííîé parray1, òî åñòü îíà ñòàëà óêàçûâàòü íà ÿ÷åéêó ñ àäðåñîì 0, à ìàññèâ array íå ïîìåíÿëñÿ */



Åñëè ïàðàìåòð ôóíêöèè — àäðåñ ìàññèâà, òî åãî ìîæíî îïèñàòü äâóìÿ ðàçíûìè ñïîñîáàìè:

void mirror(double *arr, int arr_size);

void mirror(double arr[], int arr_size);

(äåêëàðàöèÿ ôóíêöèè)



void mirror(double arr[], int arr_size) { /* void – îçíà÷àåò, ÷òî ôóíêöèÿ íå âûðàáàòûâàåò íèêàêîãî çíà÷åíèÿ */

double buf;

int i;

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

buf = arr[i];

arr[i] = arr[arr_size – 1 – i];

arr[arr_size – 1 – i] = buf;

}

}



#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++) {

/* îáìåíèâàåì çíà÷åíèÿ äâóõ ýëåìåíòîâ ìàññèâà: i-ãî è ñèììåòðè÷íîãî åìó */

buffer = array[i];

array[i] = array[size – 1 – i]; /* size – 1 – èíäåêñ ïîñëåäíåãî ýëåìåíòà */

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 ýëåìåíò âëåâî

1 2 3 4 5 6 7 8 9 10 → 2 3 4 5 6 7 8 9 10 1

2 2 3 4 5 6 7 8 9 10

2 3 3 4 5 6 7 8 9 10

2 3 4 4 5 6 7 8 9 10

...

2 3 4 5 6 7 8 9 10 10

2 3 4 5 6 7 8 9 10 1



1) 1 ñîõðàíÿåì â áóôåðå

2) Âñå îñòàëüíûå ýëåìåíòû äâèãàåì âëåâî. Âîïðîñ: cêîëüêî ðàç äâèãàåì? Îòâåò: ðàçìåð ìàññèâà - 1

3) 1 èç áóôåðà çàïèñûâàåì íà ïîñëåäíåå ìåñòî



void shift(double *array, int size); /* shift – ñäâèã

void shift(double *array, int size) {

double buffer;

int i;

buffer = array[0];

for (i = 0; i < size – 1; i++) {

array[i] = array[i + 1];

}

array[size - 1] = buffer;

}



double *array;

array[i] – âåùåñòâåííîå ÷èñëî, êîòîðîå íàõîäèòñÿ â i-îì ýëåìåíòå ìàññèâà ñ àäðåñîì array.

Çäåñü àäðåñ âåùåñòâåííîãî èñïîëüçóåòñÿ êàê àäðåñ ìàññèâà, òî åñòü ìû çíàåì, ÷òî array – ýòî àäðåñ ìàññèâà.