【C言語】小数第◯位を四捨五入出来ない
Q&A
Closed
標準入力された6つの整数値の平均値を算出し、四捨五入して小数第1位まで求めて結果を出力するプログラムについてです。
例:
平均の計算結果が56.739→出力値は56.7
平均の計算結果が56.789→出力値は56.8
プログラムは次のように作りました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char buf[100];
int a,b,c,d,e,f;
fgets(buf,sizeof(buf),stdin);
sscanf(buf,"%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);
double ave = (a+b+c+d+e+f) / 6;
int int_ave = (a+b+c+d+e+f) / 6;
char str[100];
snprintf(str,sizeof(str),"%1f",ave); //aveを文字列に変換する
char* p = strchr(str,'.'); //小数点の位置str[X]をつき止める
if(p != NULL){
if(str[(p-str)+2] >= 48 && str[(p-str)+2] <= 52){ //str[X] (小数点) の2個隣 (小数第2位) の文字が「0」~「4」だった場合
int m = atoi(&str[(p-str)+1]); //str[X] (小数点) の1個隣 (小数第1位) の文字を数値に変換して
printf("%0.1f\n",int_ave+0.1*m); //計算式:平均値の整数版+小数第1位の文字 (int) ×0.1 (1/10の位だから)
}else if(str[(p-str)+2] >= 53 && str[(p-str)+2] <= 57){ //str[X] (小数点) の2個隣 (小数第2位) の文字が「5」~「9」だった場合
int n = atoi(&str[(p-str)+1]); //str[X] (小数点) の1個隣 (小数第1位) の文字を数値に変換して
printf("%0.1f\n",int_ave+0.1*(n+1)); //計算式:平均値の整数版+(小数第1位の文字 (int) に1を加えた (繰り上げた) 数字)×0.1 (1/10の位だから)
}
}
}
結果は失敗でした。コンパイルは出来たものの、期待した通りに出力されない上、小数点以下が0の一点張りになる等の問題に直面して困っています。
・(プログラムのコメント等をもとに)根本的に、僕の考え方が正しいか否か
・本当ならもっとシンプルに出来るプログラムを難しく考えていないかどうか(これが特に気になる)
・目的に合ったプログラムにするために、どこを訂正すべきなのか
上の2点について、アドバイス頂きたいです。