Форум программистов, компьютерный форум, киберфорум
Наши страницы
PowerShell
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
Rocksos
0 / 0 / 0
Регистрация: 21.10.2018
Сообщений: 20
1

Написать скрипты на PowerShell (.ps1) 1.Нахожденияе числа Фибоначчи по номеру 2.Вывод измененных файлов каталога

17.01.2019, 02:04. Просмотров 1365. Ответов 31

Здравствуйте, нужна помощь в написании двух скриптов на PowerShell (расширение .ps1)

1. Выведите число Фибоначчи по его номеру, вводимому с клавиатуры.
Первые два числа Фибоначчи равны 1; каждое следующее равно сумме
двух непосредственно предшествующих ему чисел Фибоначчи.

2. Выведите на экран названия файлов каталога, указанного в качестве
первого параметра командной строки, которые изменены в год, номер
которого указан во втором аргументе
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2019, 02:04
Ответы с готовыми решениями:

Как в PS1 выводить количество файлов и подкаталогов домашнего каталога?
В задаче требуется изменить конфигурационный файл командного интерпретатора, чтобы формировалась...

Скрипты Linux, удаление файлов из каталога, подсчет файлов в каталоге
С linux столкнулась не по своей воле, но приходиться изучать, я совсершенно еще зеленая в...

Написать программу, которая обеспечивает:начальное формирование каталога файлов;вывод каталога файлов;удаление файлов...
Уважаемые хакеры!Прошу вашей помощи!Я в СИ не особо шарю.((( А на днях уже сдавать.Очень...

Запуск нескольких ps1 скриптов через Powershell
Всем привет. Есть папка в которой находятся ещё папки, в этих папка лежат файлы с одинаковым...

Как правильно дебаггить ps1-скрипты?
Если команда запускается из ISE, но не работает из командлета, как правильно дебаггить в таком...

31
YuS_2
Любознательный
1079 / 614 / 193
Регистрация: 10.03.2016
Сообщений: 1,426
17.01.2019, 16:58 2
Цитата Сообщение от Rocksos Посмотреть сообщение
Выведите число Фибоначчи по его номеру
PowerShell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$k = $args[0]
if ($k -lt 2){write-host Должно быть выполнено условие n >= 2;sleep 3;break}
#    при 250000 - TotalSeconds      : 18,4659158
#    при 275000 - TotalSeconds      : 60,6238501
#    не рекомендую использовать бОльшие числа, ибо легко поймать переполнение с зависанием
 
$arr = new-object 'bigint[]' ($k+1)
 
for ($i=0;$i -le $k;$i++){
    if ($i -lt 2){$arr[$i] = $i} else {
        $arr[$i]=$arr[$i-1]+$arr[$i-2]
    }
}
write-host " F8 = " $arr[8]"`n"`
"F9 = " $arr[9]"`n"`
"F10 = " $arr[10]"`n"`
"F18 = " $arr[18]"`n"`
"F19 = " $arr[19]"`n"`
"F20 = " $arr[20]"`n"`
"F298 = " $arr[298]"`n"`
"F299 = " $arr[299]"`n"`
"F300 = " $arr[300]"`n"`
"Fk = " $arr[$k]
1
Rocksos
0 / 0 / 0
Регистрация: 21.10.2018
Сообщений: 20
17.01.2019, 18:10  [ТС] 3
а можно попроще, без массива и с циклом for просто?
0
YuS_2
Любознательный
1079 / 614 / 193
Регистрация: 10.03.2016
Сообщений: 1,426
17.01.2019, 18:22 4
нет, без массива получится рекурсия с великими тормозами при расчете всего ряда... это без меня.
А показанный выше скрипт, просто уже был когда-то давно написан, причем это решение с достаточно быстрым расчетом... пользуйтесь.
Прикрутите запрос на ввод числа и получите то, что требуется... без труда, как говорится, нет и суда
0
KDE777
1269 / 777 / 311
Регистрация: 22.01.2016
Сообщений: 2,258
17.01.2019, 18:41 5
Цитата Сообщение от Rocksos Посмотреть сообщение
а можно попроще, без массива и с циклом for просто?
Fibonnaci Sequence

PowerShell
1
Get-Fibonacci (Read-Host 'Enter number')
Добавлено через 11 минут
Цитата Сообщение от Rocksos Посмотреть сообщение
2. Выведите на экран названия файлов каталога, указанного в качестве
первого параметра командной строки, которые изменены в год, номер
которого указан во втором аргументе
PowerShell
1
2
function List ($path, $year) {ls $path -File| ? {($_.LastWriteTime).Year -eq $year}}
cls; list -path (Read-Host 'enter Path') -year (Read-Host 'enter Year')
1
YuS_2
Любознательный
1079 / 614 / 193
Регистрация: 10.03.2016
Сообщений: 1,426
17.01.2019, 18:51 6
Цитата Сообщение от KDE777 Посмотреть сообщение
Fibonnaci Sequence
вроде бы, там вывод ряда чисел, по максимальному значению конечного числа из ряда... но требуется же вывод по номеру числа.
0
KDE777
1269 / 777 / 311
Регистрация: 22.01.2016
Сообщений: 2,258
17.01.2019, 18:54 7
Цитата Сообщение от YuS_2 Посмотреть сообщение
но требуется же вывод по номеру числа.
Ок, тогда так

PowerShell
1
(Get-Fibonacci (Read-Host 'Enter number'))[-1]
0
YuS_2
Любознательный
1079 / 614 / 193
Регистрация: 10.03.2016
Сообщений: 1,426
17.01.2019, 19:10 8
Цитата Сообщение от KDE777 Посмотреть сообщение
Ок
не так...
Цитата Сообщение от YuS_2 Посмотреть сообщение
"F300 = " $arr[300]"`n"
- здесь, 300 - номер числа, $arr[300] - значение числа Фибоначчи по его порядковому номеру...

1,1,2,3,5,8,13...

т.е. например, значением числа под номером 7, является 13
0
KDE777
1269 / 777 / 311
Регистрация: 22.01.2016
Сообщений: 2,258
17.01.2019, 19:21 9
Цитата Сообщение от YuS_2 Посмотреть сообщение
- здесь, 300 - номер числа, $arr[300] - значение числа Фибоначчи по его порядковому номеру...
1,1,2,3,5,8,13...
т.е. например, значением числа под номером 7, является 13
Ок, понял

http://progopedia.com/example/fibonacci/506/

PowerShell
1
2
3
4
5
6
7
function Get-Fibonacci ($n)
{
    if ($n -le 1) {return 1}
    return (Get-Fibonacci ($n - 1)) + (Get-Fibonacci ($n - 2))
}
 
Get-Fibonacci ((Read-Host 'Enter Fibonacci Number') - 1)
1
YuS_2
Любознательный
1079 / 614 / 193
Регистрация: 10.03.2016
Сообщений: 1,426
17.01.2019, 19:26 10
Цитата Сообщение от KDE777 Посмотреть сообщение
return (Get-Fibonacci ($n - 1)) + (Get-Fibonacci ($n - 2))
Да-да, это и есть:
Цитата Сообщение от YuS_2 Посмотреть сообщение
без массива получится рекурсия с великими тормозами

Примерное время получения числа, хотя бы под номером 1000? Хотя, лучше не экспериментировать, это малоприемлемое время получится...
0
KDE777
1269 / 777 / 311
Регистрация: 22.01.2016
Сообщений: 2,258
17.01.2019, 19:29 11
Цитата Сообщение от YuS_2 Посмотреть сообщение
лучше не экспериментировать, это малоприемлемое время получится...
Всё для заказчика! Просили без массива - получите
0
Rocksos
0 / 0 / 0
Регистрация: 21.10.2018
Сообщений: 20
17.01.2019, 19:36  [ТС] 12
Вот, все очень быстро работает

$f1=1
$b=0
$f2=2
Write-Host "Введите номер числа"
$n=Read-Host
for ($i=3; $i -le $n; $i++) {
$b=$f1
$f1=$f2
$f2=$b+$f1
}
echo "Fib($n)=$f2"
0
KDE777
1269 / 777 / 311
Регистрация: 22.01.2016
Сообщений: 2,258
17.01.2019, 19:45 13
Цитата Сообщение от Rocksos Посмотреть сообщение
Вот, все очень быстро работает
Быстро, но с ошибкой на одно число

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987...
PowerShell
1
2
3
4
$f1, $f2, $b = 1, 2, 0
$n = Read-Host "Введите номер числа"
for ($i=3; $i -le $n; $i++) {$b=$f1; $f1=$f2; $f2=$b+$f1} 
"Fib($n)=$f2"
Код
Введите номер числа: 7
Fib(7)=21
1
YuS_2
Любознательный
1079 / 614 / 193
Регистрация: 10.03.2016
Сообщений: 1,426
17.01.2019, 19:49 14
Цитата Сообщение от Rocksos Посмотреть сообщение
все очень быстро работает
Угу, попробуйте вывести числа с порядковыми номерами:
100,1000,2000 и более...


Добавлено через 46 секунд
Цитата Сообщение от KDE777 Посмотреть сообщение
но с ошибкой на одно число
это-то поправить можно... но дело не в этой ошибке...
1
KDE777
1269 / 777 / 311
Регистрация: 22.01.2016
Сообщений: 2,258
17.01.2019, 20:10 15
Цитата Сообщение от YuS_2 Посмотреть сообщение
Угу, попробуйте вывести числа с порядковыми номерами:
100,1000,2000 и более...
Для 2000 не хватает System.Double, а 1400 находит за ~10 ms

Код
Fib(1400) = 2.7682097123729E+292
PowerShell
1
1..5 |%{ (Measure-Command {$f1, $f2, $b = 1, 2, 0; $n = 1400; for ($i=3; $i -le $n; $i++) {$b=$f1; $f1=$f2; $f2=$b+$f1}; "Fib($n) = $f2"}).TotalMilliseconds}
Код
10,8776
7,8737
10,3461
8,4371
14,696
Добавлено через 11 минут
Для сравнения (на моём же ПК):

PowerShell
1
1..5 |% {(Measure-Command {$k = 1401; $arr=new-object 'bigint[]' ($k+1); for($i=0;$i -le $k;$i++){if ($i -lt 2){$arr[$i] = $i}else{$arr[$i]=$arr[$i-1]+$arr[$i-2]}}; $arr[-1]}).TotalMilliseconds}
Код
25,9812
18,0477
21,7442
20,2613
22,1813
Но да, у вас тип System.Numerics.BigInteger и можно получать куда большие значения...
1
YuS_2
Любознательный
1079 / 614 / 193
Регистрация: 10.03.2016
Сообщений: 1,426
17.01.2019, 20:10 16
Цитата Сообщение от KDE777 Посмотреть сообщение
System.Double
о чем и речь
числа получаются не "по фен-шую", плюс ограничение максимального номера...
0
Rocksos
0 / 0 / 0
Регистрация: 21.10.2018
Сообщений: 20
17.01.2019, 20:12  [ТС] 17
По 2 скрипту можете посмотреть, у меня вот такой получился, но ничего не выводится, просто пробел

$way=Read-host "Enter the way: "
$year=Read-Host "Enter the year: "
$all=Get-ChildItem $way
$a=$all.Length

for ($i=0; $i -lt $a; $i++) {
$e=$all[$i]
$d=$a.LastWriteTime.Year
if ($d -eq $year) {
echo "$a"}
}

В чем тут ошибки?
0
KDE777
1269 / 777 / 311
Регистрация: 22.01.2016
Сообщений: 2,258
17.01.2019, 20:34 18
Лучший ответ Сообщение было отмечено Rocksos как решение

Решение

Цитата Сообщение от YuS_2 Посмотреть сообщение
числа получаются не "по фен-шую", плюс ограничение максимального номера
Лёгким движением добавляем фен-шуй и снимаем ограничение Double

Кликните здесь для просмотра всего текста

683570225957580664704539654917058010705540802936552456540755336779808245440805401495453431895311380272660372676952344747 823819219271452667793994333830610140510541481970566409090181363729645376709552810486826470491443352935557914873104468563 4135487735
897954629842516947101494253575869699893400976539545740214819819151952085089538422954565146720383752121972115725761141759 114990448978941370030912401573418221496592822626

683570225957580664704539654917058010705540802936552456540755336779808245440805401495453431895311380272660372676952344747 823819219271452667793994333830610140510541481970566409090181363729645376709552810486826470491443352935557914873104468563 4135487735
897954629842516947101494253575869699893400976539545740214819819151952085089538422954565146720383752121972115725761141759 114990448978941370030912401573418221496592822626


PowerShell
1
2
3
(1..10 |%{ (Measure-Command {[bigint]$f1, [bigint]$f2, [bigint]$b = 1, 2, 0; $n = 2000; for ($i=3; $i -le $n; $i++){$b=$f1; $f1=$f2; $f2=$b+$f1};$f2}).TotalMilliseconds} | Measure-Object -Average).Average
''
(1..10 |% {(Measure-Command {$k = 2001; $arr=new-object 'bigint[]' ($k+1); for($i=0;$i -le $k;$i++){if ($i -lt 2){$arr[$i] = $i}else{$arr[$i]=$arr[$i-1]+$arr[$i-2]}}; $arr[-1]}).TotalMilliseconds} | Measure-Object -Average).Average
Разница ~2 ms

Код
28,54359

26,31133
Добавлено через 10 минут
Цитата Сообщение от Rocksos Посмотреть сообщение
В чем тут ошибки?
Во первых, перебирать в PowerShell список файлов с помощью for ($i=0; $i -lt $a; $i++) и плодить столько переменных - это ужасный моветон Чем не угодил пример из ответа #5?

А так, у вас ошибки в строках 8 и 10 - нужно вместо $a, $e

PowerShell
1
2
3
4
5
6
7
8
$way=Read-host "Enter the way"
$year=Read-Host "Enter the year"
$all=Get-ChildItem $way
 
for ($i=0; $i -lt $all.Length; $i++) {
$e=$all[$i]
$d=$e.LastWriteTime.Year
if ($d -eq $year) {echo "$e"}}
1
Rocksos
0 / 0 / 0
Регистрация: 21.10.2018
Сообщений: 20
17.01.2019, 20:40  [ТС] 19
Спасибо,что указали ошибки, все заработало, а способ #5 у меня не срабатывал
0
KDE777
1269 / 777 / 311
Регистрация: 22.01.2016
Сообщений: 2,258
17.01.2019, 20:44 20
Цитата Сообщение от Rocksos Посмотреть сообщение
а способ #5 у меня не срабатывал
Какая ошибка? Если у вас PS 2.0, то у Get-ChildItem там не было ключа -file, можете его просто убрать, т.к. и в вашем примере вы не обращаете на это внимание:

PowerShell
1
2
function List ($path, $year) {Get-ChildItem $path | ? {($_.LastWriteTime).Year -eq $year}}
cls; list -path (Read-Host 'enter Path') -year (Read-Host 'enter Year')
1
17.01.2019, 20:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.01.2019, 20:44

Вывод файлов папки, измененных после даты создания самой папки
я так понимаю, надо использовать ls, но с какими параметрами. также, я не ориентируюсь в синтаксисе...

Составить программу определения числа Фибоначчи по его номеру в последовательности
Числа Фибоначчи 1, 1, 2, 3, 5, 8, 13 и т.д. В общем случае числа Фибоначчи (fn) определяются...

Поиск числа Фибоначчи (через операторы цикла for, while и do . while) по его номеру в последовательности
Здравствуйте,подскажите,пожалуйста, как реализовать это тз для отрицательного значения,при этом...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru