代入されません(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 = %d ID = %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も同様)。
いろいろ考えてみましたが、原因が分かりませんでした。
どなたかよろしくお願いします。
お礼
わかりやすいご説明ありがとうございます。 安心してプログラミングできそうです。 的確なご回答ありがとうございました。