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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Освой Самостоятельно Perl за 24 часа, Самообучение 
:(
    Опции темы
Lisssa
Дата 1.10.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В ходе самообучения по книге "Освой Самостоятельно Perl за 24 часа" возникают вопросы , на которые хотелось бы найти ответы. Некоторые моменты ну никак не вяжутся с моей логикой. smile 

Буду вносить все вопросы , которые появятся в ходе обучения в эту тему.
Всем спасибо за внимание. smile 


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


Новичок



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

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



На третьем занятии : ,есть игра “Угадайка”.
Вот пример скрипта –
Код

#!/usr/bin/perl -w
print "\n\r\r\Угадайте число от 0 до 9:\n Введите задуманное значение\n\r\r\r\r";
chomp($a=<STDIN>);
$b=int(rand(10));
if ($a < $b) { print "Недобор!\n"; }
elsif ($a > $b) { print "Перебор!\n"; }
еlse { print "Вы угадали!\n"; }


 В ней задействованы некоторые именованные  унарные операторы. 
А именно “int” – Возвращает целую часть аргумента “rand”
“rand” – тоже именованный унарный оператор, по определению он: Возвращает случайное число в диапазоне от 0 до указанного в аргументе; если аргумент отсутствует— возвращается случайное число в диапазоне от 0 до 1.
С оператором int все понятно.
Вопрос :
По определению rand должен вернуть число от  0 до 10.(Не обязательно целое, поэтому используется int.), но почему в функции print, сказано , что от 0 до 9 ?
 Где истина ?

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


Опытный
**


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

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



perldoc -f rand
Цитата

rand  EXPR  Returns a random fractional number greater than or equal to 0 and less than the value of EXPR

Говоря по-русски, возвращает число в диапазоне [0, EXPR)



--------------------
PM MAIL   Вверх
myth777
Дата 3.10.2011, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Lisssa @ 2.10.2011,  13:04)
но почему в функции print, сказано , что от 0 до 9 ?

потому что rand работает от нуля до N.

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


Эксперт
***


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

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



Цитата(myth777 @  3.10.2011,  15:28 Найти цитируемый пост)
потому что rand работает от нуля до N.

не просто до N, а до N не включая N. О чем собственно и говорит круглая скобка в сообщении Pfailed
PM MAIL Jabber   Вверх
Lisssa
Дата 6.10.2011, 03:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



  Спасибки огромное , за подсказку.
Вытекает вопрос: 
Как сделать , чтобы включало заданное число ?
Возможно это не возможно.
Попробывала поставить квадратную скобку, выдает вообще хаотичное число.

Код

#!/usr/bin/perl -w
a$ =rand [10];
print  $a;



Это сообщение отредактировал(а) Lisssa - 6.10.2011, 03:34
PM MAIL   Вверх
Pfailed
Дата 6.10.2011, 05:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Lisssa @  6.10.2011,  03:33 Найти цитируемый пост)
Как сделать , чтобы включало заданное число ?

Прибавить 1. Если хотите от 0 до 10 включительно, то int(rand(11))


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


Шустрый
*


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

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



Цитата(Pfailed @ 6.10.2011,  05:43)
Цитата(Lisssa @  6.10.2011,  03:33 Найти цитируемый пост)
Как сделать , чтобы включало заданное число ?

Прибавить 1. Если хотите от 0 до 10 включительно, то int(rand(11))

А если хотите от 1 до 10 то это будет rand(10)+1

Это сообщение отредактировал(а) myth777 - 6.10.2011, 13:09
PM MAIL   Вверх
Lisssa
Дата 7.10.2011, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 Спасибки за участие.
Блин немного не корректно задала вопрос. Существует ли способ - это реализовать по синтаксису языка,  чтобы сразу включить 10, а не с помощью математических, арифметических приемчиков ? ))) (Тоесть написать в операторе только 10)
PM MAIL   Вверх
dixoNICH
Дата 7.10.2011, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



можете написать свой перл.
PM MAIL   Вверх
Lisssa
Дата 7.10.2011, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ха ну, очень смешно.
 Я то по правде этот еле понимаю, мысли заплетаются, а Вы мне свой предлагаете.
Вот я и спрашиваю может в этом уже такой оператор есть ?  smile 
 Просто , если нет , то на нет и суда нет. Иду дальше продолжать учить , чтобы не заострать внимание на моментах , которые в пустую отнимают время.
PM MAIL   Вверх
arto
Дата 7.10.2011, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а какие-либо рациональные причины есть для изменения существующего поведения?
PM MAIL ICQ   Вверх
Lisssa
Дата 19.10.2011, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 Извенияюсь за столь не скорый ответ, не было возможности отписать.
  Просто очень похож на математическую науку.
  Соответственно возникает внутренее желание , что бы по всем параметрам был максимально преближен к ней , да бы проще было запомнить.
Нет , я просто пока учу его таким , какой он есть, вот и спросила , есть или нет такая возможность.
PM MAIL   Вверх
Lisssa
Дата 19.10.2011, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



На терьем занятии вконце есть программа, по нахождению простых чисел.
 К сожалению мое учебное пособие в отсканированном виде ужастного качества с кучей ошибок. 
Саму программу я исправить , исправила. Просто увидев написала правильно по памяти.

Код

#!/usr/bin/perl -w
$maxprimes=20;    # Максимально кол. целых чисел
$value=1;            # Значение проверяемое на простое число
$count=0;        # Счетчик найденых чисел
while($count < $maxprimes) {    # Цикл выполняется пока не будет найдено 
                        # заданное кол. простых чисел.
    $value++;            # Инкримент , начинаем с 2.
    $composite=0;        # Флажок в цикле for, обозначает , что в 
                # текущей интерации иследуемое число не 
                # является простым.
    OUTER: for($i=2; $i<$value; $i++) {    # Перебираем все возможные 
                    # множетели числа $value. 
                    # Присваиевается флаг $composite
                    # и программа выходит из обоих 
                    # циклов.
        for($j=$i; $j<$value; $j++) {
            if (($j*$i)==$value) {
                $composite=1;
                last OUTER;
            }
        }
    }
    if (!$composite) {    # Проверяем значение флага, если множители найдены не 
            # были, то флагу присваивается значение 0 и 
            # выполняется данный условный оператор if.
     $count++;
        print "Число $value простое\n";
    }
}


 Есть в конце главы логичное задание, избавится в расчетном цикле от четных значений, чтобы разгрузить программу.
Понятно , что в самой переменной $value избавляемся от четных вариантов. Это легко.
меняем 
Код

$value++;
  на
Код
$value+=2; # Тоесть начиная от 1 прибавляем по 2, тем самым всегда попадая на нечетное число.
 

Так же логично избавиться от четных множителей, но тут уже в тупике  smile 
Блин какие только варианты не пробывала , но в итоге выводит все не то... печатет уже не простые числа, а даже четные.
Вот примеры , которые крутились в голове: (Измененый фрагмент скрипта между меткой OUTER)

Код

OUTER: for ($a=1;($a+1)<$value;$a+=2) {
       next if $a==1;
        for ($b=$a;($b+1)<$value;$b+=2) {
       next if $b==1;
#               if ($a%2 and $b%2){# и такой вариант пробывала...
                if (($a*$b)==$value ){
                $flag=1;
                last OUTER;

 
  Блиннн , ну как избавиться от четных множителей ...

Да по поводу 2 - (Это тоже просто число. С изменыной переменной $value+=2 данной цифры там нет)
Решается очено просто , поэтому вностить в код не стала
Код

print "Число 2 простое\n"; # пишем перед циклом while .

 





Это сообщение отредактировал(а) Lisssa - 19.10.2011, 02:39
PM MAIL   Вверх
Lisssa
Дата 19.10.2011, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



 Второе интересное  задание в конце 3 главы - это усовершенствовать игру "Угадайка".
Нужно написать программу так , чтобы можно было играть в нее пока не угадаешь число.
Я написала два работающих варианта. Одинс помощью цикла for , а второй с помощь цикла while.
 Вот пример второго варианта , если кому понадобиться. ))

Код

#!/usr/bin/perl -w
$b=int(rand(10));
print "\n\r\r\Угадайте число от 0 до 9:\n Введите задуманное значение\n\r\r\r\r";
$flag=1;
while ($flag==1) {
chomp($a=<STDIN>);
if ($a < $b) { print "Недобор!\n"; }
elsif ($a > $b) { print "Перебор!\n"; }
elsif ($a = $b) { print "Вы угадали!\n"; $flag=0;}}

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


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

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


 




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


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

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