这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2020OOP |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10231 |
这个作业的目标 | 1.继续完成作业1的编程题 2.学会新建github仓库并上传代码 3.制作编译脚本 |
作业正文 | https://www.cnblogs.com/atsap/p/12260249.html |
其他参考文献 | https://blog.csdn.net/WxqHUT/article/details/86502948https://help.github.com/cn/articles/create-a-repohttps://blog.csdn.net/xu_fu_yong/article/details/83019776及一些同学的解答! |
实践题
新建一个文件夹,右键点击Git Bash Here,执行命令git init创建一个.git隐藏文件夹。
设置SSH key,把生成的id_rsa.pubde内容复制粘贴在网页中的new SSH key,点击add SSH key。
git add +要上传的文件名,然后git status查看,发现new file。
添加之后提交,输入git commit -m "第一次提交",再输入git status检查状态。
新建一个repository。
复制repository的地址,输入命令:git remote add origin "地址”。
最后执行命令:git push origin master,会弹出一个登录的界面,登录。
编程题
继续完成程序
再对原来的代码进行了改动(感觉重新写了一遍??),虽然还有很多不完善的地方,但是相比于原来增加了对一些不规范输入的处理
- 增加了输入的字符串字符数组的长度,避免输入使用不当造成数组越界;
添加了没有输入“整数”,物品名称前后不一致,数字输入不规范等格式错误的提示,不过只能在输入回车后提示;
如:if (strcmp(word, zs) != 0) { printf("程序只能处理整数数据\n"); }
把一个函数拆解成更多的函数,使每个函数行数更少,避免不同函数中有重复的部分。
int Cn_To_Int(char* s); // 把一个汉字转化成数字 void Int_To_Cn(char* m, int a); // 把数字转换成一个汉字 int f(char* s); // 分类处理不同汉字数组成的数字 int f1(char* s); // 把两个汉字转换成数字 int f2(char* s); // 把三个汉字转换成数字 void output(int i); // 处理数字并输出
书写规范:
虽然输入分号后vs会自动帮忙整理格式,但是还应当了解平时应该注意的书写规范,例如一些命名规则等,规范的书写可以使代码更整洁便于阅读,还可以避免一些错误,
在此摘录了一些觉得要注意的:
- 在定义变量的同时初始化该变量
- 两个相对独立的程序块、变量说明之后必须要加空行
- 所有宏定义、枚举常数和const变量,用大写字母命名
- 当需要把一个程序行的内容分成几行书写时,操作符应该放在行末
- 函数名是复合词的,第一个词采用全部小写,随后每一个单词采用第一个字母大写,其余小写
- 在一般情况下,源程序有效注释量必须在 20% 以上。虽然注释有助于理解代码,但注意不可过多地使用注释
全部代码:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
char zero[] = "零",
one[] = "一",
two[] = "二",
three[] = "三",
four[] = "四",
five[] = "五",
six[] = "六",
seven[] = "七",
eight[] = "八",
nine[] = "九",
ten[] = "十";
int Cn_To_Int(char* s); // 把一个汉字转化成数字
void Int_To_Cn(char* m, int a); // 把数字转换成一个汉字
int f(char* s); // 分类处理不同汉字数组成的数字
int f1(char* s); // 把两个汉字转换成数字
int f2(char* s); // 把三个汉字转换成数字
void output(int i); // 处理数字并输出
int main()
{
int money = 0;
char zs[] = "整数",
op1[] = "等于",
op2[] = "增加",
op3[] = "减少",
kk[] = "看看";
char word[1000] , name[1000];
scanf("%s", word);
if (strcmp(word, zs) != 0)
{
printf("程序只能处理整数数据\n");
}
scanf("%s", name);
scanf("%s", word);
if (strcmp(word, op1) == 0)
{
scanf("%s", word);
money = f(word);
}
else
printf("请按照格式输入\n");
for (;;)
{
scanf("%s", word);
if (strcmp(word, name) != 0 && strcmp(word, kk) != 0)
{
printf("无法进行运算\n");
break;
}
else if (strcmp(word, kk) == 0)
break;
scanf("%s", word);
if (strcmp(word, op2) == 0)
{
scanf("%s", word);
money += f(word);
}
else if (strcmp(word, op3) == 0)
{
scanf("%s", word);
money -= f(word);
}
}
scanf("%s", word);
if (strcmp(word, name) != 0)
{
printf("无法进行运算\n");
}
output(money);
return 0;
}
int f(char* s)
{
int i;
if (strlen(s) == 2)
{
i = Cn_To_Int(s);
if (i == -1)
printf("无法处理输入的数字\n");
else
return i;
}
else if (strlen(s) == 4)
return f1(s);
else if (strlen(s) == 6)
return f2(s);
else printf("无法处理输入的数字\n");
}
int Cn_To_Int(char* s)
{
if (strcmp(s, zero) == 0) return 0;
else if (strcmp(s, one) == 0) return 1;
else if (strcmp(s, two) == 0) return 2;
else if (strcmp(s, three) == 0) return 3;
else if (strcmp(s, four) == 0) return 4;
else if (strcmp(s, five) == 0) return 5;
else if (strcmp(s, six) == 0) return 6;
else if (strcmp(s, seven) == 0) return 7;
else if (strcmp(s, eight) == 0) return 8;
else if (strcmp(s, nine) == 0) return 9;
else if (strcmp(s, ten) == 0) return 10;
else return -1;
}
void Int_To_Cn(char* m, int a)
{
if (a == 1) strcat(m, one);
if (a == 2) strcat(m, two);
if (a == 3) strcat(m, three);
if (a == 4) strcat(m, four);
if (a == 5) strcat(m, five);
if (a == 6) strcat(m, six);
if (a == 7) strcat(m, seven);
if (a == 8) strcat(m, eight);
if (a == 9) strcat(m, nine);
}
int f1(char* s)
{
int m = 0, n;
char k[3];
k[0] = s[0];
k[1] = s[1];
k[2] = '\0';
n = Cn_To_Int(k);
if (n > 1)
{
if (n < 10)
m += n * 10;
else if (n == 10)
m += 10;
k[0] = s[2];
k[1] = s[3];
m += (Cn_To_Int(k));
}
else
printf("无法处理输入的数字\n");
return (m);
}
int f2(char* s)
{
int m = 0 ,n;
char k[3];
k[0] = s[0];
k[1] = s[1];
k[2] = '\0';
n = Cn_To_Int(k);
if (n > 1 && n < 10)
{
m += n * 10;
k[0] = s[2];
k[1] = s[3];
if (Cn_To_Int(k) != 10)
{
printf("无法处理输入的数字\n");
}
k[0] = s[4];
k[1] = s[5];
n = Cn_To_Int(k);
m += n;
}
else
printf("无法处理输入的数字\n");
return (m);
}
void output(int i)
{
int a, b;
char money[7] = { 0 };
a = i % 10;
b = i / 10;
if (b != 0)
{
if (b != 1) Int_To_Cn(money, b);
strcat(money, ten);
}
if (a != 0) Int_To_Cn(money, a);
if (a == 0 && b == 0)
strcat(money, zero);
printf("%s", money);
}
制作编译脚本:
我用windows批处理来写编译的脚本。
首先在桌面上新建了一个记事本,内容是用cd命令找到要编译的文件的位置,然后cl 1.c。
写完后改成bat格式,双击打开。
起先打开后一直闪退,后来查资料后发现因为脚本已经运行完了所以就一闪而过,只要在脚本的末尾加上一个pause,就不会闪退了。
能看到生成了一个名为1.exe的文件。
制作单元测试:
其实测试过程没有全部做完,不过程序写完已经做了一些测试,没有出现问题,只抽取了两个幸运函数进行测试
单元测试的脚本与编译的脚本类似,但是增加了编译文件之后再运行文件的部分
cd..
cd source
cd repos
cd zuoye2+
cl hanshu.c
hanshu.exe //更改文件名或目录就可以编译运行不同的文件
pause
测试的程序如下:
1.函数是int Cn_To_Int(char* s),作用是能把汉语数字转换成阿拉伯数字
如果返回正确的数字就显示 pass ,否则显示 !
#include
#include
char zero[] = "零",
one[] = "一",
two[] = "二",
three[] = "三",
four[] = "四",
five[] = "五",
six[] = "六",
seven[] = "七",
eight[] = "八",
nine[] = "九",
ten[] = "十";
int Cn_To_Int(char* s);
int main()
{
char sz0[] = "零一二三四五六七八九十";
char sz[3];
int i;
for (i = 0; i <= 10;i++)
{
sz[0] = sz0[2 * i];
sz[1] = sz0[2 * i + 1];
sz[2] = '\0';
if (i == Cn_To_Int(sz))
{
printf("pass\n");
}
else
printf("!\n");
}
return 0;
}
int Cn_To_Int(char* s)
{
if (strcmp(s, zero) == 0) return 0;
else if (strcmp(s, one) == 0) return 1;
else if (strcmp(s, two) == 0) return 2;
else if (strcmp(s, three) == 0) return 3;
else if (strcmp(s, four) == 0) return 4;
else if (strcmp(s, five) == 0) return 5;
else if (strcmp(s, six) == 0) return 6;
else if (strcmp(s, seven) == 0) return 7;
else if (strcmp(s, eight) == 0) return 8;
else if (strcmp(s, nine) == 0) return 9;
else if (strcmp(s, ten) == 0) return 10;
else return -1;
}
测试结果:
2.函数是int f2(char* s)。
作用是处理三个汉字组成的数。
测试数据为"五十五", "二二二", "二十四", "一十七"。
#include
#include
char zero[] = "零",
one[] = "一",
two[] = "二",
three[] = "三",
four[] = "四",
five[] = "五",
six[] = "六",
seven[] = "七",
eight[] = "八",
nine[] = "九",
ten[] = "十";
int f2(char* s);
int Cn_To_Int(char* s);
int main()
{
char w1[] = "五十五", w2[] = "二二二", w3[] = "二十四", w4[] = "一十七";
if (f2(w1) != 0)
printf("%d\n", f2(w1));
if (f2(w2) != 0)
printf("%d\n", f2(w2));
if (f2(w3) != 0)
printf("%d\n", f2(w3));
if (f2(w4) != 0)
printf("%d\n", f2(w4));
return 0;
}
int f2(char* s)
{
int m = 0, n;
char k[3];
k[0] = s[0];
k[1] = s[1];
k[2] = '\0';
n = Cn_To_Int(k);
if (n > 1 && n < 10)
{
m += n * 10;
k[0] = s[4];
k[1] = s[5];
n = Cn_To_Int(k);
m += n;
k[0] = s[2];
k[1] = s[3];
if (Cn_To_Int(k) != 10)
{
printf("无法处理输入的数字\n");
m = 0;
}
}
else
printf("无法处理输入的数字\n");
return (m);
}
int Cn_To_Int(char* s)
{
if (strcmp(s, zero) == 0) return 0;
else if (strcmp(s, one) == 0) return 1;
else if (strcmp(s, two) == 0) return 2;
else if (strcmp(s, three) == 0) return 3;
else if (strcmp(s, four) == 0) return 4;
else if (strcmp(s, five) == 0) return 5;
else if (strcmp(s, six) == 0) return 6;
else if (strcmp(s, seven) == 0) return 7;
else if (strcmp(s, eight) == 0) return 8;
else if (strcmp(s, nine) == 0) return 9;
else if (strcmp(s, ten) == 0) return 10;
else return -1;
}
测试结果:
添加功能
想了很久不知道该怎么做,在主函数里添加
char file[100];
scanf("%s",file);
freopen(file,"r",stdin);
但是好像不合题意,因为要输入回车而不是空格。
踩坑:txt文件要用ANSI编码方式,否则不能运行。