Untitled
unknown
c_cpp
a year ago
4.3 kB
2
Indexable
Never
#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( const MyPoint* arr, const int 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); MyPoint count = RemoveAllLowerX(points, n); PrintArr(points,n); free(points); return 0; }