Delphiでの条件分岐について

このQ&Aのポイント
  • Delphiで配列の条件分岐を作る方法について質問です。
  • 配列の要素の中に「1」という値が含まれていれば、配列全体を「0」にするような条件分岐を作りたいです。
  • 一つずつ要素をチェックする方法では、配列が増えた場合に面倒なので、効率的な方法があれば教えてください。
回答を見る
  • ベストアンサー

Delphiでの条件分岐について

すいません。ちょっとわからないので、質問させて頂きます。 Delphiで下記のようにIntegerの配列を宣言したとします。 var hoge : array [1..5] of integer; この配列の全ての要素のうち、ひとつでも「1」(いち)と言う値であれば、 配列の全てを「0」(ぜろ)にすると言う条件分岐(if)を作りたいのです。 どのようにして作ればいいでしょうか? 一つずつ下記(途中までですが)のように書けば出来そうですが、配列の数が 増えた場合に大変面倒な事になりそうなので、何か良い知恵があれば よろしくお願い致します。 if( (hoge[0]=1) or (hoge[1]=1)・・・・){ //配列全てに0を代入 }

  • mkim
  • お礼率72% (161/221)

質問者が選んだベストアンサー

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

delphiに限った話では無く、この種のプログラミング言語で共通の内容ですね。C,FORTRAN,JAVA.... まず、基本はループを使うことです。 そうしておけば、ループの終了条件を変えるだけで, 配列がいくつあろうと同じ処理が可能です。 で、そのための手段として、別に変数を一つ用意します. mustClearFlagとでもしておきます。 integerでもいいんですが、本来は論理型(bool,boolean?)を使います。 で、ループに入る前にmustClearFlagをfalseで初期化しておきます。 ループ中で配列の内容をチェックし、1の時にmustClearFlagにtrueを設定します。 ループを抜けたときに、mustClearFlagがtrueなら 1があったことになりますので、配列を0クリアします。 Delphiは忘れたのでCで書きますが、こんな感じですね. noOfArray = 5; mustClearFlag = 0; for ( i=0 ; i<noOfArray ; i++ ) if ( hoge[i] == 1 ) mustClearFlag = 1; if ( mustClearFlag ) for ( i=0 ; i<noOfArray ; i++ ) hoge[i]=0; // 簡略化のため無駄なループを回してます(^^;

mkim
質問者

補足

ご回答ありがとうございます。 forループを使えば、数がいくつ増えても大丈夫ですよね^^ noOfArrayの所も配列の要素数を取得するようにすれば、 どのようにも対応できそうです。 さらに質問となってしまいますが、多数の場合には、terra5さんの お答えにて対応したいと思いましたが、配列の要素数が例えば、 3個だけに限定されている場合は、自分の手で3つ分の値を「1」と 比べて・・と言うように記述するのでしょうか? なんか、スマートに書ける方法をご存知の方がいれば教えて欲しいのですが。。 if( hoge[0..3] = 1){ //ここで処理 } みたいに簡潔に書く事はできないでしょうか? みなさんは、どのようにされているのでしょうか? 3つくらいでもループを回すと言う書き方をしているのでしょうか? それとも、3つ限定なら、ごりごり3個と比較する書き方をしているのでしょうか? 質問だらけとなってしまいますが、よろしくお願い致します。

その他の回答 (1)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

>3個だけに限定されている場合は、自分の手で3つ分の値を「1」と >比べて・・と言うように記述するのでしょうか? >なんか、スマートに書ける方法をご存知の方がいれば教えて欲しいのですが。。 場合によりますね。 2回でもループにすることもあります。 ループにする場合は、回数が変化する可能性がある場合、ループにした方が見やすいと思われる場合, タイプ数が少なくなる場合(笑)なんかですね。 見た目を簡潔にするには、関数などで書き換えるぐらいでしょう。 >if( hoge[0..3] = 1){ 私が知る範囲では、こういう記述ができる言語はないです。 でも、もしあったとすると、直感的には全て1の場合という意味にとりますね(^^;

mkim
質問者

お礼

またまたの回答、ありがとうございます。 配列の要素数が変化する場合などは、ループにしておくと 要素数が変化しても対応できるので、そちらを使うのがよいのですね! 状況によって、使い分けるようにします。 >見た目を簡潔にするには、関数などで書き換えるぐらいでしょう。 ソースを綺麗に見せたい場合は、関数化して、外にだしておけばよいのですね。 結構、わかってきました。 色々とアドバイスして頂き、助かりました。 ありがとうございました。

関連するQ&A

  • delphi 2次元配列がわかりません

    将棋盤の様な9×9マスの配列宣言を a1 : array[1..9, 1..9] of Integer ;とした場合、a1に値を 代入するにはどんな式が考えられますか? a1 : array [1..9] of integer = (394,448,502,556,612,664,721,774,827); みたいに直接括弧内で 代入も可能でしょうか? 超初心者で頭の中で混乱してしまいます。 どなたかお助け下さい。

  • 配列の値によって条件分岐がしたいんですが

    イメージとしては配列で表されたチェックボックスに対して、その値に対して条件を分岐して処理させようと思うのですが、 送る側 1. {html_checkboxes name="list[]" selected=$smarty.session.list separator="<br/>" 2. options=$value} 1. $valueの中身は、 2. $value = array( 3. "1" => "朝", 4. "2" => "昼", 5. "3" => "夜" 6. ); 7. return $li_value; 8. } 条件のイメージとしては、朝をチェックしたら1なので、値が1ならば、hogeを実行。 2ならばhoge02を実行 3ならばhoge03を実行 ソースは下記のようにしてみました。 <<CODE if($_POST['list'] == "1"){ echo "hoge"; } <<CODE 期待とおり動かないです。。。 どうしたらよいでしょうか!? ご教授よろしくお願いします。

    • 締切済み
    • PHP
  • 配列の簡易な記載法ついて

    JavaScript初心者です。 20の要素を持つ配列があるとします。 そのうちの複数個に同一の値を入れるには下記のような冗長な書き方以外にどのようなものがあるのでしょうか? 例: 配列arrayの1,5,9,13,17番目にabcという値を格納する (※値を入れて宣言する以外の方法で) array[0] = array[4] = array[8] = array[12] = array[16] = "abc";   検索の仕方が悪いのか簡易な書き方が見つからなかったので、教えていただけると助かります!  

  • DelphiのInputQueryで整数値を入力させたい

    DelphiのInputQueryで整数値を入力させたい のですが、 var Val: Integer; begin Val := 1; InputQuery('個数入力', '個数(1~49):', Val, 1, 49, 1); end; とすると、3番目の引数の型が合っていないとのコンパイルエラーが出ます。 ヘルプでは以下のように書いてあるのですが、何か宣言が必要なのでしょうか? 一番下の例を使いたいのですが… Delphi の構文: function InputQuery(const ACaption, APrompt: string; var Value: string): Boolean; function InputQuery(const ACaption, APrompt: WideString; var Value: WideString): Boolean; overload; function InputQuery(const ACaption, APrompt: WideString; var Value: string): Boolean; overload; function InputQuery(const ACaption, APrompt: WideString; var Value: Double, Min: Double = Low(Integer); Max: Double = High(Integer); Decimals: Integer = 1): Boolean; overload; function InputQuery(const ACaption, APrompt: WideString; var Value: Integer, Min: Integer = Low(Integer); Max: Integer = High(Integer); Increment: Integer = 1): Boolean; overload;

  • Delphi6で、実行後、一時停止をしたい。

    Delphi6を使ってPascalを勉強しています。 Delphi6でプログラムを記述し実行すると、MS-DOSが出てきて実行します。 しかし、実行した後すぐに終了してしまうので困っています。 合っているのか確認できません。 そのために一時停止用に型宣言のときに、 x:string;  end.の前に  readln(x)  を付けて止めるようにしているのですが、 プログラムによって止まるのと止まらないのがあります。 どうしてなのでしょうか。 ↓は止まりません。どうしたら止まってくれますか? 配列にデータを追加するプログラムです。 program ng; {$AppType Console} uses SysUtils; var  i, j, n, dat : integer;  a : array[1..100] of integer;  {一時停止のため変数名}  x:string; begin {配列にデータを入力する}  n := 6;  a[1] := 20; a[2] := 30; a[3] := 60;  a[4] := 70; a[5] := 80; a[6] := 90;  writeln('(1)現在の配列の内容');  for i := 1 to n do write(a[i]:3);  writeln;  writeln('(2)挿入するデータ?');  read(dat);  repeat    writeln('(3)挿入する位置?');    read(i);  until(i < n) and (i > 0); {配列への挿入}  for j := n downto i do a[j+1] := a[j];  a[i] := dat;  n := n+1; {挿入後の配列を表示}  writeln('(4)挿入後の配列の内容');  for i := 1 to n do write(a[i]:3);  {一時停止のためのread文}  readln(x) end.

  • array_intersectで空欄を比較しない

    お世話になります。 $arr1 = array(1,2,3); $arr2 = array(2,3,4); という配列が存在していたとき、これらすべてに共通する値を取り出すとき、 array_intersect($arr1,$arr2) で良いと思うのですが、上記に更に値があるか分からない配列($arr3,$arr4)を比較したいときどのように記述すればよいでしょうか? $array_list[] = $arr1; $array_list[] = $arr2; if($arr3 != NULL){$array_list[] = $arr3;} if($arr4 != NULL){$array_list[] = $arr4;} $array_list = implode(",",$array_list); と半ば強引に配列に追加したのですが、var_dump($array_list)したところ、 Array,Arrayとなってしまいました。 $arr3,$arr4に値が入っている場合と入っていない場合でif分岐させて、 array_intersect($arr1,$arr2) array_intersect($arr1,$arr2,$arr3) array_intersect($arr1,$arr2,$arr4) array_intersect($arr1,$arr2,$arr3,$arr4) の4パターンを書くこともできるかと思いますがスマートではないような気がしまして・・・。 なにかよい方法が有りましたらよろしくお願い致します。

    • ベストアンサー
    • PHP
  • c言語の問題です。解説と解答をお願いします

    (1) doube a[3][4]で宣言された2次元配列の要素a[y][x]に割り当てられるメモリのアドレス&a[y][x]を数式で表せ。x∈{0,1,2,3},y∈{0,1,2}である。 (2) 下記の宣言文によって複数個の配列要素に初期値を代入した。各配列要素に代入される値を説明しなさい。 char b[]={‘X’,’Y’,’Z’}; char c[]=“xyz”; char *d[]={“ONE”,”TWO”,”THREE”}; int e[3][2]={1,3,5,7,9,11}; お願いします。

  • 配列要素の値の入れ替え

    C++の問題で分からないものがあります。 10個の要素を持つ整数型配列を宣言し、for文を使用して各要素に順番に1~10の要素を代入する。次に、関数名RVを使用して配列要素の値を入れ替えにより10~1の順番に並べ替えなさい。各要素への直接入力は行わないこと。 という問題で、1~10までの要素を代入することは出来るのですが、配列要素の入れ替えとはどうやったら良いのでしょうか? 教えていただけませんか?お願いします。

  • 空の配列を示す方法

    Flash8を使用して、ActionScript2を書いています。 if文を用いて、「変数my_array(配列)が空の配列でない場合は~」 という条件分岐を書きたいのですが、 空の配列を示す方法がわかりません。 var my_array:Array = new Array(); とした上で、 if (my_array == null) { trace("null"); } else { trace("違う"); } と書いて調べてみたのですが、 nullでもundefinedでも""でも[]でも「違う」と表示されてしまいます。 「空の配列でない場合」という条件を書く方法はあるでしょうか?

    • ベストアンサー
    • Flash
  • 未定義の変数に対して条件分岐する際の対処法

    PHP 5.3 で次のような関数があったとして、配列$optionの内容によって条件を分岐するとします。 $optionに渡される値は不定で、空の場合もあれば$option['param3']などが渡されることもあります。 function sample($option=array()){ if($option['param1'] == 'test'){ echo "A"; } elseif($option['param2'] == 'test'){ echo "B"; } } もし引数に「$option['param3']='test'」だけが渡されたら、条件分岐の際に未定義の「param1」と「param2」はNoticeエラーを返すことになります。 「@」でとりあえず抑制したり、予想される全てのキーに対して初期化するなどがあると思いますが、 エラー表示レベルを変えずにこのエラーを消すにはどうするのが一般的ですか?

    • ベストアンサー
    • PHP

専門家に質問してみよう