-2

プロシージャでこのコードを使用していますが、最初の if 句に問題があります。

procedure TForm1.Button1Click(Sender: TObject);
var i,indice,n,conto:integer;
    a:string;
begin
  indice:=1;
  conto:=0;

  Memo2.Lines.Add('<tr>');

  for i := 1 to 649 do
   begin
    if ((i <> 11) or (i mod 11 <> 0)) then
     begin
      proced4();
     end
    else
     begin
      Memo2.Lines.Add('</tr><tr>');
      proced5();
    end;
   end;
end;

1 から 649 までの for があります。インデックスが 11 の倍数の場合は、11, 22, 33, 44...呼び出す必要があります。

Memo2.Lines.Add('</tr><tr>');
proced5();

私が書いたコードでは、インデックス i が 11 の場合にのみ、コードは proced5() を呼び出します。ただし、たとえば、i が 22 または 33 の場合、proced5() の代わりに proced4() を実行します。

どうすればこれを修正できますか?

4

1 に答える 1

10

if テストは意味がありません:

i mod 11 <<-- will be 0 for any multiple of 11. (including 0) 
(i <> 11)  <<-- superflous, the mod already does the job.

また、正気を保つためには、何か肯定的なことをテストするために常にifを持っていることが最善です.
人間は否定を解析するのが苦手です。

  for i := 1 to 649 do begin
    if ((i mod 11) = 0) then begin
      Memo2.Lines.Add('</tr><tr>');
      procedureWithAMeaningfulName5();
    end else {if not multiple of 11 then} begin
      procedureWithAMeaningfulName4();
    end;
  end; {for}

コーディング スタイルに関するコメント
関数名と変数名は、その意味を示す必要があります。

`Button1`: bad, what does the button do? Should e.g. `ButtonBuildHTMLTable`  
`proced5`: what the hell does that do?? Give it a meaningful name.  
`indice`: Index of what?
`conto`: count of what?

インデントに一貫性がありません。CTRL + Dキーを押すと、Delphi がコードを自動的にインデントすることをご存知ですか?

コードが機能しない理由

テストを分解してみましょう。

if ((i <> 11) or (i mod 11 <> 0)) then
  1. は、(i <> 11) が true または (i mod 11 <> 0) が true の場合orに返します。true
  2. (i <> 11) は、i = 11 の場合を除き、ほぼ常に真です。
  3. したがって、テスト B: (i mod 11 <> 0)(i = 11) の場合にのみテストされます。
  4. それ以外の場合proced4();はすべて実行されます。
  5. ケース i=22、i=33 などはテストnot(i <> 11)aka(i = 11)を満たしていないため、else をトリガーしません。
  6. ポイント 5 の二重否定に注意してください。これが、if ステートメントが肯定的なものをテストする必要がある理由です。
于 2013-10-09T21:29:12.167 に答える