1108. Finding Average (20)

来源:互联网 发布:c语言写幻灯相册 编辑:程序博客网 时间:2024/05/16 10:50
一个数字一旦出现以下几种情况就不合法:
    1. 出现小数点、数字、负号以外的符号;
    2. 小数点多于一个;
    3. 负号多于一个;
    4. 小数部分位数多于两位;
    5. 数字绝对值大于1000。

#define _CRT_SECURE_NO_WARNINGS#include <cstdio>#include <cstdlib>#include <cctype>#include <cstring>#include <cmath>double convert(char str[]);int main(void){char str[100];double result, sum = 0;int cnt = 0, i, N;scanf("%d", &N);for (i = 0; i < N; i++) {scanf("%s", str);result = convert(str);if (result >= -1000 && result <= 1000) {sum += result;cnt++;}else {printf("ERROR: %s is not a legal number\n", str);}}if (cnt == 0) {puts("The average of 0 numbers is Undefined");}else if (cnt == 1) {printf("The average of 1 number is %.2lf\n", sum);}else {printf("The average of %d numbers is %.2lf\n", cnt, sum / cnt);}return 0;}double convert(char str[]){double result = 0.0;int dotcnt = 0, rightcnt = 1, i;bool negative = false, legal = true;for (i = 0; str[i] != '\0'; i++) {if (str[i] == '-') {if (i == 0) {negative = true;}else {legal = false;break;}}else if (isdigit(str[i])) {if (dotcnt) {result += pow(0.1, rightcnt++) * (str[i] - '0');}else {result = result * 10 + str[i] - '0';}if (rightcnt > 3) {legal = false;break;}}else if (str[i] == '.') {if (dotcnt) {legal = false;break;}else {dotcnt++;}}else {legal = false;break;}}if (legal) {if (negative) {result *= -1;}}else {result = -100000;}return result;}

0 0