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


    作业描述 详情
    这个作业属于哪个课程 2020面向对象程序设计
    这个作业要求在哪里 面向对象程序设计寒假作业2
    这个作业的目标 1.实践题:新建GitHub仓库,并将作业上传至该仓库 2.编程题:优化代码、编译脚本、添加功能
    作业正文 面向对象程序设计寒假作业2题解
    其他参考文献 desktop用法 [power shell的用法](https://www.cnblogs.com/lsdb/p/9531338.html"power shell的用法") Python中os.system的用法 C语言常见命名法

    一、实践题

    新建GitHub仓库

    上传编程题代码至仓库

    二、编程题

    首先是对作业一的编程题进行优化
    题目要求:
    ①优化架构,一般要求每个函数长度不超过15行。
    ②优化规范,尤其是命名规范。
    对于要求①,最先想到的是有没有办法优化一下函数算法,对着代码发了一会儿呆发现这条路太难了,走不通,压到20行左右的时候怎么也挤不出5行
    于是想到了函数嵌套套娃,将原本的函数分为更多的函数,更加模块化
    对于要求②,参考了骆驼命名法和下划线命名法
    除main函数外,共有5个函数

    int In_Or_De(char* s, char * sp,int a);//判断是增加还是减少
    void output(int a);//输出结果
    int Ch_Switch_Num(char* s);//将汉字转为数字
    int changeSingle(char* s);//将单个汉字转换为数字
    char *extract(char* a, char* b);//提取“十”字前后的数字
    

    Part1.输入

    int main()
    {
    	char s[10];char sp[10];
    	int i, caibu;
    	scanf("%s", s);
    	scanf("%s", s);
    	strcpy(sp, s);
    	for (i = 0; i < 2; i++)
    		scanf("%s", s);
    	caibu = Ch_Switch_Num(s);
    	scanf("%s", s);
    	caibu = In_Or_De(s,sp,caibu);
    	scanf("%s", s);
    	output(caibu);
    	return 0;
    }
    
    int In_Or_De(char* s, char* sp,int a)
    {
    	while (strcmp(s, sp) == 0)
    	{
    		scanf("%s", s);
    		if (strcmp(s, "增加") == 0)
    		{
    			scanf("%s", s);
    			a += Ch_Switch_Num(s);
    		}
    		else if (strcmp(s, "减少") == 0)
    		{
    			scanf("%s", s);
    			a -= Ch_Switch_Num(s);
    		}
    		scanf("%s", s);
    	}
    	return a;
    }
    

    Part.2转换

    int Ch_Switch_Num(char* s)
    {
    	char buffer[5] = "";
    	if (strlen(s) == 2)//处理0-9的汉字
    		j=changeSingle(s);
    	else if (strlen(s) == 4)//处理10-19以及十的倍数的汉字
    	{
    		strcpy(buffer,extract(buffer, s));
    		if (strcmp(buffer, "十") == 0)//处理10-19的汉字
    			j = 10 + changeSingle(extract(buffer,s+2));
    		else//处理十的倍数
    			j = changeSingle(buffer) * 10;
    	}
    	else//处理几十几的汉字
    		j = changeSingle(extract(buffer, s)) * 10 + changeSingle(extract(buffer, s + 4));
    	return j;
    }
    int changeSingle(char* s)
    {
    	int i;
    	for (i = 0; i < 11; i++)
    	{
    		if (strcmp(s, chinese[i]) == 0)
    			return i;
    	}
    }
    char *extract(char* a, char* b)
    {
    	a[0] = b[0];
    	a[1] = b[1];
    	return a;
    }
    

    Part3.输出

    void output(int a)
    {
    	if (a <= 10)
    		printf("%s", chinese[a]);
    	else if (a > 10 && a < 20)
    		printf("十%s", chinese[a - 10]);
    	else if (a % 10 == 0)
    		printf("%s十", chinese[a / 10]);
    	else
    		printf("%s十%s", chinese[a / 10], chinese[a % 10]);
    }
    

    完整代码

    #include<stdio.h>
    #include<string.h>
    int j;
    int In_Or_De(char* s, char * sp,int a);//判断是增加还是减少
    void output(int a);//输出结果
    int Ch_Switch_Num(char* s);//将汉字转为数字
    int changeSingle(char* s);//将单个汉字转换为数字
    char *extract(char* a, char* b);//提取“十”字前后的数字
    char chinese[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
    int main()
    {
    	char s[10];char sp[10];
    	int i, caibu;
    	scanf("%s", s);
    	scanf("%s", s);
    	strcpy(sp, s);
    	for (i = 0; i < 2; i++)
    		scanf("%s", s);
    	caibu = Ch_Switch_Num(s);
    	scanf("%s", s);
    	caibu = In_Or_De(s,sp,caibu);
    	scanf("%s", s);
    	output(caibu);
    	return 0;
    }
    int In_Or_De(char* s, char* sp,int a)
    {
    	while (strcmp(s, sp) == 0)
    	{
    		scanf("%s", s);
    		if (strcmp(s, "增加") == 0)
    		{
    			scanf("%s", s);
    			a += Ch_Switch_Num(s);
    		}
    		else if (strcmp(s, "减少") == 0)
    		{
    			scanf("%s", s);
    			a -= Ch_Switch_Num(s);
    		}
    		scanf("%s", s);
    	}
    	return a;
    }
    void output(int a)
    {
    	if (a <= 10)
    		printf("%s", chinese[a]);
    	else if (a > 10 && a < 20)
    		printf("十%s", chinese[a - 10]);
    	else if (a % 10 == 0)
    		printf("%s十", chinese[a / 10]);
    	else
    		printf("%s十%s", chinese[a / 10], chinese[a % 10]);
    }
    int Ch_Switch_Num(char* s)
    {
    	char buffer[5] = "";
    	if (strlen(s) == 2)//处理0-9的汉字
    		j=changeSingle(s);
    	else if (strlen(s) == 4)//处理10-19以及十的倍数的汉字
    	{
    		strcpy(buffer,extract(buffer, s));
    		if (strcmp(buffer, "十") == 0)//处理10-19的汉字
    			j = 10 + changeSingle(extract(buffer,s+2));
    		else//处理十的倍数
    			j = changeSingle(buffer) * 10;
    	}
    	else//处理几十几的汉字
    		j = changeSingle(extract(buffer, s)) * 10 + changeSingle(extract(buffer, s + 4));
    	return j;
    }
    int changeSingle(char* s)
    {
    	int i;
    	for (i = 0; i < 11; i++)
    	{
    		if (strcmp(s, chinese[i]) == 0)
    			return i;
    	}
    }
    char *extract(char* a, char* b)
    {
    	a[0] = b[0];
    	a[1] = b[1];
    	return a;
    }
    

    制作编译脚本

    刚看到这里的时候确实有点被吓退了,完全没有接触过的内容,一点头绪都没有,在查阅了power shell、shell、Windows批处理的相关资料后后还是没有什么头绪
    最近正好在自学Python,那天看到一位大佬(感谢)的脚本使用了Python,于是我选择了PythonPython牛逼
    引入os模块,调用os.system方法

    有exe文件出现,编译成功

    单元测试

    一开始把问题想的太复杂,问了同学后才知道是自己想太多
    所有函数中转换函数Ch_Switch_Num函数最为重要,因此选择她进行测试
    测试代码

    int main(void)
    {
    	test("九十九", 99);
    	test("零", 0);
    	test("一", 1);
    	test("十", 10);
    	test("五十", 50);
    	test("六十三", 63);
    	test("七十七", 77);
    	printf("以下为错误测试
    ");
    	test("sekiro", 99);
    	test("真", 66);
    	test("好", 1);
    	test("玩", 2);
    	return 0;
    		
    }
    void test(char* s, int a)
    {
    	if (Ch_Switch_Num(s) == a)
    		printf("pass
    ");
    	else
    		printf("error
    ");
    }
    

    添加功能

    参考了同学的作业使用了freopen()函数,在代码中添加freopen()便能实现功能的添加

  • 相关阅读:
    移动端touch事件获取事件坐标
    详解webpack中的hash、chunkhash、contenthash区别
    textarea placeholder 设置主动换行
    js-xlsx的使用
    关于Blob对象的介绍与使用
    spring boot zuul集成kubernetes等第三方登录
    Spring Boot 获取yaml配置文件信息
    spring boot @Value源码解析
    java.lang.StackOverflowError解决
    Jpa 重写方言dialect 使用oracle / mysql 数据库自定义函数
  • 原文地址:https://www.cnblogs.com/111900811cocoa/p/12260305.html
Copyright © 2020-2023  润新知