C言語でのif文分岐について(PICで使用)

このQ&Aのポイント
  • C言語を用いてPICマイコンでプログラムを組んでいる中で、if文の分岐がうまく行かない問題が発生しています。具体的には、パルス幅に応じて個数を判別し、累積カウントをするプログラムで、パルス幅が100以上の場合に「2つ」とカウントするべきなのに「1つ」とカウントされてしまうという問題です。
  • プログラムの仕様は以下の通りです。まず、パルスの幅を計測するプログラムを実行し、計測したパルス幅に応じて個数を判別し、累積するという流れです。このプログラムは2ミリ秒の周期で実行されます。また、カメラの前に物体がある場合には累積カウントを行わないような設計になっており、そのためには「PP」という変数を定義しています。
  • 現在のアルゴリズムは自己流で作成されており、問題が発生しています。アドバイスや指摘があればご教授いただきたいです。
回答を見る
  • ベストアンサー

C言語でのif文分岐について(PICで使用)

お世話になります。 現在PICマイコンでC言語を用いて、プログラムを組んでいますが、煮詰まったので皆様のアドバイスを頂戴したく、質問させて頂きます。 問題点概要: if文の分岐がうまく行かない。 パルス幅を計測し、その幅に応じて個数を判別し、累積カウントをするプログラムです。 しかし、パルス幅での個数の判別がうまく行きません。 例)パルス幅100以上で「2つ」とカウントしたいところが、「1つ」とカウントする。 プログラム仕様: 1.パルスの幅を計測するプログラム 2.計測したパルス幅に応じて、個数を判別する。 3.個数を累積する。 4.表示する 1から3を2[ms]周期で実行しています。 ※カメラの前を物体が横切ると、カメラ出力がLになるので、そのエッジを見ています。 したがって、 カメラの前にずっと物体があると、出力がLのままなので、累積カウントがアップし続けます。 その時は、累積カウントをしないプログラムにしています。  → 一回目の検知時のみ累積カウントをアップさせる。 そのために、「PP」という変数を定義しています。 添付資料に、詳しく書いています。 見て頂けると幸いです。 カメラ出力の取り込みについて: 立ち上りエッジをCaptime_rise[Rise]; Riseは検知するたびに、インクリメントされます。(1から++) Downも同様です。 カメラは、物体を検知しないときは ______|‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾|________________ なので、Rise==Down==1です。 物体を検知すると ______|‾‾‾‾‾‾|_____|‾‾‾‾‾‾|______________ となります。 上述の通り、「カメラの前に物体がずっとある場合の、累積カウントアップ防止」の為に PP==1  // PPは前のRiseの値 の時のみ、累積を加算するようにしています。 PP==1の状態とは、物体を検知していない場合なので、この考えで大丈夫ではないかと思っています。 //プログラム抜粋 // 個数の計算 /* Captime[i] → 計測パルス Captime_rise[i] → 立上パルス Captime_down[i] → 立下パルス KOSU → 個数 KOSU_SUM → 累積個数 PP → 1つ前のサイクルのRiseの値 STD_width → 個数判別の基準値 */ if(Rise==1){ KOSU=0; Captime[1]=0; } else if(Rise==2){ // パルス幅の計算 Captime[0]=Captime_down[1]-Captime_rise[1]; // Captime[1]=Captime_rise[2]-Captime_down[1]; // 1つ目の検知 if(PP==1){ if(Captime[1]>STD_width) { KOSU=2; KOSU_SUM=KOSU_SUM+2; } else { KOSU=1; KOSU_SUM++; } } } else{ KOSU=9; } PP=Rise; アルゴリズムの考え方等が我流なので、皆様のアドバイスを頂けると幸いです。

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

  • ベストアンサー
  • koujikuu
  • ベストアンサー率43% (428/992)
回答No.2

1) ラインカメラで物体の大きさと、通過個数をカウントしていると思われますが、物体の大きさを最初の一回しかチェックしていません、物体が通過する間の一番大きい値で比較する必要があるのでは? 2) 割り込みキャプチャにおいて、Captime_rise[Rise]=IC2BUF、Captime_down[Down]=IC1BUF、のRise,Downの最大値のチェックが必要では? デバッグ方法 物体が通過する際の全てのキャプチャデータをパソコンへシリアル転送すれば、全体の流れがつかめると思います。

Snoodam
質問者

お礼

koujikuu様: >1) ラインカメラで物体の大きさと、通過個数をカウントしていると思われますが、物体の大きさを最初の一>回しかチェックしていません、物体が通過する間の一番大きい値で比較する必要があるのでは? →下名の勝手な判断で、現状はカメラの前に棒を置きっぱなしにしてパルス幅を測定していました。  その影響か、横から(落下方向でない方向から)物体を徐々にカメラ範囲内にいれると、KOSUが「2」と検出できていたので、なにか挙動がおかしいなと思っていました。 頂いたアドバイスをもとに、プログラムを考え直します。 >2) 割り込みキャプチャにおいて、Captime_rise[Rise]=IC2BUF、Captime_down[Down]=IC1BUF、の>Rise,Downの最大値のチェックが必要では? →これは、現状配列で4つまで定義しているので(Captime_rise[4])、3までのチェックということでしょうか。 現状の想定は __|¯|____|¯¯|__ のみで、一つ目のパルスの幅のみを計測する。 というものでした。2つめ以降は破棄するという考えと、PPを用いて前のサイクルのRise状態を見るという考えの乖離が、おかしな挙動を招いているのかもしれません。 >デバッグ方法 ありがとうございます。 LCDでの表示にばかりこだわっていました。 16FシリーズでTeraTermを用いてシリアル通信でのPC表示はしたことがあるので、教えて頂きました方法でデータも見て見ます。

Snoodam
質問者

補足

補足: 現状でKOSU=1と判別している最中に、KOSU=2のパルス幅を検知しても、KOSUの値が変わらないことに問題がありそうです。 パルス幅100以上で2と判断するプログラムで、50位の棒をカメラの前にすると、当然KOSU=1になります。 この状態で、棒をカメラに近づけてパルス幅を大きくし(光遮る範囲が大きくなる)、100以上にしてもKOSUが変化しません。 何かループの条件が意図しない動きなのかと思うので、もう一度洗ってみます。

その他の回答 (1)

回答No.1

コメントの入れ方が良くなく、想定外の処理を通っているのではないでしょうか? ----------------------------------------------------------- else// if (Captime[1] { KOSU=1; KOSU_SUM++; } ----------------------------------------------------------- 中括弧の数が合わないように見えるのでコンパイルが通ってるのかちょっと不思議ですが、『「2つ」とカウントしたいところが、「1つ」とカウントする。』そうなので、この辺りが怪しく見えます。 質問本文の抜粋コードが正とするならば、if文が怪しいと思います。 ----------------------------------------------------------- if(Captime[1]>STD_width) ----------------------------------------------------------- リンク先ですとコメントがついており、『計測値が、基準より小さいなら』とありますが、それだと不等号の向きが逆に思えます。 見当違いでしたら申し訳ありません。 アルゴリズムについては、カメラの前に物体がずっとある場合の波形が以下のどちらかわからないのでちょっと控えます。 1) ______|‾‾‾‾‾‾‾‾‾‾‾‾‾|___________________ 途中で物体が入る ______|‾|___________________________ 次の周のスタートで一瞬立ち上がる 2) ______|‾‾‾‾‾‾‾‾‾‾‾‾‾|___________________ 途中で物体が入る __________________________________ 物体がある限り次の周もずっとL アルゴリズム自体には関係ありませんが、変数名はKOSUよりCountや、PPよりPrevious_Riseなどが良いと思います。

Snoodam
質問者

お礼

y_mochiduki様: ソース全文まで見て頂きありがとうございます。 ********* >リンク先ですとコメントがついており、『計測値が、基準より小さいなら』とありますが、それだと不等号の向きが逆に思えます。 すみません。これは完全にコメント分のミスです。 色々試行錯誤をしてく中で、ifの条件の順番を入れ替えたりしたので、その名残です・・・ 中カッコの数は、もう一度確認します。 PICのエディターが、対応するかっこを、色付き反転で示してくれていますので、かっこの数自体は 間違っていないと考えていますが、 何度も「思い込み」で痛い目にあっていますので、もう一度確認します。 ********** カメラの前に物体がずっとある場合の波形は (2)です。 カメラは前方から光を投光し、光が当たるとHの出力を返します。 したがって、物体があると、Lになります。 ただ、カメラのアナログ出力をコンパレータ―を通していますので、スレッドショルドレベル付近で チャタリングの可能性も考えられることに、アドバイスを拝見して気づきました。 ただ、パルス幅も液晶に表示しており、正常な値を示しておりました。 (プログラムの構成上、チャタリングノイズを拾うと、計測するパルス幅が極端に小さくなるはずです) もしくは、デジタルオシロでは拾いきれないノイズや、y_mochiduki様が仰る(1)の状態が発生しているのかもしれません。(もう一度カメラの仕様も確認します) ******* 変数名についても、ありがとうございます。 Previous Pulseのつもりでしたが、考えてみれば「前の立ち上がり」なので、仰る通りです。 KOSUについては、下名の学の無さが滲み出ておりました・・・ ****** お忙しい中、ソースまで見て頂きありがとうございます。 もし、お時間が許すようであれば、アドバイスを頂けると幸いです。

関連するQ&A

  • C言語でのif文分岐について(PICで使用) 2

    http://oshiete1.watch.impress.co.jp/qa9017378.html で質問をさせて頂き、アドバイスを基に以下のアルゴリズムを追加しました。 (以前の質問では、間違って質問を締め切ってしまいました。 アドバイスを頂いた方に大変失礼なことをしてしまいました。申し訳ございません。) 1.パルス幅の最大値を保持する。 2.物体の通過後に累積個数を加算する。この時に、保持した最大値を用いる 従来はRise==2,PP==1の時に、累積加算+パルス幅の判別を行っていました。 このタイミングは、「物体の先端を検知した時」になります。 それを変更し、Rise==1,PP==2の時に、判別するようにしました。 このタイミングは「物体の通過後」になります。 質問: 「1」の「最大値の保持」のプログラムが意図した通りに動きません。 1ループ前のパルス幅を P_Captime[1]=Captime[1]; として保持し、 現在のループの計測値を比較を行い、現在の値の方が大きければ Max_Captime[1]=Captime[1]; とし、最大値を保持しています。 私の意図している動き: LCDに ・現在のパルス幅(Captime[1]) ・最大値 (Max_Captime[1]) を表示しています。 この時、LCDの表示が ・1ループ目 現在のパルス幅が50 →最大値も50 ・2ループ目 現在のパルス幅が20 →最大値は50のまま としたいのですが、 ずっと現在のパルス幅=最大値となり、 最後のパルス幅(物体が通過した最後のループ)がLCDに保持されたままになります。 例)上記の後、最後のループのパルス幅が30の場合、最大値は50でなく、30と表示される。 以下ソース抜粋 /* パルス有無の検知 Rise による識別*/ if(Rise==1){ KOSU=0; Captime[1]=0; } else if(Rise==2){ // パルス幅の計算 Captime[1]=Captime_rise[2]-Captime_down[1]; if(Captime[1]>P_Captime[1]){ // 最大パルスの取得・保持 Max_Captime[1]=Captime[1]; } } P_Captime[1]=Captime[1]; PP=Rise; /*抜粋終わり*/ ドツボに嵌っています。 あえて昨日は何も考えずに、もう一度ソースコードでなく、アルゴリズム図から見直してみましたが、うまくいきません。 /*****************************/ 冗長な文章でしたので、要約すると 1.パルス幅の最大値を保持する。 2.物体の通過後に累積個数を加算する。この時に、保持した最大値を用いる の「1.パルス幅の最大値を保持する」がうまくいかないので、「2」に進めずに 困っています。 となります。 アドバイスを頂けたら幸いです。 (もちろん自分自身でも、並行して考え直しています)

  • C言語 値の合計について(PICマイコン上)

    C言語、値の合計について(PICマイコンを使用) C言語のアルゴリズムについての質問です。 申し訳ございませんが、前提が長く、質問が後半にあります。 1.行いたいこと パルス幅を取り込んで、パルス幅を足しこんでいく。この値を面積とする。 2.仕様 ・500usでループを回しており、その都度、パルス幅を取得しています。 (パルス幅は1つであったり、複数であったりします。パルスの数を「Rise」という 変数で記憶しています。) ・そのパルス幅を取得し、一定ループ後に合計値を計算したい。 例) ___|¯¯|___|¯¯¯|___ Rise=1。中央のくぼみの幅を計算 ↓ ___|¯¯|_|¯¯|_|¯|____ Rise=2。中央2つのくぼみを計算 3.問題点 Riseの値でif分岐をした、べた書きしたプログラムと、より一般化したプログラムの 面積の値(SUM_Areaの値)が異なる。 一般化したものの方が値が大きくなる。 /*以下プログラム*/ // べた書き if(Rise==2){ Captime[1]=Captime_rise[2]-Captime_down[1]; //パルス幅の計算 Area[1] += Captime[1]; //面積計算 SUM_Area=Area[1]; //合計の面積 } // Rise==2 LOOP END else if(Rise==3){ Captime[1]=Captime_rise[2]-Captime_down[1]; Captime[2]=Captime_rise[3]-Captime_down[2]; Area[1] += Captime[1]; Area[2] += Captime[2]; SUM_Area=Area[1]+Area[2]; } // Rise==3 LOOP END else if(Rise==4){ Captime[1]=Captime_rise[2]-Captime_down[1]; Captime[2]=Captime_rise[3]-Captime_down[2]; Captime[3]=Captime_rise[4]-Captime_down[3]; Area[1] += Captime[1]; Area[2] += Captime[2]; Area[3] += Captime[3]; SUM_Area=Area[1]+Area[2]+Area[3]; } // 一般化したもの for(i=1;i<Rise;i++){ Captime[i]=Captime_rise[i+1]-Captime_down[i]; Area[i]+=Captime[i]; SUM_Area+=Area[i]; } 4.考察 一般化したプログラムの SUM_Area+=・・・・ の部分のみをifで場合分けすると、 (SUM_Area=Area[1]+Area[2]+Area[3]; の様にRiseの値で分岐) 値が一致したので この部分が悪さをしていると考えています。 5.質問 今回の場合はSUM_Areaの部分は、べた書き(Riseでの分岐)しか方法がないのでしょうか。 Riseが64個まであるので、プログラムが冗長になってしまいます。 宜しくお願いします

  • dsPIC33E でのインプットキャプチャについて

    問題点 概要: インプットキャプチャを用いて、ラインカメラの出力の幅を計測しようと考えています。 しかし、カメラ出力が無い場合でも、キャプチャをしてしまいます。 SHOEISHAの「組込みマルチタスクプログラミング」等の書籍でも勉強していますが 分かりません。 何かアルゴリズムのお勧めの書籍等も教えて頂けると幸いです。 添付画像のような信号図になります。 仕様: ラインカメラ:投光器を用いて、物体を検知すると信号が「L」になる。 そのエッジをキャプチャし、パルス幅を計測する。 ※但し、現状はエッジを検出すると、あるピンを反転させてキャプチャしたかの点検をしています。(オシロにて確認) 動作詳細: ・動作は120MHzです。 ・カメラはPICからクロックパルスを送り、それに応じて出力を返す。 1MHzのクロック(T=1[us])で129発。 その後は出力はOFFになり、リセットパルスが入力させるまで、信号を出力しない。 ・タイマ2にて上記クロックパルスをカウントし、130回目で、割込み。 (後にデータ送信等を行う) ・タイマ3にて500[us]毎にリセットパルスを送信を、割込みにて行う。 これでカメラがリセットされる。 上記のタイマ2での割込み後です。 ・メインループ内では、インプットキャプチャフラグを見ており、フラグONで RB13ピンを反転させる。 (後に、タイマ1を用いたキャプチャ値の計算を実装予定) 問題点 詳細: カメラの前に物体が無いと、信号は「H」です。 しかし、129回クロックパルスを与えると、カメラ出力は「L」になります。 この部分も検知してしまい、冒頭に述べたように、「カメラ出力が無い場合でもキャプチャをする」事態になっています。 (1)物体を検知していない状態のカメラ出力   ここでは、本来であればキャプチャは行わない ____________|¯¯¯¯¯¯¯¯¯|_________________ (2)物体を検知した状態 ____________|¯¯¯|___|¯¯¯¯ |_________________ 現状のプログラムでは、(1)の場合のエッジを検知してしまいます。 目的は(2)の状態の中央部のエッジ2つのみをキャプチしたいのです。 考察 調査した点: (1)main内のwhile(1)内で、無限にキャプチャのフラグを見ていますので タイマ2の値でのifを付けた。 TMR2が、1<TMR2<129の間のみキャプチャフラグを見る ! (1-1)上記の改良で、キャプチャフラグ検知後に、TRM2の条件分岐 (2)キャプチャを行うタイミングでのみ、インプットキャプチャをONにする。 リセットパルス後、インプットキャプチャON、クロックパルス130回目でインプットキャプチャOFF いずれも、うまくいきませんでした。(カメラが物体を検知していないのに、キャプチャをすると出力反転するピンが反転している) 要約は、 mainの無限ループ内でインプットキャプチャを行っており、それを条件に合わせてON/OFFしたいのですが、上手く行きません。 長文になりましたが宜しくお願い致します。 参考文献等の案内でも大歓迎ですのでお願いします。

  • PIC10F系で参考プログラムを伝授ください。

    PIC10F系でパルス波形検知の参考プログラムを伝授ください。 マイコン初心者です。 ネットと本を数冊読んで、何とかPICマイコンにアセンブラで書き込み スイッチでLEDをオンーオフするぐらいはできるようになりました。 そこからかなりのステップアップかもしれないのですが、 皆さんのご教授をお願いします。 あるパルス波形のみ検知し それ以外は無視する場合、タイマーとかカウントとか 使用したりするみたいですが、 具体的にはどのようなプログラムになるのでしょうか? 検知したい矩形波形は200Khzでデューティー比20%と仮定し 波形入力中は出力をし 内部クロック4MHzを使用したいです。 なるべく、入力する波形の5カウントぐらいで判別したいです。 参考文献等もございましたら、お願いします。 以上、よろしくお願いします。

  • 16ビットPICのインプットキャプチャについて

    dsPICやPIC24の16ビットPICのインプットキャプチャについて お世話になります。16ビットPICのインプットキャプチャは、8ビットのPIC(特に16F1ファミリ)のCCPモジュールと使用方法がどこか違うのでしょうか。 16ビットPICはバッファを4つ持っており、値を4つまで保持できるはずですが、パルス幅計測がうまくできません。 現在dsPIC33Eを使っています。 皆様のアドバイスを頂けると幸いです。 問題点: 以下のパルスを計測すると、値がおかしくなる。 ㅤAㅤㅤ Bㅤㅤ CㅤㅤD ___|¯¯¯¯|_________|¯¯¯¯¯|______ ・B-Aでは正常 ・D-Cでも正常 ・しかし、C-Bをすると値が狂う。 値の確認方法: LCDにて表示。 タイマ1をキャプチャ用タイマとしている。(分解能は0.1336us) オシロでの計測値が120usの時、LCDの表示は「896」なので 896*0.1336=119.705us なので、正常と判断しています。(B-AやD-Cでパルス幅を計算時) プログラム仕様: メインループ内で、キャプチャを行う。 IC1で立下りエッジを検出 Captime_down[0]=IC1BUF;ㅤㅤ上図のDエッジ Captime_down[1]=IC1BUF;ㅤㅤ上図のBエッジ IC2で立ち上がりエッジ検出 Captime_rise[0]=IC2BUF;ㅤㅤ上図のCエッジ Captime_rise[1]=IC2BUF;ㅤㅤ上図のAエッジ 2msでタイマ3割込みが入り、値を計算し、表示 Captime[0]=Captime_down[0]-Captime_rise[0];ㅤㅤD-C Captime[1]=Captime_down[1]-Captime_rise[1];ㅤㅤB-A この時にC-B Captime_rise[0]-Captime_down[1] を行うと値が理論値をはるかに超えた19000等の値になります。 考察: インプットキャプチャに使用のタイマ1のオーバーフローも疑いましたが オーバフローしている形跡はありません。以下を試しました。 (1)タイマ1は0.1336usでカウントUP。 FFFFまで8755us=8.7ms必要。今回は2msで回し、値もクリアしている。 (TMR1=0) (2)タイマ1がオーバーフローすると、別ピンがON →ONしていないのでオーバーフローしない バッファの使い方?がおかしいのか? Captime_rise[0]-Captime_down[1] と配列の要素が違う計算(バッファの位置とでも言うのでしょうか、 キャプチャしたタイミングの違う値→[0]でのエッジ検出と[1]で タイマ1の値が変わる?) リファレンスマニュアルや書籍も読んだのですがわかりません。 アドバイスを頂けると幸いです。

  • IC16F1829でのCCPモジュールについて

    PIC16F1829でのCCPモジュールを使用した、パルス幅のキャプチャについて 割込み関数を用いたら、mainループ内でCCP*IFを検知しません。状況: CCPモジュールを用いて、パルスの幅を計測しようとしています。CCP単独での動作では、パルス幅を計測できました。 ここでの「単独」とは、割り込み関数を用いないmainループ内での処理です。 //「単独」での仕様 // (1)CCP2モジュールでPWMパルスを発生する (2)上記パルスをCCP1で立下がり、CCP4で立上がり検出する (3)上記の値の差を計算 (4)I2C通信でLCDに表示 これで、タイマ1の分解能を1usに設定し、パルスのOFF時間を計測できました。 問題: PICにラインカメラを接続し、カメラの出力パルスOFF幅を計測したいのですが できません。 原因: mainループ内 if(CCP1IF){ } に処理が入らない。 質問: なせCCP1IFを検知できないのでしょうか。 割込み関数を入れると、検知できないようになってしましいます。 何か競合するのでしょうか。 PICでは割込み関数の処理が終わるまでは、ほかの割込み禁止なはずなので 下に書いてある、フローチャート通りにプログラムが動くはずなのですが・・ 私の力不足で、うまく動作しません。 後閑さんの本やPIC16F1829のデータシートも見ましたが原因がわかりません。 よろしくお願いします。 仕様(フローチャート): 概要 割込み関数は ・タイマ0 (CCP2のパルスカウント) キャプチャした値の計算とシリアル送信を行う ・タイマ4 (20ms周期でリセットパルスを生成) メイン関数は ・CCP1で立下りエッジ検出 ・CCP4で立上がりエッジ検出 ****** タイマ0の割込みは約13msです。 タイマ4は20msです。 時系列で言うと (1)プログラムスタート~タイマ0割込みまで(0~13ms) main関数が走り、パルスのエッジをキャプチャする (はずですが、現状CCP1IFを検知できません) (2)タイマ0割込み中(13~19.9ms) キャプチャの値の計算とシリアル送信 (3)タイマ4割込み発生(20ms) リセット信号と全ての値のクリア

  • PICでパルス数をカウントする方法

    PICで不規則な幅のパルス数をカウントする為にはどうのようなプログラムになるのでしょうか? ループで入力ポートを監視するのでは出来ないように思うのですがどのような方法を用いると出来ますでしょうか?

  • どのような統計分布?

     入射光としてパルスレーザーを用いた蛍光測定を行っております。検出を高感度に行うため,入射パルスと同期して生じた蛍光のフォトン数をカウントし,そのカウント数から蛍光強度を求めたいと考えております。  ここで一つ問題があるのですが,入射光のパルス幅が非常に狭いため,各入射パルスに対して蛍光が発生したかどうかは判別できますが,一回の入射光パルス内で複数の蛍光フォトンが発生していても,そのフォトン数を正確に数えることができません。この場合,カウント数は1カウントと数えられてしまいます。よって,蛍光カウント数と入射パルス数との値が近くなってきた場合,蛍光強度は蛍光カウント数に比例しなくなり,下の式には従わなくなってきます。    蛍光カウント数   ---------------- = 蛍光強度 (強度が低いときのみ成立)    入射光パルス数  なぜなら,上の式が成り立つ前提条件として,「検出する各パルスが,蛍光1フォトンによるものである」という条件があるからです。つまり,1パルスの入射光に対して,蛍光が2光子含まれる確率,および3光子含まれる確率が無視できなくなってくると,蛍光強度は実際の強度よりも低く見積もられることになります。  何らかの統計的な手法を用いることによって,正確な蛍光強度を算出できるのではないかと思うのですが,一体どのような統計分布に従うのか,具体的にどのような計算をして蛍光カウント数を処理すればよいのか分かりません。  どうか,よろしくお願いいたします。

  • 配列の乱数と平均値、個数表示

    0から9までの整数乱数を100個発生させ、100個の乱数の平均値も合わせて出力し、0から9それぞれの個数を数えるための変数に必ず配列を用いるプログラムを下記に作成したんですけども、出現個数カウント用の変数を10個用意していけないという条件で出現個数カウント用の配列を用意し、 結果が、 7 7 1 7 3 9 1 2 5 0 0 3 6 8 4 9 1 4 2 4 8 2 4 2 6 0 9 3 5 8 6 6 6 2 0 9 5 2 6 9 5 0 5 3 9 2 6 7 0 6 1 4 1 1 1 9 7 0 5 0 6 9 7 4 9 9 7 5 3 6 1 9 6 6 6 7 1 2 6 1 4 9 1 3 1 3 7 0 0 8 1 9 3 2 9 4 4 5 4 0 0 *********** 11 1 ************* 13 2 ********* 9 3 ******** 8 4 ********** 10 5 ******** 8 6 ************** 14 7 ********* 9 8 **** 4 9 ************** 14 平均 4.4 に表示されるプログラムがわかりません、Java初心者なので作ったプログラムのどこを直せばいいのか教えてください。 class Kadai06_5 { public static void main(String args[]) { int n=10; int a[] = new int[n]; int i; int sum=0; double avg=0; for(i=0; i<100; i++){ System.out.print((int)(Math.random()*10)); sum +=(int)(Math.random()*10); } for(i=0; i<n; i++){ System.out.println(); } avg=(double)sum/100; System.out.println("平均"+avg); } }

    • ベストアンサー
    • Java
  • C言語 if文について

    #include <stdio.h> int main(void) { int a; printf("整数を入力してください:"); scanf("%d",&a); if(a % 10 == 5) puts("最下位の桁は5です。"); else puts("最下位の桁は5でありません。"); return 0; これでどうして読み込んだ整数値の最も下の桁が5であるかどうかを判断しているのでしょう? ifの式がいまいち理解できません。 解説できる方いませんか?

専門家に質問してみよう