Untitled

mail@pastecode.io avatar
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;
}