这个作业属于哪个课程 | 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<stdio.h>
#include<string.h>
#include<math.h>
//定义结构体数组 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("
");
}
//汉字转换成数字
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]=' ';
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]!=' ' ) 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("
");
}
//处理 如果 语句
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]!=' ' ) 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
",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]!=' ';i++)
if(s[i]!=' ')
{
k=i;
while( s[i]!=' '&&s[i]!=' ' ) 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])) ||
(strcmp(str[2],"等于")==0 && peop[k].n==ctn(str[3])) )
fun(strstr(s,"则"));
else
fun(strstr(s,"否则"));
}
else
printf("您输入的格式有问题,请重新输入");
gets(s);
}
}
6、样例运行截图:
样例1:
样例2:
样例3: