题目:
需要有以下输入:
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
6
bool IsInt(char); //判断是否为数字
7
int SubSum(int numbers[],int start,int end); //求数组部分和
8
int GetNumber(int number[],int length); //求出一个完整的数字
9
int power(int,int); //求一个数的幂
10
11
下面是主函数的实现,主要是利用死循环获取键盘输入字符,逐个分析成完整的数字存入数组
1
int _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()的探索历程。