这个作业属于哪个课程 | 2020面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计作业3 |
这个作业的目标 | 继续完成作业二的编程题,优化架构,思考代码的拓展性 |
作业正文 | 本文 |
解题
相较于作业二的代码,本次添加了以下功能
①媒介不再单一
支持多种“钱包形式”的输入
②输入次数不再限制
原本只能输入3次
③支持负数输入!
针对负数输入,添加了switchMinus函数,并且针对此项功能对判断“增加”还是“减少”的In_Or_De函数同时进行了修改,在这个函数内进行是否为“负数”的判定
代码实现如下
int switchMinus(char* s)
{
int m, n;
for (m = 0; m < 2; m++)
{
for (n = 0; n < strlen(s); n++)
s[n] = s[n + 1];
}
j = Ch_Switch_Num(s);
return j;
}
int In_Or_De(char* s,int a)
{
while (strcmp(s, "看看") != 0)
{
scanf("%s", s);
if (strcmp(s, "增加") == 0)
{
scanf("%s", s);
if (strcmp(extract(buffer, s), "负") == 0)
a -= switchMinus(s);
else
a += Ch_Switch_Num(s);
}
else if (strcmp(s, "减少") == 0)
{
scanf("%s", s);
if (strcmp(extract(buffer, s), "负") == 0)
a += switchMinus(s);
else
a -= Ch_Switch_Num(s);
}
scanf("%s", s);
}
return a;
}
对于新增功能①和②,在In_Or_De函数中对循环条件的判断进行了修改,原先是限制了同一种钱包媒介
while (strcmp(s, "看看") != 0)
完整代码
#include<stdio.h>
#include<string.h>
int j;
char buffer[5] = "";
int In_Or_De(char* s, int a);//判断是增加还是减少
void output(int a);//输出结果
int Ch_Switch_Num(char* s);//将汉字转为数字
int changeSingle(char* s);//将单个汉字转换为数字
char *extract(char* a, char* b);//提取“十”字前后的数字
int switchMinus(char* s);//转换负数
char chinese[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
int main()
{
char s[10];char sp[10];
int i, caibu;
scanf("%s", s);
scanf("%s", s);
for (i = 0; i < 2; i++)
scanf("%s", s);
caibu = Ch_Switch_Num(s);
scanf("%s", s);
caibu = In_Or_De(s,caibu);
scanf("%s", s);
output(caibu);
return 0;
}
int In_Or_De(char* s,int a)
{
while (strcmp(s, "看看") != 0)
{
scanf("%s", s);
if (strcmp(s, "增加") == 0)
{
scanf("%s", s);
if (strcmp(extract(buffer, s), "负") == 0)
a -= switchMinus(s);
else
a += Ch_Switch_Num(s);
}
else if (strcmp(s, "减少") == 0)
{
scanf("%s", s);
if (strcmp(extract(buffer, s), "负") == 0)
a += switchMinus(s);
else
a -= Ch_Switch_Num(s);
}
scanf("%s", s);
}
return a;
}
void output(int a)
{
if (a <= 10)
printf("%s", chinese[a]);
else if (a > 10 && a < 20)
printf("十%s", chinese[a - 10]);
else if (a % 10 == 0)
printf("%s十", chinese[a / 10]);
else
printf("%s十%s", chinese[a / 10], chinese[a % 10]);
}
int Ch_Switch_Num(char* s)
{
int i;
if (strlen(s) == 2)//处理0-9的汉字
j=changeSingle(s);
else if (strlen(s) == 4)//处理10-19以及十的倍数的汉字
{
strcpy(buffer,extract(buffer, s));
if (strcmp(buffer, "十") == 0)//处理10-19的汉字
j = 10 + changeSingle(extract(buffer,s+2));
else//处理十的倍数
j = changeSingle(buffer) * 10;
}
else//处理几十几的汉字
j = changeSingle(extract(buffer, s)) * 10 + changeSingle(extract(buffer, s + 4));
return j;
}
int changeSingle(char* s)
{
int i;
for (i = 0; i < 11; i++)
{
if (strcmp(s, chinese[i]) == 0)
return i;
}
}
char *extract(char* a, char* b)
{
a[0] = b[0];
a[1] = b[1];
return a;
}
int switchMinus(char* s)
{
int m, n;
for (m = 0; m < 2; m++)
{
for (n = 0; n < strlen(s); n++)
s[n] = s[n + 1];
}
j = Ch_Switch_Num(s);
return j;
}
思考
对于扩大输入范围,如增大到几百、几千,目前的想法是依旧使用strlen
函数,判断输入中文的长度,在不同长度下考虑多种情况,比如在2字节下新增“五百”“一千”的情况,和九十九以内的输入没有太大的区别