Консультация № 183655
19.06.2011, 00:01
52.03 руб.
0 19 2
Уважаемые эксперты! Прошу Вас написать программу для решения следующей задачи:

При работе ЭВМ время от времени наступает сбой (отказ). Поток сбоев можно считать простейшим.
Среднее число сбоев за сутки равно 1,5. Найдите вероятности того, что:
а) за двое суток не будет ни одного сбоя;
б) в течение суток произойдет хотя бы один сбой;
в) за неделю работы ЭВМ произойдет не менее трех сбоев.

В программу нужно вводить число сбоев за сутки и на его основании вычисляется ответ под а)б)в).

Ниже прикрепляю файл с решением этой задачи. Заранее спасибо. С уважением.
https://rfpro.ru/upload/5989

Обсуждение

Неизвестный
19.06.2011, 00:11
общий
Уважаемые эксперты! Прошу приложить пояснение к программе! Заранее спасибо, извините, за несвоевременность.
Неизвестный
19.06.2011, 01:16
общий
это ответ
Здравствуйте, Sanek!
В этом коде переменная sboi - среднее число сбоев в сутки; Pa, Pb, Pv - искомые результаты для а, б и в. t - период времени, m количество сбоев вероятность которых нужно найти.

вычисление факториала и степени оформлены в виде функций, ответ в экспоненциальном виде.

Приложение:
program programm183655;
var sboi, Pa,Pb,Pv,t,m:real;
var i:integer; {для цикла}

{функция для расчёта степени числа}
function stp(a,x:real):real;
var y:real;
begin
y:=exp(x*ln(a));
stp:=y;
end;

{функция для расчёта факториала}
function fakt(n:integer):integer;
var yy:integer;
begin
yy:=1;
for i:=1 to n do
yy:=yy*i;
fakt:=yy;
end;

begin

{ставим значения для первого случая}
sboi:=1.5;
t:=2;
m:=0;
Pa:=(stp((sboi*t),m)*(1/(exp(sboi*t))))/fakt(0);

{ставим значения для второго случая}
t:=1;
m:=0;
Pb:=1-(stp((sboi*t),m)*(1/(exp(sboi*t))))/fakt(0);

{ставим значения для третьего случая}
t:=7;
Pv:=1;
for i:=0 to 2 do
Pv:=Pv-(stp((sboi*t),i)*(1/(exp(sboi*t))))/fakt(i);

{выводим данные на экран}
writeln(Pa);
writeln(Pb);
writeln(Pv);
readln;
end.
давно
Мастер-Эксперт
319965
1463
19.06.2011, 07:58
общий
это ответ
Здравствуйте, Sanek!
Собственно говоря, этот вопрос уже задавали.
Нужно только добавить ввод числа сбоев за сутки lambda:
Код:
program poisson;

uses
crt;

var
lambda: Double;

{функция, вычисляющая вероятность k сбоев за время t с числом сбоев за сутки lambda}
function Puasson(k: Word; t,lambda: Double): Double;
var
y: Double;
i: Integer;
begin
y:=1;
for i:=1 to k do y:=y*lambda*t/i;
y:=y*Exp(-lambda*t);
Puasson:=y;
end;

begin
ClrScr;{очистка экрана}
Write('lambda=');Readln(lambda);{ввод числа сбоев за сутки}
Writeln('P(k=0,t=2)=',Puasson(0,2,lambda));{ответ на первый вопрос}
Writeln('1-P(k=0,t=1)=',1-Puasson(0,1,lambda));{ответ на второй вопрос}
Writeln('1-P(k=0,t=7)-P(k=1,t=7)-P(k=2,t=7)=',
1-Puasson(0,7,1.5)-Puasson(1,7,1.5)-Puasson(2,7,lambda));{ответ на третий вопрос}
Readln;{ожидание завершения работы}
end.

Неизвестный
19.06.2011, 14:47
общий
19.06.2011, 14:47
Уважаемые эксперты! С Вашими решениями данной задачи у меня возникли определенные неполадки:
В ответе №1
Программа прогоняет решения, не реагируя на ввод числа сбоев за сутки:
[img]
[/img]
К тому же, вычисленные программой ответы не совпадают с вычисленными в ручную:
[img]
[/img]

Ответ №2
не прогоняется, выдает следующую ошибку:
[img]
[/img]

Уважаемые эксперты, пожалуйста помогите разрешить данные ошибки. В задаче, по возможности, ответ должен выдаваться в полном виде, т.е. образец этой программы, решенной на С++ для (а)=1.5 - число сбоев за сутки:
[img]
[/img]

С уважением.
давно
Мастер-Эксперт
319965
1463
19.06.2011, 14:54
общий
Ответ №2
не прогоняется, выдает следующую ошибку:

Зайдите в меню Options/Compiler... и в пункте Numeric processing отметьте 8087/80287.
Неизвестный
19.06.2011, 15:05
общий
Уважаемые эксперты!
Выполнил Ваше требование:
Зайдите в меню Options/Compiler... и в пункте Numeric processing отметьте 8087/80287.

Получил результат прогона:
[img]
[/img]
Данные результаты просто невозможны, ибо вероятность должна быть менее 1, и, к тому же, опять таки не совпадает с вычислениями в "ручную".
Помогите разобраться.
С уважением.
давно
Мастер-Эксперт
319965
1463
19.06.2011, 15:14
общий
Код:
program poisson;

uses
crt;

var
lambda: Double;

{функция, вычисляющая вероятность k сбоев за время t с числом сбоев за сутки lambda}
function Puasson(k: Word; t,lambda: Double): Double;
var
y: Double;
i: Integer;
begin
y:=1;
for i:=1 to k do y:=y*lambda*t/i;
y:=y*Exp(-lambda*t);
Puasson:=y;
end;

begin
ClrScr;{очистка экрана}
writeln('При работе ЭВМ время от времени наступает отказ. Поток сбоев можно считать

простейшим.');
Write('Введите среднее число сбоев за сутки: ');Readln(lambda);{ввод числа сбоев за

сутки}
Writeln('Вероятность того, что:');
Writeln('а) за двое суток не будет ни одного сбоя:');
Writeln(Puasson(0,2,lambda));{ответ на первый вопрос}
Writeln;
Writeln('б) в течение суток произойдет хотя бы один сбой:');
Writeln(1-Puasson(0,1,lambda));{ответ на второй вопрос}
Writeln;
Writeln('в) за неделю работы ЭВМ произойдет не менее трех сбоев:');
Writeln(1-Puasson(0,7,1.5)-Puasson(1,7,1.5)-Puasson(2,7,lambda));{ответ на третий

вопрос}
Readln;{ожидание завершения работы}
end.
давно
Мастер-Эксперт
319965
1463
19.06.2011, 15:20
общий
19.06.2011, 15:29
???
Где это Вы видите, что вероятность больше единицы?
4,987...........E-0002

Обратите внимание, что в конце стоит E-0002. Это так называемая инженерная или экспоненциальная форма числа и означает, что запятую нужно передвинуть на две позиции влево. Поэтому эти числа равны
0,04978.......
0,7768.......
0,9981......
Неизвестный
19.06.2011, 15:23
общий
19.06.2011, 15:27
Обратите внимание, что в конце стоит E-0002. Это так называемая инженерная или экспоненциальная форма числе и означает, что запятую нужно передвинуть на две позиции вправо. Поэтому эти числа равно 0,04987....... 0,7768....... 0,9981......

Уважаемые эксперты, спасибо за разъяснение, только я так понимаю на две позиции влево, а не вправо). А возможно ли вывести представление чисел в обычном виде?
давно
Мастер-Эксперт
319965
1463
19.06.2011, 15:29
общий
не совпадает с вычислениями в "ручную

Вот данные из решения, на которое Вы ссылаетесь:
0,05
0,78
0,99816
Программные вычисления дают:
0,04978...
0,7768...
0.99816...
С точностью до округления это одно и то же.
давно
Мастер-Эксперт
319965
1463
19.06.2011, 15:30
общий
только я так понимаю на две позиции влево

Исправил.
Неизвестный
19.06.2011, 15:33
общий
Спасибо, с вычислениями все понятно, противоречий нет. А возможно ли вывести представление чисел в обычном виде, т.е. чтоб ответ в Паскале был именно вида: 0,04978... а не: 4,987...........E-0002 ?
давно
Мастер-Эксперт
319965
1463
19.06.2011, 15:41
общий
Замените
Writeln(...)
на
Writeln(...:m:n)
m - шириная поля вывода
n - точность
Например:
Writeln(Puasson(0,2,lambda):7:5);
Неизвестный
19.06.2011, 15:46
общий
Спасибо за разъяснение. И если Вас не затруднит, подскажите как сделать корректное отображение русских символов в Паскале?
давно
Мастер-Эксперт
319965
1463
19.06.2011, 15:59
общий
http://programmersforum.ru/showthread.php?t=23488
Неизвестный
19.06.2011, 16:04
общий
Спасибо за помощь! С уважением.
давно
Мастер-Эксперт
319965
1463
19.06.2011, 16:16
общий
А лучше, наверно, скачать русифицированный паскаль:
http://forum.woweb.ru/topic40713.html
давно
Мастер-Эксперт
425
4118
20.06.2011, 05:24
общий
20.06.2011, 05:24
Скачайте нормальный Паскаль, который написан специально для современных процессоров и операционных систем:
FreePascal
Пользоваться Turbo(Borland)Pascal сейчас - это всё равно, что выезжать на автобан на деревянном самокате и удивляться, отчего это водители на проезжающих мимо Porsche и Toyota'х сигналят и крутят пальцем у виска...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Мастер-Эксперт
319965
1463
20.06.2011, 09:11
общий
Полностью согласен с sir Henry по поводу Turbo Pascal. Его проблема в том, что он уже умер (фирма, которая его делала, уже не существует). А попытки реанимации, как правило, приводят к возникающим время от времени разным проблемам. Единственно, что можно обсуждать - это какую современную среду разработки выбрать. Кроме Free Pascal существуют и другие возможности.
Форма ответа