2020面向对象程序设计寒假作业1 题解

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/2020OOP
这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10224
这个作业的目标 1.安装C++开发环境(见附录) 2.完成问答题、实践题及编程题 3.发布博客
其他参考文献 https://www.cnblogs.com/jasf/p/12231679.html https://www.cnblogs.com/Misanthropel/p/12230724.html https://www.cnblogs.com/xiao-qingjiang/p/12232562.html https://zhidao.baidu.com/question/585606335.html https://www.cnblogs.com/ericling/articles/11736681.html

安装C++开发环境(见附录)。
完成问答题、实践题及编程题
发布博客

  • 问答题:(基础3分)回答以下问题:

    • 如果你不了解C++请回答以下问题:你认为C语言有什么缺陷(你觉得哪里用的不顺手)。
      如果你已经了解C++请回答以下问题:你觉得C++和C语言比有什么优点。

目前我只学了一丁点的C++,对于有以下一些感受:
1.C++的输入输出语句比较简洁;
2.C++的库函数很多,尤其是针对字符数组的库函数可以直接转换大小写等,使用十分方便;
3.C++可以用同一个函数名写出几个不同的函数,使用时系统可以直接根据变量的个数,形式匹配合适的函数,如果这几个函数表达式相同甚至可以共用,写起来比较简短
所以相应的,我感觉C语言的语句写起来有点繁琐;库函数比较少,需要写比较多的程序;用法相对于C++来说没那么灵活,也导致写出来代码比较冗长;而且C语言的数组极易越界,有时会对计算机造成威胁

- 查阅相关资料,简述一下C语言/C++的编译过程。

1.预处理,预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。预处理之后的程序还是文本,可以用文本编辑器打开。
2.编译,这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。
3.汇编,汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。这一步会为每一个源文件产生一个目标文件。
4.链接,链接过程将多个目标文件以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。

  • 实践题:(基础2分)自己动手,完成以下任务:

    • 查看自己的C++编译器版本。
      visual studio 2019最上方工具->命令行->开发者提示命令->输入cl.exe

    • 使用命令行编译一份C语言/C++代码。
      先写一个最简单的hello world的程序

      然后同时摁win和R键输入cmd,然后输入文件名(???)


      (不知道出了什么问题)

  • 编程题(请使用C语言或者C++完成以下题目):(基础5分)

中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。

编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包

样例
输入:

整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包

输出:

注意:

输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
数字只会出现以下 零一二三四五六七八九十 。

编程题要求:

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

1.读题,提取出题目的要求
(1)输入的语句都是汉字的形式,需要转换成数字进行运算
(2)输出的结果要求是汉字,也需要转换
(3)程序需要识别输入语言中的关键词,进行运算或输出
(4)对于汉语和数字之间的转换需要考虑到平时说话的习惯
(5)对于一些错误情况如输入不规范或者结果为负数的情况做处理

2.思考每个模块怎么写,可以从简单的模块开始写。

(1)首先,写一个函数对输入的语句中的数字进行转换
    作为一个菜鸡,我通过其他同学的作业得到启发,可以用cctype头文件下的strcmp函数比较两个数组大小确定输入的是什么数字
char exchange1(char s)
{
	if (strcmp(s, "零") == 0)
		return 0;
	else if (strcmp(s, "一") == 0)
		return 1;
	else if (strcmp(s, "二") == 0)
		return 2;
	else if (strcmp(s, "三") == 0)
		return 3;
	else if (strcmp(s, "四") == 0)
		return 4;
	else if (strcmp(s, "五") == 0)
		return 5;
	else if (strcmp(s, "六") == 0)
		return 6;
	else if (strcmp(s, "七") == 0)
		return 7;
	else if (strcmp(s, "八") == 0)
		return 8;
	else if (strcmp(s, "九") == 0)
		return 9;
}
    (2)然后,对输出的数字进行转换
       同样使用strcmp函数
void exchange3(int x)
{
	if (x == 0)
		printf("零");
	else if (x == 1)
		printf("一");
	else if (x == 2)
		printf("二");
	else if (x == 3)
		printf("三");
	else if (x == 4)
		printf("四");
	else if (x == 5)
		printf("五");
	else if (x == 6)
		printf("六");
	else if (x == 7)
		printf("七");
	else if (x == 8)
		printf("八");
	else if (x == 9)
		printf("九");
}
(3)程序需要识别输入语言中的关键词,进行运算或输出&对于输入不规范的情况做处理
int main()
{
	char s1[10], s2[10], s3[10], s4[10];
	int r,sum,i;
	scanf("%s %s %s %s", &s1, &s2, &s3, &s4);
	if (strcmp(s1, "整数") == 0 && strcmp(s3, "等于") == 0)
		r = 1;
	else
		r = 0;
	if (r == 0)
		printf("Input Error\n");
	else if (r == 1)
	{
		char s5[10], s6[10], s7[20];
		while (1)
		{
			i = exchange1(s7);
			if (strcmp(s6, "增加") == 0)
				sum = sum + i;
			else if (strcmp(s6, "减少") == 0)
				sum = sum - i;
			else if (strcmp(s5, "看看") == 0)
			{
				output(sum);
				break;
			}
		}
	}
}
(4)对于汉语和数字之间的转换需要考虑到平时说话的习惯&对于结果为负数的情况做处理
void output(int x)
{
	int a, b;
	a = x / 10;
	b = x % 10;
	if (a == 0)
		printf("%s", exchange3(b));
	else if (a == 1)
		printf("十%s", exchange3(b));
	else if (a != 0 && a != 1)
		printf("%s十%s", exchange3(a), exchange3(b));
	else if (x < 0)
		printf("出现财政赤字");
}

完整代码如下:

#include <iostream>
#include <cctype>
using namespace std;
char exchange1 (char s);
void exchange3 (int x);
void output(int x);
int main()
{
	char s1[10], s2[10], s3[10], s4[10];
	int r,sum,i;
	scanf("%s %s %s %s", &s1, &s2, &s3, &s4);
	if (strcmp(s1, "整数") == 0 && strcmp(s3, "等于") == 0)
		r = 1;
	else
		r = 0;
	if (r == 0)
		printf("Input Error\n");
	else if (r == 1)
	{
		char s5[10], s6[10], s7[20];
		while (1)
		{
			i = exchange1(s7);
			if (strcmp(s6, "增加") == 0)
				sum = sum + i;
			else if (strcmp(s6, "减少") == 0)
				sum = sum - i;
			else if (strcmp(s5, "看看") == 0)
			{
				output(sum);
				break;
			}
		}
	}
}
char exchange1(char s)
{
	if (strcmp(s, "零") == 0)
		return 0;
	else if (strcmp(s, "一") == 0)
		return 1;
	else if (strcmp(s, "二") == 0)
		return 2;
	else if (strcmp(s, "三") == 0)
		return 3;
	else if (strcmp(s, "四") == 0)
		return 4;
	else if (strcmp(s, "五") == 0)
		return 5;
	else if (strcmp(s, "六") == 0)
		return 6;
	else if (strcmp(s, "七") == 0)
		return 7;
	else if (strcmp(s, "八") == 0)
		return 8;
	else if (strcmp(s, "九") == 0)
		return 9;
}
void exchange3(int x)
{
	if (x == 0)
		printf("零");
	else if (x == 1)
		printf("一");
	else if (x == 2)
		printf("二");
	else if (x == 3)
		printf("三");
	else if (x == 4)
		printf("四");
	else if (x == 5)
		printf("五");
	else if (x == 6)
		printf("六");
	else if (x == 7)
		printf("七");
	else if (x == 8)
		printf("八");
	else if (x == 9)
		printf("九");
}
void output(int x)
{
	int a, b;
	a = x / 10;
	b = x % 10;
	if (a == 0)
		printf("%s", exchange3(b));
	else if (a == 1)
		printf("十%s", exchange3(b));
	else if (a != 0 && a != 1)
		printf("%s十%s", exchange3(a), exchange3(b));
	else if (x < 0)
		printf("财政赤字");
}

(因为实在太太太菜了,出现了太多编译错误无法运行)
(而且此代码有很多限制,如只能输入一位数,最多输出两位数)
(看到其他同学的作业得到启发,输入的中文数字可以通过库函数strlen判断有多少个字,进而实现输入多位数,但是我还不能实现)

posted @ 2020-01-27 18:43  SCP-033  阅读(298)  评论(2编辑  收藏  举报