Регистрация не е нужна, освен при създаване на тема в "Задача на седмицата".

Задача с код и обясниение C++

Задача с код и обясниение C++

Мнениеот closerPr0 » 08 Дек 2024, 12:00

Здравейте,
Можете ли да ми помогнете с една задача ( работещ код) , и ако остане време да я обясните. Или някой коментар, към кода. Защото искам и да я разбера, помеже трябва и да правя блоксхема към нея. Малко ми е спешно, понеже имам изпит и искам, да мога да ги решавам от този тип:
Задача: C++
Зададени са k окръжности (абсциса и ордината на центъра и радиус) и m (m<=20) точки (абсциса и ордината). Да се състави алгоритъм и напише програма за определяне дали има окръжност, в която лежат всички точки.
closerPr0
Нов
 
Мнения: 1
Регистриран на: 08 Дек 2024, 11:54
Рейтинг: 0

Re: Задача с код и обясниение C++

Мнениеот ammornil » 25 Дек 2024, 12:21

Аз разбирам заданието като: да се определи дали има окръжност (единствена) за която всички точки са на разстояние от центъра на окръжността, което е по-малко или равно на радиуса на окръжността. Ако точките по окръжността не се зачитат, тогава само по-малко ще е решение; ако се иска всички точки да са по окръжността, тогава решенията ще са само разстоянията равни на радиуса.

Трябват ни дефиниции за точка с дадени координати; за окръжност с даден център (точка вече има дефиниция от предното) и радиус; после ни трябва функция, която пресмята разстояние между точки по координатите им; трябва ни функция която проверява, за дадена окръжност, дали разстоянията от всички дадени точки до центъра на окръжността са по-малки или равни на радиуса; накрая ни трябва цикъл, които минава през всички окръжности и прави проверката.

Предложеното решение спира при първата намерена окръжност, която изпълнява условието. Ако се искат всички такива окръжности, трябва да се дефинира масив да записва индексите на окръжностите, които изпълняват условието и накрая да проверява дали този масив е празен или не.

Нямам кирилизатор, затова всички съобщения са на аглийски език. Съобщението коя окръжност удовлетворява условието показва естествен броен индекс (с едно по-голям от програмния индекс). Можете да замените с кооридинатите и радиуса на окръжността ако желаете.
Скрит текст: покажи
Вместо:
Код: Избери целия код
cout << "Circle " << i + 1 << " contains all the points." << endl;

Поставете
Код: Избери целия код
cout << "Circle ((" << circles[i].center.x << "; " << circles[i].center.y << ")," << circles[i].radius << ") contains all the points." << endl;


Проверете кода внимателно, защото от много време не съм ползвал C++ и може несъзнателно да съм вложил C# код някъде.

Скрит текст: покажи
Код: Избери целия код
#include <iostream>
#include <cmath>

using namespace std;

// дефиниция на точка с дадени координати
struct Point {
    double x, y;
};

// дефиниция на кръг с дадена точка за център и зададен радиус
struct Circle {
    Point center;
    double radius;
};

//калкулация на разстояние между две точки
double distance(const Point& p1, const Point& p2) {
    return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}

// проверява дали разстоянието от всяка от дедените точки е по-малко или равно на радиуса на кръга
bool circleContainsAllPoints(const Circle& circle, const Point points[], int m) {
    for (int i = 0; i < m; ++i) {
        double dist = distance(circle.center, points[i]);
        if (dist > circle.radius) {
            return false; // намерена е точка извън окръжността, прекъсва цикъла
        }
    }
    return true; // търсеното условие е изпълнено
}

int main() {
    int k, m;

    // Иска брой окръжности
    cout << "Enter the number of circles (k): ";
    cin >> k;

    // Иска въвеждане на брой точки
    cout << "Enter the number of points (m): ";
    cin >> m;

    // Създава масиви за окръжности и точки
    Circle circles[20];
    Point points[20];

    // Приема данни за окръжности (координати на центът и радиус)
    for (int i = 0; i < k; ++i) {
        cout << "Enter the center (x y) and radius of circle " << i + 1 << ": ";
        cin >> circles[i].center.x >> circles[i].center.y >> circles[i].radius;
    }

    // Приема данни за точки (координати по абсциса и ордината)
    for (int i = 0; i < m; ++i) {
        cout << "Enter the coordinates (x y) of point " << i + 1 << ": ";
        cin >> points[i].x >> points[i].y;
    }

    // Цикъл за проверка
    bool found = false;
    for (int i = 0; i < k; ++i) {
        if (circleContainsAllPoints(circles[i], points, m)) {
            cout << "Circle " << i + 1 << " contains all the points." << endl;
            found = true;
            break;
        }
    }

    if (!found) {
        cout << "No circle contains all the points." << endl;
    }

    return 0;
}
[tex]\color{lightseagreen}\text{''Който никога не е правил грешка, никога не е опитвал нещо ново.''} \\
\hspace{21em}\text{(Алберт Айнщайн)}[/tex]
Аватар
ammornil
Математик
 
Мнения: 3768
Регистриран на: 25 Май 2010, 19:28
Местоположение: Великобритания
Рейтинг: 1780


Назад към C, C++



Кой е на линия

Регистрирани потребители: Google Adsense [Bot], Google [Bot]

Форум за математика(архив)