至急!教えてください。
#include <stdio.h>
#include <windows.h>
#define COUNT (3)
struct Seiseki{
char name[20];
int score1;
int score2;
int score3;
int score4;
int score5;
int average;
};
int getValue(char str[], char temp[], int n){
memset(temp, 0, 19);
while(*(str+n) == ' '){
n++;
}
int i = 0;
while(*(str+n) != ' ' && *(str+n) != 0){
temp[i] = *(str+n);
i++;
n++;
}
return n;
}
void getAverage(Seiseki *seiseki){
int total = seiseki->score1 +
seiseki->score2 +
seiseki->score3 +
seiseki->score4 +
seiseki->score5;
seiseki->average = total / 5;
}
void getSeiseki(Seiseki seiseki[]){
char temp[20];
char str[256];
for(int i = 0; i < COUNT; i++){
printf_s("%d 人目の点数と名前 > ", i+1);
memset(str, 0, 255);
gets(str);
int n = 0;
n = getValue(str, temp, n);
strcpy(seiseki[i].name, temp);
n = getValue(str, temp, n);
seiseki[i].score1 = atoi(temp);
n = getValue(str, temp, n);
seiseki[i].score2 = atoi(temp);
n = getValue(str, temp, n);
seiseki[i].score3 = atoi(temp);
n = getValue(str, temp, n);
seiseki[i].score4 = atoi(temp);
n = getValue(str, temp, n);
seiseki[i].score5 = atoi(temp);
getAverage(&seiseki[i]);
}
}
void showSeiseki(Seiseki seiseki[]){
for(int i = 0; i < COUNT; i++){
printf("%d %s %d %d %d %d %d\n", i+1,
seiseki[i].name,
seiseki[i].score1,
seiseki[i].score2,
seiseki[i].score3,
seiseki[i].score4,
seiseki[i].score5,
seiseki[i].average);
}
}
void showScoresAverage(Seiseki seiseki[]){
int total1 = 0;
int total2 = 0;
int total3 = 0;
int total4 = 0;
int total5 = 0;
for(int i = 0; i < COUNT; i++){
total1+=seiseki[i].score1;
total2+=seiseki[i].score2;
total3+=seiseki[i].score3;
total4+=seiseki[i].score4;
total5+=seiseki[i].score5;
}
int ave1 = total1 / COUNT;
int ave2 = total2 / COUNT;
int ave3 = total3 / COUNT;
int ave4 = total4 / COUNT;
int ave5 = total5 / COUNT;
printf_s("\naverage %d %d %d %d %d\n",ave1,
ave2,
ave3,
ave4,
ave5);
}
void main(){
Seiseki seiseki[COUNT];
printf_s("生徒 %d 名分の成績を入力してください:\n", COUNT);
getSeiseki(seiseki);
printf_s("\n成績表\n# NAME #1 #2 #3 #4 #5 average\n");
showSeiseki(seiseki);
showScoresAverage(seiseki);
}
間違っている点がありますか?
ありましたらどこに入れるか教えてください。
改良点などありましたらお願いします。
お礼
現在補足の方に示した質問の方をメインに話が進んでいるので、一度こちらの質問の方は締め切りたいと思います。 貴重なアドバイスありがとうございました。 また、何かアドバイスをいただけるようでしたらよろしくお願いいたします。 http://oshiete1.goo.ne.jp/qa4584822.html
補足
返答が遅くなりすいませんでした。 返答が遅くなったのは結果が出てないせいです。(泣) 頂いたアドバイスを元にデジタルGNDとアナログGNDを電源付近で1点接続にしてみました。結果、26個のサーボ駆動で±15mV位のノイズ→±10mV位になりました。 元々デジタル用とアナログ用の2個のバッテリーを積んでいるので、デジタルGNDとアナログGNDが明確に分かれていたことから1点接続は比較的簡単にできたのですが、 "太く""短く" → 基板を自前のCNCフライスで切削加工しているのでベタグランドがうまく作れない。 + センスの問題?で現時点でこれ以上は難しいです。 現在行っている内容も含めて、Cの問題とは少し異なってると思いましたので、マナーが悪くて恐縮ですが、別のカテゴリで、質問を立てました。この質問もしばらく締め切らずにいようと思いますが、差し支えなければ参照願います。 http://oshiete1.goo.ne.jp/qa4584822.html 上記の質問とは別に移動平均のコードを書いてみたので下記に示します。結果は多分あっていると思います。コードは20回平均ですが、40回平均くらい取ると、サーボがプルプルしても差し支えないレベルまで値は安定しますが、実用的にはちょっと疑問かもしれません。 unsigned short int adc0_buffer[20][3]; //移動平均用バッファ"[3]"は3軸用の為です。グローバルで宣言し、main()であらかじめ20個分の初期値を代入しています unsigned int buffer_sum[3]; //平均値計算時の合計値用バッファです int data_adc0i[3]; //計算結果を入れる変数です。 void int_cmi0(void) { short int i, j = 0; for(i = 0; i < 20; i++) //20回の合計を求めます { for(j = 0; j < 3; j++) { buffer_sum[j] = buffer_sum[j] + adc0_buffer[i][j]; } } for(i = 0; i < 3; i++) //平均を求めます { data_adc0[i] = buffer_sum[i] / 20; } for(i = 0; i < 19; i++) //adc0_buffer内の値を1個ずらします { for(j = 0; j < 3; j++) { adc0_buffer[i][j] = adc0_buffer[i + 1][j]; } } buffer_sum[0] = 0; //合計値を初期化します buffer_sum[1] = 0; buffer_sum[2] = 0; adc0_buffer[19][0] = AD0.ADDR0.WORD; //配列の最後に新しい値を代入します adc0_buffer[19][1] = AD0.ADDR1.WORD; adc0_buffer[19][2] = AD0.ADDR2.WORD; for(i = 0; i < 3; i++) { adc0_buffer[19][i] = adc0_buffer[19][i] >> 6; } CMT0.CMCSR.BIT.CMF = 0; //コンペアマッチフラグをクリア } コード面で進展がありましたら、御報告いたしますので御指導のほどよろしくお願いいたします。 参考URL http://www.hokutodenshi.co.jp/PUPPYSupportPage/soft/status/status.html http://tkstechnology.web.fc2.com/robot/system/enc_03.html http://okwave.jp/qa3523603.html?ans_count_asc=0