for文内の論理演算子「&&」について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
b1982970jp
記事: 2
登録日時: 1週間前

for文内の論理演算子「&&」について

#1

投稿記事 by b1982970jp » 1週間前

コード:

 
 #include <stdio.h>
int main(void){
int     sum;
int     values[10];
int     i, j;

for( i = 0, sum = 0 ; i < 10 && sum <= 100 ; i++ )
{
    scanf("%d", &values[i] );
    sum += values[i];
}

for( j = 0 ; j < i ; j ++ )
    printf( "\n%d", values[j] );
    
return 0;
}

  
C言語を勉強しています。
「数値を繰り返して入力し、合計が 100 を超えた場合、または入力が 10 回行われた場合、入力を止め入力された数値をすべて表示する」という課題で回答にあるfor文の「&&」の意味を理解したいと考えております。
for文内に論理演算子が記載されている例文も見当たらず困っています。

「合計が 100 を超えた場合、または入力が 10 回行われた場合」なので、「&&」ではなく「||」の方が良いと思い試した見ましたがうまく動きません。
for文の「&&」はどのような意味で使われているのでしょか?

tanu_kichi
記事: 8
登録日時: 1ヶ月前

Re: for文内の論理演算子「&&」について

#2

投稿記事 by tanu_kichi » 1週間前

これは、高校数学の「集合と論理」、大学数学の「数理論理学」で学べる話ですが、
多くのプログラマが初期の頃に悩む問題でもあります。

「合計が100を越えた場合 または 入力が10回(以上)行われた場合」
をC言語で書くと
sum > 100 || i >= 10
となります。
これの補集合を考えると
「合計が100以下の場合 かつ 入力が10回を越えない場合」
sum <= 100 && i < 100
すなわち、for文の条件式
i < 100 && sum <= 100
となります。

私の場合、このような複数の条件が出たときには、必ずのように以下のデシジョン・テーブル(決定表)を
作るようにしています。
_______sum <= 100__sum > 100
i < 10__実行する_____実行しない
i >= 10_実行しない___実行しない
この表から、i < 10 && sum <= 100 のときだけ実行すればよいと判断できます。

かずま

Re: for文内の論理演算子「&&」について

#3

投稿記事 by かずま » 1週間前

b1982970jp さんが書きました:
1週間前
「合計が 100 を超えた場合、または入力が 10 回行われた場合」なので、「&&」ではなく「||」の方が良いと思い
「合計が 100 を超えた場合、または入力が 10 回行われた場合」入力をやめる。
「合計が 100 以下の場合、かつ入力が 10 回未満の場合」入力を続ける。

tanu_kichi
記事: 8
登録日時: 1ヶ月前

Re: for文内の論理演算子「&&」について

#4

投稿記事 by tanu_kichi » 1週間前

追記:
_______sum <= 100__sum > 100
i < 10__実行する_____実行しない
i >= 10_実行しない___実行しない
を詳しく書くと

コード:

//         sum < 100     sum = 100     sum > 100
// i < 10   実行する      実行する      実行しない
// i = 10   実行しない    実行しない    実行しない
// i > 10   実行しない    実行しない    実行しない
この表から、i < 10 && sum <= 100 のときだけ実行。

b1982970jp
記事: 2
登録日時: 1週間前

Re: for文内の論理演算子「&&」について

#5

投稿記事 by b1982970jp » 1週間前

tanu_kichiさん かずまさん
おかげさまで理解することが出来ました。本当に有難うございました。

返信

“C言語何でも質問掲示板” へ戻る