Важная информация
Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 11

Тема: Пересечение прямоугольников!

  1. #1 Пересечение прямоугольников! 
    Новичок
    Регистрация
    17.02.2011
    Сообщений
    17
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Даны два прямоугольника, стороны которых параллельны. Известны координаты левого нижнего угла каждого из них и длины их сторон.
    а) Определить, принадлежат ли все точки одного прямоугольника второму.
    б) Определить, пересекаются ли эти прямоугольники.

    Код :
    CLS
    PRINT TAB(20); "Программа определяет пересекаются ли 2 прямоугольника а"
    PRINT TAB(20); "также принадлежность всех точек одного прямоугольника"
    PRINT TAB(20); "к другому,при заданных координат нижнего левого угла,"
    PRINT TAB(20); "сторон, каждого из них"
    PRINT
    PRINT "Координаты и размеры сторон первого прямоугольника"
    INPUT "Абцисса нижнего угла: ", x1
    INPUT "Ордината нижнего угла: ", y1
    1 : INPUT "Высота: ", a1
        IF a1 = 0 OR a1 < 0 THEN
        PRINT "Высота в прямоугольнике всегда должна быть больше 0"
        GOTO 1
        END IF
    2 : INPUT "Длинна: ", b1
        IF b1 = 0 OR b1 < 0 THEN
        PRINT "Длинна в прямоугольнике всегда должна быть больше 0"
        GOTO 2
        END IF
        PRINT
    PRINT "Координаты и размеры сторон второго прямоугольника"
    INPUT "Абцисса нижнего угла: ", x11
    INPUT "Ордината нижнего угла: ", y11
    3 : INPUT "Высота: ", a11
        IF a11 = 0 OR a11 < 0 THEN
        PRINT "Высота в прямоугольнике всегда должна быть больше 0"
        GOTO 3
        END IF
    4 : INPUT "Длинна: ", b11
        IF b11 = 0 OR b11 < 0 THEN
        PRINT "Длинна в прямоугольнике всегда должна быть больше 0"
        GOTO 4
        END IF
    'Находим координаты центра для первого прямоугольника
    x2 = x1 + b1
    x4 = x1
    x3 = x2
    y3 = y1 + a1
    y2 = y1
    y4 = y3
    xctr1 = (x1 + x2 + x3 + x4) / 4
    yctr1 = (y1 + y2 + y3 + y4) / 4
     
    'Находим координаты центра для второго прямоугольника
    x22 = x11 + b11
    x44 = x11
    x33 = x22
    y33 = y11 + a11
    y22 = y11
    y44 = y33
    xctr2 = (x11 + x22 + x33 + x44) / 4
    yctr2 = (y11 + y22 + y33 + y44) / 4
     ' Определение
    IF ABS(xctr1 - xctr2) <= (b1 + b11) / 2 AND ABS(yctr1 - yctr2) <= (a1 + a11) / 2 THEN
    PRINT "Прямоугольники пересекаются"
    END IF
    else
    PRINT "Прямоугольники не пересекаются"
    END IF
    IF x1 = x11 AND y1 = y11 AND a1 = a11 AND b1 = b11 THEN
    PRINT "Прямоугольники совпадают"
    ELSE
    IF x11 <= x1 AND y11 >= y1 AND a11 >= a1 AND b11 >= b1 THEN
    PRINT "1-ый прямоугольник принадлежит 2-ому"
    ELSE
    IF x1 <= x11 AND y1 >= y11 AND a1 >= a11 AND b1 >= b11 THEN
    PRINT "2-ой прямоугольник принадлежит 1-ому"
    END IF
    END IF
    END IF
    END

    Помогите исправить алгоритм....
    Ответить с цитированием  
     

  2. #2  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Вот, программа работает
    Код qbasic:
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ](20); "Программа определяет пересекаются ли 2 прямоугольника а"
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ](20); "также принадлежность всех точек одного прямоугольника"
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ](20); "к другому,при заданных координат нижнего левого угла,"
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ](20); "сторон, каждого из них"
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Координаты и размеры сторон первого прямоугольника"
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Абцисса нижнего угла: ", x1
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Ордината нижнего угла: ", y1
    1 : [Ссылки могут видеть только зарегистрированные пользователи. ] "Высота: ", a1
        IF a1 = 0 [Ссылки могут видеть только зарегистрированные пользователи. ] a1 < 0 THEN
            [Ссылки могут видеть только зарегистрированные пользователи. ] "Высота в прямоугольнике всегда должна быть больше 0"
            GOTO 1
        [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    2 : [Ссылки могут видеть только зарегистрированные пользователи. ] "Длина: ", b1
        IF b1 = 0 [Ссылки могут видеть только зарегистрированные пользователи. ] b1 < 0 THEN
            [Ссылки могут видеть только зарегистрированные пользователи. ] "Длинна в прямоугольнике всегда должна быть больше 0"
            GOTO 2
        [Ссылки могут видеть только зарегистрированные пользователи. ] IF
       
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Координаты и размеры сторон второго прямоугольника"
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Абцисса нижнего угла: ", x11
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Ордината нижнего угла: ", y11
    
    3 : [Ссылки могут видеть только зарегистрированные пользователи. ] "Высота: ", a11
        IF a11 = 0 [Ссылки могут видеть только зарегистрированные пользователи. ] a11 < 0 THEN
            [Ссылки могут видеть только зарегистрированные пользователи. ] "Высота в прямоугольнике всегда должна быть больше 0"
            GOTO 3
        [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    4 : [Ссылки могут видеть только зарегистрированные пользователи. ] "Длинна: ", b11
        IF b11 = 0 [Ссылки могут видеть только зарегистрированные пользователи. ] b11 < 0 THEN
            [Ссылки могут видеть только зарегистрированные пользователи. ] "Длинна в прямоугольнике всегда должна быть больше 0"
            GOTO 4
        [Ссылки могут видеть только зарегистрированные пользователи. ] IF
     
    'Находим координаты центра для первого прямоугольника
    x2 = x1 + b1
    x4 = x1
    x3 = x2
    y3 = y1 + a1
    y2 = y1
    y4 = y3
    xctr1 = (x1 + x2 + x3 + x4) / 4
    yctr1 = (y1 + y2 + y3 + y4) / 4
     
    'Находим координаты центра для второго прямоугольника
    x22 = x11 + b11
    x44 = x11
    x33 = x22
    y33 = y11 + a11
    y22 = y11
    y44 = y33
    xctr2 = (x11 + x22 + x33 + x44) / 4
    yctr2 = (y11 + y22 + y33 + y44) / 4
     ' Определение
    IF [Ссылки могут видеть только зарегистрированные пользователи. ](xctr1 - xctr2) <= (b1 + b11) / 2 [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ](yctr1 - yctr2) <= (a1 + a11) / 2 THEN
        [Ссылки могут видеть только зарегистрированные пользователи. ] "Прямоугольники пересекаются"
    ELSE
        [Ссылки могут видеть только зарегистрированные пользователи. ] "Прямоугольники не пересекаются"
    [Ссылки могут видеть только зарегистрированные пользователи. ] IF
     
    IF x1 = x11 [Ссылки могут видеть только зарегистрированные пользователи. ] y1 = y11 [Ссылки могут видеть только зарегистрированные пользователи. ] a1 = a11 [Ссылки могут видеть только зарегистрированные пользователи. ] b1 = b11 THEN
        [Ссылки могут видеть только зарегистрированные пользователи. ] "Прямоугольники совпадают"
    ELSEIF x11 <= x1 [Ссылки могут видеть только зарегистрированные пользователи. ] y11 >= y1 [Ссылки могут видеть только зарегистрированные пользователи. ] a11 >= a1 [Ссылки могут видеть только зарегистрированные пользователи. ] b11 >= b1 THEN
        [Ссылки могут видеть только зарегистрированные пользователи. ] "1-ый прямоугольник принадлежит 2-ому"
    ELSEIF x1 <= x11 [Ссылки могут видеть только зарегистрированные пользователи. ] y1 >= y11 [Ссылки могут видеть только зарегистрированные пользователи. ] a1 >= a11 [Ссылки могут видеть только зарегистрированные пользователи. ] b1 >= b11 THEN
        [Ссылки могут видеть только зарегистрированные пользователи. ] "2-ой прямоугольник принадлежит 1-ому"
    [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Дружба-магия-радость!
    Ответить с цитированием  
     

  3. #3 Стиль програмирования! 
    Профи Аватар для Dimon012
    Регистрация
    09.02.2011
    Адрес
    Владивосток
    Сообщений
    850
    Сказал(а) спасибо
    29
    Поблагодарили 130 раз(а) в 108 сообщениях
    Записей в блоге
    3
    Я прекрасно понимаю, что большая часть этих программ пишется с целью сдать и забыть, но все же думаю надо продвигать в массы хороший стиль програмирования, вот например в данной программе:
    Ну почему для первого прямоугольника переменные называются x1, b1, х2, х3, x4, y1, y3, y2, y4, а для второго x11, x22, x33, x44, y11, y22, y33, y44, разве сложно написать для первого х11,х12...y14, а для второго х21,х22...y24.
    Далее переходы GOTO, на метку при вводе и проверке данных, лучше вообще заменить на что то вроде:
    Код :
    DO
      PRINT "Высота в прямоугольнике должна быть больше 0"
      INPUT "Высота:", a1
    LOOP WHILE a1 = 0 OR a1 < 0
    Ведь даже если лень, то в данной конструкции на одну строчку меньше чем в исходной.
    И наконец, операторы внутри цикла желательно сдвигать на несколько пробелов вправо.
    Это все вроде мелочи, а читабельность программ вырастает на порядки!
    Последний раз редактировалось Dimon012; 18.02.2011 в 06:59.
    Ответить с цитированием  
     

  4. #4  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Фишка в том, что если человек воспользовался Goto, а также криво назвал переменные, это скорее всего свидетельствует о том, что программу пытался решить он сам - а это весьма похвально, каким бы плохим не был стиль программирования. Поэтому, когда я вижу криво написанную кем либо программу и просьбу помочь, меня радует хотя бы то, что люди хоть как то попытались решить проблему самостоятельно.
    В любом случае, хороший стиль программирования продвигать то надо . Но заставить новичков придерживаться каких либо правил - это значит еще больше осложнить процесс обучения. Поэтому имхо, это должно придти со временем, и не быть навязываемым
    Дружба-магия-радость!
    Ответить с цитированием  
     

  5. #5  
    Новичок
    Регистрация
    17.02.2011
    Сообщений
    17
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Спасибо за помощь и замечания! Буду стараться менять стиль написания.
    Ответить с цитированием  
     

  6. #6  
    Новичок
    Регистрация
    17.02.2011
    Сообщений
    17
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Неправильно работает код программы

    Код :
    ' Определение
    IF ABS(xctr1 - xctr2) <= (b1 + b11) / 2 AND ABS(yctr1 - yctr2) <= (a1 + a11) / 2 THEN
        PRINT "Прямоугольники пересекаются"
    ELSE
        PRINT "Прямоугольники не пересекаются"
    END IF
     
    IF x1 = x11 AND y1 = y11 AND a1 = a11 AND b1 = b11 THEN
        PRINT "Прямоугольники совпадают"
    ELSEIF x11 <= x1 AND y11 >= y1 AND a11 >= a1 AND b11 >= b1 THEN
        PRINT "1-ый прямоугольник принадлежит 2-ому"
    ELSEIF x1 <= x11 AND y1 >= y11 AND a1 >= a11 AND b1 >= b11 THEN
        PRINT "2-ой прямоугольник принадлежит 1-ому"
    END IF
    END

    Если же 1 прямоугольник находиться внутри 2-го, то они не пересекаются,но 1 принадлежит 2-ому.

    Может есть упрощенный вариант поиска пересечения???
    Ответить с цитированием  
     

  7. #7  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Внимательно проверьте исправленную мной программу на правильность работы. У меня с математикой жуткий напряг, в виде трояка в аттестате, поэтому такие термины как принадлежность и пересечение я понимаю смутно и интуитивно. Повводите в программу разные данные, и проверьте правильно ли она выдает ответы. Также программа для наглядности строит 2 прямоугольника на экране (при этом вместо русских букв могут отображаться козюбрики на экране, если вы не пользуетесь отдельным русификатором вроде keyrus). Если это не нужно, просто измените Screen 12 на CLS, и уберите две команды Line

    Код qbasic:
    [Ссылки могут видеть только зарегистрированные пользователи. ] 12 'CLS
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ](20); "Программа определяет пересекаются ли 2 прямоугольника а"
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ](20); "также принадлежность всех точек одного прямоугольника"
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ](20); "к другому,при заданных координат нижнего левого угла,"
    [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ](20); "сторон, каждого из них"
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Координаты и размеры сторон первого прямоугольника"
    [Ссылки могут видеть только зарегистрированные пользователи. ] X1, Y1, H1, L1, X2, Y2, H2, L2 [Ссылки могут видеть только зарегистрированные пользователи. ] [Ссылки могут видеть только зарегистрированные пользователи. ]
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Абцисса нижнего угла: ", X1
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Ордината нижнего угла: ", Y1
    1 :
        [Ссылки могут видеть только зарегистрированные пользователи. ] "Высота: ", H1
        IF H1 <= 0 THEN
            [Ссылки могут видеть только зарегистрированные пользователи. ] "Высота в прямоугольнике всегда должна быть больше 0"
            GOTO 1
        [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    2 : [Ссылки могут видеть только зарегистрированные пользователи. ] "Длина: ", L1
        IF L1 <= 0 THEN
            [Ссылки могут видеть только зарегистрированные пользователи. ] "Длина в прямоугольнике всегда должна быть больше 0"
            GOTO 2
        [Ссылки могут видеть только зарегистрированные пользователи. ] IF
       
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Координаты и размеры сторон второго прямоугольника"
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Абцисса нижнего угла: ", X2
    [Ссылки могут видеть только зарегистрированные пользователи. ] "Ордината нижнего угла: ", Y2
    
    3 : [Ссылки могут видеть только зарегистрированные пользователи. ] "Высота: ", H2
        IF H2 <= 0 THEN
            [Ссылки могут видеть только зарегистрированные пользователи. ] "Высота в прямоугольнике всегда должна быть больше 0"
            GOTO 3
        [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    4 : [Ссылки могут видеть только зарегистрированные пользователи. ] "Длина: ", L2
        IF L2 < 0 THEN
            [Ссылки могут видеть только зарегистрированные пользователи. ] "Длина в прямоугольнике всегда должна быть больше 0"
            GOTO 4
        [Ссылки могут видеть только зарегистрированные пользователи. ] IF
     
    [Ссылки могут видеть только зарегистрированные пользователи. ] (X1, Y1)-(X1 + L1, Y1 + H1), 4, BF  'После замены Screen 12 на CLS можно убрать
    [Ссылки могут видеть только зарегистрированные пользователи. ] (X2, Y2)-(X2 + L2, Y2 + H2), 1, BF  'Это тоже
     
    ' Определение
    IF (X1 < X2 [Ссылки могут видеть только зарегистрированные пользователи. ] X1 + L1 <= X2 + L2) [Ссылки могут видеть только зарегистрированные пользователи. ] (Y1 < Y2) [Ссылки могут видеть только зарегистрированные пользователи. ] (Y1 + H1 <= Y2 + H2) THEN
        [Ссылки могут видеть только зарегистрированные пользователи. ] "Прямоугольники пересекаются"
    ELSE
        [Ссылки могут видеть только зарегистрированные пользователи. ] "Прямоугольники не пересекаются"
    [Ссылки могут видеть только зарегистрированные пользователи. ] IF
     
    IF X1 = X2 [Ссылки могут видеть только зарегистрированные пользователи. ] Y1 = Y2 [Ссылки могут видеть только зарегистрированные пользователи. ] H1 = H2 [Ссылки могут видеть только зарегистрированные пользователи. ] L1 = L2 THEN
        [Ссылки могут видеть только зарегистрированные пользователи. ] "Прямоугольники совпадают"
    ELSEIF X1 >= X2 [Ссылки могут видеть только зарегистрированные пользователи. ] X1 + L1 <= X2 + L2 [Ссылки могут видеть только зарегистрированные пользователи. ] Y1 >= Y2 [Ссылки могут видеть только зарегистрированные пользователи. ] Y1 + H1 <= Y2 + H2 THEN
        [Ссылки могут видеть только зарегистрированные пользователи. ] "1-ый прямоугольник принадлежит 2-ому"
    ELSEIF X2 >= X1 [Ссылки могут видеть только зарегистрированные пользователи. ] X2 + L2 <= X1 + L1 [Ссылки могут видеть только зарегистрированные пользователи. ] Y2 >= Y1 [Ссылки могут видеть только зарегистрированные пользователи. ] Y2 + H2 <= Y1 + H1 THEN
        [Ссылки могут видеть только зарегистрированные пользователи. ] "2-ой прямоугольник принадлежит 1-ому"
    [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    [Ссылки могут видеть только зарегистрированные пользователи. ]
    Дружба-магия-радость!
    Ответить с цитированием  
     

  8. #8  
    Новичок
    Регистрация
    17.02.2011
    Сообщений
    17
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Огромное спасибо за помощЬ!!! Сейчас погонял немного, пашет!
    Ответить с цитированием  
     

  9. #9  
    Новичок
    Регистрация
    17.02.2011
    Сообщений
    17
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях
    Извините, ошибся программа работает не правильно. Правильно определяет когда прямоугольники совпадают или один принадлежит другому, а вот когда они не пересекаются пишет что пересекаюся.
    Я уже даже и незнаю, как найти рациональное решение. Ужас...
    Ответить с цитированием  
     

  10. #10  
    Гуру Аватар для Абадябер
    Регистрация
    09.12.2010
    Адрес
    Беларусь, Минск
    Сообщений
    1,219
    Сказал(а) спасибо
    302
    Поблагодарили 176 раз(а) в 144 сообщениях
    Записей в блоге
    5
    Прощу прощения за такую оплошность. Видать я плохо провярял ту программу.
    Замените все определение. Затем проверьте программу на правильность. В этот раз я сам проверил все возможные случаи пересечения\недопересечения\непересечения. Вроде работает. Тем не менее, основательно ее проверьте.
    Код qbasic:
    ' Определение
    IF ((X1 + L1 < X2) [Ссылки могут видеть только зарегистрированные пользователи. ] (X1 > X2 + L2)) [Ссылки могут видеть только зарегистрированные пользователи. ] ((Y1 + H1 < Y2) [Ссылки могут видеть только зарегистрированные пользователи. ] (Y1 > Y2 + H2)) THEN
        [Ссылки могут видеть только зарегистрированные пользователи. ] "Прямоугольники не пересекаются"
    ELSE
        [Ссылки могут видеть только зарегистрированные пользователи. ] "Прямоугольники пересекаются"
    [Ссылки могут видеть только зарегистрированные пользователи. ] IF
    Дружба-магия-радость!
    Ответить с цитированием  
     

Страница 1 из 2 12 ПоследняяПоследняя
Информация о теме
Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права
  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •