累加功能笔试题

嵌入式应用开发笔试题

累加功能函数描述

编写函数实现累加功能,要求在数组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;
}


运行结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值