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

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

 詳しくはこちら


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

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


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

No.22042

構造体のポインタ
投稿者---neko(2005/07/22 16:16:35)


こんにちは
こちらのサイトの
15-3-1
を自分なりに作成してみました。
まだ未完成ですが、
結果が下記の通りになりますがなぜでしょうか?
No1004から値がおかしいです。
いろいろと調べましたが分かりませんでしたので、
お手数ですが、よろしくお願いします。

no=1001 kok=85.0 su=74.0 rika=63.0 sya=90.0
no=1002 kok=174.0 su=166.0 rika=151.0 sya=166.0
no=1003 kok=266.0 su=242.0 rika=232.0 sya=264.0
no=1004 kok=1081114890.0 su=242.0 rika=1080885480.0 sya=264.0
no=1005 kok=1087808210.0 su=6694042.0 rika=1080885480.0 sya=-2123968544.0


#include<stdio.h>
struct kamoku {
    int kokugo;
    int sugaku;
    int rika;
    int syakai;
};

struct seito {
    int no;
    struct kamoku seiseki;
    
};

int main(void) 
{
    
    struct seito seito1[6]= {{1001, 85, 74, 63, 90},
                    {1002, 78, 65, 70, 62}, 
                    {1003, 89, 92, 88, 76}, 
                    {1004, 32, 48, 66, 25}, 
                    {1005, 92, 76, 81, 98}, 
                    {-1, 0, 0, 0, 0,}}; 

    struct seito *work;
    int i, j;   
    double kok = 0.0;         
    double su = 0.0;            
    double rik = 0.0;         
    double sya = 0.0;         
    
    work = seito1;
    
        for (i = 0; work->no != -1; i++) {
            kok = kok + (work + i)->seiseki.kokugo;
            su =  su + (work + i)->seiseki.sugaku;
            rik = rik +  (work + i)->seiseki.rika;
            sya =   sya + (work + i)->seiseki.syakai;
            printf("no=%d ",work->no);
            printf("kok=%2.1f ",kok);
            printf("su=%2.1f ",su);
            printf("rika=%2.1f ",rik);
            printf("sya=%2.1f ",sya);
            printf("\n");
            work++;
        }
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:構造体のポインタ 22043 あかま 2005/07/22 16:44:26


No.22043

Re:構造体のポインタ
投稿者---あかま(2005/07/22 16:44:26)


>for (i = 0; work->no != -1; i++) {
>            kok = kok + (work + i)->seiseki.kokugo;
>   〜中略〜
>            work++;
>}
for文の中でworkをインクリメントしているのに(work+i)でさらに先を参照しているのが原因です。
work++;をなくすかiをなくすかすればいいと思います。




この投稿にコメントする

削除パスワード

No.22051

Re:構造体のポインタ
投稿者---neko(2005/07/22 23:26:10)


再三ありがとうございます。
最後のwork++;をコメントにすると無限ループになりました。
for文の中のi++をなくすため、for文の代わりに
 while(work->no != -1) {
とし、最後のwork++;を生かしました。
表示が全く行われませんでした。
なぜでしょうか?
お手数ですが、よろしくお願いします。




この投稿にコメントする

削除パスワード

No.22052

Re:構造体のポインタ
投稿者---まきじ(2005/07/22 23:35:09)


>表示が全く行われませんでした。

表示されましたが?

>kok = kok + (work + i)->seiseki.kokugo;

の、+ i は消しましたか?
他の su, rik, sya も同様に + i は不要です。


この投稿にコメントする

削除パスワード

No.22068

Re:構造体のポインタ
投稿者---neko(2005/07/24 00:59:25)


ありがとうございます。

>の、+ i は消しましたか?
>他の su, rik, sya も同様に + i は不要です。
消してませんでした。
消したらちゃんと思うとおりに表示されました。
また変更修正し、より回答例に近くなるようにしました。
そしたら下記のようなエラーとなりどのように修正したらよいか分かりません。お手数ですが、よろしくお願いします。

エラー E2110 SeitoSeiseki_1.c 35: 互換でない型変換(関数 main )
エラー E2062 SeitoSeiseki_1.c 35: 無効な間接参照(関数 main )
警告 W8070 SeitoSeiseki_1.c 41: 関数は値を返すべき(関数 main )
*** 2 errors in Compile ***



#include<stdio.h>
struct kamoku {
    int kokugo;
    int sugaku;
    int rika;
    int syakai;
};

struct seito {
    int no;
    struct kamoku seiseki;
    
};

int main(void) 
{
    
    struct seito seito1[6]= {{1001, 85, 74, 63, 90},
                    {1002, 78, 65, 70, 62}, 
                    {1003, 89, 92, 88, 76}, 
                    {1004, 32, 48, 66, 25}, 
                    {1005, 92, 76, 81, 98}, 
                    {-1, 0, 0, 0, 0,}}; 
                    

    struct seito *work;
    char *kname[] = {"国語","数学","理科","社会"};
    int i = 0;
    int j = 0;  
    double heikin = 0.0;
    work = seito1;
    
    for (j = 0; j < 4; j++) { 
        while((work + i)->no != -1) {
            heikin = heikin + (work + i)->seiseki[j];
            i++;
        }
        heikin = heikin / 5;
        printf("%s 平均 %f \n", kname[j], heikin);
    }
}




この投稿にコメントする

削除パスワード

No.22070

Re:構造体のポインタ
投稿者---まきじ(2005/07/24 01:06:23)


>heikin = heikin + (work + i)->seiseki[j]

seiseki は構造体ですよ。


この投稿にコメントする

削除パスワード

No.22073

Re:構造体のポインタ
投稿者---neko(2005/07/24 01:15:05)


ありがとうございます。

>seiseki は構造体ですよ。

ということは、

pre> while(work-&amp;gt;no != -1) {
kok = kok + work-&amp;gt;seiseki.kokugo;
su = su + work-&amp;gt;seiseki.sugaku;
rik = rik + work-&amp;gt;seiseki.rika;
sya = sya + work-&amp;gt;seiseki.syakai;
work++;
}

</pre>
この方法をとるしかないのでしょうか?
もっとよい方法がありそうですが、思いつきませんので
よろしくお願いします。



この投稿にコメントする

削除パスワード

No.22074

Re:構造体のポインタ
投稿者---neko(2005/07/24 01:18:10)


表示がへんです。すみません。
ということは、

while(work->no != -1) {
  kok = kok + work->seiseki.kokugo;
  su = su + work->seiseki.sugaku;
  rik = rik + work->seiseki.rika;
  sya = sya + work->seiseki.syakai;
  work++;
}
この方法をとるしかないのでしょうか?
もっとよい方法がありそうですが、思いつきませんので
よろしくお願いします。




この投稿にコメントする

削除パスワード

No.22075

Re:構造体のポインタ
投稿者---まきじ(2005/07/24 01:20:22)


>この方法をとるしかないのでしょうか?

最初に提示されたソースで良いと思います。
# 当然、指摘された部分は修正した状態。

kok, su, rik, sya をそれぞれ人数で割れば平均でるでしょ?


この投稿にコメントする

削除パスワード

No.22076

Re:構造体のポインタ
投稿者---neko(2005/07/24 01:26:13)


ありがとうございます。

>最初に提示されたソースで良いと思います。
なるほど配列とそうでないのとやり方が分かりました。

>kok, su, rik, sya をそれぞれ人数で割れば平均でるでしょ?
はい。ありがとうございました。
言葉足らずでしたが、

>>>の、+ i は消しましたか?
>>>他の su, rik, sya も同様に + i は不要です。
>>消してませんでした。
>>消したらちゃんと思うとおりに表示されました。

のご返信をした時に人数で割って出来ていました。
どうもありがとうございました。


この投稿にコメントする

削除パスワード

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