Untitled
unknown
c_cpp
2 years ago
4.3 kB
8
Indexable
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <math.h>
// заполнить одномерный массив структур (точка на плоскости) и вывести на экран
// (12; 65) (45; 18) (67; 98) ..
// размер массива вводит пользователь
// найти ближайшую точки к началу координат
// удалить ВСЕ точки, которые ниже оси X
// 1) посчитать размер нового массива - количество точек всего минус количество точек ниже оси X
typedef struct MyPoint {
int x, y;
} MyPoint;
void FillArr( MyPoint* arr, const int n ) {
int i;
for (i = 0; i < n; i++ ) {
arr[ i ].x = rand() % 101 - 50;
arr[ i ].y = rand() % 101 - 50;
}
}
void PrintArr(const MyPoint *arr, const int n) {
int i;
for (i = 0; i < n; i++)
printf("(%d; %d) ", arr[i].x, arr[i].y ); // (25; 98)
}
double MyDistance(const MyPoint p) {
return sqrt( p.x * p.x + p.y * p.y );
}
int GetCountLowerX( const MyPoint* arr, const int size ){
int count,i;
for (i = 0; i < size; i++)
if (arr[i].y < 0)
++count;
return count;
}
// НЕЛЬЗЯ arr[ i ] = rand() % 101 - 50
// НУЖНО
// arr[ i ].x = rand() % 101 - 50
// arr[ i ].y = rand() % 101 - 50
MyPoint GetNearestOrigin( const MyPoint* arr, const int size ) {
MyPoint nearest = arr[ 0 ]; // near.x = arr[ 0 ].x, near.y = arr[ 0 ].y
int i;
for( i = 1; i < size; ++i )
if( MyDistance( arr[ i ] ) < MyDistance( nearest ) )
nearest = arr[ i ];
return nearest;
}
MyPoint* RemovePointByIndex( MyPoint* arr, int* size, const int num ) { // 0, 1, 2, [3], 4, 5
// выделяем память под новый массив
MyPoint* parr = (MyPoint*)malloc( ( *size - 1 ) * sizeof(MyPoint));
if ( parr == NULL ) { // если память выделиь НЕ удалось,
free(arr); // очищаем память от исходного массива
return NULL; // и возвращаем NULL
}
int i, j = 0; // копируем все точки кроме удаляемой
for( i = 0; i < *size; ++i )
if ( i != num ) // для пропуска удаляемой точки
parr[ j++ ] = arr[ i ];
// меняем размер массива - изменяем значение переменной n в функции main
--(*size); //*size -= 1; или *size = *size - 1;
free(arr); // очищаем память от исходного массива
return parr; // возвращаем указатель но новый массив
}
MyPoint* RemoveAllLowerX(MyPoint* arr, int* size) {
int countLower = GetCountLowerX(arr, size );
// выделяем память под новый массив
MyPoint* parr = (MyPoint*)malloc( ( *size - countLower ) * sizeof(MyPoint));
if ( parr == NULL ) {
free(arr);
return NULL;
}
return parr;
}
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int n;
printf("Введите размер массива: ");
scanf("%d", &n);
MyPoint* points = (MyPoint*)malloc( n * sizeof( MyPoint ) ); // 5 * 8 = 40
if( points == NULL ) {
puts("Memory allocation error");
return 1;
}
srand( time( NULL ) );
FillArr(points, n );
PrintArr(points,n);
MyPoint nearest = GetNearestOrigin( points, n );
printf("\nближацшая точка к началу координат: x = %d, y = %d", nearest.x, nearest.y );
printf("\nВведите номер точки для удаления: ");
int num;
scanf("%d", &num);
--num;
points = RemovePointByIndex( points, &n, num );
if( points == NULL ){
puts("Ошибка удаления точки!");
return 1;
}
puts("");
PrintArr(points,n);
free(points);
points = RemoveAllLowerX(points, &n);
PrintArr(points,n);
free(points);
return 0;
}
Editor is loading...