第一次个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/SE
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzzcxy/SE/homework/10283
这个作业的目标 发布一篇随笔,使用markdown语法进行编辑。
在随笔前附上github仓库地址。
作业正文 见下面
其他参考文献 https://blog.csdn.net/weixin_42029738/article/details/81255389

github仓库地址:https://github.com/Viola-Violet/code

1、记录自己的代码行数,需求分析时间,编码时间:

(1)代码行数:大约200行;
(2)需求分析时间:>2h;
(3)编码时间:4天;

2、分解需求的思路,分解成多个模块,并阐述为什么这么分,优势在哪,可以附上代码片段:

定义结构体数组,用来存放变量名以及其对应的值,值用int类型存放,方便运算;
inter二维数组的一维大小与其存放的数字大小一一对应,便于快速寻找;
自定义两个函数(ntc与ctn)分别实现汉字与数字之间的转换,但仅限于三位数的,无法实现更高位的;
自定义disp函数处理 看看 语句的两种不同情况(输出指定字符串 or 输出指定变量的值);
自定义fun函数对 如果 语句进行详细判断;
主函数则控制输入以及对其进行初步判断,while(strcmp(s,"0"))循环语句可输入多条输入语句,遇0则结束。

3、记录不会的知识的学习过程以及修改优化的过程;可以附上资料网站:

学习过程:
程序中可能会有遇到中文乱码无法进行判断的现象:由于输入的格式,可以先用空格进行分割,再利用strcmp函数与指定的中文进行比较,也可利用strstr函数截取所需要的中文内容(特别是用于 如果 的输入语句)
GitHub新建仓库和提交代码:GitHub新建仓库和提交代码
优化过程:
一个变量和简单加减(10以内):一个变量和简单加减.c
多个变量和简单加减(10以内):多个变量和简单加减.c
数字转汉字(三位数):数字转汉字(三位数).c
汉字转数字(三位数):汉字转数字(三位数).c
最后,将以上代码进行整合、测试并修改。

4、代码的进一步完善:

数值可能会有小数的情况,特别是在进行除法运算后,int类型的数据会让结果出现误差;
变量的数值大小受限,一方面因为汉字与数字之间的相互转换,输入与输出的数值最多只能是三位数的;另一方面,由于int类型,在运算时遇到大数会溢出;
变量的个数受结构体数组的限制;
在对输入语句用空格进行分割时,由于分割的字符串长短不一,对存储空间会造成一定程度的浪费等等。

5、具体代码:

#include
#include
#include
//定义结构体数组 name存放变量名 n则记录变量的大小
struct people
{
    char name[10];
    int n;
}peop[10];

//全局变量,其中x用来记录变量名的个数
char inter[11][5]={"零","一","二","三","四","五","六","七","八","九","十"};
int i,j,k,x=0;
char s[1001];


//一个数字汉字转为数字类型
int number(char *num)
{
    for(i=0;i<11;i++)
        if ( strcmp(inter[i],num)==0 )
            return i;
    if ( strcmp(num,"两")==0 )
        return 2;
}

//数字转换成汉字
void ntc( int n1 )
{
    if(n1<0)
    {
        printf("负");
        n1=abs(n1);
    }
    while(n1)
    {
        if(n1<=10)
        {
            puts(inter[n1]);
            return ;
        }
        else if(n1<100)
        {
            printf("%s",inter[n1/10]);
            printf("十");
            n1%=10;
        }
        else if(n1>=100)
        {
            printf("%s",inter[n1/100]);
            printf("百");
            if( n1%100 < 10 && n1%100 != 0)
                printf("零");
            n1%=100;
        }   
    }
    printf("\n");
}

//汉字转换成数字
int ctn( char *a )
{
    char num[5];
    int i,sum=0,m=0;
    for(i=0;a[i];i+=2)
    {
        strncpy(num,a+i,2);
        num[2]='\0';
        if ( strcmp(num,"十")==0 )
            if(sum==0) sum=10;
            else sum*=10;
        else if ( strcmp(num,"百")==0 )
        {
            m=sum*100;
            sum=0;
        }
        else
            sum+=number(num);
    }
    return sum+m;
}

//根据变量名查找对应位置
int look(char *na)
{
    for(i=0;i<5;i++)
        if( strcmp(peop[i].name,na)==0 ) return i;
}

//打印 看看 后要求的内容
void disp(char *p)
{
    char str1[2][50]={0};
    p=strstr(p,"看看");
    for(i=0,j=0;j<2;i++)
        if(p[i]!=' ')
        {
            k=i;
            while( p[i]!=' '&&p[i]!='\0' ) i++;
            strncpy(str1[j++],p+k,i-k);
        }
    if(str1[1][0]!='"')
    {
        k=look(str1[1]);
        ntc(peop[k].n);
        return ;
    }
    for(i=1;str1[1][i]!='"';i++)
        printf("%c",str1[1][i]);
    printf("\n");
}

//处理 如果 语句
void fun(char *p)
{
    char str1[10][50]={0};
    for(i=0,j=0;p[i];i++)
        if(p[i]!=' ')
        {
            k=i;
            while( p[i]!=' '&&p[i]!='\0' ) i++;
            strncpy(str1[j++],p+k,i-k);
        }
    if ( strcmp(str1[1],"无")==0 )
        return ;
    else if ( strcmp(str1[1],"整数")==0 )
        {
            strcpy(peop[x].name, str1[2]);
            peop[x].n=ctn(str1[4]);
            x++;
        }
    else if ( strcmp(str1[1],"看看")==0 )
        disp(p);
    else if ( strcmp(str1[2],"等于")==0 )
    {
        k=look(str1[1]);
        peop[k].n=ctn(str1[3]);
    }
    else if ( strcmp(str1[2],"增加")==0 )
    {
        k=look(str1[1]);
        peop[k].n=peop[k].n+ctn(str1[3]);
    }
    else if ( strcmp(str1[2],"减少")==0 )
    {
        k=look(str1[1]);
        peop[k].n=peop[k].n-ctn(str1[3]);
    }
    else if ( strcmp(str1[2],"乘")==0 || strcmp(str1[2],"乘以")==0 )
    {
        k=look(str1[1]);
        peop[k].n=peop[k].n * ctn(str1[3]);
        printf("%d\n",peop[k].n);
    }
    else if ( strcmp(str1[2],"除")==0 )
    {
        k=look(str1[1]);
        peop[k].n=ctn(str1[3])/peop[k].n;
    }
    else if ( strcmp(str1[2],"除以")==0 )
    {
        k=look(str1[1]);
        peop[k].n=peop[k].n/ctn(str1[3]);
    }
    else
        printf("您输入的格式有问题!");
}

//程序入口
int main()
{
    int t=5;
    gets(s);
    while(strcmp(s,"0"))//输入0终止程序
    {
        char str[15][50]={0};
        //gets(s);
        for(i=0,j=0;s[i]!='\0';i++)
            if(s[i]!=' ')
            {
                k=i;
                while( s[i]!=' '&&s[i]!='\0' ) i++;
                strncpy(str[j++],s+k,i-k);
            }
        if ( strcmp(str[0],"整数")==0 )  //两个字符串相等时,strcmp返回0
        {
            strcpy(peop[x].name, str[1]);
            peop[x].n=ctn(str[3]);
            x++;
        }
        else if ( strcmp(str[0],"看看")==0 )
            disp(s);
        else if ( strcmp(str[1],"等于")==0 )  
        {
            k=look(str[0]);
            peop[k].n=ctn(str[2]);
        }
        else if ( strcmp(str[1],"增加")==0 )
        {
            k=look(str[0]);
            peop[k].n=peop[k].n+ctn(str[2]);
        }
        else if ( strcmp(str[1],"减少")==0 )
        {
            k=look(str[0]);
            peop[k].n=peop[k].n-ctn(str[2]);
        }
        else if ( strcmp(str[1],"乘")==0 || strcmp(str[1],"乘以")==0 )
        {
            k=look(str[0]);
            peop[k].n=peop[k].n*ctn(str[2]);
        }
        else if ( strcmp(str[1],"除以")==0 )
        {
            k=look(str[0]);
            peop[k].n=peop[k].n/ctn(str[2]);
        }
        else if ( strcmp(str[1],"除")==0 )
        {
            k=look(str[0]);
            peop[k].n=ctn(str[2])/peop[k].n;
        }
        else if ( strcmp(str[0],"如果")==0 )
        {
            k=look(str[1]);
            if( (strcmp(str[2],"大于")==0 && peop[k].n>ctn(str[3])) || 
                (strcmp(str[2],"小于")==0 && peop[k].n=ctn(str[3])) || 
                (strcmp(str[2],"小于等于")==0 && peop[k].n<=ctn(str[3])) || 
                (strcmp(str[2],"等于")==0 && peop[k].n==ctn(str[3])) )
                fun(strstr(s,"则"));
            else
                fun(strstr(s,"否则"));
        }
        else
            printf("您输入的格式有问题,请重新输入");
        gets(s);
    }
}

6、样例运行截图:

样例1:
第一次个人编程作业_第1张图片
样例2:
第一次个人编程作业_第2张图片
样例3:
第一次个人编程作业_第3张图片

你可能感兴趣的:(第一次个人编程作业)