Форум программистов, компьютерный форум CyberForum.ru

Структура - C++

Восстановить пароль Регистрация
 
NastiKor
1 / 1 / 0
Регистрация: 05.10.2009
Сообщений: 101
18.01.2010, 17:26     Структура #1
Дан массив из 6 элементов типа структура, содержащих координаты центра окружности и радиус(x,y,r)Надо определить и вывести на печать координаты центра той окружности, которая пересекает максимальное количество заданных окружностей. Использовать функции.
Язык Си(не С++)....помогите, пожалуйста...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.01.2010, 17:26     Структура
Посмотрите здесь:

Си, структура C++
C++ Структура
C++ структура :(
Структура. C++
C++ Структура
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Bloodykeeper
This party getting crazy!
 Аватар для Bloodykeeper
78 / 74 / 1
Регистрация: 22.09.2009
Сообщений: 427
18.01.2010, 17:28     Структура #2
вот. Тут есть для тебя хотя бы начало на Структуру
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
18.01.2010, 19:51     Структура #3
NastiKor, вроде правильно работает, но на всякий случай проверьте получше
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#ifndef min(a, b)
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define max(a, b) (((a) > (b)) ? (a) : (b))
#endif
    
typedef struct {
    double x;
    double y;
    double r;
} Circle_t;
 
Circle_t Circle(void){
    Circle_t circle;
    printf("X: ");
    if ( scanf("%lf", &circle.x) != 1 )
        exit(1);
    printf("Y: ");
    if ( scanf("%lf", &circle.y) != 1 )
        exit(1);
    printf("R: ");
    if ( scanf("%lf", &circle.r) != 1 )
        exit(1);
    return circle;
}
 
/* Возвращает единицу, если окружности перекрываются. Если только касаются друг-друга, 
    или вообще не касаются - вернёт 0 */
int overlapedCircles(const Circle_t *a, const Circle_t *b){
    double kx, ky, distance;
    if ( a->x == b->x ){
        distance = max(a->y, b->y) - min(a->y, b->y);
    }
    else if ( a->y == b->y ){
        distance = max(a->x, b->x) - min(a->x, b->x);
    }
    else {
        kx = max(a->x, b->x) - min(a->x, b->x);
        ky = max(a->y, b->y) - min(a->y, b->y);
        distance = sqrt(kx * kx + ky * ky);
    }
    return ( a->r + b->r > distance );
}
 
void printCircles(const Circle_t *c, const int *ovl, int count){
    printf("X      Y      R      O\n");
    while ( count-- ){
        printf("%-7.1f%-7.1f%-7.1f%d\n", c->x, c->y, c->r, *ovl);
        ++c;
        ++ovl;
    }
}
 
/*
    Дан массив из 6 элементов типа структура, содержащих координаты центра окружности 
    и радиус(x,y,r)Надо определить и вывести на печать координаты центра той окружности, 
    которая пересекает максимальное количество заданных окружностей.
*/
#define CIRCLES 6
int main(void){
    Circle_t circles[CIRCLES];
    int overlaps[CIRCLES] = { 0 }, max_overlaps, i, j;
    
    for ( i = 0; i < CIRCLES; ++i ){
        printf("\nCircle #%d\n", i + 1);
        circles[i] = Circle();
    }
    
    for ( i = 0; i < CIRCLES; ++i ){
        for ( j = 0; j < CIRCLES; ++j ){
            if ( j == i )
                continue;
            if ( overlapedCircles(&circles[i], &circles[j]) )
                overlaps[i]++;
        }
    }
 
    max_overlaps = overlaps[0];
    for ( i = 1; i < CIRCLES; ++i )
        if ( overlaps[i] > max_overlaps )
            max_overlaps = overlaps[i];
 
    printf("\nAll circles:\n");
    printCircles(circles, overlaps, CIRCLES);
    printf("\nCircle(s) with maximum overlaps:\n");
    for ( i = 0; i < CIRCLES; ++i )
        if ( overlaps[i] == max_overlaps )
            printf("%-7.1f%-7.1f%-7.1f%d\n", circles[i].x, circles[i].y, circles[i].r, max_overlaps);
    
    exit(0);
}
NastiKor
1 / 1 / 0
Регистрация: 05.10.2009
Сообщений: 101
19.01.2010, 18:33  [ТС]     Структура #4
easybudda, спасибо! а можете описать принцип решения, отвлеченно от программного кода? я просто и его не очень понимаю...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
20.01.2010, 00:04     Структура #5
NastiKor, две окружности перекрываются, если сумма их радиусов больше, чем расстояние между центрами. Если обе окружности лежат на одной прямой, параллельной одной из осей координат, то расстояние между центрами - разность большей и меньшей координат по этой оси. Если окружности не лежат на прямой ни по оси х, ни по оси у, тогда разность большей и меньшей координаты по х и разность большей и меньшей координаты по у - по сути катеты прямоугольного треугольника. Тогда расстояние между центрами - его гипотенуза, квадрат которой равен сумме квадратов катетов. Ну а дальше всё просто - заводим параллельный массив (int overlaps[CIRCLES] = { 0 }) и для каждого круга считаем количество перекрывающихся с ним кругов:
C
1
2
3
4
5
6
7
8
        for ( i = 0; i < CIRCLES; ++i ){
                for ( j = 0; j < CIRCLES; ++j ){
                        if ( j == i ) /* на перекрываемость с собой самим круг не проверяем ;) */
                                continue;
                        if ( overlapedCircles(&circles[i], &circles[j]) )
                                overlaps[i]++;
                }
        }
Потом в массиве overlaps ищем максимальное значение и выводим все круги у которых оно такое же:
C
1
2
3
4
        printf("\nCircle(s) with maximum overlaps:\n");
        for ( i = 0; i < CIRCLES; ++i )
                if ( overlaps[i] == max_overlaps )
                        printf(...
Да и всё, собственно.
Yandex
Объявления
20.01.2010, 00:04     Структура
Ответ Создать тему
Опции темы

Текущее время: 00:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru