【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22977

表示の仕方
投稿者---あきき(2005/09/07 23:54:18)


当サイトの9-1-2の例題で、矢印の所で間違えて予想に反した表示結果をえてしまいました。勿論バグですが、番号で1001から1004までの平均点は正の実数に対して、1005の平均点は負の実数で表示されます。なぜ、1005の平均点だけこのようなことになったのかご教授願います。 

#include <stdio.h>
#include <conio.h>

#define NINZU  5
#define KAMOKU 4

int  main( void )
{
    int bango[NINZU] = {1001,1002,1003,1004,1005};
    int tokuten[NINZU][KAMOKU]={
            { 85, 74, 63, 90},
            { 78, 65, 70, 62},
            { 89, 92, 88, 76},
            { 32, 48, 66, 25},
            { 92, 76, 81, 98}
    };
    double  ave[NINZU]={ 0.0, 0.0, 0.0, 0.0, 0.0};
    char    hyouka[NINZU];
    int     i,j;

    printf("番号  国語 数学 理科  社会   平均点 評価\n");

    for(i=0;i < NINZU;i++) {
        for(j=0;j < KAMOKU;j++) {//←KAMOKUをNINZUとミスタッチ
            ave[i] += tokuten[i][j];
        }
        ave[i] /= KAMOKU;

        //評価
        if ( ave[i] > 80.0){
            hyouka[i] = 'A';
        }
        else if (ave[i] > 70.0){
            hyouka[i]='B';
        }
        else if ( ave[i] > 60.0){
            hyouka[i]='C';
        }
        else
            hyouka[i]='D';
        
    }
    //表示
    for ( i=0;i < NINZU;i++) {
        printf("%4d  %4d %4d  %4d   %4d    %6.2f     %c\n",bango[ i ],
         tokuten[i][0],tokuten[i][1],tokuten[i][2],tokuten[i][3],ave[i],hyouka[i]);
    }
    printf("\n");
    puts("リターンキーを押してください。");
    getch();

    return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:表示の仕方 22978 Blue 2005/09/08 00:13:58
<子記事> Re:表示の仕方 22979 ぽこ 2005/09/08 00:20:14


No.22978

Re:表示の仕方
投稿者---Blue(2005/09/08 00:13:58)


for文の中にintの値を表示するprintf文かなんかをいれて
確認してみればわかると思いますが、

tokuten[ 0 ][ 4 ] == tokuten[ 1 ][ 0 ]

というような関係になっています。

ということは

tokuten[ 3 ][ 4 ] == tokuten[ 4 ][ 0 ]

となり、配列で宣言されていないところの値を持ってきています。
(普通はアクセスエラーになる)
よって、初期化していない値なので不定な値、今回はマイナスの値
が格納されていたため、結果的にaveがマイナスになったのでしょう。



この投稿にコメントする

削除パスワード

No.22980

Re:表示の仕方
投稿者---Blue(2005/09/08 00:23:47)


> tokuten[ 3 ][ 4 ] == tokuten[ 4 ][ 0 ]
インデックスがメチャクチャずれてました。

tokuten[ 4 ][ 4 ] == tokuten[ 5 ][ 0 ]
でした。
# ぽこさんの投稿みてからきづき私って。。。orz



この投稿にコメントする

削除パスワード

No.22979

Re:表示の仕方
投稿者---ぽこ(2005/09/08 00:20:14)


たまたまです。

本来、ループでtokuten[i][0]からtokuten[i][3]までの値をaveに
足しこむはずだったのが、tokuten[i][0]からtokuten[i][4]までの値を
aveに足しこんでいます。
ここでポイントなのは、tokuten[i][4]というのはtokuten[i+1][0]と
同値(同義?うまい言葉が思いつかない)であると言うことです。

iが0から3までの間(番号で1001から1004までの間)は、
tokuten[i][4]はそれぞれ、tokuten[1][0]、tokuten[2][0]、tokuten[3][0]、tokuten[4][0]と同じ箇所を指し、実体がありますが、
iが4の時(番号が1005のとき)tokuten[4][4]はtokuten[5][0]を指し、
何が入っているかわかりません。
今回はたまたま大きな負の値が入っていただけでしょう。



この投稿にコメントする

削除パスワード

No.23007

Re:表示の仕方
投稿者---あきき(2005/09/08 22:06:40)


>tokuten[i][4]というのはtokuten[i+1][0]と
>同値(同義?うまい言葉が思いつかない)であると言うことです。
>
この事は、tokuten[i][4]のアドレスの次にtokuten[i+1][0]が存在するという事でしょうか?
もし、そうなれば確かに、tokuten[4][4](tokuten[5][0])には何が入っているのか分からないですね。

>今回はたまたま大きな負の値が入っていただけでしょう。
今回は、たまたま負の値がメモリーに存在していたわけですが、ここで、メモリー自体を'¥0'か、0でイニシャライズできないものでしょうか?




この投稿にコメントする

削除パスワード

No.23013

Re:表示の仕方
投稿者---Blue(2005/09/08 23:27:26)


>今回は、たまたま負の値がメモリーに存在していたわけですが、
>ここで、メモリー自体を'¥0'か、0でイニシャライズできないものでしょうか?

管理していないメモリに対しては出来ません。(今回のようなケース)

例えば、

char buff[ 100 ];
memset( buff, '\0', sizeof( buff ) );

のように管理している領域に対しては、memset関数を使うことである値を設定できます。



この投稿にコメントする

削除パスワード

No.23014

ありがとうございます
投稿者---あきき(2005/09/09 00:14:06)


管理していないメモリに対しては出来ません。(今回のようなケース)

例えば
char buff[ 100 ];
memset( buff, '\0', sizeof( buff ) );

忙しい中、回答していただきありがとうございます。あとは、memset関数の[buff]が構造体(int,char,longなどがあった場合)の時どうなるのか調べてみます


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧