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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.02.2022, 03:43   #1
corpselles
 
Регистрация: 09.02.2022
Сообщений: 7
По умолчанию Задача "Секретные материалы"

Задача:

Ваша программа работает с архивом документов. Каждый документ состоит из списка строк, представляющих собой страницы текста.
Ваша задача — написать функцию print_document(pages), которая будет просто распечатывать переданный документ страница за страницей. Иногда в документе попадаются секретные страницы. Они всегда идут в конце, а первая страница секретной части начинается словом «Секретно». Секретную часть печатать не нужно, надо остановиться на последней незасекреченной странице.
В случае, когда секретных страниц не было, выведите в конце: «Напечатано без купюр». Если секретные страницы были, выведите «Дальнейшие материалы засекречены».

Пример 1
Ввод Вывод
print_document(["Обычная страница", "И еще страница", "Секретно Вот этот вот текст не показывать", "Никому", "Никогда"])

Обычная страница
И еще страница
Дальнейшие материалы засекречены

Пример 2
Ввод Вывод
print_document(["Пустой трёп", "который", "никому не интересен"])

Пустой трёп
который
никому не интересен
Напечатано без купюр


Это была сама задача, а теперь мой код:
Код:
def print_document(pages):
    pub = list()
    count = 0
    while count < len(pages):
        for s in pages:
            if 'Секретно' not in s:
                pub.append(s)
                count += 1
            else:
                pub.append('Дальнейшие материалы засекречены')
                break
    if 'Дальнейшие материалы засекречены' not in pub:
        pub.append('Напечатано без купюр')
    return pub
Ошибка при вводе запроса из первого примера - моя программа просто выводит пустую строку! Нужна помощь! Заранее благодарен!
corpselles вне форума Ответить с цитированием
Старый 10.02.2022, 05:34   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

По условию сказано распечатать, а вы возвращаете список строк-страниц, поэтому на экране и пустота.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.02.2022, 14:50   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

У вас есть список строк - pages
Строки списка можно получить в цикле.
Функция печатает допустимые строки и прекращает печать, если находит "волшебное" слово.
Причину прекращения печать функция может вернуть в виде логического значения. Пусть это будет переменная flag. Тогда:
Код:
flag = false
for s in pages:
    print(s)
Перед тем, как печатать строку надо проверить её содержимое:
Код:
if s.find('Секретно') >= 0:
    flag = True
    break
else:
    <можно печатать>
После завершения цикла можно вернуть значение флага
Код:
return flag
и допечатать причину завершения вывода. Это будет выглядеть примерно так:
Код:
if print_document(s1):
    print('Дальнейшие материалы засекречены')
else:
    print('Напечатано без купюр')
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 10.02.2022, 22:12   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Эх, надеялся, что ТС сначала попробует свой код исправить, ну да ладно. Мой вариант, как к обычной печати:
Код:
for page in pages:
    print(page)
Добавить условия:
Код:
for page in pages:
    if page.startswith('Секретно'):
        print('Дальнейшие материалы засекречены')
        break
    print(page)
else:
    print('Напечатано без купюр')
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.02.2022, 22:43   #5
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

BDA
Цитата:
Эх, надеялся, что ТС сначала попробует свой код исправить, ну да ладно.
Да заторможенные ребята.
И даже если решит, то не выложит. Что у ТС со скобками получилось? Да и с алгоритмом проблема

Не нашёл я этот метод: startswith().
К тому же подумал за расширенный вариант, когда волшебное слово в середине строки (по условию оно конечно в начале, но ...)
Это другая версия.
Код:
def print_document(page):
    flag = False                  # 'Секрет' ещё не найден
    while not flag and len(page): # Секрет не найден и есть что печатать
        s = page.pop(0)           # Извлекаем первую строку из списка
                                  # При этом список модифицируется (извлекаемая строка удаляется) 
        n = s.find('Секретно')    # В строке есть слово 'Секрет'?
        if n >= 0:                # Да! Полагаем, что оно не первое слово строки
            s = s[:n]             # Всё что до 'Секрет'
            flag = True           # 'Секрет' найден
        print(s)                  # Печать строки
    return flag

s1 = ["Обычная страница", "И еще страница", "Дорогой друг Секретно Вот этот вот текст не показывать", "Никому", "Никогда"]
s2 = ["Пустой трёп", "который", "никому не интересен"]

if print_document(s2):
    print('Дальнейшие материалы засекречены')
else:
    print('Напечатано без купюр')
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 11.02.2022, 00:15   #6
corpselles
 
Регистрация: 09.02.2022
Сообщений: 7
По умолчанию

У меня еще возник следующий вопрос: почему код является недостижимым(unreachable) после цикла while True?
Он выделяется желтой полосой в пайчарме, а именно последняя строчка с условием через if

Код:
def print_document(pages):
    k = 0
    while True:
        for page in pages:
            if 'Секретно' not in page[:8]:
                print(page)
            else:
                k += 1
                break
    if k == 0:
И еще, что значит аббревиатура ТС?)

Последний раз редактировалось corpselles; 11.02.2022 в 00:20.
corpselles вне форума Ответить с цитированием
Старый 11.02.2022, 00:21   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Код:
if k == 0:
    <тут_что-то_должно_быть>
Условный оператор предполагает наличие условия и кода, который должен выполниться, если условие Истина.
У вас тут ничего нет.

Цитата:
ТС - (от англ. аббревиатуры TS - "Topic Starter" - создавший тему). Другими словами ТС - это тот кто создал тему, автор первого сообщения в ветке. Также "ТС" иногда расшифровывают как Тема Создатель.

Тут нашёл ещё несколько терминов:
https://tunnel.ru/post-chto-znachit-...niya-na-forume
Как-то так, ...

Последний раз редактировалось ViktorR; 11.02.2022 в 00:30.
ViktorR вне форума Ответить с цитированием
Старый 11.02.2022, 00:59   #8
corpselles
 
Регистрация: 09.02.2022
Сообщений: 7
Вопрос

Там даже не в теле цикла ошибка, а просто код ниже условия не читаем программой

А в самой ошибке пишет "This cod is unreachable"
Изображения
Тип файла: jpg изображение_2022-02-11_005840.jpg (39.8 Кб, 7 просмотров)
corpselles вне форума Ответить с цитированием
Старый 11.02.2022, 01:28   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Не нашёл я этот метод: startswith().
str.startswith.
Цитата:
Сообщение от ViktorR Посмотреть сообщение
подумал за расширенный вариант, когда волшебное слово в середине строки
Ну да, я опирался именно на вариант из условия. А вдруг текст будет "Совершенно Не Секретно"?
Цитата:
Сообщение от corpselles Посмотреть сообщение
А в самой ошибке пишет "This cod is unreachable"
Потому что он недостижим. Вы внутри цикла использовали return, который вернет значение k из функции (при этом происходит выход из всей функции, а не только из цикла).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 13.02.2022, 01:30   #10
corpselles
 
Регистрация: 09.02.2022
Сообщений: 7
По умолчанию

Всее, я видоизменил чутка свой код, но получил нужное решение задачи. Все-таки сделал через список, как по мне, так проще)

Но вот мне кажется, что тут здесь где-то есть излишество в переменных k и count, то есть это я к тому, что одну из них можно как-нибудь сократить и переделать задачу

Код:
def print_document(pages):
    k = 0
    pub = list()
    count = 0
    while count < len(pages):
        for page in pages:
            if 'Секретно' not in page:
                count += 1
                if k == 0:
                    pub.append(page)
            else:
                count += 1
                k += 1
    if k == 0:
        pub.append('Напечатано без купюр')
    else:
        pub.append('Дальнейшие материалы засекречены')
    for s in pub:
        print(s)
corpselles вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Для заданной строки определить все входящие в неё символ. Например: строка "abccbbabbac" состоит из символов "a", "b" и "c" Sandakan01 Помощь студентам 1 24.02.2016 03:20