すいません。ちょっとわからないので、質問させて頂きます。

Delphiで下記のようにIntegerの配列を宣言したとします。
var hoge : array [1..5] of integer;
この配列の全ての要素のうち、ひとつでも「1」(いち)と言う値であれば、
配列の全てを「0」(ぜろ)にすると言う条件分岐(if)を作りたいのです。

どのようにして作ればいいでしょうか?
一つずつ下記(途中までですが)のように書けば出来そうですが、配列の数が
増えた場合に大変面倒な事になりそうなので、何か良い知恵があれば
よろしくお願い致します。

if( (hoge[0]=1) or (hoge[1]=1)・・・・){
//配列全てに0を代入

このQ&Aに関連する最新のQ&A

A 回答 (2件)

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;


// 簡略化のため無駄なループを回してます(^^;

この回答への補足

ご回答ありがとうございます。

forループを使えば、数がいくつ増えても大丈夫ですよね^^
noOfArrayの所も配列の要素数を取得するようにすれば、
どのようにも対応できそうです。

さらに質問となってしまいますが、多数の場合には、terra5さんの
お答えにて対応したいと思いましたが、配列の要素数が例えば、
3個だけに限定されている場合は、自分の手で3つ分の値を「1」と
比べて・・と言うように記述するのでしょうか?
なんか、スマートに書ける方法をご存知の方がいれば教えて欲しいのですが。。

if( hoge[0..3] = 1){
//ここで処理
}

みたいに簡潔に書く事はできないでしょうか?
みなさんは、どのようにされているのでしょうか?
3つくらいでもループを回すと言う書き方をしているのでしょうか?
それとも、3つ限定なら、ごりごり3個と比較する書き方をしているのでしょうか?

質問だらけとなってしまいますが、よろしくお願い致します。

補足日時:2002/01/30 10:06
    • good
    • 0

>3個だけに限定されている場合は、自分の手で3つ分の値を「1」と


>比べて・・と言うように記述するのでしょうか?
>なんか、スマートに書ける方法をご存知の方がいれば教えて欲しいのですが。。

場合によりますね。
2回でもループにすることもあります。
ループにする場合は、回数が変化する可能性がある場合、ループにした方が見やすいと思われる場合,
タイプ数が少なくなる場合(笑)なんかですね。


見た目を簡潔にするには、関数などで書き換えるぐらいでしょう。

>if( hoge[0..3] = 1){
私が知る範囲では、こういう記述ができる言語はないです。
でも、もしあったとすると、直感的には全て1の場合という意味にとりますね(^^;
    • good
    • 0
この回答へのお礼

またまたの回答、ありがとうございます。

配列の要素数が変化する場合などは、ループにしておくと
要素数が変化しても対応できるので、そちらを使うのがよいのですね!
状況によって、使い分けるようにします。

>見た目を簡潔にするには、関数などで書き換えるぐらいでしょう。

ソースを綺麗に見せたい場合は、関数化して、外にだしておけばよいのですね。
結構、わかってきました。
色々とアドバイスして頂き、助かりました。
ありがとうございました。

お礼日時:2002/01/31 09:51

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qaccess2003 クロス集計クエリに抽出条件を設定する

QNo.3495024にて、「取引先ごとの月次売上(部品別および合計)」をフォーム形式で表示する方法を質問した者です。
1)クロス集計クエリの抽出条件としてこのコンボを設定
2)フォームに置いたボタンでクロス集計クエリまたはそれをソースにした別フォームを開く
という方法を教えていただきました。

昨夜から自分なりに調べましたが、1)のクロス集計クエリに抽出条件を設定する方法がわかりません。 昨日の今日で再質問も気が引けますが、時間がないので質問させてください! ご存知の方、よろしくお願いいたします。

Aベストアンサー

>クロス集計クエリに抽出条件を設定する方法がわかりません。
クロス集計クエリでもデザインビューは同じですよ
異なるのはクロス集計クエリではパラメータのデータ型指定を省略できないという点だけです

[クエリ][パラメータ]でパラメータ名とデータ型を指定してください

Q[platex] description環境でのitemのオプション([]内)で]という文字を使うには?

\documentclass[12pt]{jreport}
\begin{document}

単位は[mm]のように鍵括弧でくくって書くことにします

\begin{description}
\item[5[cm]の時]{5[cm]の時と表示されるのが望んでいる動作。実際は先の括弧で終わったと解釈されてしまい、5[cmの時]となってしまう。
バックスラッシュを使おうとしても「Bad math environment delimiter.」というエラーが表示されてしまう。どうするのが正解か?}
\end{description}
\end{document}

Aベストアンサー

\item[5[cm]の時]

\item[5{[cm]}の時]
としてください。

Q住所録から2つ以上の条件で抽出する関数について

Windows Excel 2003で住所録から2つ以上の条件で抽出するにはどんな関数を使えばいいですか?

例えば住所録で『TELとFAXが異なっている番号の別々のセル』と『TELとFAXが同じ番号のセル(TELとFAXが同じなのでFAXのセルは空欄)』尚且つ『Eメールのある会社名』を抽出する関数はありますか?

Aベストアンサー

どういうレベルで要っているのかわかりませんが
>関数はありますか?
単独関数ではありません。2つ以上の関数を組み合わせたり、作業列を使ったりすれば出来るといえます。
単独の関数はあるとも無いとも言えるが、該当分行がつめたカタチでは単独の関数ではありません。
該当が飛び飛びで出てよいなら、IF関数で簡単に出来ます。これわかりますね。
A1 TELNO,B1 FAXNOとして
C1に =IF(A1<>B1,A1,"") D1に=IF(A1<>B1,B1,"")  でよいわけです。
 ここの質問に出るレベルは、ほとんど関数の組み合わせが必要です。
ーー
Googleで「imogasi方式」で照会してください。条件をかけて、抜き出す課題が相当数出てきます。
回答は
A.関数の組み合わせー作業列なし
B.関数の組み合わせー作業列を使うー>Imogasi方式など
などの回答が見られます。
もちろんフィルタやフィルタオプションの設定のお勧めの回答もあるでしょう。
私見では、A.の式が理解できたら、関数は9割5分は卒業です。
関数に拘らず、データ^フィルターフィルタオプションの設定
をお勧めします。(データーフィルタではないですよ)

どういうレベルで要っているのかわかりませんが
>関数はありますか?
単独関数ではありません。2つ以上の関数を組み合わせたり、作業列を使ったりすれば出来るといえます。
単独の関数はあるとも無いとも言えるが、該当分行がつめたカタチでは単独の関数ではありません。
該当が飛び飛びで出てよいなら、IF関数で簡単に出来ます。これわかりますね。
A1 TELNO,B1 FAXNOとして
C1に =IF(A1<>B1,A1,"") D1に=IF(A1<>B1,B1,"")  でよいわけです。
 ここの質問に出るレベルは、ほとんど関数の組み合わ...続きを読む

QTexで[0:0]を文頭でつかいたいのですが。

pLatex2εを使っています。文頭で[0:0]と言う記述を書きたいのですが、どのような設定が必要なのでしょうか。\[0:0\]としてしまうと[ ]が表示されず、0:0となりそれに続く文字が改行されてしまいます。文頭に[0:0]と書いてしまうとIllegal unit of measure (pt inserted)
とエラーが出てしまいます。文中ではちゃんと表示されるのですが。

Aベストアンサー

$[0:0]$
とか書くと大丈夫なんじゃないでしょうか。
ちなみに、\[[0:0]\]でも表示されます。
$とか\[\]で囲んでやると数式モードに移行するのですね。
後者の場合は独立した行になります。

Q別シートに複数条件を選択すると抽出され合計値がでてくるような関数はありますか

毎日、以下のような作業内容が手元にくるのですが今までは手でノートに振り分け管理していたのですが、エクセルの関数で別シートに複数条件を選択すると抽出され合計値がでてくるような関数はありますか。
よろしくお願いします。

↓毎日くる作業内容です。
ex)これを日ごとにシートに入力して、別シートに項目の班替え選択→内訳選択→班長を選択→形を選択→該当する全日付から時間が抽出され合計時間がでてくる

Aベストアンサー

条件をかけるとして、条件該当の明細を必要としているのか、合計だけでよいのか、質問ではっきりしない。添付画像通常は小さくなり見にくい。
質問文に簡略化した1例(10行以内でよい)を挙げて質問すべきだ。要点を掴む能力と思考力が鍛えられる。
>ex)これを日ごとにシートに入力して、別シートに項目の班替え選択→内訳選択→班長を選択→形を選択→該当する全日付から時間が抽出され合計時間がでてくる、の部分。
4条件で加算の例か。
====
条件該当分の明細を出すなら
データーフィルタオプションの設定で出来るはず。
関数関数と言うが、エクセルは第1的には、操作の体系のソフトですよ。他シートにデータを出すのは、他シート側で操作を始めてください。
ーー
関数なら、自称「imogasi方式」で出来ると思います。
Googleで「imogasi方式」で照会すれば数百の例が出ると思います。
現データシート(Sheet1)条件該当分の行にだけ、上の行から順に連番をフリ(式の複写を使う)、他シート(Sheet2)で
Sheet2の行1に-->Sheet1の連番1の行をINDEX関数で持ってくる。
Sheet2の行2に-->Sheet1の連番2の行をINDEX関数で持ってくる。
・・以下同じ。
これを式の複写で自動で行える。
=====
合計だけで良いのなら、多分、条件が多数のものに対する合計をほしい、になり、条件値の組み合わせを手作業でセルにセットするのか、操作関数で出すのかも質問に書いてない。合計を出すより、この条件データを揃える方が、いつも言っているが、難しい。
>複数条件を選択すると抽出され合計値がでてくるような関数
これが文字通り合計計数だけでよいなら、毎日ここに質問が出る
SUMPRODUCT、SUMIFSのどちらかをつかえだけ。質問にエクセルバー順が書いてないのは、エクセルの勉強経験不足。
2007で便利な関数が出来たのは有名な話。

条件をかけるとして、条件該当の明細を必要としているのか、合計だけでよいのか、質問ではっきりしない。添付画像通常は小さくなり見にくい。
質問文に簡略化した1例(10行以内でよい)を挙げて質問すべきだ。要点を掴む能力と思考力が鍛えられる。
>ex)これを日ごとにシートに入力して、別シートに項目の班替え選択→内訳選択→班長を選択→形を選択→該当する全日付から時間が抽出され合計時間がでてくる、の部分。
4条件で加算の例か。
====
条件該当分の明細を出すなら
データーフィルタオプション...続きを読む

Q[Oracle]と [PL/SQL]の違い

[Oracle]と [PL/SQL]の違いを
コンピュータの知識がまったくない人に教えたいのですが、
どうすればよいですか。

Aベストアンサー

[Oracle]とはオラクル社により提供されているデータベースです。
[PL/SQL]とは、そのデータベースへアクセスするための(オラクル社により開発された)言語です。
即ち、[PL/SQL]を使用することにより、[Oracle]へデータ(情報)を書き込んだり、取り出したりすることが出来ます。
これを倉庫に例えれば、[Oracle]が、倉庫であり、この倉庫に品物を格納し、必要があれば、そこから取り出します。そうすると、[PL/SQL]は、倉庫の管理人と考えることが出来ます。私たちは、倉庫の管理人に依頼して、倉庫に品物を保管してもらい、必要があれば、また、管理人に依頼して、その品物を取り出してもらいます。

Qエクセルにおいて複数の条件から抽出することができる関数(式)を教えてください。

皆さんどうか教えてください

エクセルにおいて複数の条件から抽出することができる関数(式)を教えてください。

400  70円  ad   6個
700  60円  da 7個  
100  30円 ad   9個
400  50円  ad   10個


などの表で、400で70円でadなものの数を求める
条件で数値を求めるにはどうすればいいのでしょうか

また条件にあったデータに6個などの数値をかけて合計した数値を求めるにはどうすればいいのでしょうか

関数でできる方法をお願いします。


あと”なおかつ”などの条件を行う関数も教えてください

どうかヨロシクお願いします。

Aベストアンサー

#4さんの回答で解決しませんか?

1行に複数のデータが入力されており、全ての列を満たす行数をカウントしたいということですか?
カウント対象が1万行あるとすると
=SUM((A1:A10000=A列の条件)*(B1:B10000=B列の条件)*(C1:C10000=C列の条件)*(D1:D10000=D列の条件)・・・)
と必要なだけ入力し、ctrlキーとshiftキーを押しながら
enterキーで式を確定して下さい。そうすると式が
{=SUM((A1:A10000=A列の条件)*(B1:B10000=B列の条件)*(C1:C10000=C列の条件)*(D1:D10000=D列の条件)・・・)}
という風な括弧で括られます。(配列数式になる)

列の条件は、数値ならそのまま、文字列なら""で囲います。
セルを指定しても構いません。
(1行目と同じ場合のみカウントという事であれば=A$1等となる)

もし、例の場合でいう400でadの場合の金額*個数を求めたいなら
(例では70円*6個+50円*10個で920円)
=SUM((A1:A10000=400)*(C1:C10000="ad")*(B1:B10000)*(D1:D10000))
をctrlキーとshiftキーを押しながらenterキーです。

後は応用です。

#4さんの回答で解決しませんか?

1行に複数のデータが入力されており、全ての列を満たす行数をカウントしたいということですか?
カウント対象が1万行あるとすると
=SUM((A1:A10000=A列の条件)*(B1:B10000=B列の条件)*(C1:C10000=C列の条件)*(D1:D10000=D列の条件)・・・)
と必要なだけ入力し、ctrlキーとshiftキーを押しながら
enterキーで式を確定して下さい。そうすると式が
{=SUM((A1:A10000=A列の条件)*(B1:B10000=B列の条件)*(C1:C10000=C列の条件)*(D1:D10000=D列の条件)・・・)}
という風な括弧...続きを読む

Qverilog HDLの[=]と[<=]の使い分け

現在Verilog HDLを勉強しており、ひと通り勉強は終わりました。
しかしブロッキング代入[=]とノンブロッキング代入[<=]の使い分けをどこまで暗記すれば良いのか分かりません。
皆様は、[=]と[<=]の使い分け、あるいはネット型、レジスタ型への代入をする際の区別をどのように暗記していますか?「このポイントを理解すれば大丈夫!」みたいなことを教えていただけると助かります。

今思いつく例としては↓のとおりです
・assign文では[=]を使用しなければならない。
・assign文の左辺は[ネット型]のみ
・case文のHPによって[=]を使用しなければならない。
・ http://veri.jp/ba_nba.html のHPの最後のほうで『ほかにも「assign 文では NBA "<=" が使えません」という誤った注意書き』と書いてありますが、この記述の意味がわかりません。
・回路記述ではダメなのに、シミュレーション記述では問題がない等等、、、
他にもfunction文やalways文の中で式を書く時にも困っています。

Aベストアンサー

> http://veri.jp/ba_nba.html
こんな良い解説ページを見つけたのに、なぜ質問しているのかがよく分かりませんが・・・。

まずassign文は継続的代入であって、ブロッキング代入でもノンブロッキング代入でもないので、
ブロッキング代入とノンブロッキング代入の使い分けという議論の対象外です。

また、ブロッキング代入とノンブロッキング代入はレジスタ型に対して使う、
継続的代入はネット型に対して使う、
となるため、型でブロッキング代入とノンブロッキング代入の使い分けなんて言う議論は最初からできないです。(どちらもレジスタ型が相手だから)


解説ページにも書かれていますが、
ブロッキング代入とノンブロッキング代入の違いは、
"右辺の評価" と "左辺への代入" が同時に行われるか、別々に行われるかの違いです。

たとえば、
a = x;
b = a;
としたとき普通のプログラミング言語のように、bもxになって欲しいなら、ブロッキング代入を使いますし、
bにxが代入される前のaの値が入って欲しいなら、ノンブロッキング代入を使うことになります。


always文でFFを生成するときは、その時刻においては代入前の値を参照したい(実際の回路を考えると代入後の値を参照できるのは次のクロックがやってきたときだから)ので、
ノンブロッキング代入を普通は使いますね。
(ブロッキング代入だとレーシング=記述順序で結果が変わってしまうという問題があるというのもありますが。)

それ以外(組み合わせ論理を作るalways、function、シミュレーション記述)は、
特に理由がなければブロッキング代入を使っています(変数を直ちに更新して欲しい場合がほとんどだから)が、
前述のノンブロッキング代入の挙動を理解した上でノンブロッキング代入が必要だと思ったなら
使っていけないわけではないです。

> http://veri.jp/ba_nba.html
こんな良い解説ページを見つけたのに、なぜ質問しているのかがよく分かりませんが・・・。

まずassign文は継続的代入であって、ブロッキング代入でもノンブロッキング代入でもないので、
ブロッキング代入とノンブロッキング代入の使い分けという議論の対象外です。

また、ブロッキング代入とノンブロッキング代入はレジスタ型に対して使う、
継続的代入はネット型に対して使う、
となるため、型でブロッキング代入とノンブロッキング代入の使い分けなんて言う議論は最初からでき...続きを読む

Q条件に合うデータを抽出する関数

EXCELで、条件に合うデータを抽出し個数を表示させたいと思っています。
ただしSUMPRODUCTなどの『複数条件の設定』ではなく、『特定の文字列を除く』
という形で設定したいのですが、そのような関数はありますか?

Aベストアンサー

=COUNTIF(範囲,"<>*文字列*")
で出来ませんか?
=SUMPRODUCT(ISERROR(FIND("文字列",範囲))*1)
でも同じに出来ますけど...

Q[プログラミング][画像処理]勉強法をおしえてください

プログラミングを勉強しようと考えています。

学生時代(10年前)にC言語を習い、実験で使う簡単なプログラムを作ったことがある程度です(ちなみに情報系の学生ではなく機械系です)。簡単な文法をなんとなく覚えている程度でC++?? JAVA?? オブジェクト?? な感じです。

直近でやりたいことは...
「画像から複数の円を探して中心の距離を測定する」です。
それができたら、他にも色々とやってみたいと考えています。

少ししらべてみたのですが、
・画像を読み込んでハフ変換と処理をするプログラムを作ればいいらしい。
・ハフ変換をするソースコードは探せばいくらでもありそう。
・ただソースコードがあっても実行させるスキルはない。
・パラメータは自分でいじりたい。
・OpenCVというのを使えば、画像処理がいろいろできそう。

ImageJというフリーソフトを使えばなんとなく円を検出するこてゃできたのですが、
距離を測ったり、円以外のものを検出したりと、自分でソースコードをいじれるレベルにはなりたいで
す。

そこで何から手をつけたら良いのか教えて頂けないでしょうか。
まずはCを思い出すところから?
それともJAVAとか他の言語を基礎から勉強する?
それともOpenCVとやらをとりあえずインストールしてみる??

アドバイスを頂けないでしょうか。よろしくお願い致しますm(_ _)m

プログラミングを勉強しようと考えています。

学生時代(10年前)にC言語を習い、実験で使う簡単なプログラムを作ったことがある程度です(ちなみに情報系の学生ではなく機械系です)。簡単な文法をなんとなく覚えている程度でC++?? JAVA?? オブジェクト?? な感じです。

直近でやりたいことは...
「画像から複数の円を探して中心の距離を測定する」です。
それができたら、他にも色々とやってみたいと考えています。

少ししらべてみたのですが、
・画像を読み込んでハフ変換と処理をするプログラム...続きを読む

Aベストアンサー

ご自分で答えを出されていますよね。
まずはまったくの初心者のつもりで必要な言語を基礎から勉強しましょう。
昔少しかじったからなどと基礎をおざなりにすると、必ずあとで後悔します。
OpenCVだってライブラリなのですから基礎言語が理解できていなければ使えません。
ベテランSEでも基礎マニュアルを見直すことは欠かしませんので
自分がやりたいことを早く実現したい気持ちはわかりますが焦らず1から学びましょう。
中途半端に手を付けると、事あるたびにこうして質問サイトに投稿するハメになりますよ。


人気Q&Aランキング

おすすめ情報