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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна помощь --- array 
:(
    Опции темы
junior
  Дата 23.1.2005, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет!
Помогите, пожалуйста, исправить ошибки в программе.
Программа должна делать следующее:
1. Инициализировать массив с 3 названиями фильмов.
2. Показывать список массива юзеру.
3. Спрашивать юзера индекс фильма (movie array index), который нужно удалить. Если invalid input, то просить повторить ввод с правильным значением. Если valid input, значит удалить фильм.
4. Спрашивать юзера ввести новые названия в список ( одно название в строке), предупредив юзера разделять каждое название нажатием enter.
5. Спрашивать юзера хочет ли он получить список в reverse order.
6. Если да, output in reverse order. Если нет - forward.

Вот что у меня получилось. (смотрите ниже)
Пункт 3 работает, если можно так выразится, однобоко. Т.е. переходит на 4 пункт только при введенной 1. smile Надо бы поставить вывод после него всего массива опять, что бы убедиться, что в пункте 3 что-то все таки удаляется.
Далее, при "успешно" введенной 1 в пункте 3, начинаю вводить новые значения. На винде, почему-то, не работает cntr+z, на freeBSD cntr+d позволяет остановить ввод новых значений. Можно как-то по-другому решить эту проблему? smile В общем список в финале (пункты 5 и 6) содержит только (!!!) значения, введенные в пункте 4. То, что было задано в начале, отсутствует.
Что-то у меня написано с ошибками.
Помогите разобраться, пожалуйста!
Спасибо!

Код
#!/usr/bin/perl -w
# array.pl
# A program initializes an @movies array
# with three movie titles.

use strict;
use warnings;

my @movies = ('Snatch', 'Zatoichi', 'Hero');
my $index;

# Display titles for the user in alphabetic order
{
@movies=sort @movies;
print "$_: $movies[$_]\n" foreach (0..$#movies);
};

# Ask the user for index of the movie
# to delete from array
while(1){
  print "Please enter the index of the movie you want to delete: ";
  $index = <STDIN>;
  chomp $index;
  last if($index !~ /\D/ && $index > 0 && $index < $#movies);
  # test, whether $index is an integer and within the index range
};

# Delete movies from array
{
delete $movies[$index];
};

# prompt for use input
print "Please enter movies you want to add to the list, one per line\n",
"Use cntrl/Z to termnate the input: \n";
# Ask the user to input a movie titles, one per line
# read everything from stdin
@movies = <STDIN>;
# chop off newlines using the array chop operator (chops each line)
chop(@movies);

# Ask the user which sort order to use
print "To print the movie list in reverse order, press Y";
if (<STDIN> =~ /^y/i) { # does the input begin with a y
 # Display movies in the array in reverse order
 sort {$b cmp $a} (@movies);
 print "$_: $movies[$_]\n" foreach (0..$#movies);
} else                      {
 # Display movies in the array in alphabetic order
                   @movies=sort @movies;
                  print "$_: $movies[$_]\n" foreach (0..$#movies);
                   };

PM MAIL ICQ   Вверх
korob2001
Дата 23.1.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот рабочий пример:
Код

#!/usr/bin/perl -w
# array.pl

use strict;
use warnings;

my @movies = ('Snatch', 'Zatoichi', 'Hero');
my $index;

{
@movies=sort @movies;
print "$_: $movies[$_]\n" for (0..$#movies);
};

while(1){
 print "Please enter the index of the movie you want to delete: ";
 chomp($index = <STDIN>);
 last if($index =~ /^\d+$/ && $index > 0 && $index <= $#movies);
};

{
splice(@movies, $index, 1);# $movies[$index];
};
print join("\n", @movies), "\n";
print "Please enter movies you want to add to the list, one per line\n",
"Use cntrl/Z to termnate the input: \n";
chomp(my $check = <STDIN>);
push(@movies, $check);

print "To print the movie list in reverse order, press Y";
if (<STDIN> =~ /^y/i) {
@movies = sort {$b cmp $a} (@movies);
print "$_: $movies[$_]\n" foreach (0..$#movies);
} else {
@movies=sort @movies;
print "$_: $movies[$_]\n" foreach (0..$#movies);
}

Удачи.

Это сообщение отредактировал(а) korob2001 - 23.1.2005, 17:36


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


Unregistered











Спасибо korob2001!!!
У меня в итоге вот что получилось, с твоей помощью:
Код

#!/usr/bin/perl -w
# This program initializes array with 3 movie titles,
# allow the user to add/delete movie from the list,
# print movie list in reverse or forward order.
# array.pl

use strict;
use warnings;

# initializes an @movies array with 3 movie titles
my @movies = ('Snatch', 'Zatoichi', 'Hero');
my $index;

# print the user movie list
{
@movies=sort @movies;
print "$_: $movies[$_]\n" for (0..$#movies);
};

# ask the user for movie array index to delete
while(1){
 print "Please enter the index of the movie\n",
 "you want to delete: ";
 chomp($index = <STDIN>);
 last if($index =~ /^\d+$/ && $index >= 0 && $index <= $#movies);
};
{
splice(@movies, $index, 1);# $movies[$index];
};
print join("\n", @movies), "\n";

# ask the user to input a series of movie titles
# one per line
print "Please enter movies you want to add to the list,\n",
"one per line. Use ctrl/D to termnate the input: \n";
while (($_ = <STDIN>) =~ /^.+$/) {
 chomp(@movies);
 push(@movies,$_);
};

# ask the user which sort order use to print movie list
print "To print the movie list in reverse order, press Y\n";
if (<STDIN> =~ /^y/i) {
 @movies = (sort {lc($b) cmp lc($a)} @movies);
 print "$_: $movies[$_]\n" foreach (0..$#movies);
} else {
 @movies=(sort {lc($a) cmp lc($b)} @movies);
 print "$_: $movies[$_]\n" foreach (0..$#movies);
}


Вроде бы все работает, только при запуске программы, после добавления новых строк, выдает warning:
Use of uninitialized value in pattern match (m//) at ./array.pl line 41, <STDIN> line 3.
но после этого продолжает работать.
Вот output программы:

0: Hero
1: Snatch
2: Zatoichi
Please enter the index of the movie
you want to delete: 0
Snatch
Zatoichi
Please enter movies you want to add to the list,
one per line. Use ctrl/D to termnate the input:
asd
asdf
Use of uninitialized value in pattern match (m//) at ./array.pl line 41, <STDIN> line 3.
To print the movie list in reverse order, press Y
y
0: Zatoichi
1: Snatch
2: asdf
3: asd

Для меня, эта ошибка пока не критична, просто интересно узнать, что не так. smile
Еще раз спасибо за помощь!!!
  Вверх
korob2001
Дата 26.1.2005, 06:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ошибка здесь:
Код

while (($_ = <STDIN>) =~ /^.+$/) {
           chomp(@movies);
           push(@movies,$_);
};

В условии цикла. Попробуй так:
Код

while (<STDIN>) {
           last if length( $_ ) <= 0;
           chomp;
           push(@movies,$_);
};



--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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