Вычисление суммы и произведения элементов массива (матрицы)
Рассмотрим алгоритм нахождения суммы, который заключается в следующем: вначале сумма равна 0 (s=0), затем к s добавляем первый элемент массива и результат записываем опять в переменную s, далее к переменной s добавляем второй элемент массива и результат записываем в s и далее аналогично добавляем к s остальные элементы массива. При нахождении суммы элементов матрицы последовательно суммируем элементы всех строк.
Алгоритм нахождения произведения следующий: на первом начальное значение произведения равно 1 (p=1), затем последовательно умножаем p на очередной элемент, и результат записываем в p и т.д.
Программа вычисления суммы элементов массива
//Записываем в переменную s число 0.
s=0;
//Перебираем все элементы массива
for i=1:length(x)
//накопление суммы
s=s+x(i);
end
Программа вычисления произведения элементов массива
p=1;
for i=1:length(x)
p=p*x(i);
end
Программа вычисления суммы элементов матрицы
s=0;
//Вычисляем количество строк n и столбцов m матрицы a.
[n,m]=size(a);
for i=1:n
for j=1:m
s=s+a(i,j);
end
end
disp(s);
Программа вычисления произведения элементов матрицы
//Начальное значение произведения (p) равно 1.
p=1;
//Вычисляем количество строк N и столбцов M матрицы a.
[N,M]=size(a);
//Перебираем все строки матрицы.
for i=1:N
//Перебираем все столбцы матрицы.
for j=1:M
Умножаем значение p на текущий элемент матрицы.
p=p*a(i,j);
end
end
Поиск максимального (минимального) элемента массива (матрицы)
Алгоритм решения задачи поиска максимума и его номера в массиве следующий. Пусть в переменной с именем Max хранится значение максимального элемента массива, а в переменной с именем Nmax - его номер. Предположим, что первый элемент массива является максимальным и запишем его в переменную Max, а в Nmax - его номер (1). Затем все элементы, начиная со второго, сравниваем в цикле с максимальным. Если текущий элемент массива оказывается больше максимального, то записываем его в переменную Max, а в переменную Nmax - текущее значение индекса i. Фрагмент программы поиска максимума:
Реализация алгоритма поиска максимума
//Записываем в Max значение первого элемента массива.
Max=a(1);
//Записываем в Nmax номер максимального элемента
//массива, сейчас это число 1.
Nmax=1;
//Перебираем все элементы массива, начиная со второго.
for i=2:N
//Если текущий элемент массива больше Max,
if x(i)>Max
//то текущий элемент массива объявляем максимальным,
Max=x(i);
//а его номер равен i.
Nmax=i;
end;
end;
Алгоритм поиска минимального элемента в массиве будет отличаться от приведенного выше лишь тем, что в операторе if знак поменяется с > на <.
Программа поиска минимального элемента матрицы и его индексов: Nmin - номер строки , min - номер столбца минимального элемента.
Обратите внимание, что при поиске минимального (максимального) элемента матрицы циклы по i и j начинаются с 1. Если написать с двух, то при обработке элементов будет пропущена первая строка или первый столбец при сравнении a(i , j) с min.
Программа поиска минимального элемента матрицы и его индексов
//Записываем в Min a(1,1), в Nmin и Lmin число 1.
Min=a(1,1); Nmin=1; Lmin=1;
for i=1:N
for j=1:M
//Если текущий элемент матрицы меньше Min,
if a(i,j)<Min
//то текущий элемент массива объявляем минимальным,
Min=a(i,j);
//а его индексы равны i и j.
Nmin=i;
Lmin=j;
end;
end;
end;
Другие примеры.
Пример: вычислить количество отрицательных элементов вектора x=(-2, 5, -7, 9, -15).
Решение.
x=[-2, 5, -7, 9, -15];
n=length(x);
k=0;
for i=1:n
if x(i)<0 then
k=k+1;
end
end
t= k
Пример: вычислить произведение положительных элементов матрицы
Решение.
a=[1 3 5 7
9 -2 0 5];
[n, m]=size(a);
s=1;
for i=1:n
for j=1:m
if a(i, j)>0 then
s=s*a(i, j);
end
end
end
s
Структура функций
В пакете есть возможность использовать функции. Функции играют роль подпрограмм. Это позволяет создавать интегрированные в Scilab специализированные программы и использовать библиотеки. Рекомендуемое расширение для файлов подпрограмм sce, а для библиотечных функций sci.
Существуют два типа sci-файлов: файл-сценарий и файл-функция.
Файл-сценарий (Script-файл) представляет собой последовательность команд без входных и выходных параметров. Он имеет следующую структуру:
// Kомментарий
Тело файла с любыми выражениями
Пример:
//Plot with color red
// Строит график синусоиды линией красного цвета
// в интервале [0, pi]
x=0: .1: %pi; plot(x, sin(x), 'r')
Файл-функция имеет следующую структуру:
function[y1,...,yn]=fun(x1,...,xm)
Тело функции
Endfunction
Здесь
fun - имя функции,
xi - входные аргументы функции (их m штук),
yi - выходные аргументы функции (их n штук).
Пример.
Вычисление факториала.
function [x]=fact(k)
k=int(k)
if k<1 then k=1, end
x=1;
for j=1:k,x=x*j;end
endfunction
Наберем этот текст в любом текстовом редакторе и сохраним его в файле с именем fact.sci. Расширение *.sci является для Sclab "родным", но не обязательным. Затем следует вызвать эти файлы из Scilab c помощью команд getf(filename) или exec(filename,-1); Те же операции можно произвести с помощью команд меню File-getf или File-exec.
До вызова функции желательно проверить, не была ли уже загружена такая функция ранее. Для этого:
exists('fact')
Результат:
ans =
0.
После загрузки файла
-->exec('C:\fact');
набираем
-->x=fact(5)
x =
120
Пример:
function z=fun(x, y)
// Определение функции
z=x.^2 + y.^2;
endfunction
Сохраним эту функцию под именем fun.sci. После загрузки функции в Scilab мы можем обратиться к ней:
-->fun(1,2)
ans =
5.
Пример. Даны два массива X и Y. Вывести в командное окно имя массива, содержащего наибольшее число элементов, кратных числу три.
Решение. Составим программу и сохраним ее под именем t.sci в каталоге C:\DOCUME~1\user\.
function g=t(v)
s=0; n=length(v);
for i=1:n
if modulo(v(i), 3)==0 then
s=s+1;
end
end
g=s;
endfunction
Далее сохраним в корневом каталоге C:\ под именем tot, а затем выполним программу
x=[1 2 3 5 7 6 12]; y=[5 7 24 15]; d1=t(x), d2=t(y)
if d1>d2 then
disp('x')
elseif d1==d2 then
disp('в обоих массивах это число одинаково')
else
disp('y')
end
Получим ответ:
d1 =
3.
d2 =
2.
x
Запуск файла на выполнение осуществляется так:
-->scipad('C:\DOCUME~1\user\t.sci');
-->scipad('C:\tot');
-->exec('C:\tot');
Файл-функция был сохранен в 'C:\DOCUME~1\user\t.sci', файл-сценарий – в 'C:\tot'
Это эквивалентно выполнению следующих операций: запускаем Scilab.
Далее: открываем файл-функцию File/Open… Далее Execute/Load into Scilab; Открываем файл-сценарий (выполняемый файл) File/Open…Далее File/Exec …
Открываются файлы в окне Scilab.
Если выходных параметров несколько, то их надо указать в квадратных скобках после слова function.
function [var1, var2, …] = fname(список_параметров)
// Основной комментарий
// Дополнительный комментарий
Тело файла с любыми выражениями
var1=выражение
var2=выражение
…
endfunction
Пример. Задан вектор . Вычислить и
.
Решение. Набираем и сохраняем в редакторе под именем statv.sci файл
function[mean, stdev] = statv(x)
n=length(x);
mean=sum(x)/n;
stdev=sqrt(sum((x-mean).^2)/n);
endfunction
Далее в командном окне набираем
--> v=[1, 2, 3, 4, 5];
--> [a, m]=statv(v)
В строках вывода получаем:
m =
1.4142136
a =
3.
-->
Краткий комментарий к программе.
Во второй строке файла statv.sci вычисляется количество элементов в массиве x; sum(x) – суммируются все элементы массива x; mean – вычисляется ; stdev – вычисляется . В итоге получаем среднее значение , .
Для создания временной задержки выполнения программы служит команда xpause, которая приостанавливает текущий процесс на число микросекунд, указанных в скобках
· хpause(microsecs)
Пример:
xbasc();
xset("color",12);
xstring(1,1,"Blue");
xpause(5.e6); // временная задержка на 5 секунд
xbasc();
xset("color",5);
xstring(0,1,"Red");
В результате мы видим в графическом окне вначале надпись "Blue", а затем она исчезает и мы видим сдвинутую по горизонтали надпись "Red".
Некоторые полезные функции Scilab для вычисления целой части числа:
int(1.9999)=1=int(1.1) int(-1.9999)=-1=int(-0.00001)
floor(1.5)=1=floor(1.9)=floor(1.1) floor(-1.1)=-2=floor(-1.8)
ceil(1.1)=ceil(1.9)=2 ceil(-1.9)=-1=ceil(-1.2)
fix(-1.2)=-1=fix(-1.7) fix(1.7)=1=fix(1.2)