Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.10.2012, 14:26   #1
Viload
Новичок
Джуниор
 
Регистрация: 03.10.2012
Сообщений: 2
По умолчанию Длина линии вертикального разреза (Pascal)

Дано задание:
Составить алгоритм и написать код программы, вычисляющей длину линии вертикального разреза фигуры y_razrez, значения площадей фигуры слева и справа от линии разреза s_left, s_right, по значениям аргумента x, введенным с консоли:

Это задание по теме ветвления, даже примерно не знаю с чего начать..
Viload вне форума Ответить с цитированием
Старый 03.10.2012, 14:40   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 18,136
По умолчанию

А где координаты разреза? На глаз отрезать что-ли?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 03.10.2012, 14:47   #3
gaw4
Форумчанин
 
Регистрация: 31.05.2010
Сообщений: 407
По умолчанию

как то так
длина линии разреза = длине дуги круга R=2, проходящей на расстоянии х от центра
радиусы малых кпугов r1=r2=1
для x<=-r1/2 Sл=площади сегмента Sпр=pi*R^2- площади сегмента
для -r1/2<x<=0 ......................
для 0<x<=r1/2 ...................
icq 584 308 611
gaw4 вне форума Ответить с цитированием
Старый 03.10.2012, 14:50   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

...поскольку разрез вертикальный, то достаточно знать одну координату - Х, одна и задается с консоли.

Вам ТС интегральчики вычислять для определения площадей под кривыми. Хотя откуда сами кривые вообще непонятно, одно дело вы их сами задаете, другое - они откуда-то с "потолка".
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 03.10.2012, 18:05   #5
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

raxp, у него (у неё?) фигура образована тремя полуокружностями (радиусами 1, 0.5 и 0.5). Поэтому там и без интегралов можно обойтись. Геометрия 9-го (а, может, и 8-го) класса.

ТС, на Паскаль уж сами переведите. И проверку обработки ошибочных данных хотя бы добавьте...
Код:
#!/usr/bin/python
# -*- coding: cp1251 -*-

from math import asin, pi, sqrt

rLarge = 1.
rSmall = 0.5

def Chord( r, x ):
    return 2. * sqrt( r*r - x*x )

def Segment( r, x ):
    ch2 = Chord( r, x ) / 2.		# половина хорды
    alpha = 2. * asin( ch2 / r )	# центральный угол (rad)
    sSector = (alpha * r * r ) / 2.	# площадь кругового сектора
    sTriangle = x * ch2			# площадь треугольника
    return sSector - sTriangle		# площадь сегмента


def main():
    s1 = pi * rLarge * rLarge / 2.
    s2 = pi * rSmall * rSmall / 2.
    sFull = s1 + s2 - s2		# для наглядности добавляю правый верхний выступ и отнимаю ТАКУЮ ЖЕ левую нижнюю выемку

    print "x0 = ?", ; x0 = input()

    if x0 <= -rLarge:
        y_razrez = 0.
        s_left = 0.
    elif x0 <= -rSmall:
        y_razrez = Chord( rLarge, -x0 )
        s_left = Segment( rLarge, -x0 )
    elif x0 <= 0.:
        y_razrez = Chord( rLarge, -x0 ) - Chord( rSmall, -x0 )
        s_left = Segment( rLarge, -x0 ) - Segment( rSmall, -x0 )
    elif x0 <= rSmall:
        y_razrez = Chord( rSmall, x0 )
        s_left = sFull - Segment( rSmall, x0 )
    else:
        y_razrez = 0.
        s_left = sFull

    s_right = sFull - s_left

    print y_razrez, s_left, s_right

main()

#
Vago вне форума Ответить с цитированием
Старый 04.10.2012, 11:33   #6
Viload
Новичок
Джуниор
 
Регистрация: 03.10.2012
Сообщений: 2
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
raxp, у него (у неё?) фигура образована тремя полуокружностями (радиусами 1, 0.5 и 0.5). Поэтому там и без интегралов можно обойтись. Геометрия 9-го (а, может, и 8-го) класса.

ТС, на Паскаль уж сами переведите. И проверку обработки ошибочных данных хотя бы добавьте...
Код:
#!/usr/bin/python
# -*- coding: cp1251 -*-

from math import asin, pi, sqrt

rLarge = 1.
rSmall = 0.5

def Chord( r, x ):
    return 2. * sqrt( r*r - x*x )

def Segment( r, x ):
    ch2 = Chord( r, x ) / 2.		# половина хорды
    alpha = 2. * asin( ch2 / r )	# центральный угол (rad)
    sSector = (alpha * r * r ) / 2.	# площадь кругового сектора
    sTriangle = x * ch2			# площадь треугольника
    return sSector - sTriangle		# площадь сегмента


def main():
    s1 = pi * rLarge * rLarge / 2.
    s2 = pi * rSmall * rSmall / 2.
    sFull = s1 + s2 - s2		# для наглядности добавляю правый верхний выступ и отнимаю ТАКУЮ ЖЕ левую нижнюю выемку

    print "x0 = ?", ; x0 = input()

    if x0 <= -rLarge:
        y_razrez = 0.
        s_left = 0.
    elif x0 <= -rSmall:
        y_razrez = Chord( rLarge, -x0 )
        s_left = Segment( rLarge, -x0 )
    elif x0 <= 0.:
        y_razrez = Chord( rLarge, -x0 ) - Chord( rSmall, -x0 )
        s_left = Segment( rLarge, -x0 ) - Segment( rSmall, -x0 )
    elif x0 <= rSmall:
        y_razrez = Chord( rSmall, x0 )
        s_left = sFull - Segment( rSmall, x0 )
    else:
        y_razrez = 0.
        s_left = sFull

    s_right = sFull - s_left

    print y_razrez, s_left, s_right

main()

#
Спасибо, но только, что-то я понять ничего не могу, насколько я понял это на питоне написано, а я только-только языки программирования изучать начал..
Viload вне форума Ответить с цитированием
Старый 04.10.2012, 12:19   #7
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Viload Посмотреть сообщение
насколько я понял это на питоне написано
На Питоне. def - заголовок подпрограммы, операторный блок определяется отступами, а не операторными скобками. Всё остальное в этой программке не сильно отличается от Си или Паскаля. Кстати, если сделать ф-ю Chord() чуть более дуракозащищённой
Код:
def Chord( r, x ):
    if x < r:
        return 2. * sqrt( r*r - x*x )
    else:
        return 0.
то можно упростить основное дерево анализа:
Код:
    ...
    print "x0 = ?", ; x0 = input()

    if x0 <= -rSmall:
        y_razrez = Chord( rLarge, -x0 )
        s_left = Segment( rLarge, -x0 )
    elif x0 <= 0.:
        y_razrez = Chord( rLarge, -x0 ) - Chord( rSmall, -x0 )
        s_left = Segment( rLarge, -x0 ) - Segment( rSmall, -x0 )
    else:
        y_razrez = Chord( rSmall, x0 )
        s_left = sFull - Segment( rSmall, x0 )

    s_right = sFull - s_left
    ...
Цитата:
Сообщение от Viload
Спасибо, но только, что-то я понять ничего не могу...
Тогда рисуй блок-схему. Нагляднее ничего другого не придумано пока. Или думай - своим ли делом ты занялся в жизни...
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Длина линии вертикального разреза фигуры fbsd Помощь студентам 4 07.02.2012 21:20
Правка вертикального меню в CSS Artem93 Общие вопросы C/C++ 1 11.06.2011 00:59
Правка вертикального меню в CSS Artem93 Помощь студентам 1 11.06.2011 00:58
Вывод линии данных в режиме VGA/EGA на Pascal Yana_ Помощь студентам 2 07.12.2010 23:58
Помогите сделать алгоритм минимального разреза на графах Алексей Равен Помощь студентам 0 07.05.2009 13:05