代码如下:
请问为何第45行需要atof测试点2才能正确,但是atoi不行?
我的思路是在这个else当中小数点个数为0了,如果整数部分有数字,那么字符串就是个整数了,只需要atoi即可。
//一个“合法”的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int isLegal(char a[]){
int i,len = strlen(a);
int isNegative = 0;//是否是负数
int ispoint = 0;//有几个小数点
int num_xs = 0;//小数的位数
int num_zs = 0;//整数的位数
for (i=0;i<len;i++)
{
if (i==0 && a[i]=='-')
isNegative = 1;//是负数
else if (a[i]>47 && a[i]<59)
{
if (ispoint==1)
num_xs++;
else if (ispoint==0)
num_zs++;
else//多个小数点是错误的
return 0;
}
else if (a[i]=='.')
{
ispoint++;
if (ispoint>1)
return 0;
}
else
return 0;
}
if (ispoint>1)
return 0;
else if (ispoint==1)//小数点前后均不允许没有数字,且该实数需要满足范围
{
if (num_zs>0 && num_xs<3 && abs(atof(a))<=1000)
//小数点需要整数位,小数位数不得超过2,[−1000,1000]
return 1;
else
return 0;
}
else//没有小数点
{
if (num_zs>0 && abs(atof(a))<=1000)//要有数字,排除仅为负号的情况
return 1;
else
return 0;
}
}
int main(){
int N,i,k = 0;
char temp[10001];
long double sum = 0;
scanf("%d",&N);
for (i=0;i<N;i++)
{
scanf("%s",temp);
if (isLegal(temp)==1)
{
sum+=atof(temp);
k++;
}
else
printf("ERROR: %s is not a legal number\n",temp);
}
if (k==0)
printf("The average of 0 numbers is Undefined\n");
else if (k==1)
printf("The average of 1 number is %0.2llf\n",sum);//精确到小数点后 2 位
else
printf("The average of %d numbers is %0.2llf\n",k,sum/k);
return 0;
}
同问
供参考:
#include <stdio.h>
#include <string.h>
#include <math.h>
int Str_cmp(char str1[], char str2[])
{
int len1 = strlen(str1), i;
for (i = 0; i < len1; i++) {
if (str1[i] != str2[i]) {
return 1;
}
}
return 0;
}
int main()
{
int n;
scanf("%d", &n);
int k = n, i;
double sum = 0.0;
char str1[50], str2[50];
for (i = 0; i < n; i++) {
double tmp;
scanf("%s", str1);
sscanf(str1, "%lf", &tmp);
sprintf(str2, "%.2lf", tmp);
if (fabs(tmp) <= 1000 && !Str_cmp(str1, str2)) {
sum += tmp;
}
else {
k--;
printf("ERROR: %s is not a legal number\n", str1);
}
}
if (!k) {
printf("The average of 0 numbers is Undefined");
}
else if (k == 1) {
printf("The average of 1 number is %.2lf", sum);
}
else {
printf("The average of %d numbers is %.2lf", k, sum / k);
}
return 0;
}