-Поиск по дневнику

Поиск сообщений в Linux_Loader

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 20.04.2008
Записей: 743
Комментариев: 2542
Написано: 7716


Программа

Вторник, 09 Января 2018 г. 01:50 + в цитатник

Вот такое понаписал. Добавить нечего, кроме Qt-морды. Но это потом, когда комп будет.

#-*-coding:utf8;-*-
# ver. 2.31
# Программа рассчитывает скорость или время свободного падения из пользовательского ввода. Автоматически корректирует введенные данные. Например убирает лишние точки, заменяет запятые точками. Если ввод содержит некорректные символы (буквы и пунктуацию), выдаёт ошибку и предлагает повторить ввод.

# Как  и все мои программы работает ТОЛЬКО в оффлайне, потому что содержит  символы кириллицей.

import math

def finput ():
    g = 9.8
    a = input("Введите высоту падения в метрах \nили Enter, если хотите вычислить \nскорость по времени: \n> ")
    a = zap2point(a)
    if len(a) > 0:
        h = number_test(a)
        if h == "error":
            finput  ()
        else:
            h = float (h)
            u = math.sqrt(2*g*h)
            t = u / g
            u2 = u * 3.6
            print ("Конечная скорость падения: \n{} м/с \n{} км/ч \n{} м за {} сек.".format (fr(u), fr(u2), fr(h), fr(t)))
    else:
        a = input("Введите время падения в секундах: \n> ")
        a = zap2point(a)
        t = number_test(a)
        if t == "error":
            finput ()
        else:
            t = float (t)
            u = g * t
            h = (u * t) / 2
            u2 = u * 3.6
            print ("Конечная скорость падения: \n{} м/с \n{} км/ч \n{} м за {} сек.".format (fr(u), fr(u2), fr(h), fr(t)))

def number_test (a):
    b = ""
    # Если  число точек в строке больше 1
    # запоминаем  индекс первой точки.
    if a.count (".") > 1:
        pindex = a.index(".")
    else:
        pindex = len (a) + 2
    if len(a) == 0:
        b = "error"
        return b
    else:
    # Перебираем  все символы строки
    # Если символ число или точка, продолжаем
    # Если символ точка  и  его индекс  больше
    # индекса первой точки, пропускаем его
    # Если символ не число и не точка -
    # обрываем цикл
        for char in  a:
            if char in ("1234567890."):
                if char == "." and len (b) > pindex:
                    continue
                b += char
            else:
                print ("***********************\nОшибка! Введите целое или \nвещественное число, \nнапример 34 или 45.6\n***********************")
                b = "error"
                break
    if b == ".":
        print ("***********************\nОшибка! Введите целое или \nвещественное число, \nнапример 34 или 45.6\n***********************")
        b = "error"
    return b

# Так как питон иногда отображает
# натуральные числа некрасиво, например
# 3.2999999999 вместо 3.3, я написал
# функцию,которая более и менее корректно
# окугляет число перед выводом на экран.

def fr (x):
    if x >= 10000:
        x = int(math.modf(x)[1])
    elif x >= 999:
        x = "{:.5}".format(x)
    elif  x <= 0.0001:
        x = "{:.10}".format(x)
    elif x >= 99.9:
        x = "{:.4}".format(x)
    else:
        x = "{:.3}".format(x)
    return x

# Так как часто  при вводе числа хочется
# вместо точки поставить запятую, эта
# функция заменяет все запятые точками
# и удаляет пробелы
# чтобы избежать ошибок при вычислении

def zap2point (h):
    y = ""
    for char in h:
        if char == ",":
            char = "."
        elif char == " ":
            continue
        y += char
    return y
   
# собственно, запускаем программу
finput()

Рубрики:  кодинг

_DOOMer_   обратиться по имени Вторник, 09 Января 2018 г. 16:04 (ссылка)
Детально код не разбирал, но за пару моментов зацепился взгляд.

x = int(math.modf(x)[1])

А чем стандартный round(округляемое_значение, [число_знаков_после_запятой]) не угодил?

def zap2point (h)

Вполне можно было бы обойтись без цикла, применив функцию замены подстроки в строке:

y = h.replace(",", ".").replace(" ", "")
Ответить С цитатой В цитатник
Linux_Loader   обратиться по имени Пятница, 12 Января 2018 г. 00:11 (ссылка)

Ответ на комментарий _DOOMer_

Да, есть различные методы обрезать дробную часть, но во-первых, round делает это не во всех интерпреторах правильно. А во-вторых, я хотел попробовать вши, которыми ещё не пользовался. Мне кажется math.modf довольно простой и надёжный.

Пример работы round:
round (3.33333,2)
>> 3.3300000000000001

А насчёт replace, я ещё только начинаю учить питон, для меня подобные строки - китайский язык))).

Это я для практики писал всякую всячину простейшую. Потом по мере изучения языка совершенствовал их. За эту взялся серьёзнее всего. Тут больше всего простора для творчества было).
Ответить С цитатой В цитатник
Аноним   обратиться по имени Воскресенье, 04 Марта 2018 г. 09:38 (ссылка)
+
Ответить С цитатой В цитатник
Аноним   обратиться по имени Вторник, 03 Июля 2018 г. 18:57 (ссылка)
+
Ответить С цитатой В цитатник
Комментировать К дневнику Страницы: [1] [Новые]
 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку