这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业2 |
这个作业的目标 | 1.继续完成编程题 2.新建一个github仓库,并把作业推送到该仓库 3.发布博客 |
作业正文 | 一、实践题 二、编程题 |
其他参考文献 | 常见代码命名规则 C语言常见命名规范 |
一、实践题
新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
请使用.gitignore文件忽略不要上传的文件。
多次下载git或者github desktop都不成功
一开始我以为是笔记本电脑自身问题,所以我换用台式电脑下载,下载到最后的时候依旧出现下载失败
可能是家里网络问题,等过段时间疫情好转,可以出去的时候,我再换个地方的网络,下载git,完成这次没完成好的作业。
所以这一题我只在网站上创建了仓库,并在网站上上传文件
二、编程题
•继续完成作业一的编程题。
•优化架构,一般要求每个函数长度不超过15行。
•优化规范,尤其是命名规范。
•制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
•进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
•在作业一编程题的基础上添加以下功能:通过命令行读取一个文件,然后运行这个文件。
2.1 优化结构
将point函数分成point和point2函数
point实现零到十的转化
point2实现十一到九九的转化
即
int point(char num[])
{
if (strcmp("零", num) == 0) return 0;
else if (strcmp("一", num) == 0) return 1;
else if (strcmp("二", num) == 0) return 2;
else if (strcmp("三", num) == 0) return 3;
else if (strcmp("四", num) == 0) return 4;
else if (strcmp("五", num) == 0) return 5;
else if (strcmp("六", num) == 0) return 6;
else if (strcmp("七", num) == 0) return 7;
else if (strcmp("八", num) == 0) return 8;
else if (strcmp("九", num) == 0) return 9;
else if (strcmp("十", num) == 0) return 10;
else{
int i, a, b, c;
char x[2], y[2];
for (i = 0; i < 2; i++){
x[i] = num[i];
y[i] = num[i + 2];
}
if (strcmp("十", x) == 0){
a = 10;
b = point(y);
c = a + b;
}
else {
a = point(x);
b = point(y);
c = a * 10 + b;
}
return c;
}
}
换成
int point(char num[])
{
int point2(char num[]);
if (strcmp("零", num) == 0) return 0;
else if (strcmp("一", num) == 0) return 1;
else if (strcmp("二", num) == 0) return 2;
else if (strcmp("三", num) == 0) return 3;
else if (strcmp("四", num) == 0) return 4;
else if (strcmp("五", num) == 0) return 5;
else if (strcmp("六", num) == 0) return 6;
else if (strcmp("七", num) == 0) return 7;
else if (strcmp("八", num) == 0) return 8;
else if (strcmp("九", num) == 0) return 9;
else if (strcmp("十", num) == 0) return 10;
else{
int shu;
shu=point2(num);
return shu;
}
}
和
int point2(char num[])
{
int i, a, b, c;
char x[2], y[2];
for (i = 0; i < 2; i++){
x[i] = num[i];
y[i] = num[i + 2];
}
if (strcmp("十", x) == 0){
a = 10;
b = point(y);
c = a + b;
}
else {
a = point(x);
b = point(y);
c = a * 10 + b;
}
return c;
}
完整代码
#include
#include
int main()
{
int point(char num[]);
void change(int a);
int qian,k;
char a[30], b[30], c[30], d[30],x[30],y[30],z[30];
scanf("%s%s%s%s", a, b, c, d);
if (strcmp(a, "整数") != 0 || strcmp(b, "钱包") != 0 || strcmp(c, "等于") != 0) {
printf("格式错误");
return 0;
}
else qian = point(d);
for(;;) {
scanf("%s%s", x, y);
if (strcmp(x, "看看") == 0 && strcmp(y, "钱包") == 0){
change(qian);
break;
}
if (strcmp(x, "钱包") == 0) {
if (strcmp(y, "增加") == 0) {
scanf("%s", z);
k = point(z);
qian += k;
}
if (strcmp(y, "减少") == 0) {
scanf("%s", z);
k = point(z);
qian -= k;
}
}
else printf("格式错误");
}
return 0;
}
int point(char num[])
{
int point2(char num[]);
if (strcmp("零", num) == 0) return 0;
else if (strcmp("一", num) == 0) return 1;
else if (strcmp("二", num) == 0) return 2;
else if (strcmp("三", num) == 0) return 3;
else if (strcmp("四", num) == 0) return 4;
else if (strcmp("五", num) == 0) return 5;
else if (strcmp("六", num) == 0) return 6;
else if (strcmp("七", num) == 0) return 7;
else if (strcmp("八", num) == 0) return 8;
else if (strcmp("九", num) == 0) return 9;
else if (strcmp("十", num) == 0) return 10;
else{
int shu;
shu=point2(num);
return shu;
}
}
int point2(char num[])
{
int i, a, b, c;
char x[2], y[2];
for (i = 0; i < 2; i++){
x[i] = num[i];
y[i] = num[i + 2];
}
if (strcmp("十", x) == 0){
a = 10;
b = point(y);
c = a + b;
}
else {
a = point(x);
b = point(y);
c = a * 10 + b;
}
return c;
}
void change(int a)
{
void exchange(int b);
int x, y;
if (a <= 10) exchange(a);
else if (a > 10 && a < 20) {
printf("十");
x = a % 10;
exchange(x);
}
else if (a >= 20 && a % 10 == 0) {
y = a / 10;
exchange(y);
printf("十");
}
else {
x = a / 10;
exchange(x);
printf("十");
y = a % 10;
exchange(y);
}
}
void exchange(int b)
{
if (b == 0)printf("零");
if (b == 1)printf("一");
if (b == 2)printf("二");
if (b == 3)printf("三");
if (b == 4)printf("四");
if (b == 5)printf("五");
if (b == 6)printf("六");
if (b == 7)printf("七");
if (b == 8)printf("八");
if (b == 9)printf("九");
if (b == 10)printf("十");
}
2.2 命名规范
2.2.1 常用的命名规则
·匈牙利命名法
这种命名方法是由Microsoft程序员查尔斯·西蒙尼(Charles Simonyi) 提出的。
其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。
匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。
·驼峰命名法
驼峰命名法,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字。其中第一个单词首字母小写,余下的单词首字母大写。
函数名中每一个逻辑断点都有一个大写字母来标记。
·帕斯卡命名法
帕斯卡(Pascal)命名法与骆驼命名法类似。
只不过骆驼命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。
·下划线命名法
下划线法是随着C语言的出现流行起来的,在UNIX/LIUNX这样的环境,以及GNU代码中使用非常普遍。
2.2.2 函数的命名
函数名使用下划线分割小写字母的方式命名:
设备名_操作名()
2.2.3 变量的命名
变量的命名也采用下划线分割小写字母的方式命名。
2.2.4 常量及宏的命名
采用下划线分割大写字母的方式命名,一般应以设备名作为前缀,防止模块间命名的重复。
参考内容:常见代码命名规则 C语言常见命名规范
2.3 编译脚本
参考了很多同学的作业,我最终决定也用windows批处理的方法。
首先我在B站上看了一些视频,做好了准备工作,出现的却是下面的结果。
我一直修改脚本,做了很多尝试,没有效果。
随后,我试着百度,好像有了办法。
结果,依旧没有用。
然后,我上网搜索“如何解决“ 'g++' 不是内部或外部命令,也不是可运行的程序或批处理文件 ”
根据以下两个博客:
(https://www.jianshu.com/p/9bffbaf12bed)
(https://blog.csdn.net/wzhwei1987/article/details/83414218)
我下载了所需文件
设置了路径
期间还遇到了各种困难,我又搜寻了很多相关问题的答案,在此就不一一列举了。
但最终,我成功了!!
(由于电脑自动设置了隐藏扩展名,所以上图没有test后面.exe,不过现已更改)
哦对了,我最初上网查如何“制作一个编译脚本,运行该脚本可以编译你的代码”,看到一个回答是使用makefile。
Makefile文件详解一(怎么在Windows下使用Makefile文件)
windows下使用makefile
Makefile教程
根据这些资料以及在b站上看的makefile教学视频,我认为大致步骤为:
第一步,创建example1文件夹,里面有test.c的文件。
第二步,创建makefile文本文件(脚本)。
第三步,到所属文件夹下打一个make,点回车后自动运行命令gcc test.c -o test,然后就有test可执行文件了,最后可以执行它。
(上图来自视频)
补充: makefile格式:
target:dependencies
command
不过我并未完全实现这些操作,不知道问题出在哪里。
2.4 单元测试**
选择对point及point2函数进行测试
测试代码如下:
#include
#include
int main()
{
int point(char num[]);
int a[10]={0,3,5,13,20,31,33,45,56,99};
char b[10][6] = { "零","三","五","十六","十九","三十","三三","四八","五九","九九" };
int i;
for(i=0;i<10;i++)
{
if(a[i]==point(b[i]))
{
printf("%s",b[i]);
printf( "测试正确" );
printf("\n");
}
else
{
printf("%s",b[i]);
printf( "测试错误" );
printf("\n");
}
}
return 0;
}
int point(char num[])
{
int point2(char num[]);
if (strcmp("零", num) == 0) return 0;
else if (strcmp("一", num) == 0) return 1;
else if (strcmp("二", num) == 0) return 2;
else if (strcmp("三", num) == 0) return 3;
else if (strcmp("四", num) == 0) return 4;
else if (strcmp("五", num) == 0) return 5;
else if (strcmp("六", num) == 0) return 6;
else if (strcmp("七", num) == 0) return 7;
else if (strcmp("八", num) == 0) return 8;
else if (strcmp("九", num) == 0) return 9;
else if (strcmp("十", num) == 0) return 10;
else{
int shu;
shu=point2(num);
return shu;
}
}
int point2(char num[])
{
int i, a, b, c;
char x[2], y[2];
for (i = 0; i < 2; i++){
x[i] = num[i];
y[i] = num[i + 2];
}
if (strcmp("十", x) == 0){
a = 10;
b = point(y);
c = a + b;
}
else {
a = point(x);
b = point(y);
c = a * 10 + b;
}
return c;
}
测试脚本如下:
测试结果如下:
2.5 命令行读取并运行文件
参考了许多同学的作业说使用freopen()函数,所以我在主函数中加入了这一步,成功实现了命令行读取并运行文件。
代码如下:
#include
#include
int main()
{
int point(char num[]);
void change(int a);
char file[100];
printf("请输入文件地址\n");
scanf("%s",file);
freopen(file,"r",stdin);
int qian,k;
char a[30], b[30], c[30], d[30],x[30],y[30],z[30];
scanf("%s%s%s%s", a, b, c, d);
if (strcmp(a, "整数") != 0 || strcmp(b, "钱包") != 0 || strcmp(c, "等于") != 0) {
printf("格式错误");
return 0;
}
else qian = point(d);
for(;;) {
scanf("%s%s", x, y);
if (strcmp(x, "看看") == 0 && strcmp(y, "钱包") == 0){
change(qian);
break;
}
if (strcmp(x, "钱包") == 0) {
if (strcmp(y, "增加") == 0) {
scanf("%s", z);
k = point(z);
qian += k;
}
if (strcmp(y, "减少") == 0) {
scanf("%s", z);
k = point(z);
qian -= k;
}
}
else printf("格式错误");
}
return 0;
}
int point(char num[])
{
int point2(char num[]);
if (strcmp("零", num) == 0) return 0;
else if (strcmp("一", num) == 0) return 1;
else if (strcmp("二", num) == 0) return 2;
else if (strcmp("三", num) == 0) return 3;
else if (strcmp("四", num) == 0) return 4;
else if (strcmp("五", num) == 0) return 5;
else if (strcmp("六", num) == 0) return 6;
else if (strcmp("七", num) == 0) return 7;
else if (strcmp("八", num) == 0) return 8;
else if (strcmp("九", num) == 0) return 9;
else if (strcmp("十", num) == 0) return 10;
else{
int shu;
shu=point2(num);
return shu;
}
}
int point2(char num[])
{
int i, a, b, c;
char x[2], y[2];
for (i = 0; i < 2; i++){
x[i] = num[i];
y[i] = num[i + 2];
}
if (strcmp("十", x) == 0){
a = 10;
b = point(y);
c = a + b;
}
else {
a = point(x);
b = point(y);
c = a * 10 + b;
}
return c;
}
void change(int a)
{
void exchange(int b);
int x, y;
if (a <= 10) exchange(a);
else if (a > 10 && a < 20) {
printf("十");
x = a % 10;
exchange(x);
}
else if (a >= 20 && a % 10 == 0) {
y = a / 10;
exchange(y);
printf("十");
}
else {
x = a / 10;
exchange(x);
printf("十");
y = a % 10;
exchange(y);
}
}
void exchange(int b)
{
if (b == 0)printf("零");
if (b == 1)printf("一");
if (b == 2)printf("二");
if (b == 3)printf("三");
if (b == 4)printf("四");
if (b == 5)printf("五");
if (b == 6)printf("六");
if (b == 7)printf("七");
if (b == 8)printf("八");
if (b == 9)printf("九");
if (b == 10)printf("十");
}