Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задания по Perl 
:(
    Опции темы
korob2001
Дата 13.3.2004, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Привет, всем!
Вот читаю опять книгу по Perl, при этом пообещал себе на пропускать задания, которые имеются в конце каждой главы. Книга 'Самоучитель Perl', авторы А.Матросов и М.Чаунин.

Я переодически буду задавать вопросы которые, как я считаю можно решить более оптимальным способом, но сам до этих способов пока не дошёл или не совсем дошёл.
Цель: сам обучаюсь оптимизировать код, при этом обучаются и другие, особенно начинающие. Да и просто, для разнообразия, не помешает.

Глава 5, стр. 135, Задание №3:
Напишите программу, которая по заданному числу STEP печатает лесенку из STEP ступеней ( каждая следующая ступень на один символ "-" шире предидущей ).
Пример:
Код

-
 |
  --
    |
     ---
        |
         ----
             |
              -----
                   |
..............................................................

Я написал такой код:
Код

#!/usr/bin/perl -w
use strict;
while ( 1 ) {
  print "Please enter one number forom 1 till 11: ";
  chomp( my $user_num = <STDIN> );
  last if $user_num =~ /^(?:quit|exit)$/i;
  next if $user_num !~ /^\d+$/;
  next if ( ( $user_num < 1 ) || ( $user_num > 11 ) );
  for ( my $x=1, my $y=0; $x <= $user_num; $x++, $y += $x ) {
       print " " x $y, "-" x $x, "\n";
       print " " x ( $x + $y ), "|\n";
  }
print "." x 80, "\n";
}

Если у кого-то есть другие варианты решения данной задачи, пожалуйста предоставьте их. Я например думаю, что её можно также решить с помощью именованных блоков, но пока ещё не пробовал реализовать эту идею. ;)

Заранее спасибо,
Денис

Это сообщение отредактировал(а) korob2001 - 15.3.2004, 14:56


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Secandr
Дата 13.3.2004, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Незнаю будет ли работать, пишу тз головы:
Код
#!/usr/bin/perl -w
use strict;
while ( 1 ) {
 print "Please enter one number forom 1 till 11: ";
 chomp( my $user_num = <STDIN> );
 last if $user_num =~ /^(?:quit|exit)$/i;
 next if $user_num !~ /^\d+$/;
 next if ( ( $user_num < 1 ) || ( $user_num > 11 ) );
 my $probel='';
 my $t_p='';
 my $line='';
 for ( my $x=1; $x <= $user_num; $x++ ) {
   $line.='_';
   $t_p.=' ';
   print $probel.$line;
   $probel.=$t_p;
   print $probel.'|';
   $probel.=' ';
 }
}
Стандартная задача smile.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
korob2001
Дата 14.3.2004, 03:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата
Незнаю будет ли работать, пишу тз головы:

Не работает. :o(

Но если маленько подправить, накример так:
Код

#!/usr/bin/perl -w
use strict;
while ( 1 ) {
print "Please enter one number forom 1 till 11: ";
chomp( my $user_num = <STDIN> );
last if $user_num =~ /^(?:quit|exit)$/i;
next if $user_num !~ /^\d+$/;
next if ( ( $user_num < 1 ) || ( $user_num > 11 ) );
my $probel='';
my $t_p='';
my $line='';
  for ( my $x=1; $x <= $user_num; $x++ ) {
    $line.="_";
    $t_p.=' ';
    print $probel.$line, "\n";   # вставил , "\n"
    $probel.=$t_p;
    print $probel."|\n";         # заменил кавычки и вставил \n
    $probel.=' ';
  }
}

Уже работает. Но это были не ошибки. ;)

Это сообщение отредактировал(а) korob2001 - 14.3.2004, 03:50


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Secandr
Дата 14.3.2004, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



korob2001 Точно, забыл про еревод строки smile.gif Пазор мне smile.gif


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
korob2001
Дата 15.3.2004, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата

korob2001 Точно, забыл про перевод строки.  Позор мне.

Да ладно тебе, не скромничай. Это ведь не ошибки, просто ты не протестировал свой код. Если бы протестировал, я думаю, этих мелких недочётов мы бы не увидели. Не тот ты человек, который допустил бы такие ошибки. smile.gif

А вот решение, о котором я говорил - с использованием именованных блоков:
Код

#!/usr/bin/perl -w
use strict;
BLOCK1: {
    print "Please enter number from 1 to 11: ";
    chomp( my $user_num = <STDIN> );
    last BLOCK1 if $user_num =~ /^(?:exit|quit)$/i;
    redo BLOCK1 if $user_num !~ /^\d+$/;
    redo BLOCK1 if $user_num < 1 or $user_num > 11;
    my $x = 1;
    my $y = 0;
    BLOCK2: {
         last BLOCK2 if $x > $user_num;
         print " " x $y, "-" x $x, "\n";
         print " " x ($x+$y), "|\n";
         $x++;
         $y += $x;
         redo BLOCK2;
    }
 print "." x 80, "\n";
 redo BLOCK1;
}

Ещё, как мне кажется, можно воспользоваться замыканиями. ;)

Это сообщение отредактировал(а) korob2001 - 15.3.2004, 14:47


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
GoodBoy
Дата 15.3.2004, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Главный джедай
****


Профиль
Группа: Модератор
Сообщений: 3886
Регистрация: 8.1.2003
Где: КМВ

Репутация: нет
Всего: 83



А мне всегда вдалбливали, что метки - не есть хорошо!!!!!!!!!! :-))))))))
ВСЕГДА можно обойтись без них... :-)))


--------------------
Чем дальше в лес, тем толще партизаны...

Цитата(igorold @  1.5.2016,  17:40 Найти цитируемый пост)
Индейцы не обратили внимания на поток беженцев из Европы… Теперь они живут в резервациях. 
PM MAIL   Вверх
korob2001
Дата 15.3.2004, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 6
Всего: 61



Цитата

А мне всегда вдалбливали, что метки - не есть хорошо!!!!!!!!!! :-))))))))
ВСЕГДА можно обойтись без них... :-)))

Мне тоже вдалбливали. smile.gif Но меня например интересуют все возможные решения данной задачи, чуть позже я ещё попробую реализовать эту задачу при помощи безусловных переходов goto. А о том, что мне вдалбливали о goto, я вообще молчу. smile.gif

А вот кстати, решение этой задачи с использованием замыканий:
Код

#!/usr/bin/perl -w
use strict;
my $x = 1;
my $y = 0;
my $user_num = 0;
while ( 1 ) {
   print "Please enter one number from 1 till 11: ";
   chomp( $user_num = <STDIN> );
   last if $user_num =~ /^(?:exit|quit)$/i;
   next if $user_num !~ /^\d+$/;
   next if $user_num < 1 or $user_num > 11;
   write_stears($x, $y);
   print "." x 80, "\n";
}

sub write_stears {
   my($x, $y) = @_;
   return if $x > $user_num;
   print " " x $y, "-" x $x, "\n";
   print " " x ($x + $y), "|\n";
   $x++;
   $y += $x;
   write_stears($x, $y);
}





--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Secandr
Дата 15.3.2004, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



korob2001 Единственое что хочу сказать, конструкция
Код
" " x
Будет работать медленее, чем
Код
$t_p.=' ';




--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
ElectricalStorm
Дата 15.3.2004, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 1
Всего: 9



Код

$step = 5;
for ($i = 1, $j =1; $i < $step+1; $i++, $j +=$i+1  )   {
   print "_"x $i,"\n"," "x$j,"|"
}



--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Нюбстер
Дата 6.10.2005, 22:31 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А меня интересует где можна скачать Книга 'Самоучитель Perl', авторы А.Матросов и М.Чаунин.


  Вверх
sharq
Дата 7.10.2005, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



Нюбстер форум Компьютерная документация -> Perl

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1031 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.