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

作业描述 详情
这个作业属于哪个课程 2020年面向对象程序设计
这个作业的要求在哪里 寒假作业2
这个作业的目标 1.继续完成编程题2.新建一个github仓库,并把作业推送到该仓库。3.发布博客
作业正文 如下
参考资料 见正文

一.实践题

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

1.新建github仓库

key

2.clone

3.commit了


4.使用.gitinore

参考资料:Github Guides
Mac下使用Git上传代码到Github仓库
.gitignor

二.编程题

1.继续完成作业一的编程题。
2.优化架构,一般要求每个函数长度不超过15行。
3.优化规范,尤其是命名规范。
4.制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。

编程题要求:

1.读题,提取出题目的要求。
2.分解需求,把需求分解为几个你觉得不太相关的模块。
3.思考每个模块怎么写,可以从简单的模块开始写。
4.对于不会的问题进行查阅资料。
5.对于每一个模块设计测试用例。
6.详细记录下以上每一步,并写在博客中。
7.不要求完全做出来,但要求记录详细。
8.建议博客长度不少于1000字(不包含代码)。

要优化架构的话可能会麻烦点,所以我选择了我认为较为简单的优化规范——命名规范。
参考资料:常见代码命名规则

正确并形象地给函数、变量命名,不仅可以增加程序的可读性,也是程序员编程风格的一种反映。较好的命名习惯,可以有效的提高程序的可维护性 。

使用范围较广的有一下几种:
1.匈牙利命名法:广泛应用于Microsoft Windows这类环境中。
这种命名技术是由一位能干的 Microsoft 程序员查尔斯·西蒙尼(Charles Simonyi) 提出的。匈牙利命名法通过在变量名前面加上相应的小写字母的符号标识作为前缀,标识出变量的作用域,类型等。这些符号可以多个同时使用,顺序是先m_(成 员变 量),再指针,再简单数据类型,再其他。例如:m_lpszStr, 表示指向一个以0字符结尾的字符串的长指针成员变量。
匈牙利命名法关键是:标识符的名字以一个或者多个小写字母开头作为前缀;前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。

2.驼峰命名法:近年来越来越流行,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字。其中第一个单词首字母小写,余下的单词首字母大写。

3.帕斯卡(Pascal)命名法:与驼峰命名法类似,只不过驼峰命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。因此这种命名法也有人称之为“大驼峰命名法”。

4.下划线命名法:下划线法是随着C语言的出现流行起来的,在UNIX/LIUNX这样的环境,以及GNU代码中使用非常普遍。

我选择的命名方法是第一种,匈牙利命名法。
其中我用到的是将字符串命名为sz等,和第一次作业有改变的是,我将钱的总量s改为了sum,钱的输入数额从c改为了sz,函数名change我认为较为合理所以未变,而l1,l2代表language也很合理,我也未改变。
这是主体函数,命名规范后的结果。

#include<stdio.h>
#include<string.h>
int change1(char c[]);
void change2(int s);
int main()
{
	char sz1[100],sz2[100],sz3[100],l1[100],l2[100]; 
	int a,b,i,j,k,t,m,n,f,sum=0;
	scanf("%s%s 等于 %s",l2,l1,sz1);
	sum=change1(sz1);
	while(strcmp(l1,"钱包")==0)
	{ 
	scanf("%s%s",l1,l2);
	if(strcmp(l1,"钱包")!=0)
	break;
	scanf("%s",sz2);
	if(strcmp(l2,"增加")==0)
	{
	f=1;
	sum=sum+change1(sz2);
	}
	else if(strcmp(l2,"减少")==0)
	{
	f=-1;
	sum=sum-change1(sz2);
	}
	} 
	if(sum>=0)  change2(sum);
	else printf("meiqianla");
	return 0;
}

至于优化结构,使每个函数在15行内,刚开始我认为很麻烦,但我再仔细看过我写得函数后,发现第一次写得的确太粗糙,长的函数完全可以直接由小的函数组成,并且还能简化一些步骤。
于是我花了一些时间,重写了函数,并略微修改了主干,一下是全部代码。

#include<stdio.h>
#include<string.h>
int change1(char sz[]);
void change2(int sum);
void change3(int sum);
int main()
{
	char sz1[100],sz2[100],sz3[100],l1[100],l2[100]; 
	int a,b,i,j,k,t,m,n,f,sum=0;
	scanf("%s%s 等于 %s",l2,l1,sz1);
	sum=change1(sz1);
	while(strcmp(l1,"钱包")==0)
	{ 
	scanf("%s%s",l1,l2);
	if(strcmp(l1,"钱包")!=0)
	break;
	scanf("%s",sz2);
	if(strcmp(l2,"增加")==0)
	{
	f=1;
	sum=sum+change1(sz2);
	}
	else if(strcmp(l2,"减少")==0)
	{
	f=-1;
	sum=sum-change1(sz2);
	}
	} 
	if(sum>=10)  {
	change2(sum);
	change3(sum);
	}
	else if(sum>0) change3(sum);
	else printf("meiqianla");
	return 0;
}

int change1(char sz[])
{
	int n;
	if(strcmp(sz,"零")==0) n=0;
	if(strcmp(sz,"一")==0)n=1;
	if(strcmp(sz,"二")==0)n=2;
	if(strcmp(sz,"三")==0)n=3;
	if(strcmp(sz,"四")==0)n=4;
	if(strcmp(sz,"五")==0)n=5;
	if(strcmp(sz,"六")==0)n=6;
	if(strcmp(sz,"七")==0)n=7;
	if(strcmp(sz,"八")==0)n=8;
	if(strcmp(sz,"九")==0)n=9;
	if(strcmp(sz,"十")==0)n=10;
	return n;
}
void change2(int sum)
{
	int n=sum,i,j;
	i=sum/10;
	switch(i) 
	{
		case 1: break;
		case 2: printf("二");break;
		case 3: printf("三");break;
		case 4: printf("四");break;
		case 5: printf("五");break;
		case 6: printf("六");break;
		case 7: printf("七");break;
		case 8: printf("八");break;
		case 9: printf("九");break;
	}
	printf("十");
	}
void change3(int sum)
{
	switch(sum%10) 
	{
		case 0: break;
		case 1: printf("一");break;
		case 2: printf("二");break;
		case 3: printf("三");break;
		case 4: printf("四");break;
		case 5: printf("五");break;
		case 6: printf("六");break;
		case 7: printf("七");break;
		case 8: printf("八");break;
		case 9: printf("九");break;
	}
}

将函数完善的话,我还是不知道怎么输入二位数,但输出能控制在99以内,感觉修改完的比之前的代码好吧。

制作编译脚本

刚开始是这样的

@pause
@echo off
set /p var=请输入文件所在
cd "%var%"
set /p var=请输入文件名
cd "%var%"
gcc "%var%" -o lang.exe
if exist "lang.exe" echo 编译成功
if not exist "lang.exe" echo 编译失败
pause



完成是完成了,但有点瑕疵,多打了一个
cd "%var%"
所以出现了下面这行

改完之后就好啦

要测试的代码:

#include<iostream>
#include<string.h>
using namespace std;
int change1(char c[]);
int main()
{
	int a;
	char sz[100]={"五"};
	a=change1(sz);
	if(a==5) 
	cout<< "测试成功" <<endl;
	else cout<< "测试失败"<<endl;
	return 0;
}

int change1(char sz[])
{
	int n=-1;
	if(strcmp(sz,"零")==0) n=0;
	if(strcmp(sz,"一")==0)n=1;
	if(strcmp(sz,"二")==0)n=2;
	if(strcmp(sz,"三")==0)n=3;
	if(strcmp(sz,"四")==0)n=4;
	if(strcmp(sz,"五")==0)n=5;
	if(strcmp(sz,"六")==0)n=6;
	if(strcmp(sz,"七")==0)n=7;
	if(strcmp(sz,"八")==0)n=8;
	if(strcmp(sz,"九")==0)n=9;
	if(strcmp(sz,"十")==0)n=10;
	return n;
}

测试脚本的代码

@echo off
echo 开始测试
test1.exe
echo 测试结束
pause

在作业一编程题的基础上添加以下功能:

通过命令行读取一个文件,然后运行这个文件。

代码

#include<stdio.h>
#include<string.h>
int change1(char c[]);
void change2(int s);
void change3(int s);
int main()
{ 	char file[999];
    printf("请输入文件地址\n");
    scanf("%s",file); 
    freopen(file,"r",stdin);
	char sz1[100],sz2[100],sz3[100],l1[100],l2[100]; 
	int a,b,i,j,k,t,m,n,f,sum=1;
	scanf("%s%s 等于 %s",l2,l1,sz1);
	sum=change1(sz1);
	while(strcmp(l1,"钱包")==0)
	{ 
	scanf("%s%s",l1,l2);
	if(strcmp(l1,"钱包")!=0)
	break;
	scanf("%s",sz2);
	if(strcmp(l2,"增加")==0)
	{
	f=1;
	sum=sum+change1(sz2);
	}
	else if(strcmp(l2,"减少")==0)
	{
	f=-1;
	sum=sum-change1(sz2);
	}
	} 
	if(sum>=10)  {
	change2(sum);
	change3(sum);
	}
	else if(sum>0) change3(sum);
	else printf("meiqianla");
	return 0;
}

int change1(char sz[])
{
	int n;
	if(strcmp(sz,"零")==0) n=0;
	if(strcmp(sz,"一")==0)n=1;
	if(strcmp(sz,"二")==0)n=2;
	if(strcmp(sz,"三")==0)n=3;
	if(strcmp(sz,"四")==0)n=4;
	if(strcmp(sz,"五")==0)n=5;
	if(strcmp(sz,"六")==0)n=6;
	if(strcmp(sz,"七")==0)n=7;
	if(strcmp(sz,"八")==0)n=8;
	if(strcmp(sz,"九")==0)n=9;
	if(strcmp(sz,"十")==0)n=10;
	return n;
}
void change2(int sum)
{
	int n=sum,i,j;
	i=sum/10;
	switch(i) 
	{
		case 1: break;
		case 2: printf("二");break;
		case 3: printf("三");break;
		case 4: printf("四");break;
		case 5: printf("五");break;
		case 6: printf("六");break;
		case 7: printf("七");break;
		case 8: printf("八");break;
		case 9: printf("九");break;
	}
	printf("十");
	}
void change3(int sum)
{
	switch(sum%10) 
	{
		case 0: break;
		case 1: printf("一");break;
		case 2: printf("二");break;
		case 3: printf("三");break;
		case 4: printf("四");break;
		case 5: printf("五");break;
		case 6: printf("六");break;
		case 7: printf("七");break;
		case 8: printf("八");break;
		case 9: printf("九");break;
	}
}


我参考了网上的资料和同学的博客,艰难地完成了编程题。。。
遇到的困难太多了,如最后的输入路径要\,而系统自动给的是\,这是看好几个同学博客才恍然大悟。
msvc的cl命令行用不明白,然后自己又重新下了个g++,也花了好长时间。
脚本编译的话边学网上的,边参考同学的,感谢前面的同学呀,网上零零散散,如果不是前面的大佬给力,我肯定要花更多时间。
虽然参考了同学很多,但应该也不会太像,大部分应该还是我自己的东西,起码让我现在重新自己做一遍,不靠任何帮助我能够完成这份作业了。

posted @ 2020-02-04 20:19  hqk111  阅读(139)  评论(0编辑  收藏  举报