LinuxForum.Fans
Тема

Скрипт табулирования функции

Автор: santer_HAK 18 сообщений 4460 просмотров
13.10.2014 20:07 #396376

Здравствуйте. При написании консольной программы для табулирования функции, возникает ошибка в последней строке (Bad substitution), помогите ее убрать. Спасибо.

text
#!/bin/bash 
read a 
read b 
i=$a 
while [ $i -lt $b ] 
do 
 c[`expr $i - $a`]=$i 
 i=`expr $i + 1` 
done 
echo ${c[*]}
13.10.2014 20:14 #396379

У меня работает.
Кстати, для вывода последовательности есть программа seq.

14.10.2014 06:33 #396422

linux mint выдает следующую ошибку:

text
adminka@adminka-virtual-machine ~/Рабочий стол/lab5 $ nano tab.sh
Используйте «fg» для возврата в nano

[4]+ Остановлено nano tab.sh adminka@adminka-virtual-machine ~/Рабочий стол/lab5 $ sh tab.sh 1 9 tab.sh: 7: tab.sh: c[0]={1..9}: not found tab.sh: 9: tab.sh: Bad substitution adminka@adminka-virtual-machine ~/Рабочий стол/lab5 $

14.10.2014 09:36 · отредактировано #396446

Может у тебя bash старый?
Либо sh ссылается не на bash, а на другой интерпретатор.
Покажи вывод

text
ls -l `which sh`
14.10.2014 16:09 #396514

Спасибо за ответ. Вот вывод:

text
adminka@adminka-virtual-machine ~/Рабочий стол $ ls -l `which sh`
lrwxrwxrwx 1 root root 4 окт. 12 18:59 /bin/sh -> dash
adminka@adminka-virtual-machine ~/Рабочий стол $
Vascom написал:
text
ls -l `which sh`

14.10.2014 18:05 · отредактировано #396532

Ну вот, не bash.
Надо либо сделать скрипт исполняемым и запускать его напрямую, либо разбираться с синтаксисом твоего dash.

14.10.2014 18:27 #396535

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

14.10.2014 19:52 #396547

Запускай из консоли.
Либо добавь в конце ещё один read, закроется после ввода чего нибудь и нажатия Enter или просто по Enter.

16.10.2014 17:55 · отредактировано #396930

Помогите написать консольную программу для табулирования функции (например, sin(x)) на отрезке [a,b] с шагом h=(b-a)/1000000 с хранением значений
таблицы в массиве. Вывод на экран все элементы массива.

16.10.2014 19:12 #396936

Сам попробуй, это же видно какое-то учебное задание.
А что не получится - мы подскажем.

19.10.2014 09:19 #397200

У меня есть программа для табулирования функции на турбо паскале, мне нужно ее переписать на sh скрипт. Так как я не силен в скриптах, прошу помощи. Спасибо.

text
program a1;
var
  a, b, h, x, s, r : real;
  i : integer;
 function f(x : real):real;
begin
  f := sin(x);
end;
begin
  write('a = ');
  readln(a);
  write('b = ');
  readln(b);
  write('h = ');
  readln(h);
  s:=(b-a)/h;
  write(s:10:5);
  x := a;
  while (x<b) do
   begin
    r:=f(x);
    write(r:10:5);
     x := x + s ;
   end;
   readln;
end.
19.10.2014 10:59 #397207

Хм, сразу видно паскаль :) Имена переменных лучше подлиннее использовать и чтобы они что-то значили, иначе очень сложно понимать текст программы.
Сегодня-завтра попробую тебе помочь.

19.10.2014 18:08 #397244

Спасибо большое, очень надеюсь. =)

Vascom написал:
Хм, сразу видно паскаль :) Имена переменных лучше подлиннее использовать и чтобы они что-то значили, иначе очень сложно понимать текст программы.
Сегодня-завтра попробую тебе помочь.
19.10.2014 21:37 #397253

Тут есть проблема. В bash только целочисленные переменные, поэтому цикл таким образом нельзя реализовать.
Всё-таки bash это скриптовый, а не математический язык, и не предназначен для решения таких задач.

20.10.2014 10:32 #397270
"santer.HAK" написал:
Помогите написать консольную программу для табулирования функции (например, sin(x)) на отрезке [a,b] с шагом h=(b-a)/1000000 с хранением значений
таблицы в массиве. Вывод на экран все элементы массива.

писать не буду, но подскажу:
[console]drb@amilo:~$ X="3.1415926" # переменные в bash все строковые, я их называю большими буквами
drb@amilo:~$ echo "s($X)" | bc -l # считаем синус (подробности в man bc)
.00000005358979323846
drb@amilo:~$ Y=$(echo "s($X)" | bc -l) # а это как синус посчитать, и его в переменную засунуть
drb@amilo:~$ echo $Y
.00000005358979323846
[/console]

"santer.HAK" написал:
на отрезке [a,b] с шагом h=(b-a)/1000000

[console]$ A="1"; B="2"; H="0.07"; while true; do echo "$A"; A=$(echo "$A + $H"|bc -l); S=$(echo "$B - $A"| bc -l); S="${S:0:1}"; if [ "$S" == "-" ]; then break; fi; done
1
1.07
1.14
1.21
1.28
1.35
1.42
1.49
1.56
1.63
1.70
1.77
1.84
1.91
1.98
[/console]

20.10.2014 10:38 #397272

"Vascom" написал:
Тут есть проблема. В bash только целочисленные переменные
хуже: только строковые. В конструкции (( )) строковые переменные переводятся в целые числа. Потому скрипты с математикой на bash выполняются в десятки и сотни раз медленнее, чем аналоги на других скриптовых ЯП(php/python/etc). В bash целые числа только для таких вещей:
[console]$ for I in {1..10}; do echo "$I"; done
1
2
3
4
5
6
7
8
9
10
[/console]
ну например обработать файлы нужно file1.txt, file2.txt, и т.д.
22.10.2014 17:03 #397709

спасибо. =)

23.10.2014 04:13 #397768

santer.HAK, всегда пожалуйста, я забыл ещё про awk написать
[console]$ awk BEGIN{'printf "%f\n",sin(1)'}
0.841471
[/console]

Войдите или зарегистрируйтесь, чтобы ответить.