Tuesday, December 24, 2019

ЛР4 Программирование (1.3.3 В22) - I

I. Внешняя спецификация
1. Условие задачи
Составить алгоритм и программу для вычисления в цикле суммарного результата.
Определить объем симметричной игрушки, состоящей из N дисков, нанизанных в порядке убывания их внешнего диаметра на колышек радиуса R, объем которого задан. Внешний диаметр диска определяется выражением D=2R+KH, где Н - заданная толщина диска (она одинакова для всех дисков), К - номер диска, считая от верхнего. Зазором между диском и колышком пренебречь.
Замечание. 
Диск толщиной Н представляет собой два шаровых сегмента высотой Н/2. Радиус каждого диска соответственно равен R+KH/2.
Объем одного диска (с номером К): 

Задача решена при условии, что объем колышка не исключается из объема игрушки.

2. Состав данных
Тип
Имя
Смысл
Структура
Исходные данные
вещественный
R
диаметр внутреннего колышка
простая переменная
вещественный
H
толщина каждого диска
простая переменная
целый
N
количество дисков
простая переменная
Выходные данные
вещественный
V
суммарный объем игрушки с N дисками
простая переменная
Промежуточные данные
целый
i
номер диска
простая переменная
целый
c
индекс выполнения условий корректности данных (0 - выполняется, 1 - не выполняется)
простая переменная

3. Форма ввода
1 3
<N>
1 5
<R>
1 5
<H>

4. Выходная форма
1 3
<N>
1 5
<R>
1 5
<H>
1  7
<V>

5. / 6.
Вычисления производятся после проверки условия:
все исходные данные - положительные величины (R>0, H>0).
7. Аномалии
Радиус и толщина диска не могут принимать отрицательные значения или быть равными нулю.
R<=0, H<=0

8. Тесты
1) с положительным результатом

3
4.17
2.79


2) с отрицательным результатом

5
-3.22
7.18


ЛР3 Программирование (1.4.1 В22) - IV

LabWork3
📑 IT Online Mini Campus. Task 1.4.1
IV. Программа SageMath (Python)
Вариант 1 (с проверкой условия)
V=0; N=5; c=0; s='Данные не корректны'
R=[282.26,246.19,943.02,902.51,245.93]
H=[112.35,184.01,0,1414.61,91.32]
for i in [0..N-1]: 
    if (R[i]<=0 or H[i]<0 or 2*R[i]<H[i]):
        pretty_print(s); c=1; break   
    else: V+=pi*H[i]^2*(R[i]-H[i]/3)
t=[['radiuses',html(ascii_art('%s'%R))],
   ['heights',html(ascii_art('%s'%H))],
   ['volume',html(ascii_art('<p>$%s$</p>'\
   %[latex(V),latex(V.n())]))]]
if c==0: show(table(t))


Вариант 2 (программа генерирует случайные данные, подходящие по условию)
V=0; N=7; R,H=[],[]
for i in [0..N-1]: 
    R+=[round(random()*1000,2)]
    H+=[round(2*random()*R[i],2)]
    V+=pi*H[i]^2*(R[i]-H[i]/3)
t=[['radiuses',html(ascii_art('%s'%R))],
   ['heights',html(ascii_art('%s'%H))],
   ['volume',html(ascii_art('<p>$%s$</p>'\
   %[latex(V),latex(V.n())]))]]
table(t)


ЛР3 Программирование (1.4.1 В22) - III

📑 Compile Pascal Online
Для проверки текст программы копируется в main.pas, данные (каждое число на новой строке) - в STDIN.
III. Программа Pascal
Program Lab3;
var R,H: array [0..1000] of real;
    N,i,c: integer;
    V: real;
begin
    writeln('Лаб.3':38);
    c:=0; V:=0;
    writeln('Количество резервуаров N: '); 
    readln(N); writeln(N:3);
    i:=0; 
    while i<N do
    begin
        writeln('Номер резервуара i: ',i+1);
        readln(R[i]); readln(H[i]);
        write('Радиус резервуара R: ',R[i]:5:2);
        write('Уровень топлива H: ',H[i]);
        if ((R[i]<=0) or (H[i]<0) or (2*R[i]<H[i])) then
        begin
            writeln('Данные не корректны');
            c:=1; break;
        end
        else
            if H[i]>0 then 
                V:=V+Pi*exp(2*ln(H[i]))*(R[i]-H[i]/3);  
        i:=i+1;
    end;
    if c=0 then
    begin
        write('Суммарный объем топлива V: ',V:15:4);
    end;
end.

STDIN
5
282.26
112.35
246.19
184.01
943.02
0
902.51
1414.61
245.93
91.32


ЛР3 Программирование (1.4.1 В22) - II

LabWork3
II. Алгоритм


ЛР3 Программирование (1.4.1 В22) - I

LabWork3
I. Внешняя спецификация
1. Условие задачи
Разработать алгоритм и программу с единственным циклом обработки одномерного массива для решения указанной задачи.
При заданных R1, R2 , ..., Rn и H1, H2, ..., Hn найти суммарный объем горючего, хранящегося в n шарообразных резервуарах, если Rk - внутренний радиус k-ого резервуара, а Hk определяет уровень наполнения по отношению к низшей точке дна. 
Указание: объем соответствующего шарового сегмента равен



2. Состав данных
Тип
Имя
Смысл
Структура
Исходные данные
вещественный
R
внутренние радиусы резервуаров
одномерный массив
вещественный
H
уровени наполнения резеруаров по отношению к низшей точке дна
одномерный массив
целый
N
количество резервуаров
простая переменная
Выходные данные
вещественный
V
суммарный объем в N резервуарах
простая переменная
Промежуточные данные
целый
i
номер резервуара
простая переменная
целый
c
индекс выполнения условий корректности данных (0 - выполняется, 1 - не выполняется)
простая переменная


3. Форма ввода
1 3
<N>
1 5
<R[1]>
1 5
<H[1]>
...
1 5
<R[N]>
1 5
<H[N]>


4. Выходная форма
1 3
<N>
1 5
<R[1]>
1 5
<H[1]>
...
1 5
<R[N]>
1 5
<H[N]>
1 15
<V>


5./ 6.
Вычисления производятся после проверки условий:
1) все исходные данные - неотрицательные величины



2) уровень горючего не превышает удвоенный радиус резервуара.



7. Аномалии
Хотя бы для одного резервуара:
1) отрицательная величина радиуса или уровня горючего;
2) уровень горючего превышает диаметр резервуара (удвоенный радиус).


8. Тесты
1) с отрицательным результатом


2
97.12
-32.7
115.3
22.23




2
318.65
252.72
11.75
151.69




2) с положительным результатом


5
282.26
112.35
246.19
184.01
943.02
0
902.51
1414.61
245.93
91.32