こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

代入されません(C言語)

こんにちは。
早速質問させていただきます。
申し訳ありませんが、問題の概要など話し始めるととても時間がかかってしまう為省略させていただきます。
下記のプログラムなのですが(私はプロではないため醜いプログラムですがご了承ください)、
#include <stdio.h>

int num[8][5] = {{0,0,0,0,0},{0,0,1,0,0},{0,1,0,0,0},{0,1,1,0,0},
{1,0,0,0,0},{1,0,1,0,1},{1,1,0,1,0},{1,1,1,0,0}};
int ic = 0;
int i=0, j=0;
int id=0;//IDナンバー
int m0=0, m1=0, m2=0; //中間層
int z0=0, z1=0;
int t0=0, t1=0;
double s0=0,s1=0; //総和
double w00=0, w01=0, w02=0, w10=0, w11=0, w12=0;//重み
double sikii0=1, sikii1=1; //しきい値(θ) θ0とθ1
int t; //正解
double hoge = 0.1;
double mm0, mm1, mm2; //p2. 4)学習 で使用

//プロトタイプ宣言
void input(void);
void tyukan(void);
void souwa(void); //総和
void hantei(void);
void seikai(void);
void omomi1(void);
void omomi2(void);

main(){
while(ic<70){
if(id > 7){
id=0;
i=0; j=0;
}
getchar();
printf("IC = %dID = %d\n", ic, id);
input();
tyukan();
souwa();
hantei();
seikai();
if(z0 != t0)
omomi1();
else if(z1 != t1)
omomi2();
i++;
ic++;
id++;
}
return 0;
}

void input(){
printf("入力データ M=%d A=%d B=%d\n", num[i][j], num[i][j+1], num[i][j+2]);
}

void tyukan(){
if(id == 0){
m0=0; m1=0; m2=0;
mm0=0; mm1=0; mm2=0;
s0=0; s1=0;
}

m0=num[i][0]+num[i][1]+num[i][2]; m1=num[i][0]+num[i][1]; m2=num[i][0]+num[i][2]; //中間層m0m1m2に代入
mm0 = (double)m0; mm1 = (double)m1; mm2 = (double)m2;
printf("中間層 m0=%d m1=%d m2=%d \n", num[i][0]+num[i][1]+num[i][2],
num[i][0]+num[i][1], num[i][0]+num[i][2]);
}

void souwa(void){
printf("総和 s0=%f s1=%f\n",(double)m0*w00 + (double)m1*w01 + (double)m1*w02,
(double)m0*w10 + (double)m1*w11 + (double)m2*w12);
}

//*****関数判定*****************************************
void hantei(void){
printf("判定は ");

if(s0 >= sikii0){
printf("z0 = 1 ");
z0=1;
}
else{
printf("z0 = 0 ");
z0=0;
}
if(s1 >= sikii1){
printf("z1 = 1\n");
z1=1;
}
else{
printf("z1 = 0\n");
z0=0;
printf("sikii1 %f\n",sikii1);
printf("sikii0 %f\n",sikii0);
}
}

void seikai(void){
printf("正解は ");
printf("t0 = %d t1 = %d\n", num[id][3], num[id][4]);
t0=num[id][3]; t1=num[id][4];
}

void omomi1(void){
if(z0 == 0 && t0 == 1){
w00 = w00 + (hoge*mm0);
w01 = w01 + (hoge*mm1);
w02 = w02 + (hoge*mm2);
sikii0 = sikii0-hoge;
printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02);
printf("閾値 %f\n", sikii0);
}
else if(z0 == 1 && t0 == 0){
w00 = w00 - (hoge*mm0);
w01 = w01 - (hoge*mm1);
w02 = w02 - (hoge*mm2);
sikii0 = sikii0+hoge;
printf("重み変更 00 %f\n重み変更 01 %f\n重み変更 02 %f\n", w00, w01, w02);
printf("閾値 %f\n", sikii0);
}
}

void omomi2(void){
if(z1 == 0 && t1 == 1){
w10 = w10 + (hoge*mm0);
w11 = w11 + (hoge*mm1);
w12 = w12 + (hoge*mm2);
sikii1 = sikii1-hoge;
printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12);
printf("閾値 %f\n", sikii1);
}
else if(z1 == 1 && t1 == 0){
w10 = w10 - (hoge*mm0);
w11 = w11 - (hoge*mm1);
w12 = w12 - (hoge*mm2);
sikii1 = sikii1+hoge;
printf("重み変更 10 %f\n重み変更 11 %f\n重み変更 12 %f\n", w10, w11, w12);
printf("閾値 %f\n", sikii1);
}
}
問題はこのプログラムがID7になった時に発生します。
関数hanteiの部分で
s0 >= sikii0とs1 >= sikii1がそれぞれ真だったらz0(またはz1)に1を代入するように
作ったのですが、
IC=7 ID=7の部分では,s0が1.20でsikii0が0.9(s0>=sikii0)にもかかわらず
z0に1が代入されません(s1とsikii1も同様)。
いろいろ考えてみましたが、原因が分かりませんでした。
どなたかよろしくお願いします。

投稿日時 - 2007-08-09 22:09:49

QNo.3242297

困ってます

質問者が選んだベストアンサー

No.1の回答をした者です。

s0とs1には、ゼロを代入したきりですので、
souwa関数かどこかで

s0 = (double)m0*w00 + (double)m1*w01 + (double)m1*w02;
s1 = (double)m0*w10 + (double)m1*w11 + (double)m2*w12;

のような処理が必要かもしれません。
これらの処理が正しいかどうかは、確認してください。

投稿日時 - 2007-08-09 23:06:34

お礼

早速のご回答ありがとうございます!
s0,s1の表示はしているのだけど、代入が抜けていました。
結構悩んだわりにはしっかりトレースして考えてないことがよくわかりました・・・。
ありがとうございました^^

投稿日時 - 2007-08-09 23:21:43

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

> void souwa(void){
> printf("総和 s0=%f s1=%f\n",(double)m0*w00 + (double)m1*w01 + (double)m1*w02,
> (double)m0*w10 + (double)m1*w11 + (double)m2*w12);
> }

souwa関数で上記のように出力しています。
メッセージは確かに "s0=何とか s1=何とか" ですが、
実際に出力しているのはs0やs1の値ではない、別の内容ですね。

hantei関数の中で、if文で比較する直前の
s0, sikii0, s1, sikii1の値を出力してみてください。

投稿日時 - 2007-08-09 22:41:33

あなたにオススメの質問