面向对象程序设计寒假作业1
一、问答题。
1、你认为C语言有什么缺陷。
C语言易读性相对较低;C语言语法限制不太严格,对数组的越界不做检查,对scanf有无&不进行检查;C语言是面向过程不是面向对象;C语言字符串处理能力较弱。C语言运算符多。
2、C语言/C++的编译过程。
1.预处理(Preprocessing),
预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。
2.编译(Compilation),
将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。
3.汇编(Assemble),
汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。
4.链接(Linking)。
链接过程将多个目标文件以及所需的库文件(.so等)链接成最终的可执行文件(executable file)。
二、实践题。
看群里的图片,直接在cmd中写“gcc -v”,发现会错误,在同学那知道要修改环境变量,找到gcc。过程:打开我的电脑-属性-高级系统设置-环境变量 找到path,再把这个路径复制过去 。
1、看自己的C++编译器版。
2、使用命令行编译一份C语言/C++代码。在网上查看相关资料了解的。
这个代码的功能是将0~9转化成汉字一~九。
三、编程题
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。
这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
看到题目,里面的变量是“整数”、“钱包”、符号还有数字,首先第一行需判断类型是否是整数并且确定变量“钱包”的初始值,接下去对钱包进行加减运算,知道出现看看循环结束,输出变量“钱包”的值。
要对汉字进行加减法,需要将汉字转换成罗马数字,就需写一个change函数,对数字的读入并进行运算。因为题目范围给在0~9的范围,所以只需要0~9的转换。
int change(char a[]){
4 int n;
5 if(!strcmp(a,"零")) n=0;
6 else if(!strcmp(a,"一")) n=1;
7 else if(!strcmp(a,"二")) n=2;
8 else if(!strcmp(a,"三")) n=3;
9 else if(!strcmp(a,"四")) n=4;
10 else if(!strcmp(a,"五")) n=5;
11 else if(!strcmp(a,"六")) n=6;
12 else if(!strcmp(a,"七")) n=7;
13 else if(!strcmp(a,"八")) n=8;
14 else if(!strcmp(a,"九")) n=9;
15 return n;
16 }
对于循环结束时的“看看 钱包”,我不是很理解,不知道是不是因为他的变量可能不止钱包单个,而是几个变量一起在运算,最后看看其中一个。我是直接把它当做一个变量去算,最后通过“看看”来结束循环,而“钱包”来看看是否和之前变量一样,不是就报错。
而在循环结束时,需要将最终的数字转换会汉字,由于范围是在0~99内,当数字大于九时,要将数字拆成十位和个位,分别将十位和个位存入一个数组中,然后再输出。而对于十到十九的数字,由于我们习惯前面没加一需特殊考虑,并且对整十的数字,后面是没加零的。在数字转汉字的过程,我是通过调用change2函数,再调用change2函数实现的。
下面是我完整的代码:
1 #include<stdio.h>
2 #include<string.h>
3 int change(char a[]){//将汉子转化成数字进行运算
4 int n;
5 if(!strcmp(a,"零")) n=0;
6 else if(!strcmp(a,"一")) n=1;
7 else if(!strcmp(a,"二")) n=2;
8 else if(!strcmp(a,"三")) n=3;
9 else if(!strcmp(a,"四")) n=4;
10 else if(!strcmp(a,"五")) n=5;
11 else if(!strcmp(a,"六")) n=6;
12 else if(!strcmp(a,"七")) n=7;
13 else if(!strcmp(a,"八")) n=8;
14 else if(!strcmp(a,"九")) n=9;
15 return n;
16 }
17 int main(){
18 void change2(int n,char cnum[]);
19 int n;
20 char lei[20],name[20],name1[20],fu[20],num[20];
21 scanf("%s %s %s %s",lei,name,fu,num);
22 n=change(num);
23 if(!strcmp(lei,"整数")){//判断类型是否为“整数”
24 while(1){
25 int flag=0;
26 scanf("%s",name1);
27 if(!strcmp(name1,"看看")) break;//循环结束标志
28 if(strcmp(name1,name)!=0) flag=1;//判断运算对象是不是定义的变量,否则不进行处理继续循环,这里进行标记
29 scanf("%s %s",fu,num);
30 if(flag==1) continue;
31 if(strcmp(fu,"增加")) n-=change(num);//判断运算符号
32 else n+=change(num);
33 }
34 scanf("%s",name1);
35 if(strcmp(name1,name)){// 判断最后询问对象是否是该变量,否则报错
36 printf("Error");
37 return 0;
38 }
39 if(n<0||n>99) printf("Error!");//数字不在0~99的范围内
40 else{
41 char cnum[20];//将数字转化成汉字
42 change2(n,cnum);
43 printf("%s",cnum);}
44 }
45 else printf("Error!");
46 return 0;
47 }
48 void change1(int n,char a[]){//将汉字转化成数字
49 switch(n){
50 case 0:strcpy(a,"零");break;
51 case 1:strcpy(a,"一");break;
52 case 2:strcpy(a,"二");break;
53 case 3:strcpy(a,"三");break;
54 case 4:strcpy(a,"四");break;
55 case 5:strcpy(a,"五");break;
56 case 6:strcpy(a,"六");break;
57 case 7:strcpy(a,"七");break;
58 case 8:strcpy(a,"八");break;
59 case 9:strcpy(a,"九");break;
60 }
61 }
62 void change2(int n,char cnum[]){
63 char a[20];
64 if(n>=0&&n<=99){//判断数字是否合法
65 if(n<10){
66 change1(n,a);
67 strcpy(cnum,a);
68 }
69 else{
70 int t;
71 t=n/10;
72 n=n%10;
73 if(t!=1){//考虑“十”和“一十”的差别
74 change1(t,a);
75 strcpy(cnum,a);
76 strcat(cnum,"十");
77 if(n!=0){//考虑末尾是零的情况
78 change1(n,a);
79 strcat(cnum,a);}
80 }
81 else{
82 strcpy(cnum,"十");
83 if(n!=0){
84 change1(n,a);
85 strcat(cnum,a); }
86 }
87 }
88 }
89 }
输出样例:
1、题目例子
2、10~19的特例
3、整十的特例
4、开头不是“整数”
5、变量不是“钱包”
6、前后变量不一
7、范围不在0~99