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

这个作业属于哪个课程 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 status。

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<stdio.h>
#include<string.h>
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<stdio.h>
#include<string.h>
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<stdio.h>
#include<string.h>
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文件名输出结果,如图:

txt文件内容:

但是好像不合题意,因为要输入回车而不是空格。
踩坑:txt文件要用ANSI编码方式,否则不能运行。

立个flag:下次交作业不最后一天再交!!###

posted @ 2020-02-05 22:05  atsap  阅读(166)  评论(0)    收藏  举报