题目描述
每到月末,小明就会对这个月的支出账单进行整理和统计。如今电脑已经普及大学校园,所以小明想让电脑帮忙做这件事情。聪明的你就为小明编一个程序来完成这件事情吧。
输入
多实例测试。首先输入一个整数ncase,表示测试实例的个数。每个测试实例的输入如下:第一行是整数n (n<100)。然后是n行的账单信息,每一行由事物的名字name和对应的花费c组成,长度不超过200。中间会有一个或多个空格,而每一行的开头和结尾没有空格。 0.0 < c < 1000.0。
输出
每个测试实例对应一行输出,输出总的花费,小数点后保留一位数字。
样例输入
2 1 Buy books 62.28 3 Apple 2.3 Buy clothes for girl friend 260.5 Go to cinema 30
样例输出
62.3 292.8
问题分析:
主要在于如何确定输入的字符串最后出现的数字什么,我们可以先用while循环找到结束符'\0',从后往前找这样找到的第一个数字就是花费了,此时我们可以选择从正面得到这个数或从后向前得到这个数,我选择从前往后,所以我又用了一个循环来确定这个数字从哪里开头,然后用h【i】记录下来,h【i】=h【i】 *10+(s1【j】-’0‘)如果遇到小数点时则跳过上述语句,遇到小数点之后同时每循环一遍让x++;x记录的是小数点后有几位,h【i】经过循环后将整个数据以整数的形式记录下来了,需要用x来循环x遍求得实际的值。求得实际的之后,让sum将实际的值加上sum+=h【i】,然后让h【i】=0;因为h【i】使用过后就没用了,下一个实例才会用到,所以将其初始化为零下一次可以直接使用。
代码实现:
#include<stdio.h>
int main(){
int ncase,n,flag=0,w=0,x=1;
double sum=0;
char s1[200];
double h[100]={0};
scanf("%d",&ncase);
while(ncase>0){
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++){
gets(s1);
sum=0;
w=0;
flag=0;
int j=0;
while(s1[j]!='\0'){
j++;
}
while(!(s1[j]>='0'&&s1[j]<='9')){
j--;
}
while(s1[j]>='0'&&s1[j]<='9'||s1[j]=='.'){
j--;
}
j++;
while((s1[j]>='0'&&s1[j]<='9')||s1[j]=='.'){
if(s1[j]=='.'){
flag=1;
j++;
continue;
}
h[i]=h[i]*10+(s1[j]-'0');
if(flag==1){
w++;
}
j++;
}
for(int m=0;m<w;m++){
h[i]/=10;
}
}
for(int i=0;i<n;i++){
sum+=h[i];
h[i]=0;
}
printf("%.1f\n",sum);
ncase--;
}
return 0;
}
提交结果: