作业属于 | 2020年面向对象程序设计 |
作业要求 | 面向对象程序设计寒假作业3 |
作业目标 |
继续完善代码 实现负数的处理 实现大于十数字的处理 发表博客 |
作业仓库 | https://github.com/Es-war/2020-OPP-3 |
一、编程题
(在进行代码分块处理时,编写完成后,使用不同的主函数进行单元测试,测试结果附于代码下方)
charToNum函数 |
int charToNum(char oMoney[])
{
char figure[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
char copy[0];
int i, j, sum = 0, flag = 1, x = 0;
int len = strlen(oMoney);
for(i = 0; i < len; i += 2)
{
strncpy(copy,oMoney+i,2);
if(!strcmp(copy,"负"))
{
flag = -1;
x = 2;
}
for(j = 0; j < 11; j++)
{
if(!strcmp(copy,figure[j]))
{
if(i==x&&j==10) sum += j;
else if(i!=x&&j==10) sum = sum*10;
else if(j!=10) sum += j;
}
}
}
return (flag*sum);
}
根据输入的数据进行判断,首先判断是否是负数,用flag记录正负情况,方便后面的数据返回;其次对涉及金额的中文字符数据进行转化,得到int型数据
deal函数 |
在deal函数中对用户输入的"钱包 增加"/ "钱包 减少"/ "看看 钱包"的行为进行判断处理, 根据具体行为具体操作
int deal() { char wallet[10], sign[10], coin[16]; int sum = 0; for (;;) { scanf("%s", wallet); if ( !strcmp("钱包", wallet) ) { scanf("%s%s", sign, coin); if ( !strcmp("增加", sign) ) sum += charToNum(coin); else if ( !strcmp("减少", sign) ) sum -= charToNum(coin); } else if ( !strcmp("看看", wallet) ) { scanf("%s", wallet); break; } } return sum; }
测试时与上面charToNum函数一起配合使用,并且人为的将初值赋为0(最后的代码中,是有对初值进行判断的,即调用charToNum函数得到初值)
output函数 |
在此函数中定义了字符二维数组来保存"零一二三四五六七八九十"这些中文字符,根据下标便可轻松调用. 主要用于输出<10的数据,以及接下来被outputPlus函数的调用. (与outputPlus一起进行单元测试)
void output(int num) { char figure[10][4] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; printf("%s", figure[num]); }
outputPlus |
在此函数中,主要是对处于[10, 99]区间数据的输出进行处理, 较为特殊的数据为[10,19], 例如12, 按照日常表达习惯应为"十二", 而不是"一十二"
在主函数中进行是否为负数的判断,并且判断绝对值所处区间
完整代码 |
增加读入文件的功能
#include<stdio.h> #include<string.h> #include<math.h> int charToNum(char oMoney[]) { char figure[11][4]={"零","一","二","三","四","五","六","七","八","九","十"}; char copy[0]; int i, j, sum = 0, flag = 1, x = 0; int len = strlen(oMoney); for(i = 0; i < len; i += 2) { strncpy(copy,oMoney+i,2); if(!strcmp(copy,"负")) { flag = -1; x = 2; } for(j = 0; j < 11; j++) { if(!strcmp(copy,figure[j])) { if(i==x&&j==10) sum += j; else if(i!=x&&j==10) sum = sum*10; else if(j!=10) sum += j; } } } return (flag*sum); } int deal() { char wallet[10], sign[10], coin[16]; int sum = 0; for (;;) { scanf("%s", wallet); if ( !strcmp("钱包", wallet) ) { scanf("%s%s", sign, coin); if ( !strcmp("增加", sign) ) sum += charToNum(coin); else if ( !strcmp("减少", sign) ) sum -= charToNum(coin); } else if ( !strcmp("看看", wallet) ) { scanf("%s", wallet); break; } } return sum; } void output(int num) { char figure[10][4] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; printf("%s", figure[num]); } void outputPlus(int num) { int tensPlace, onesPlace; tensPlace = num / 10; onesPlace = num % 10; if ( tensPlace != 1 ) output(tensPlace); printf("十"); if ( onesPlace ) output(onesPlace); } int main() { char document[20]; char movement[16], wallet[16], sign[16], money[16]; int total = 0; scanf("%s",document); freopen(document,"r",stdin); scanf("%s%s%s%s", movement, wallet, sign, money); total = charToNum(money); total += deal(); if (total < 0) printf("负"); total = fabs(total); if (total < 10) output(total); else outputPlus(total); return 0; }
二、编译脚本
@echo off set /p a=请输入文件所在磁盘 cd "%a%" set /p b=请输入文件所在路径 cd "%b%" set /p c=请输入文件名 echo 编译开始 gcc "%c%" -o try.exe if exist "try.exe" echo 编译成功 if not exist "try.exe" echo 编译失败 pause
三、测试脚本
@echo off cd C:/Users/Es war/C set /p a=请输入所要测试单元 gcc "%a%" -o try.exe echo 开始测试 try.exe echo 测试结束 pause
例:现将运行output.cpp
输入程序名后,即可实现编译运行