論理エラー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アレス

論理エラー

#1

投稿記事 by アレス » 14年前

コンパイルは出来るのですが論理エラーを起こしているようなのですがどこがおかしいのか教えてください。
ちなみに9999を読み込むまで次々に整数を読み込んでいき(最大1000個)、合計値および平均値を表示するプログラムです。

コード:

 
#include <stdio.h>
#define MAX 1000

int main(void)
{
	int i=0,	;
	int	sum = 0;
	int	any[MAX]={0};

	puts("整数を入力してください。");

	while(i < MAX){
		printf("No.%d:", i + 1);
			scanf("%d",	&any[i]);
		if(any[i] == 9999){
			i++;
			break;
		}
		sum += any[i++];
	}
	
	if(i>1)
		printf("合計は%dで平均は%.2fです。\n", sum, (double)sum / (i - 1));


	return (0);
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 論理エラー

#2

投稿記事 by みけCAT » 14年前

Ideoneでコンパイルしたらコンパイルエラーでした。
prog.cpp: In function ‘int main()’:
prog.cpp:6: error: expected unqualified-id before ‘;’ token
prog.cpp:14: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result
http://ideone.com/w4U2o

少し編集したらコンパイルできました。
さて、どこが論理エラーなのでしょうか?
http://ideone.com/hJOvT
私には正しく動作しているように見えます。
テストに使用した入力とそれに対する出力、そして意図する出力を提示してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: 論理エラー

#3

投稿記事 by box » 14年前

アレス さんが書きました: コンパイルは出来る

コード:

	int i=0,	;
引用した部分のコード内容なのにコンパイルできる、というのは矛盾しています。
コンパイルができているコードを載せてください。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アレス

Re: 論理エラー

#4

投稿記事 by アレス » 14年前

>みけCAT さん
学校の課題なんですけど、自分も問題ないと思い先生に提出したら論理エラーがあるから直してこいと言われて何が論理エラーなのかわからない状況です。
>boxさん
すみません。これがコンパイルしたコードです。

コード:

#include <stdio.h>
#define MAX 1000

int main(void)
{
	int i=0;
	int	sum = 0;
	int	any[MAX]={0};

	puts("整数を入力してください。");

	while(i < MAX){
		printf("No.%d:", i + 1);
			scanf("%d",	&any[i]);
		if(any[i] == 9999){
			i++;
			break;
		}
		sum += any[i++];
	}
	
	if(i > 1)
		printf("合計は%dで平均は%.2fです。\n", sum, (double) sum / (i - 1));

	return (0);
}

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 論理エラー

#5

投稿記事 by bitter_fox » 14年前

アレス さんが書きました: 学校の課題なんですけど、自分も問題ないと思い先生に提出したら論理エラーがあるから直してこいと言われて何が論理エラーなのかわからない状況です。

コード:

    while(i < MAX){
		if(any[i] == 9999){
			i++;
			break;
		}
		sum += any[i++];
	}
	
	if(i > 1)
		printf("合計は%dで平均は%.2fです。\n", sum, (double) sum / (i - 1));
sum / (i - 1)のあたりが臭そうですね。

MAX回代入した場合はどうなりますか?

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 論理エラー

#6

投稿記事 by みけCAT » 14年前

ちなみにMAX縛りが必須ならともかく、このコードならわざわざ配列に入れる必要は無いと思います。

コード:

#include <stdio.h>
 
int main(void)
{
    int i=0;
    int sum = 0;
    int any;
 
    puts("整数を入力してください。");
 
    while(1){
        printf("No.%d:", i + 1);
        scanf("%d", &any);
        i++;
        if(any == 9999)break;
        sum += any;
    }
    
    if(i > 1)
        printf("合計は%dで平均は%.2fです。\n", sum, (double) sum / (i - 1));
 
    return (0);
}
http://ideone.com/8jiFA
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: 論理エラー

#7

投稿記事 by box » 14年前

アレス さんが書きました:論理エラーを起こしているようなのですがどこがおかしいのか教えてください。
MAX をうんと小さい値にして、MAX個の整数を入力するシチュエーションで試してみてください。
1000個も入力するのは大変ですからね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アレス

Re: 論理エラー

#8

投稿記事 by アレス » 14年前

>bitter_foxさん みけCATさん boxさん
#define MAX 10 にして1~10を代入してみたら「合計は55で平均は6.11です。」と表示されたので多分sum / (i - 1)の(i - 1)がおかしかったみたいです。いろいろありがとうございました。

box
記事: 2002
登録日時: 14年前

Re: 論理エラー

#9

投稿記事 by box » 14年前

アレス さんが書きました:多分sum / (i - 1)の(i - 1)がおかしかったみたいです。
本当にそれでよいですか?
MAX個を入力せずに途中で9999を入力したときは?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アレス

Re: 論理エラー

#10

投稿記事 by アレス » 14年前

No.1~3にそれぞれ6,3,9を代入し、No.4で9999を入れたら「合計は18で平均は6.00です。」となったのでi=MAXとなった場合だけ論理エラーが起きるようです。なのでこんなかんじにしてみました。

コード:

#include <stdio.h>
#define MAX 10

int main(void)
{
	int i=0;
	int	sum = 0;
	int	any[MAX]={0};

	puts("整数を入力してください。");

	
	while(i < MAX){
		printf("No.%d:", i + 1);
			scanf("%d",	&any[i]);
		if(any[i] == 9999){
			i++;
			break;
		}
		sum += any[i++];
	}
	if(i = MAX)
		i++;
	if(i > 1)
		printf("合計は%dで平均は%.2fです。\n", sum, (double) sum / (i - 1));

	return (0);
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 論理エラー

#11

投稿記事 by h2so5 » 14年前

アレス さんが書きました:

コード:

	if(i = MAX)
		i++;
この条件式は間違っていますよ。常に真になってしまいます。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 論理エラー

#12

投稿記事 by dic » 14年前

答えを書くのは考える力が養われないので

ある場合のとき、ある現象が起きます
おそらく、このある場合のとき を論理エラー
もしくは、意図していないコード と読んで指摘しているのではないでしょうか

と書いている途中で もうひとつみつけました

私が気づいたのは2点あります


想定外といったほうがいいでしょうか
http://www.sophia-it.com/content/%E8%AB ... 9%E3%83%BC
論理エラー
読み方:ろんりエラー
【英】logic error

論理エラーとは、プログラムの実行結果が意図した通りにならないエラーのことである。

論理エラーは、コンパイルが正常に行われ、プログラムの実行途中で異常終了することなく動作するものの、アルゴリズムが論理的に正しくない場合のことを意味する。プログラムの文法や構文などが正しいため、コンパイルラによって発見されることはない。そのため、自力でデバッグを行う必要がある。

論理エラーは、仕様をよく理解した上でプログラムの設計を行えば、ある程度防ぐことができるとされている。また、紛れ込んだ論理エラーの発見効率を高めるには、アルゴリズムの正しさを検証するだけでなく、読みやすいソースコードを記述することも必要であるとされている。

アレス

Re: 論理エラー

#13

投稿記事 by アレス » 14年前

>h2so5 さん
これなら大丈夫ですか?

コード:

#include <stdio.h>
#define MAX 10

int main(void)
{
	int i=0;
	int	sum = 0;
	int	any[MAX]={0};

	puts("整数を入力してください。");

	
	while(i < MAX){
		printf("No.%d:", i + 1);
			scanf("%d",	&any[i]);
		if(any[i] == 9999){
			i++;
			break;
		}
		sum += any[i++];
	}
	if(i == MAX)
		i++;
	if(i > 1)
		printf("合計は%dで平均は%.2fです。\n", sum, (double) sum / (i - 1));

	return (0);
}
>dicさん
最後i == MAX以外にも論理エラーが発生するということですか?

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 論理エラー

#14

投稿記事 by dic » 14年前

>>アレスさん
はい
結構いじわるに受け取られるようなものがあります

アレス

Re: 論理エラー

#15

投稿記事 by アレス » 14年前

>dicさん
いじわるってことは9999が使えないとかですか?

フリオ

Re: 論理エラー

#16

投稿記事 by フリオ » 14年前

 
 一度、9999で入力を打ち切った場合と、MAXまで入力した場合で、
入力したデータが配列にどのように格納されているか、紙にでも書いて
確認してみては如何でしょうか。

そうすれば、もっと素直な処理ができると思います。
 

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 論理エラー

#17

投稿記事 by dic » 14年前

>>アレスさん
送付画像のようにある条件を満たすとバグります
添付ファイル
無題.JPG
無題.JPG (28.38 KiB) 閲覧数: 6819 回

アレス

Re: 論理エラー

#18

投稿記事 by アレス » 14年前

>dicさん
自分でいろいろ試してみたんですが9999999999999999999999999999999999999999999999999999999999999999などの数字を入力したときおかしくなったのですがこれですか?

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 論理エラー

#19

投稿記事 by dic » 14年前

>>アレスさん
ほとんど正解です

閉鎖

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