题目:
需要有以下输入:
3
2 34 45
4 1 2 4 5
1 34
要求输出结果:
79
12
34
第一个输入表示需要计算的数据组数量m,以后m行数据,每行第一个数据表示该行数据共n(每行都是独立的)个,接下来输入n个数字。输出结果共m个,占m行。
分析:1.需要连续输入,并取出数字(包括多位数,用number[]保存每一位数字),将提取出来的每一个数保存起来,numbers[]数组。
2.分析数据,提取出m,和每一个n,分别计算每一组数据,将结果保存一起,results[]数组。
3.输出
下面给出相关宏的定义和子函数的声明:
1#define NUM_LENGTH 6
2#define NUMS_LENGTH 50
3#define RESULTS_LENGTH 10
4#define ISEXIT_LOOP(c) if ('X'==c||'x'==c)break;
5
6bool IsInt(char); //判断是否为数字
7int SubSum(int numbers[],int start,int end); //求数组部分和
8int GetNumber(int number[],int length); //求出一个完整的数字
9int power(int,int); //求一个数的幂
10
11
下面是主函数的实现,主要是利用死循环获取键盘输入字符,逐个分析成完整的数字存入数组
1int _tmain(int argc, _TCHAR* argv[])
2{
3
4 char c;
5
6 int number[NUM_LENGTH]={0}; //存放提取出来的数
7 bool pre_is_int=false;
8 bool cur_is_int = false;
9
10 int numbers[NUMS_LENGTH]={0}; //存放提取出来的所有数据
11 int results[RESULTS_LENGTH]={0}; //存放结果
12
13 int length = 0; //结果长度
14 int i = 0; //numbers数组下标
15 int j = 0; //number数组下标
16
17 while (true)
18 {
19 c = getchar();
20 ISEXIT_LOOP(c); //循环结束条件
21
22 cur_is_int = IsInt(c);
23 if (true==pre_is_int&&false==cur_is_int)//表示获取到了一个完整的数字
24 {
25 nums[i++] = getnum(num,j);
26 for (int index=0;index<j;index++)number[index]=0; //number数组清零
27 j=0; //number数组当前下标设置为0,提取下一个数字
28 }
29
30 if (cur_is_int) //当前数字为数字
31 {
32 num[j++]=c-'0';
33 }
34 pre_is_int = cur_is_int; //传递
35 }
36
37
38
39 length = numbers[0];//取出数据的计算组数
40
41 int curindex = 1; //从第二个数字开始分析
42
43
44
45 //计算每一组数
46 for(int j = 0; j<length ; j++)
47 {
48
49 //curindex表示当前这一组数的第一个数的下标,这个表示该组数据的长度
50
51 //所以该组数下标从curindex+1开始,在curindex+numbers[curindex]结束
52
53 //SubSum函数,求数组部分和
54 results[j]=SubSum(nums,curindex+1,curindex+numbers[curindex]);
55
56
57
58 //改变curindex,使它为下一组数据的第一个数字的下标
59 curindex = curindex+nums[curindex]+1;
60 }
61
62
63
64 //输出结果
65
66 for (int index= 0; index<length ; index++)
67 {
68 printf("%d\n",results[index]);
69 }
70
71
72 return 0;
73}
74
75
输入的结束条件是接收到输入字符‘x’或者‘X’。
题目是做完了,但是引发了我对getchar()函数理解的兴趣,包括其基本原理和底层的实现。下一篇文章将介绍我对getchar()的探索历程。