質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

876閲覧

C言語の条件判別

yamata

総合スコア36

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/11/29 03:14

編集2016/11/29 05:41

C言語で条件判別を行いたいです。

やりたいことは、
1-30枚の画像(number)が用意してあり、
もし、1枚目の画像がある数字以上なら2枚目に
もし、2枚目の画像がある数字以上なら3枚目に
もし、3枚目の画像がある数字以上なら一致を表示して、4枚目(1枚目)に
以上のように3枚を1セットのループにしたいと考えています。
また、1枚目、2枚目、3枚目で数字以下を示せば、次の画像を1枚目として、再度ループを開始するプログラムを作りたいです。

わからない部分は、ある数字以下の場合に、ループを抜けて次の画像を1枚目として再度ループを開始する部分が分かりません。

よろしくお願いします。

イメージ説明

a,bの値は、画像処理によって得られる数字です。

if(a>0.4 ll b>0.4) { number++; if(a>0.5 && b>0.4) { number++; if(a>0.4 ll b>0.4) { printf("一致"); } } }

画像の1が常に1枚目(スタート)ということにしたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

continueを使うのはどうですか?

###追記
こんなの?

int main(){ // 1-30枚の画像(number) int arr30[30] = {4,7,6,3,4,9,7,3,2,9,4,7,3,1,2,4,6,7,6,8,0,8,5,4,2,4,2,5,6,8}; // ある数字とりあえず5とする int arusuji = 5; int i; for(i=0;i<30;i+=3) { if(arr30[i]<arusuji) { // 1枚目がある数字より小なので次のループへ continue; } if(arr30[i+1]<arusuji) { // 2枚目がある数字より小なので次のループへ continue; } if(arr30[i+2]>=arusuji) printf("一致"); } return 0; }

##追記

int main(){ int arr30[30] = {4,7,6,3,4,9,7,3,2,9,4,7,3,1,2,4,6,7,6,8,0,8,5,4,2,4,2,5,6,8}; int *p; p = arr30; int i=0; // 何枚目? int arusuji = 5; while(p<=&arr30[29]) { if(i++<2) {// 1 or 2 枚目の処理 if(*p++<arusuji) i = 0;//1枚目に戻す } else {// 3枚目の処理 if(*p++>=arusuji) printf("一致\n"); i = 0;//3枚目の処理が終われば無条件に1枚目に戻す } } return 0; }
質問に追記されている条件を使うなら、ただし画像が30枚というのがどのように管理されているかわからないのでwhileの条件は日本語になっている、またnumberで1枚目なのか2枚目なのか3枚目なのか判断しているが使い道がわからないのでインクリメントとクリアしているだけですが、、 int number = 0;// 何枚目? while(画像が30枚の最後に辿り着くまで) { if(a>0.4 && b>0.4) { number++; } else { number = 0; continue; } if(a>0.5 && b>0.5) { number++; } else { number = 0; continue; } if(a>0.4 && b>0.4) { number++; } else { number = 0; continue; } printf("一致"); number = 0; }

###追記

int gazousyori(int); int gazousyori(int number) { if(number<30) { // 画像処理 // return 1; } else return 0; } int main() { int number=0; // 30枚の画像を走査するインデックス int i = 0; // 内枚目として処理するかのインデックス while(gazousyori(number++)) { if(i < 1) { // 1枚目として処理 if(!(a<0.4 || b<0.4)) i++; } elseif(i < 2) { // 2枚目として処理 if(a<0.5 || b<0.5)        i = 0; else i++ } else { // 3枚目として処理 if(!(a<0.4 && b<0.4)) printf("一致"); i = 0; } } }

投稿2016/11/29 03:32

編集2016/11/29 06:43
hiim

総合スコア1689

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamata

2016/11/29 03:58

continueは有効に使えそうです。 この場合は、1枚目(i)で数字以下でcontinue(スキップ)した場合、次に(i+1)のプログラムが実行されると思います。 数字以下になった段階で、if(arr30[i]<arusuji)に戻ることは出来ないのでしょうか?
hiim

2016/11/29 04:42

回答に記載したコードはfor分のステップが3づつ増加なので1枚目がある数字以下でcontinueしたら次はi+1にはなりません。たとえば回答に記載したコードであればi=0の時にまず1枚目の数字はarr30[0]は4、arusujiが5なので条件合致してcontinueするので次はi=3になっています。
yamata

2016/11/29 04:54

なるほど、そういうことですか。 私が、行いたいことは、i=0のときに、arr30[0]は4を示しcontinueでスキップし、 次にi=1を画像の1番上のif文から実行したいというものです。 スキップしない場合には、私のプログラムの様に、順番にif文に画像を変えながら判定していき、 スキップする時は、次の画像を、一番上からまた判別を行いたいです。 わかりにくくて申し訳ありません。
hiim

2016/11/29 05:28

回答で配列を使った分を追記と回答に追記されていた条件での処理の流れを追記しました
yamata

2016/11/29 05:43

1-3番目の条件全てをクリアした時のみ一致を表示したいです。 もう少し詳しく、画像に書いてみました。
hiim

2016/11/29 06:12 編集

追記しました、、、すいませんミスってるので追記し直します。
hiim

2016/11/29 06:19

追記しました
yamata

2016/11/29 06:23

while(gazousyori(number++))以下はどのように処理していることになるのでしょうか? 1枚目として、2枚目としてというのが、どのように処理しているのかわかりません。
hiim

2016/11/29 06:39

質問にある画像処理というのがどんな事をしているのかわかりませんのでとりあえず関数化しただけです。ただし30枚に達したらwhile文を抜ける条件として使うため、1か0を返しています(ソース では間違えて−1返してますね。。。修正します)、ソースでは0を返すのは30枚目に到達した時。つまりwhile(gazousyori(30))でwhile文を抜けます。(様は30周) ですのwhile(gazousyori(number++))は 1周目に1枚目の画像(0001) 2周目に2枚目の画像(0002) 3周目に3枚目の画像(0003) 4周目に4枚目の画像(0004) ・・・・ 30周目に30枚目の画像(0030) というループ if(!(a<0.4 || b<0.4)) というのは 添付画像のelseに相当する部分の条件を考えるのが面倒だったので (a<0.4 || b<0.4)ではないという意味の否定!を使っただけです。 ようは(a<0.4 || b<0.4)でなければ次のループは2個目の条件で判定したいため、iをインクリメントしています。
hiim

2016/11/29 06:44

2個目の条件でiをクリアする処理抜けてました。追記しました
yamata

2016/11/29 06:46

2個目の条件で判定したいのではなく、(a<0.4 || b<0.4)であれば、次の画像の処理を開始したいということです。
hiim

2016/11/29 06:48

このwhile文は常に次の画像次の画像を処理していますよ?その中でそれを一個目の条件で判定するか、2個目の条件で判定するあ、3個目の条件で判定するかを選択するカウンタがiです。そして30枚のうちの何枚目の画像かというカウンタはnumberです、カウンタが2つあります
yamata

2016/11/29 06:55

なるほど!わかりやすくありがとうございます!
guest

0

二次元配列にすればすっきり見やすくなると思います

int array[10][3] = { { 4,7,6 }, { 3,4,9 }, ・ ・ ・ }; for(int i=0;i<10;++i) { for(int h=0;h<3;++h) { int value = array[i][h]; } }

投稿2016/11/29 05:01

編集2016/11/29 05:03
ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamata

2016/11/29 05:05

毎回画像処理を行い、結果の値2つを判別したいので、配列にはしにくいかと考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問