2020面向对象程序设计寒假作业2

这个作业属于哪个课程 2020面向对象程序设计张栋班
这个作业要求在哪里 面向对象程序设计寒假作业2
这个作业的目标 1.继续完成作业1的编程题。
2.新建一个github仓库,并把作业推送到该仓库。
3.发布博客。
作业正文 2020面向对象程序设计寒假作业2
其他参考文献 1.git 设置忽略文件提交的几种方式
2.Git教程
3.git - 简明指南
4.Windows批处理命令用法
5.Git 忽略提交 .gitignore

实践题

要求

  • 新建一个GitHub仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库.使用gitignore文件忽略不要上传的文件。

过程

  • 首先了解git是什么
    ①Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
    ②Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
    ③Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。

  • 安装git

  • 使用git-bash创建新仓库——创建新文件夹,打开,然后执行git init,以创建新的仓库。

  • 创建子目录homework_1和homework_2。

    (因为平时.git目录是看不见的,用ls -ah可以查看)

  • 执行git add,将文件添加到仓库。

  • 登陆GitHub打开“ssh key”页面,添加“ssh key”(要使用公钥)

  • 在GitHub上创建一个新的仓库 忘了截图了

  • 把本地仓库内容推送到远程仓库

  • 使用gitignore忽略不要上传的文件,在本仓库下使用git-bash,输入touch.gitignore创建.gitignore文件,注意,这里不能够先创建一个新的文件夹再改名为.gitignore文件,不要问我为什么会知道,在仓库中找到空白的.gitignore文件进行编辑。百度学习 .gitignore的使用规则:

还是看不懂?没有关系,给出了示例:

总结:全过程均学习廖雪峰老师的教程,本人也操作、尝试了很长时间,才磕磕绊绊的大致完成,虽然学到了挺多东西,但是过程一言难尽。看了很多教程,但是其中大部分都是我看不懂的。。。直到找到了廖雪峰老师的,才算是救了我一命。

编程题

要求

  • 继续完成作业一的编程题。
  • 优化架构,一般要求每个函数长度不超过15行。
  • 优化规范,尤其是命名规范。
  • 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
  • 进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
  • 添加以下功能: 通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
    1.优化(并没有)
  • 首先是输入的数字的情况(我写了三个转化函数,发现不太好命名,所以决定还是用change1,2,3来区分,再加注释。
  • 因为我的思路是先判断输入字符串的长度,再决定调用哪个函数。
  • 分三种情况,因为一个汉字占的长度是2,所以当len=2时,0<=数字<=10;当len=4时,可能是11-19或者是整十数;当len=6时,21<=数字<=99除整十数。
    ①len=2时,比较简单,就是最开始的情况
int change1(char a[]){
	int n;
	if(strcmp(a,"零")==0) n=0;
	else if (strcmp(a,"一")==0) n=1;
	else if (strcmp(a,"二")==0) n=2;
	else if (strcmp(a,"三")==0) n=3;
	else if (strcmp(a,"四")==0) n=4;
	else if (strcmp(a,"五")==0) n=5;
	else if (strcmp(a,"六")==0) n=6;
	else if (strcmp(a,"七")==0) n=7;
	else if (strcmp(a,"八")==0) n=8;
	else if (strcmp(a,"九")==0) n=9;
	else n=10;
	return n;
}

②③一个汉字长度是2,所以在汉字判断上我有点问题,后来我写了一段简单代码,

int main(){
	char a[10]="十四";
	printf("%c%c",a[0],a[1]);
	return 0;

这段代码的输出让我不知咋搞。。

所以对于输入的数字比十大时我还没找到解决方案。。。

  • 输出时数字的转化也有三个函数,命名为switch1,2,3,分别表示输出结果在0-10,11-19,20-99的范围内;阿拉伯数字转汉字会比汉字转阿拉伯要简单。。。

①0-10时

void switch1(int n)//<=结果<=10 
{
	if(n==0) printf("零"); 
	else if(n==1) printf("一"); 
	else if(n==2) printf("二"); 
	else if(n==3) printf("三"); 
	else if(n==4) printf("四"); 
	else if(n==5) printf("五"); 
	else if(n==6) printf("六"); 
	else if(n==7) printf("七"); 
	else if(n==8) printf("八"); 
	else if(n==9) printf("九"); 
	if(n==10) printf("十"); 
}

②11-19时

void switch2(int n)//11<=结果<=19 
{
    if(n==1) printf("十一"); 
	else if(n==2) printf("十二"); 
	else if(n==3) printf("十三"); 
	else if(n==4) printf("十四"); 
	else if(n==5) printf("十五"); 
	else if(n==6) printf("十六"); 
	else if(n==7) printf("十七"); 
	else if(n==8) printf("十八"); 
	else if(n==9) printf("十九"); 

}

③20-99时

void switch3(int n){
    int shiwei,gewei;
	shiwei=n/10;
	gewei=n%10;
	if(gewei==0)//整十 
	{
		switch1(shiwei);
		printf("十"); 
	}
	else//十位不为1,个位不为0 
	{
		switch1(shiwei);
		printf("十");
		switch2(gewei);
	}
}

所以我能做的就只是让命名更加规范,函数架构更加合理而已
完整代码

#include<stdio.h>
#include<string.h>
int flag=1;
int n;
//对输入做处理 ,转为判断字符串长度 
//当长度==2时,<=10; 
//长度==4时,可能是11-20,或者是整十数;
//长度==6时,21-99除整十数; 
int change1(char a[]){
	int n;
	if(strcmp(a,"零")==0) n=0;
	else if (strcmp(a,"一")==0) n=1;
	else if (strcmp(a,"二")==0) n=2;
	else if (strcmp(a,"三")==0) n=3;
	else if (strcmp(a,"四")==0) n=4;
	else if (strcmp(a,"五")==0) n=5;
	else if (strcmp(a,"六")==0) n=6;
	else if (strcmp(a,"七")==0) n=7;
	else if (strcmp(a,"八")==0) n=8;
	else if (strcmp(a,"九")==0) n=9;
	else n=10;
	return n;
}
int input(char a[]){
	int len,n;
	len=strlen(a);
	if(len==2){
		n=change1(a);
	} 
}
//一下对输出做处理 
void switch1(int n)//<=结果<=10 
{
	if(n==0) printf("零"); 
	else if(n==1) printf("一"); 
	else if(n==2) printf("二"); 
	else if(n==3) printf("三"); 
	else if(n==4) printf("四"); 
	else if(n==5) printf("五"); 
	else if(n==6) printf("六"); 
	else if(n==7) printf("七"); 
	else if(n==8) printf("八"); 
	else if(n==9) printf("九"); 
	if(n==10) printf("十"); 
}
void switch2(int n)//11<=结果<=19 
{
    if(n==1) printf("十一"); 
	else if(n==2) printf("十二"); 
	else if(n==3) printf("十三"); 
	else if(n==4) printf("十四"); 
	else if(n==5) printf("十五"); 
	else if(n==6) printf("十六"); 
	else if(n==7) printf("十七"); 
	else if(n==8) printf("十八"); 
	else if(n==9) printf("十九"); 

}
void switch3(int n){
    int shiwei,gewei;
	shiwei=n/10;
	gewei=n%10;
	if(gewei==0)//整十 
	{
		switch1(shiwei);
		printf("十"); 
	}
	else//十位不为1,个位不为0 
	{
		switch1(shiwei);
		printf("十");
		switch1(gewei);
	}
}
void output(int n){
	if(n<=9){
		switch1(n);
	} 
	else if(n>=11&&n<=19){
		n%=10;
		switch2(n);
	} 
	else{
		switch3(n); 
	}
}
int main(){
	int n;
	char lei[10],rong[10],fu[10],shu[10],r2[10];//分别代表类别,容器,符号,数字 
	scanf("%s %s %s %s",lei,rong,fu,shu);
	n=input(shu);
	if(strcmp(lei,"整数")==0) {
		if(strcmp(rong,"钱包")==0){
			while(1){
				scanf("%s",r2);
				if(strcmp(r2,"钱包")==0) {
					scanf("%s %s",fu,shu);
					if(strcmp(fu,"增加")==0) n+=input(shu);
					else n-=input(shu);
				} 
				if(strcmp(r2,"看看")==0) break;
			}
		}
		else flag=0; //标记变量不为“钱包” 
	}
	else flag=0;//标记变量不为“整数” 
	if(flag==0) printf("error");
	else output(n);
	return 0;
} 
  • 制作编译脚本
    先了解什么是脚本(一种纯文本保存的程序),然后在查阅资料以及参考同学的作业之后,用Windows批处理命令语句,将语句写在记事本或者写字板上,保存,修改名称,加后缀.bat就可以了
    首先用的脚本是这样的
@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

不知道是是路径的问题还是其他什么问题(我没有找出来),一直是编译失败,给人弄到头大,还有就是用记事本的时候会出现乱码,用写字板的时候就不会,不懂为啥。百度之后,放弃了这两个,改用notepad++,并将notepad++的编码改成ANSI编码以及换了一个脚本,脚本如下,然后保存于zuoye.cpp所在的文件夹。要记得加.bat

@echo off
title 编译脚本
gcc zuoye.cpp -o zuoye.exe
if exist zuoye.exe echo 编译成功!
pause



双击new 1,就可以发现:

  • 进行单元测试
    想法是将每一个需要测试的函数都写一个测试代码
@echo off 
title 测试脚本 
gcc test.cpp -o test.exe 
test.exe
pause

在测试每个函数时把test改成相对应的名称即可

change1函数##

#include<stdio.h>
#include<string.h>
int flag=1;
int n;
int change1(char a[]){
   int n;
   if(strcmp(a,"零")==0) n=0;
   else if (strcmp(a,"一")==0) n=1;
   else if (strcmp(a,"二")==0) n=2;
   else if (strcmp(a,"三")==0) n=3;
   else if (strcmp(a,"四")==0) n=4;
   else if (strcmp(a,"五")==0) n=5;
   else if (strcmp(a,"六")==0) n=6;
   else if (strcmp(a,"七")==0) n=7;
   else if (strcmp(a,"八")==0) n=8;
   else if (strcmp(a,"九")==0) n=9;
   else n=10;
   return n;
}
int main(){
   char shu[10];
   scanf("%s",shu);
   int n;
   //scanf("%d",&n);
   n=change1(shu);
   printf("%d\n",n);
   return 0; 
} 


我也不懂为啥名称会乱码,不想纠结了。。。 后面发现是编码没有改成ANSI的缘故,但是我已经贴图了,就不再修改了。。。
因为比十大的输入函数不完整,所以input函数的功能和change1函数的功能是一样的,就不再进行测试了。

switch1函数##

后来我觉得改测试代码改来改去很麻烦,所以全都叫test

#include<stdio.h>
#include<string.h>
int flag=1;
int n;
void switch1(int n)//<=结果<=10 
{
	if(n==0) printf("零"); 
	else if(n==1) printf("一"); 
	else if(n==2) printf("二"); 
	else if(n==3) printf("三"); 
	else if(n==4) printf("四"); 
	else if(n==5) printf("五"); 
	else if(n==6) printf("六"); 
	else if(n==7) printf("七"); 
	else if(n==8) printf("八"); 
	else if(n==9) printf("九"); 
	if(n==10) printf("十"); 
}
int main(){
	//char shu[10];
	//scanf("%s",shu);
	int n;
	scanf("%d",&n);
	switch1(n);
	printf("\n");
	return 0; 
} 

switch2函数##

#include<stdio.h>
#include<string.h>
int flag=1;
int n;
void switch2(int n)//11<=结果<=19 
{
    if(n==1) printf("十一"); 
	else if(n==2) printf("十二"); 
	else if(n==3) printf("十三"); 
	else if(n==4) printf("十四"); 
	else if(n==5) printf("十五"); 
	else if(n==6) printf("十六"); 
	else if(n==7) printf("十七"); 
	else if(n==8) printf("十八"); 
	else if(n==9) printf("十九"); 
}
int main(){
	//char shu[10];
   //scanf("%s",shu);
	int n;
	scanf("%d",&n);
	n%=10;
	switch2(n);
	printf("\n");
	return 0; 
} 

switch3函数##

#include<stdio.h>
#include<string.h>
int flag=1;
int n;
void switch1(int n)//<=结果<=10 
{
	if(n==0) printf("零"); 
	else if(n==1) printf("一"); 
	else if(n==2) printf("二"); 
	else if(n==3) printf("三"); 
	else if(n==4) printf("四"); 
	else if(n==5) printf("五"); 
	else if(n==6) printf("六"); 
	else if(n==7) printf("七"); 
	else if(n==8) printf("八"); 
	else if(n==9) printf("九"); 
	if(n==10) printf("十"); 
}
void switch2(int n)//11<=结果<=19 
{
    if(n==1) printf("十一"); 
	else if(n==2) printf("十二"); 
	else if(n==3) printf("十三"); 
	else if(n==4) printf("十四"); 
	else if(n==5) printf("十五"); 
	else if(n==6) printf("十六"); 
	else if(n==7) printf("十七"); 
	else if(n==8) printf("十八"); 
	else if(n==9) printf("十九"); 
}
void switch3(int n){
    int shiwei,gewei;
	shiwei=n/10;
	gewei=n%10;
	if(gewei==0)//整十 
	{
		switch1(shiwei);
		printf("十"); 
	}
	else//十位不为1,个位不为0 
	{
		switch1(shiwei);
		printf("十");
		switch1(gewei);
	}
}
int main(){
	//char shu[10];
   //scanf("%s",shu);
	int n;
	scanf("%d",&n);
	switch3(n);
	printf("\n");
	return 0; 
} 

output函数实际上就是对switch1,2,3函数的不同情况的调用,所以就不进行测试了。
在测试或者编译的过程中,我对于要输入路径的还有问题,先用简单一些的测试代码,对于路径输入的还需要好好研究。
3.添加功能
在这一块上面也是弄了很久,然后知道了要用到freopen()函数来实现从特定文本中读取代码
freopen函数

freopen(“文件地址”,"r",stdin);

代码修改为

int main(){
	freopen("C:\\Users\\LKH\\Desktop\\4\\1.txt","r",stdin);
	int n;
	char lei[10],rong[10],fu[10],shu[10],r2[10];//分别代表类别,容器,符号,数字 
	scanf("%s %s %s %s",lei,rong,fu,shu);
	n=input(shu);
	if(strcmp(lei,"整数")==0) {
		if(strcmp(rong,"钱包")==0){
			while(1){
				scanf("%s",r2);
				if(strcmp(r2,"钱包")==0) {
					scanf("%s %s",fu,shu);
					if(strcmp(fu,"增加")==0) n+=input(shu);
					else n-=input(shu);
				} 
				if(strcmp(r2,"看看")==0) break;
			}
		}
		else flag=0; //标记变量不为“钱包” 
	}
	else flag=0;//标记变量不为“整数” 
	if(flag==0) printf("error");
	else output(n);
	return 0;
} 

但是代码修改成这样之后,运行的结果直接是error

然后,改成这样之后

int main() {
    printf("请输入文件地址\n"); 
    char s[100];
    scanf("%s",s);
    freopen(s,"r",stdin); 

仍是error

然后,现在是第三个版本

int main(int argc,char *argv[]) {
	if(argc != 1){
		freopen(argv[1],"r",stdin);
	}

还是error

这三个全都是error,我也不知道要咋搞了,我看其他同学这样写都可以正确。。。

posted @ 2020-02-05 15:08  根号233  阅读(313)  评论(0编辑  收藏  举报