累加功能函数描述
编写函数实现累加功能,要求在数组A[100]中按输入的范围表达式求和。
支持如下两种字符:
":"为范围表示符,“n:m”表示从n到m,“:m”表示从0到m,“m:”表示从m到末尾
“,”为分隔符
A[100] = {0, 1, 2, …99};
比如输入:“3:7,9,45,2,77:78”
输出:236(即3+4+5+6+7+9+45+2+77+78)
输入:“:3,50,97:”
输出:350(即1+2+3+50+97+98+99)
实现函数int Sum(char *str):
代码实现
#include <stdio.h>
#include <stdlib.h>
#define N 100
/*
*思路:1、解决各种表达式,如:n,m:n,...如何将这些数字获取出来,于是就有各种函数
例如colonBefore就是获取:num的数字,其他依次类推。注意:在写这些相关函数时,
默认str指向当前分析表达式的第一个字符,如colonBefore中,*str = ':';colonAfter
中*str = m;依次类推
2、相同的判断功能写为单独的函数,例如judgeCommaPosition、judgeColonPosition等
3、注意边界条件,例如以m:或者:m结尾时,判断条件应该加上*(str + i) == '\0',否则
将会出现死循环
4、关于str++,因为测试用例中字符串是置于常量区,给函数传char *参时只是新的指针变量
指向那块区域,即在c++中所谓的“浅拷贝”,为了解决这个问题,可以将传参改为**或者使用全局
变量记录每次str该移动的次数,如下面代码中的mnFlag、mn就是这个功能,只不过mnFlag适用于
大部分情况,对于mn,则是m:n这种特殊情况使用的
* */
int A[N];
char twoNum[3] = {'0'}; //get str and use atoi(twoNum) change into num
int mnFlag = 0, mn; //let pointer str move;e.g:str += mnflag;
int st, en; //m:n st = m, en = n
void fillA()
{
for (int i = 0; i < N; i++)
A[i] = i;
}
int judgeCommaPosition(char *p) //if *p = ',',return 1,else return 0
{
if (NULL == p || *p == '\0')
return 0;
if (',' == *p)
return 1;
return 0;
}
int judgeColonPosition(char *p) //if *p = ':',return 1,else return 0
{
if (NULL == p || *p == '\0')
return 0;
if (':' == *p)
return 1;
return 0;
}
void getNum(char *str, int num) //set twoNum
{
if (str == NULL || *str == '\0' || 0 == num)
return ;
if (1 == num)
{
twoNum[0] = *(str);
twoNum[1] = '\0';
}else
{
twoNum[0] = *(str);
twoNum[1] = *(str + 1);
}
}
int colonBefore(char *str) //:num
{
if (NULL == str || *str == '\0')
return -1;
if (judgeCommaPosition(str + 2) || *(str + 2) == '\0') //:X
{
getNum(str + 1, 1);
mnFlag = 2;
}
else if (judgeCommaPosition(str + 3) || *(str + 3) == '\0') //:XX
{
getNum(str + 1, 2);
mnFlag = 3;
}
return atoi(twoNum);
}
int colonAfter(char *str) //m:
{
if (NULL == str || *str == '\0')
return -1;
if (judgeColonPosition(str + 1) && (judgeCommaPosition(str + 2) || *(str + 2) == '\0')) //x:
{
getNum(str, 1);
mnFlag = 2;
}
else if(judgeColonPosition(str + 2) && (judgeCommaPosition(str + 3) || *(str + 3) == '\0')) //xx:
{
getNum(str, 2);
mnFlag = 3;
}
return atoi(twoNum);
}
void colonTwoNum(char *str) //m:n
{
int l = 0;
if (NULL == str || *str == '\0')
return ;
if (judgeColonPosition(str + 1)) //x:m
{
l = 1;
getNum(str, 1);
mn = 1;
}
else if(judgeColonPosition(str + 2)) //xx:m
{
l = 2;
getNum(str, 2);
mn = 2;
}
st = atoi(twoNum); //st = m;
if (1 == l)
en = colonBefore(str + 1); //en = n;
else
en = colonBefore(str + 2); //en = n;
}
int commaAfter(char *str) //m,
{
if (NULL == str || *str == '\0')
return -1;
if (judgeCommaPosition(str + 1)) //x,
{
getNum(str, 1);
mnFlag = 1;
}
else if(judgeCommaPosition(str + 2)) //xx,
{
getNum(str, 2);
mnFlag = 2;
}
return atoi(twoNum);
}
int judgeTwoNum(char *str) //judge if m:n,true return 1,false return 0
{
if (NULL == str || *str == '\0')
return 0;
if ((judgeColonPosition(str + 1) && *(str + 2) >= '0' && *(str + 2) <= '9')
|| (judgeColonPosition(str + 2) && *(str + 3) >= '0' && *(str + 3) <= '9'))
return 1;
return 0;
}
int Sum(char *str)
{
if (NULL == str || *str == '\0' || *str == ',')
return -1;
char tmp = *str;
int tmpSum = 0;
while (1)
{
if (',' == *str)
{
tmp = *(str + 1);
str++;
}
else if (*str == '\0')
break;
switch(tmp)
{
case ':': //:m
for(int i = 0; i <= colonBefore(str); i++)
tmpSum += A[i];
str += mnFlag;
break;
default:
if (tmp >= '0' && tmp <= '9')
{
if (*(str + 1) == ',' || *(str + 2) == ',') //m,
tmpSum += A[commaAfter(str)];
else if(judgeTwoNum(str)) //m:n
{
colonTwoNum(str);
for (int i = st; i <= en; i++)
tmpSum += A[i];
str += mn;
}
else //m:
{
for (int i = colonAfter(str); i < N; i++)
tmpSum += A[i];
}
str += mnFlag;
}
break;
}
}
return tmpSum;
}
int main()
{
fillA();
char *str = ":3,50,97:";
printf("str = %s, sum = %d \n", str, Sum(str));
char *str1 = "3:7,9,45,2,77:78";
printf("str1 = %s, sum = %d \n",str1, Sum(str1));
char *str2 = ",3,4";
printf("str2 = %s, sum = %d \n",str2, Sum(str2));
char *str3 = NULL;
printf("str3 = %s, sum = %d \n",str3, Sum(str3));
char *str4 = "1,3,4,:5";
printf("str4 = %s, sum = %d \n",str4, Sum(str4));
char *str5 = "1,3,4,:10";
printf("str5 = %s, sum = %d \n",str5, Sum(str5));
return 0;
}