Fork me on GitHub

寒假作业1汇总

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 寒假作业1
这个作业的目标 安装C++开发环境、回顾知识、查看自己的C++编译器版本、使用命令行编译一份C语言/C++代码、实现简单的中文编程、编写博客
作业正文 问答题 实践题 编程题
参考文献 C语言有什么缺陷C语言的编译过程
问答题
==========
1.C语言有什么缺陷

  • 思考过程:对于c++我不并不了解,所以我回想了这一个学期从刚接触C语言到现在的一些学习经历,以及平时做编程题过程中遇到的一些问题,并查找了一些资料,做了以下总结。
  • 总结:
    1.C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。
    2.C程序有时会难以理解。C语言语法成分相对简单,是一种小型语言。但是,其数据类型多,运算符丰富且结合性多样,使得对其理解有一定的难度。发明C语言时,为了减少字符输入,C语言比较简明,同时也使得C语言可以写出常人几乎无法理解的程序。
    3.C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷。

2.C语言的编译过程

1.编译预处理。读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。
2.编译阶段。经过预编译得到的输出文件中,将只有常量。预编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
3.优化阶段。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。
4.汇编过程。汇编过程实际上指把汇编语言代码翻译成目标机器指令的过程。
5.链接程序。链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够让操作系统装入执行的统一整体。

实践题

1.查看自己的C++编译器版本。

打开vs->选择工具栏->命令行->开发者命令提示->输入cl.exe

2.使用命令行编译一份C语言/C++代码。

1.打开命令行界面:键盘win + r ,输入cmd,回车。即可打开命令行。

2.进入c程序所在的目录,例:程序在D盘下,直接输入D:即可。

3.进入到目录之后,输入程序名称,例如:hello.exe,再按下回车键即可。

编程题

  • 题目
    中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
    汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
    今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
  • 编程要求
    编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
    变量定义:整数 钱包 等于 零
    运算(加法):钱包 增加 四
    运算(减法):钱包 减少 四
    输出:看看 钱包
  • 样例
    输入:
    整数 钱包 等于 零
    钱包 增加 四
    钱包 减少 三
    看看 钱包
    输出:

思考过程

题目要求的语法信息关键是要包含“整数、等于、增加、减少、看看”五个词,如果没有限制整数条件,对于现在的我来说题目难度更大了,其次题目限制了数字的大小在0-10之间,也一定程度上降低了题目的难度,因此我们只用考虑0-10的两个数字的加减法运算;问题的关键在于输入时中文汉字与int数据类型的转换,还有输出时int数据类型转化为中文汉字的输出。

分解需求

1.首先考虑编写一个函数,函数功能为把中文数字转化为int数据类型进行运算,可以考虑使用strcmp函数,实现代码如下:

int convert1(char num[])
{
	if (strcmp(num, "一") == 0)
		return 1;
	else if (strcmp(num, "二") == 0)
		return 2;
	else if (strcmp(num, "三") == 0)
		return 3;
	else if (strcmp(num, "一") == 0)
		return 1;
	else if (strcmp(num, "四") == 0)
		return 4;
	else if (strcmp(num, "五") == 0)
		return 5;
	else if (strcmp(num, "六") == 0)
		return 6;
	else if (strcmp(num, "七") == 0)
		return 7;
	else if (strcmp(num, "八") == 0)
		return 8;
	else if (strcmp(num, "九") == 0)
		return 9;
	else if (strcmp(num, "零") == 0)
		return 0;
}

2.再考虑编写一个函数,函数功能为把int类型数据转化为汉字输出,由于本人技术原因暂时只考虑运行结果为0-99(负数不考虑),由于0-10区间、11-19区间以及20-99中文表达习惯不同,所以不同区间的答案需要分别考虑,具体代码如下:

char* convert2(int n)
{
	if (n == 0)  return "零";
	else if (n == 1) return "一";
	else if (n == 2) return "二";
	else if (n == 3) return "三";
	else if (n == 4) return "四";
	else if (n == 5) return "五";
	else if (n == 6) return "六";
	else if (n == 7) return "七";
	else if (n == 8) return "八";
	else if (n == 9) return "九";
	else if (n == 10) return "十";
}
if (result<=10)
{
	printf("%s",convert2(result));
}
else if(result%10==0&&result<100)
{
	printf("%s十", convert2(result/10));
}
else if(result <20)
{
	result%=10;
	printf("十%s", convert2(result));
}
else if(result<100)
{
	printf("%s十%s",convert2(result/10), convert2(result%10));
}


此部分函数测试结果截图:



3.编写主函数,当读到“看看”时程序停止运行,具体代码如下:


#include<stdio.h>
#include<string.h>
int convert1(char num[])
{
	if (strcmp(num, "一") == 0)
		return 1;
	else if (strcmp(num, "二") == 0)
		return 2;
	else if (strcmp(num, "三") == 0)
		return 3;
	else if (strcmp(num, "一") == 0)
		return 1;
	else if (strcmp(num, "四") == 0)
		return 4;
	else if (strcmp(num, "五") == 0)
		return 5;
	else if (strcmp(num, "六") == 0)
		return 6;
	else if (strcmp(num, "七") == 0)
		return 7;
	else if (strcmp(num, "八") == 0)
		return 8;
	else if (strcmp(num, "九") == 0)
		return 9;
	else if (strcmp(num, "零") == 0)
		return 0;
}
char* convert2(int n)
{
    if (n == 0)  return "零";
    else if (n == 1) return "一";
    else if (n == 2) return "二";
    else if (n == 3) return "三";
    else if (n == 4) return "四";
    else if (n == 5) return "五";
    else if (n == 6) return "六";
    else if (n == 7) return "七";
    else if (n == 8) return "八";
    else if (n == 9) return "九";
    else if (n == 10) return "十";
}
int main()
{
    int result;
    char a[10],name[10],b[10],c[10];
   scanf("%s %s %s %s",a,name,b,c);
    if(strcmp(a,"整数")!=0||strcmp(b,"等于")!=0)
    {printf("输入错误\n");
     return 0;
    }
    result=convert1(c);
    while(strcmp(name,"看看")!=0)
	{
		scanf("%s %s",b,c);
		if(strcmp(b,"增加")==0)
		{
		result+=convert1(c);
		}
		else if(strcmp(b,"减少")==0)
		{
		result-=convert1(c);
		}
		else printf ("格式错误\n");
	}
    if (result<=10)
    {
        printf("%s",convert2(result));
    }
    else if(result%10==0&&result<100)
    {
        printf("%s十",convert2(result/10));
    }
    else if (result<20)
    {
        result%=10;
        printf("十%s",convert2(result));
    }
    else if (result<100)
    {
        printf("%s十%s", convert2(result/10),convert2(result%10));
    }
    return 0;
}

样例运行结果图如下:

反思总结

需要考虑的情况还有很多,比如大于100后的中文输出问题等等,鉴于技术有限所以只能写个简略的版本。在编写过程中遇到的问题有挺多,比如如何输入中文等等。总而言之,目前学习的知识和能力太有限,还需加油。

posted @ 2020-01-27 17:54  TJThunder  阅读(241)  评论(4编辑  收藏  举报