面向对象程序设计第一次作业
面向对象程序设计第一次作业
这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业1 |
这个作业的目标 | 安装开发环境,了解C/C++优缺点,编译过程,了解命令行特点,学会用命令行编译代码,懂得配置环境变量,实现白话文编程,学会写博客 |
作业正文 | 问答题 实践题 编程题 |
其他参考文献 | 在Windows命令行中编译运行C/C++程序 - C语言编译过程简析 - C语言中汉字的存储和输出 |
问答题 |
你认为C语言有什么缺陷(你觉得哪里用的不顺手):
- 我觉得C语言在处理格式上很不方便,例如有的题目要求空格或者换行等特殊格式,C语言要额外写很多代码才能达到。其次C语言对语法的检查有时候不太严格,一些错误C语言本身并不会报错,初学者很容易出错,例如:数组下标越界,“=”与“==”使用错误,定义数组时误用变量,输入时没有加入地址符等,虽然使编程更灵活自由,但也给初学者带来很多问题。
查阅相关资料,简述一下C语言/C++的编译过程:
- 总的来说分为,预处理,编译,汇编,链接,四个步骤。
- 预处理:对源文件进行一些文本处理,例如#include等头文件,#define定义的宏,将他们全部替换为可以直接编译的语句,得到的是一个比源文件大的文件。
- 编译:主要作用是进行语法检查,如没有错误,将生成汇编代码(注意不是直接生成二进制代码),文件从.c变为汇编代码文件.s。
- 汇编:将汇编代码生成机器码,也就是二进制代码,生成的是二进制文件也叫目标文件.o,是真正转化为机器可以识别的语言的过程。
- 链接:将生成的多个文件联合成一个可执行文件,主要功能是链接函数实现和外部变量,就像是把一个个拼图模块拼成一个完整的拼图。
实践题
查看自己的C++编译器版本:
- 先配置环境变量,此电脑->属性->高级系统设置->环境变量,找到path在后面输入gcc所在文件夹的位置。
- 打开cmd命令框,输入gcc -v 即可查看编译器版本,但注意一定要找到正确的gcc程序位置,否则会提示不是内部或外部命令,也不是可运行的程序
或批处理文件。 - 结果如图
使用命令行编译一份C语言/C++代码:
- 如上文,在查看完c++编译器版本后,输入homework.c(源文件名)再输入a.exe即可编译并运行,如图(homework.c是一个 hellow word 的代码)
编程题
题目要求如下:
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
编程要求
编写一个程序,输入满足以下语法要求的一段文字,输出运行后的结果。
变量定义:整数 钱包 等于 零
运算(加法):钱包 增加 四
运算(减法):钱包 减少 四
输出:看看 钱包
样例
输入:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输出:
一
注意:
输入输出用例均为GBK编码,推荐使用vscode把文本切换为GBK编码。
数字只会出现以下 零一二三四五六七八九十 。
思考过程:
- 首先阅读题目,分别有变量定义,变量名称,运算类型,数值,四类组成。
程序要实现的功能: - 将中文数字转化为阿拉伯数字
- 将阿拉伯数字转化为中文数字
- 判断进行的运算种类(等于,增加,减少)再进行相应运算。
具体过程
- 首先我查阅资料得出汉字占两个字节
- 我定义全局变量二维数组存储字符串,效果等于指针数组。
- 建立两个函数模块,作用分别是将中文数字转为阿拉伯数字和将阿拉伯数字转为中文数字。
#include<stdio.h>
#include<string.h>
char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int exchange(char a[]);
void inexchange(int sum);
- 将中文数字转为阿拉伯数字(int exchange):根据我们平时的说法,我分为了三种情况,0-10(中文常说“几”)的情况,11-20及10的倍数(中文常说“十几和几十”),和其余的情况(中文常说“几十几”)。
- 11-20及10的倍数及其余情况:我建立了新的数组,将原本的数据分为两部分,因为汉字是占两个字节,所以将前两个和后个分开存到新的数组里,作为个位和十位。
int exchange(char a[])//汉字转数字//
{
int i,j,n;
char tens[10],unit[10];
n=strlen(a);
if(n==2)//0-10//
{
for(i=0;i<=10;i++)
{
if((strcmp(a,str[i])==0))
return i;
}
}
if(n==4)//11-20,10的倍数//
{
for(i=0;i<2;i++)
{
tens[i]=a[i];
}
for(i=2;i<4;i++)
{
unit[i-2]=a[i];
}
if(strcmp(tens,"十")==0)
{
for(i=0;i<=10;i++)
{
if(strcmp(unit,str[i])==0)
return 10+i;
}
}
if(strcmp(unit,"十")==0)
{
for(i=0;i<=10;i++)
{
if(strcmp(tens,str[i])==0)
return i*10;
}
}
}
else//几十几//
{
int sum;
for(i=0;i<2;i++)
{
tens[i]=a[i];
}
for(i=4;i<6;i++)
{
unit[i-4]=a[i];
}
for(i=0;i<=10;i++)
{
if(strcmp(tens,str[i])==0)
sum=i*10;
}
for(i=0;i<=10;i++)
{
if(strcmp(unit,str[i])==0)
sum+=i;
}
return sum;
}
- 阿拉伯数字转为中文数字(void inexchange):同样分为三个部分,建立新的整型变量,储存十位和个位数字,分别转化为中文数字。(这里要注意一点,例如得到50,我们中文常说“五十”,但如果不做处理的话,会得到“五零”,所以要特殊处理这类情况)
void inexchange(int sum)//数字转文本//
{
int unit,tens;
if(sum<=10)//0-10//
printf("%s\n",str[sum]);
else if(sum>=11<=20||sum%10==0)
{
unit=sum%10;
tens=sum/10;
if(sum%10==0)
printf("%s十",str[tens]);
else
printf("%s%s\n",str[tens],str[unit]);
}
else
{
unit=sum%10;
tens=sum/10;
printf("%s十%s\n",str[tens],str[unit]);
}
}
- 判断运算种类和进行运算我全部放倒了主函数内,先初始化总数,存入变量sum中。
- 判断op字符数组内是哪种运算类型,再分别进行运算,如果不是规定的运算种类,则报错。
int main()
{
char var[10],name[100],op[100],num[10];//变量类型,变量名,运算//
scanf("%s %s %s %s",var,name,op,num);
int sum,a;
sum=exchange(num);//初始化//
while((scanf("%s",name))!=EOF)//运算//
{
if(strcmp(name,"看看")!=0)
{
scanf("%s %s",op,num);
if(strcmp(op,"增加")==0)
{
a=exchange(num);
sum+=a;
}
else if(strcmp(op,"减少")==0)
{
a=exchange(num);
sum-=a;
}
else
printf("错误操作");
}
else
{
scanf("%s",op);//注意此时name存储的是操作,op存储的是变量名字//
inexchange(sum);
}
}
}
完整代码
#include<stdio.h>
#include<string.h>
char str[11][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int exchange(char a[]);
void inexchange(int sum);
int main()
{
char var[10],name[100],op[100],num[10];//变量类型,变量名,运算//
scanf("%s %s %s %s",var,name,op,num);
int sum,a;
sum=exchange(num);//初始化//
while((scanf("%s",name))!=EOF)//运算//
{
if(strcmp(name,"看看")!=0)
{
scanf("%s %s",op,num);
if(strcmp(op,"增加")==0)
{
a=exchange(num);
sum+=a;
}
else if(strcmp(op,"减少")==0)
{
a=exchange(num);
sum-=a;
}
else
printf("错误操作");
}
else
{
scanf("%s",op);//注意此时name存储的是操作,op存储的是变量名字//
inexchange(sum);
}
}
}
int exchange(char a[])//汉字转数字//
{
int i,j,n;
char tens[10],unit[10];
n=strlen(a);
if(n==2)//0-10//
{
for(i=0;i<=10;i++)
{
if((strcmp(a,str[i])==0))
return i;
}
}
if(n==4)//11-20,10的倍数//
{
for(i=0;i<2;i++)
{
tens[i]=a[i];
}
for(i=2;i<4;i++)
{
unit[i-2]=a[i];
}
if(strcmp(tens,"十")==0)
{
for(i=0;i<=10;i++)
{
if(strcmp(unit,str[i])==0)
return 10+i;
}
}
if(strcmp(unit,"十")==0)
{
for(i=0;i<=10;i++)
{
if(strcmp(tens,str[i])==0)
return i*10;
}
}
}
else//几十几//
{
int sum;
for(i=0;i<2;i++)
{
tens[i]=a[i];
}
for(i=4;i<6;i++)
{
unit[i-4]=a[i];
}
for(i=0;i<=10;i++)
{
if(strcmp(tens,str[i])==0)
sum=i*10;
}
for(i=0;i<=10;i++)
{
if(strcmp(unit,str[i])==0)
sum+=i;
}
return sum;
}
}
void inexchange(int sum)//数字转文本//
{
int unit,tens;
if(sum<=10)//0-10//
printf("%s\n",str[sum]);
else if(sum>=11<=20||sum%10==0)
{
unit=sum%10;
tens=sum/10;
if(sum%10==0)
printf("%s十\n",str[tens]);
else
printf("%s%s\n",str[tens],str[unit]);
}
else
{
unit=sum%10;
tens=sum/10;
printf("%s十%s\n",str[tens],str[unit]);
}
}