0

私は MATLAB プログラミングの初心者です。私は統計データに取り組んでいますが、while ループに問題があります。コードは次のとおりです。

% --- Executes on button press in b_analisa_data.
function b_analisa_data_Callback(hObject, eventdata, handles)
hitung(handles.lb_tkp, handles);
tkp=getappdata(handles.lb_tkp,'tkp2');
tpp=getappdata(handles.lb_tpp,'tpp2');
po=getappdata(handles.lb_po,'po2');
nq=getappdata(handles.lb_nq,'nq2');
nt=getappdata(handles.lb_nt,'nt2');
tq=getappdata(handles.lb_tq,'tq2');
tt=getappdata(handles.lb_tt,'tt2');
s=getappdata(handles.lb_s,'s2');

set(handles.lb_tkp,'String',tkp);
set(handles.lb_tpp,'String',tpp);
set(handles.lb_po,'String',po);
set(handles.lb_nq,'String',nq);
set(handles.lb_nt,'String',nt);
set(handles.lb_tq,'String',tq);
set(handles.lb_tt,'String',tt);
set(handles.lb_s,'String',s);
% hObject    handle to b_analisa_data (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)


function hitung(handles_hitung,handles)
% Perhitungan tingkat kedatangan pelanggan (TKP)
a=str2num(get(handles.st_twak,'String'));
b=str2num(get(handles.st_jwak,'String'));
param=str2num(get(handles.txt_param,'String'));
c=a/b;
t=3600;
tkp=t/c;
%set(handles.lb_tkp,'String',tkp);

% Perhitungan tingkat pelayanan pelanggan (TPP)
d=str2num(get(handles.st_twp,'String'));
e=str2num(get(handles.st_jwp,'String'));
f=d/e;
tpp=t/f;
%set(handles.lb_tpp,'String',tpp);

% Perhitungan probabilitas tidak adanya pelanggan (PO)
s=str2num(get(handles.st_kasir,'String'));
g=tkp/tpp;
h=tkp/(s*tpp);
for i=0:s-1;
    j(i+1)=(g^i)/(factorial(i));
end
k=sum(j);
l=g/((factorial(s)*(1-h)));
m=k+l;
po=1/m;
%set(handles.lb_po,'String',po);

% Perhitungan jumlah pelanggan dalam antrian (NQ)
n=po*(g^s)*h;
o=factorial(s);
p=o*((1-h)^2);
nq=n/p;
%set(handles.lb_nq,'String',nq);

% Perhitungan jumlah pelanggan dalam sistem (NT)
nt=nq+g;
%set(handles.lb_nt,'String',nt);

% Perhitungan waktu tunggu rata-rata dalam antrian (TQ)
tq=nq/tkp;
%set(handles.lb_tq,'String',tq);

% Perhitungan waktu tunggu rata-rata dalam sistem (TT)
q=tq+(1/tpp);
tt= q*60;
%set(handles.lb_tt,'String',tt);

% Perhitungan jumlah kasir (S)
%set(handles.lb_s,'String',s);

while tt>param
    s=s-1;
    tkp=t/c;
    tpp=t/f;
    po=1/m;
    nq=n/p;
    nt=nq+g;
    tq=nq/tkp;
    tt= q*60;
end
setappdata(handles_hitung,'tkp2',tkp);
setappdata(handles_hitung,'tpp2',tpp);
setappdata(handles_hitung,'po2',po);
setappdata(handles_hitung,'nq2',nq);
setappdata(handles_hitung,'nt2',nt);
setappdata(handles_hitung,'tq2',tq);
setappdata(handles_hitung,'tt2',tt);
setappdata(handles_hitung,'s2',s);

私のプロジェクトでは、複数の数式を使用して統計データを計算します。だから、私は「関数hitung」内にすべての式を入れました

function hitung(handles_hitung,handles)
% Perhitungan tingkat kedatangan pelanggan (TKP)
a=str2num(get(handles.st_twak,'String'));
b=str2num(get(handles.st_jwak,'String'));
param=str2num(get(handles.txt_param,'String'));
c=a/b;
t=3600;
tkp=t/c;
%set(handles.lb_tkp,'String',tkp);

% Perhitungan tingkat pelayanan pelanggan (TPP)
d=str2num(get(handles.st_twp,'String'));
e=str2num(get(handles.st_jwp,'String'));
f=d/e;
tpp=t/f;
%set(handles.lb_tpp,'String',tpp);

% Perhitungan probabilitas tidak adanya pelanggan (PO)
s=str2num(get(handles.st_kasir,'String'));
g=tkp/tpp;
h=tkp/(s*tpp);
for i=0:s-1;
    j(i+1)=(g^i)/(factorial(i));
end
k=sum(j);
l=g/((factorial(s)*(1-h)));
m=k+l;
po=1/m;
%set(handles.lb_po,'String',po);

% Perhitungan jumlah pelanggan dalam antrian (NQ)
n=po*(g^s)*h;
o=factorial(s);
p=o*((1-h)^2);
nq=n/p;
%set(handles.lb_nq,'String',nq);

% Perhitungan jumlah pelanggan dalam sistem (NT)
nt=nq+g;
%set(handles.lb_nt,'String',nt);

% Perhitungan waktu tunggu rata-rata dalam antrian (TQ)
tq=nq/tkp;
%set(handles.lb_tq,'String',tq);

% Perhitungan waktu tunggu rata-rata dalam sistem (TT)
q=tq+(1/tpp);
tt= q*60;
%set(handles.lb_tt,'String',tt);

% Perhitungan jumlah kasir (S)
%set(handles.lb_s,'String',s);

while tt>param
    s=s-1;
    tkp=t/c;
    tpp=t/f;
    po=1/m;
    nq=n/p;
    nt=nq+g;
    tq=nq/tkp;
    tt= q*60;
end
setappdata(handles_hitung,'tkp2',tkp);
setappdata(handles_hitung,'tpp2',tpp);
setappdata(handles_hitung,'po2',po);
setappdata(handles_hitung,'nq2',nq);
setappdata(handles_hitung,'nt2',nt);
setappdata(handles_hitung,'tq2',tq);
setappdata(handles_hitung,'tt2',tt);
setappdata(handles_hitung,'s2',s);

そして、「function b_analisa_data Callback」内で「function hitung」を呼び出します

function b_analisa_data_Callback(hObject, eventdata, handles)
    hitung(handles.lb_tkp, handles);
    tkp=getappdata(handles.lb_tkp,'tkp2');
    tpp=getappdata(handles.lb_tpp,'tpp2');
    po=getappdata(handles.lb_po,'po2');
    nq=getappdata(handles.lb_nq,'nq2');
    nt=getappdata(handles.lb_nt,'nt2');
    tq=getappdata(handles.lb_tq,'tq2');
    tt=getappdata(handles.lb_tt,'tt2');
    s=getappdata(handles.lb_s,'s2');

    set(handles.lb_tkp,'String',tkp);
    set(handles.lb_tpp,'String',tpp);
    set(handles.lb_po,'String',po);
    set(handles.lb_nq,'String',nq);
    set(handles.lb_nt,'String',nt);
    set(handles.lb_tq,'String',tq);
    set(handles.lb_tt,'String',tt);
    set(handles.lb_s,'String',s);
    % hObject    handle to b_analisa_data (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)

私のプログラムは、8 つのリストボックスで数式を計算した結果をすべて表示します。しかし、「関数hitung」を呼び出して、8つのリストボックスにも表示できるとは思いもしませんでした。以下のコードを試してみたところ、いくつかのエラーが発生しました。

function b_analisa_data_Callback(hObject, eventdata, handles)
        hitung(handles.lb_tkp,handles.lb_tpp, handles);
        ....

そのため、リストボックスを1つだけ試してみましたが、プログラムがwhileループを使用しない限り機能します。

function b_analisa_data_Callback(hObject, eventdata, handles)
        hitung(handles.lb_tkp, handles);
        ...

プログラムが while ループを使用する条件の場合、プログラムは応答しなくなります。なぜこのような結果になるのか、私はまだ混乱しています。

4

2 に答える 2

3

このwhileループがあることがわかります:

while tt>param
    s=s-1;
    tkp=t/c;
    tpp=t/f;
    po=1/m;
    nq=n/p;
    nt=nq+g;
    tq=nq/tkp;
    tt= q*60;
end

との両方が変更されることはttありparamません (tt最初は変更できます)。したがって、2回目の反復に入ると、決して抜け出すことはできません.


単なるタイプミスではない場合、あなたが望むかもしれないもののいくつかの推測:

  1. これを 1 回だけ実行する場合はwhile、 をif
  2. 変数が更新されるまで待ちたい場合は、この変数を更新するために必要なすべてをループ内に配置する必要があります。(例getappdata)
于 2013-05-24T14:51:50.003 に答える
0

デニスは正しい。あなたが望むかもしれない別の推測は、確実qに更新されることです。あなたが持っているようにq、 while ループの外側に設定され、内部で変更されることはありません。

あなたが持っているので

tt= q*60;

qttforも同様にするには、ループ内で更新する必要があります。

于 2013-05-24T15:08:07.483 に答える