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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти минимальный ненулевой элемент массива, На выходе всегда 0.. хэлп! 
V
    Опции темы
fleyta
  Дата 4.11.2010, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Выручайте! Второй вечер сижу и борюсь с, на первый взгляд, простенькой проблемой - надо найти минимальный ненулевой элемент в массиве, значения которого берутся из файла (см. аттач - find_min.csv). Код скрипта:
Код

#!/usr/bin/perl -w
use strict;

open(IN, "find_min.csv") or die "Error open file: $!";

my @data=<IN>;
my $minv=$data[0];

foreach (@data) {
    chomp;
    $_=s/\,/\./;
    if (($_<$minv) and ($_!=0)) {$minv = $_;}
}
print $minv;

close IN;

Однако в результате $minv=0. В чем же ошибка? smile 

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  find_min.rar 1,64 Kb
PM MAIL   Вверх
Jimy
Дата 4.11.2010, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



1.
Код

my $minv=$data[0];

У Вас в файле первое значение - ноль.

2.
Код

$_=s/\,/\./;

Что за хитрая операция? 
PM   Вверх
fleyta
Дата 4.11.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Jimy @  4.11.2010,  22:35 Найти цитируемый пост)
У Вас в файле первое значение - ноль.

да, ноль. дальше в цикле хочу найти отличное от нуля минимальное значение и по идее переопределяю переменную $minv

Цитата(Jimy @  4.11.2010,  22:35 Найти цитируемый пост)
Что за хитрая операция?  

в файле цифры через запятую написаны в результате чего возникало предупреждение "11,11 не является числом". чтобы от него избавиться пришлось заменить все запятые на точки

Добавлено @ 22:56
а, стоп, насчет 0.. точно! ведь выполнения условия - $_<$minv - никогда нет, поэтому и 0 на выходе. эээээх...

Это сообщение отредактировал(а) fleyta - 4.11.2010, 23:14
PM MAIL   Вверх
shamber
Дата 4.11.2010, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



У вас неправильная замена не = а =~
ну и можно 
Код

$_=~ s/\,/./;



Это сообщение отредактировал(а) shamber - 4.11.2010, 23:13
PM MAIL Jabber   Вверх
fleyta
Дата 4.11.2010, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Jimyshamber огромное спасибо!!!
вот верный код:
Код

#!/usr/bin/perl -w
use strict;

open(IN, "find_min.csv") or die "Error open file: $!";

my @data=<IN>;
my $minv=1000; # заведомо большее число, чем есть в массиве

foreach (@data) {
    chomp;
    $_=~s/\,/./;
    if (($_<$minv) and ($_!=0)) {$minv = $_; print $minv."\n";}
}
print $minv;

close IN;

PM MAIL   Вверх
shamber
Дата 4.11.2010, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



fleyta, наверно лучше не так.....
зачем указывать заведомо больший вариант, когда можно использовать данные?
Код

my $minv;
foreach (@data) {
    chomp;
    $_=~ s/\,/./;
    next if ($_ == 0);
    $minv = $_ unless (defined $minv);
    if ($_<$minv) {$minv = $_;}
}


Это сообщение отредактировал(а) shamber - 4.11.2010, 23:35
PM MAIL Jabber   Вверх
fleyta
Дата 5.11.2010, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



shamber, действительно, до этого не додумалась. спасибо еще раз!
PM MAIL   Вверх
xido
Дата 5.11.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(fleyta @ 5.11.2010,  00:25)
shamber, действительно, до этого не додумалась. спасибо еще раз!

Мм.. мне  кажется что в формате csv данные делятся запятыми, так что замена запятых на точки очень сомнительна ;). Откройте файл в Excel и убедитесь сами. 
Здесь каждая строка - это строка двумерного массива, а запятые разделяют столбцы.

В свете этого (массив двухмерный) возможно стоит уточнить задание. 

Попробуйте что-то вроде (писал на коленке, могут быть ошибки)

Код

open $fd, $file or die $!;
my @data;

while(<$fd>) {
  chomp;
  push @data, grep {$_ != 0 } (split /,/ , $_);
}

close($fd);

my $min='inf';

foreach (@data) {
  $min=$_ if ($_< $min);
}


[/code]


Это сообщение отредактировал(а) xido - 5.11.2010, 15:33
PM MAIL WWW   Вверх
Jimy
Дата 5.11.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(xido @ 5.11.2010,  15:21)
мне кажется что в формате csv данные делятся запятыми, так что замена запятых на точки очень сомнительна ;). 

Вам показалось. 

Цитата

Здесь каждая строка - это строка двумерного массива, а запятые разделяют столбцы.


Глупости. На строках равных "0" нет запятых. А следуя Вашей логике, там должно было быть "0,0" или "0," или просто разделитель ",".
Не вводите человека в заблуждение.
PM   Вверх
xido
Дата 5.11.2010, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не говорите ерунды. 

Цитата

CSV (от англ. Comma Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter) — запятая (,) или точка с запятой (;).



http://ru.wikipedia.org/wiki/CSV


Цитата

Глупости. На строках равных "0" нет запятых. А следуя Вашей логике, там должно было быть "0,0" или "0," или просто разделитель ",".


 Ничего такого не следует, откройте файл в excel, если в строке стотит 0 , то это значит что значение есть только в 1 столбце.




Это сообщение отредактировал(а) xido - 5.11.2010, 19:15
PM MAIL WWW   Вверх
shamber
Дата 5.11.2010, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



xido, разделением может быть что угодно. Не вериться? посмотрите параметры импорта в Excel.
Эксель как правило точку в числах некорректно воспринимает, преобразует к числу и месяцу. 

Это сообщение отредактировал(а) shamber - 5.11.2010, 20:45
PM MAIL Jabber   Вверх
xido
Дата 5.11.2010, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(shamber @ 5.11.2010,  20:40)
xido, разделением может быть что угодно. Не вериться? посмотрите параметры импорта в Excel.
Эксель как правило точку в числах некорректно воспринимает, преобразует к числу и месяцу.

И что дальше? ;)

Может быть что угодно в екселе, а в формате CSV -  запятая и точка с запятой. Автор топика ясно указал что формат данных - CSV а не столбик чисел. 

Так почему бы не предположить что запятая - разделитель, тем более в околокомпьютерном мире  в роли десятичной запятой ставится используется точка (от  англичан пошло).


Я просто указал на _ВОЗМОЖНУЮ_ неверную трактовку формата данных. Не отрицаю - это может быть и десятичная запятая, но в реальном мире (т.е за пределами домашних заданий) это будет именно разделитель.


//Уймитесь, великие знатоки CSV, пусть автор выскажется

Добавлено через 3 минуты и 2 секунды
Кароче, с чего вы взяли что в случае топик стартера все именно так, а не иначе-то? ;))
PM MAIL WWW   Вверх
shamber
Дата 5.11.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

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



Цитата(xido @  5.11.2010,  20:55 Найти цитируемый пост)
Кароче, с чего вы взяли что в случае топик стартера все именно так, а не иначе-то? ;)) 

пост первый прочитайте, жизнь и наладится smile

ушел... ушел...
PM MAIL Jabber   Вверх
xido
Дата 6.11.2010, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(shamber @ 5.11.2010,  23:51)
Цитата(xido @  5.11.2010,  20:55 Найти цитируемый пост)
Кароче, с чего вы взяли что в случае топик стартера все именно так, а не иначе-то? ;)) 

пост первый прочитайте, жизнь и наладится smile

ушел... ушел...

Я подозреваю что топикстартер может ошибаться. 
PM MAIL WWW   Вверх
fleyta
Дата 6.11.2010, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



оу, сколько дебатов пропустила...
развею сомнения - если бы xido скачал бы мой файлик csv, то он увидел бы, что в данном конкретном случае разделителем является точка с запятой (уж какие данные дают), так что топикстартер в этом случае не ошибается ;)
насчет замены запятых на точки - с данными впоследствии проводятся некоторые арифметические операции, а perl -w имеет привычку сыпать в консоль все предупреждения, в результате чего хоть все и считается правильно (если не производить замену), но тем не менее куча ворнингов напрягает. поэтому и была произведена данная замена, чтобы переменная сразу воспринималась как число.

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


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

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


 




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


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

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