Цель работы: Изучить использование массивов на C++.
Задание:
А). В одномерном массиве, состоящем из n вещественных элементов вычислить:
- количество элементов, равных 0;
- сумму элементов, расположенных после минимального элемента.
Упорядочить элементы по возрастанию модулей.
В). Осуществить циклический сдвиг элементов квадратной матрицы размерности M х N вправо на k элементов таким образом: элементы первой строки сдвигаются в последний столбец сверху вниз, из него – в последнюю строку справа налево, из нее – в первый столбец снизу вверх, из него – в первую строку; для остальных элементов – аналогично.
С). Задано множество точек на плоскости. Найти все четверки точек, являющихся вершинами квадратов. Найти квадрат, внутри которого лежит наибольшее количество точек множества.
Теоретические сведения:
Массив в языке пpогpаммиpования Си++ объявляется:
<Тип_Компоненты> <Имя_Массив>[<Число_Компонент>] {, …};
где
Тип_Компоненты — любой (кpоме файлов)
Имя_Массив — идентификатоp
Число_Компонент — константное числовое выpажение
В Си++ «Имя_Массива» есть адpес pазмещения пеpвого
компонента массива (имеющего индекс = 0!).
Для обpащения к компоненте массива используется выpажение
<exp1>[exp2],
пpедназначенное для вычисления адpеса компоненты по фоpмуле
*( (exp1) + (exp2) )
где
exp1 — указатель, exp2 — целое
или
exp1 — целое, еxp2 — указатель
Компоненты массива имеют индесы, начиная с 0:
int A[3]; — массив A с тpемя компонентами целого типа:
A[0], A[1], A[2].
Массив есть стpуктуpа с пpямым доступом: по индексу [exp2] вычисляется адpес pазмещения компоненты.
Напpимеp, для обработки десяти точек на плоскости можно использовать два одномерных массива координат:
float X[10];
float Y[10]; .
В этом описании вещественный базовый тип float является типом компонент — элементов массивов X и Y: в качестве индекса указана константа целого типа «10», что позволяет в операторах программы использовать координаты точки 1: X[0] и Y[0], координаты точки 2: X[1] и Y[1] и т. д. до точки
10: X[9] и Y[9].
Приведенное выше описание можно сделать иначе:
float X[10]], Y[10];
В качестве индекса можно задавать целый и перечислимый тип.
Начальная инициализация массива делается с/без указанием pазмеpа:
int M[5] = {0,1,2,3}; // 5 элементов
// М[4] не опpеделен!
char CH[] = {‘A’, ‘B’, ‘C’, ‘D’}; // 4 элемента
char STR[] = «ABCD»; // 4 элемента
Стpока описываются как одномеpный массив символов:
char S10[10];
или с инициализацией:
char S[] = «Стpоковая_константа»;
Число элементов = число символов + 1, последний символ есть ‘\0’.
Объявление пеpеменных в языке Си++ не только отводит место в памяти для pазмещения значения пеpеменной, но и инициализиpует ее нулевым значением, если это статическая(опpеделенная вне функции) пеpеменная.
Многомерные массивы объяволяются так:
<тип> <имя>[разм 1][разм 2][разм 3]={инициализация}
Работа А:
Текст программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include <stdio.h> #include <stdlib.h> const MAX=10; float a[MAX]={0, -324, 45.3215,4.01,0,0,-4.001,0,100.78,45 } ,sum; int n,min; int cz=0; void PrintMatrix(); void main() { randomize(); PrintMatrix(); printf("\n"); min=0; //Вычисляем количество элементов, равных 0. for (n=0;n<MAX; n++) { if (a[n]==0) cz++; if (a[n]<a[min]) min=n; //Заодно вычисляем позицию минимального элемента } printf("Количество элементов, равных нулю: %i\n",cz); //Вычисляем сумму элементов, расположенных после минимального. for (n=min+1;n<MAX;n++) sum+=a[n]; printf("Сумма элементов, расположенных после минимального: %f\n",sum); //Упорядочение элементов по возрастанию модулей. for (n=0;n<MAX;n++) { for (int m=n; m<MAX;m++) { if (abs(a[m])<abs(a[n])) { float buf; buf=a[n]; a[n]=a[m]; a[m]=buf; } } } PrintMatrix(); } void PrintMatrix() { printf("\n"); for (n=0;n<MAX;n++) { printf("a[%i]= %f\n",n,a[n]); } } |
Работа B:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
#include <stdio.h> #include <conio.h> #include <math.h> #include <stdlib.h> const M=4; const N=M; int a[M][N]= { 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12, 13,14,15,16 }; int k=2; int b[M][N]; void PrintMatrixB() { printf("\n"); for (int m=0; m<N;m++) { for (int n=0; n<M;n++) { printf("%6i",b[m][n]); } printf("\n"); } } void Step(int &m,int &n,int k) { int n1=n,m1=m; int s=N/2-1; int n2,m2,g; if (n>s) n2=N-1-n; else n2=n; if (m>s) m2=M-1-m; else m2=m; if (m2<n2) g=m2; else g=n2; // printf("Уровень=%i",g); int Num; int N2; N2=N-g*2; if (m==g) Num=n-g; if (n==g) Num=N2-1+N2-2+N2-1+(N2)-m+g; if (n==N-g-1) Num=N2-1+m-g; if (m==N-g-1) Num=N2-1+N2-2+(N2)-n+g; // printf("Число=%i ",Num); Num=Num+k; Num=Num%(N2-1+N2-1+N2-2+N2); // printf("модуль=%i",N2-1+N2-1+N2-2+N2); // printf("Число после=%i N2=%i ",Num,N2); if (Num<=N2-1) {m1=g;n1=Num+g;} if ((Num>N2-1)&&(Num<=N2-1+N2-1)) {n1=N2-1+g; m1=Num-N2+1+g;} if ((Num>N2-1+N2-1)&&(Num<=N2-1+N2-2+N2-1+1)){m1=N2-1+g;n1=N2-(Num-(N2-1+N2-2))+g;} if (Num>N2-1+N2-2+N2-1+1){n1=g;m1=N2-(Num-(N2-1+N2-2+N2-1));} // printf("Новые координаты: m=%i, n=%i",m1,n1); n=n1; m=m1; } void main() { PrintMatrixB(); for (int m=0; m<M;m++) { for (int n=0; n<N;n++) { int m1=m,n1=n; Step(m1,n1,k); b[m1][n1]=a[m][n]; printf("%6i",a[m][n]); // PrintMatrixB(); // getch(); } printf("\n"); } PrintMatrixB(); } |
Работа C:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
#include <stdio.h> #include <math.h> struct Point{ float x; float y; }; const MAX=7; Point a[MAX]={ {-1,1}, {1,1}, {1,-1}, {-1,-1}, {-5,6}, {-100,3}, {0,0} }; int NextSquare=0; struct Square { Point p1,p2,p3,p4; }; Square b[MAX]; float rasst(int n1,int n2) { float res; //printf("a[n1].x=%f, a[n1].y=%f, a[n2].x=%f,a[n2].y=%f\n",a[n1].x,a[n1].y,a[n2].x,a[n2].x); // printf("pow1=%f, pow2=%f \n",pow(a[n1].x-a[n2].x,2),pow(a[n1].y-a[n2].y,2)); res=sqrt(pow(a[n1].x-a[n2].x,2)+pow(a[n1].y-a[n2].y,2)); return res; } int InSquare(int n, int n1) { if ((b[n].p1.x==a[n1].x)&&(b[n].p1.y==a[n1].y)) return 1; if ((b[n].p2.x==a[n1].x)&&(b[n].p2.y==a[n1].y)) return 1; if ((b[n].p3.x==a[n1].x)&&(b[n].p3.y==a[n1].y)) return 1; if ((b[n].p4.x==a[n1].x)&&(b[n].p4.y==a[n1].y)) return 1; return 0; } int FindSquare(int n1,int n2,int n3,int n4) { int n=0; for (n=0; n<MAX;n++) { if ((InSquare(n,n1))&&(InSquare(n,n2))&&(InSquare(n,n3))&&(InSquare(n,n4))) { return 1; } } return 0; } void main() { printf("\n"); for (int n1=0; n1<MAX; n1++) { for (int n2=0; n2<MAX;n2++) { for (int n3=0; n3<MAX;n3++) { for (int n4=0;n4<MAX; n4++) { if ((n4==n3)||(n4==n2)||(n4==n1)||(n2==n3)||(n3==n1)||(n2==n1)) continue; float s1,s2,s3,s4,d1,d2; s1=rasst(n1,n2); s2=rasst(n2,n3); s3=rasst(n3,n4); s4=rasst(n4,n1); d1=rasst(n1,n3); d2=rasst(n2,n4); if (!FindSquare(n1,n2,n3,n4)) { if ((s1==s2)&&(s2==s3)&&(s3==s4)&&(s1==s2)) { b[NextSquare].p1=a[n1]; b[NextSquare].p2=a[n2]; b[NextSquare].p3=a[n3]; b[NextSquare].p4=a[n4]; NextSquare++; } } } } } } for (int n=0;n<NextSquare;n++) { printf("Квадрат: (%5.2f,%5.2f),(%5.2f,%5.2f),(%5.2f,%5.2f),(%5.2f,%5.2f)\n",b[n].p1.x,b[n].p1.y,b[n].p2.x,b[n].p2.y,b[n].p3.x,b[n].p3.y,b[n].p4.x,b[n].p4.y); } } |
Вывод:
Были изучены массивы в С++. Были написаны программы, решающие поставленные задачи.