这个作业属于哪个课程 | 2020面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业1 |
这个作业的目标 | 1.了解c语言的局限性 2.了解编译过程 3.使用命令行查看c++编译器版本并且编译一个c代码 4.使用白话文编程 |
作业正文 | 第一次作业 |
其他参考文献 | c语言编译过程,命令行编译c语言 |
一·问答题 |
(1)不够简洁
我们在写代码的时候,有时会把一段代码复制粘贴好几次。比如引用数组时,要写好几次的循环,这样既浪费空间也浪费时间。同时为了实现某一功能时,时常要写很长的代码。
(2)不够安全
写程序时,只要不会违反语法,就不会报错,这就导致写程序时会更加困难,比如数组越界,在编译时就不会报错。
2.(1.预处理:
预处理阶段主要是完成对源程序的替换工作。经过替换后,会生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件.i,该输出文件中只有常量如数字、字符等,或者是变量的定义,以及C语言的关键字如if、else等,如#define pi 3.14,那么之后系统把所有的pi都变成3.14.
(2.编译:
主要进行语法检查,查看是否有语法错误,但是如果该源程序运用了非本源文件中定义的函数,只要有对应的声明,编译器不会报错。
(3.汇编:
汇编是将汇编代码生成机械码,这个文件就叫做目标文件,也就是说汇编是机械转换的过程。
(4.链接:
链接是将生成的一个或者多个中间文件联合生成可执行文件。入口函数就是main函数,每个源文件都可能调用到其他源文件中的函数,因此生成的目标文件要进行链接。
二·实践题:
(1.查看编译器版本,我安装的是vs2019
首先打开命令行:
输入cl.exe
就会出现版本号。
(2.用命令行编译c代码
于我而言,第一步设置环境变量,在默认安装了vc后,我们需要找到路径,像我的电脑是在
找到vc98后,进入文件夹找到bin并且把该地址记住,再进入跟vc98同级目录的common的msdev\bin,将两者加入到环境变量中的系统变量中的path中
再写一个批处理文件导入相应变量,写一个文本如下:
INCLUDE=C:\Program Files (x86)\Microsoft Visual Studio\Include
LIB=C:\Program Files (x86)\Microsoft Visual Studio\Lib
保存为path.bat.
设置完我们可以输入cl,测试一下。
这样就成功了。
接下来写一个代码,保存在比如d盘。
输入vcvars32.bat.
转入d盘:
输入cl /EHsc 汉诺塔.cpp
接下来就能得到相应的exe。
运行exe
得到结果
三·编程题:
中国文化博大精深,从仓颉造字开始,汉字一直流传到了今天。我们在感叹汉字的源远流长时,也不禁感慨,为什么没有一门使用汉字编程的语言?
汉字真的不能编程吗?最近文言文编程火了一把,吾有一數。曰三。名之曰「甲」。这朴实无华的变量定义无疑不是几千年来中华文化的发展中一朵奇葩。
今天小王同学想,文言文能编程那白话文呢?他找到了你,让你帮帮他。
思路:
首先输入的时候,因为大于10后的数比较不好拆分,因此我统一输入三五代表三十五,以此类推。
所以接下来就可以进行拆分将三,五分别存入不同的字符串中。
int dight=strlen(a.num);
int dight2=dight/2;
int k=0;
for(i=0;i<dight2;i++)
{
for(int j=0;j<2;j++,k++)
f[i][j]=a.num[k];
f[i][2]='\0';
}
再将单个字符串进行比较得到相应的数字。
int zh1(char f[][3],int i)
{
if(strcmp(f[i],"一")==0) return 1;
if(strcmp(f[i],"二")==0) return 2;
if(strcmp(f[i],"三")==0) return 3;
if(strcmp(f[i],"四")==0) return 4;
if(strcmp(f[i],"五")==0) return 5;
if(strcmp(f[i],"六")==0) return 6;
if(strcmp(f[i],"七")==0) return 7;
if(strcmp(f[i],"八")==0) return 8;
if(strcmp(f[i],"九")==0) return 9;
if(strcmp(f[i],"零")==0) return 0;
}
再利用pow函数进行进一步的数字转化,就是将三五转化为35。
for(i=0,k=dight2-1;i<dight2;i++,k--)
{
sum2=sum2+zh1(f,i)*pow(10,k);
}
接下来进行位数的拆分。(将35拆为3和5)。
转化为汉字。
最后根据数字判断是否要进行特殊处理。
printf("%s ",a.name);
if(sum2>999&&sum2%1000==0)
{zh2(sum2/1000);printf("千");}
else if(sum2>999&&sum2%100==0)
{zh2(sum2/1000);printf("千");zh2((sum2%1000)/100);printf("百");}
else if(sum2>999&&sum2%10==0) {
zh2(sum2/1000);printf("千");zh2((sum2%1000)/100);
printf("百");zh2((sum2/10)%10);printf("十");}
else if(sum2>999&&sum2%10!=0){
zh2(sum2/1000);printf("千");zh2((sum2%1000)/100);
printf("百");zh2((sum2/10)%10);printf("十");zh2(sum2%10);}
else if(sum2>=100&&sum2%100==0){
zh2((sum2%1000)/100);printf("百");
}
else if(sum2>=100&&sum2%10==0){
zh2((sum2%1000)/100);printf("百");zh2((sum2/10)%10);printf("十");
}
else if(sum2>=100&&sum2%10!=0){
zh2((sum2%1000)/100);printf("百");zh2((sum2/10)%10);printf("十");zh2(sum2%10);
}
else if(sum2>9&&sum2!=10&&sum2%10==0){
zh2((sum2/10)%10);printf("十");
}
else if(sum2>9&&sum2!=10&&sum2%10!=0){
zh2((sum2/10)%10);printf("十");zh2(sum2%10);
}
else if(sum2==10) printf("十");
else if(sum2<10) zh2(sum2);
return 0;
}
完整代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
struct hanzi{
char name[20];
char operate[20];
char num[20];
}; //定义结构体,储存汉字变量名。
int zh1(char f[][3],int i);//将汉字转化为数字。
void zh2(int n);//将数字转化为汉字。
int main()
{
printf("提示:\n1.该程序只进行整数的运算\n2.如果数字大于十请按以下方式输入:\n");
printf("如三十,请输入三零,以此类推\n");
hanzi a,b,c,d;
char u[10],op[20],o[20];
int q=0,sum1=0,sum2=0;
int i=0,j=0;
scanf("%s ",u);
if(strcmp(u,"整数")!=0)
{
printf("请输入整数");
}
scanf("%s%s%s\n",a.name,a.operate,a.num);
char e[100][3],f[10][3];
int dight=strlen(a.num);
int dight2=dight/2;
int k=0;
for(i=0;i<dight2;i++)
{
for(int j=0;j<2;j++,k++)
f[i][j]=a.num[k];
f[i][2]='\0';
}
for(i=0,k=dight2-1;i<dight2;i++,k--)
{
sum2=sum2+zh1(f,i)*pow(10,k);
}
while(scanf("%s%s",o,op),strcmp(o,"看看")!=0)
{
scanf("%s\n",a.num);
dight=strlen(a.num);
dight2=dight/2;
k=0;
for(i=0;i<dight2;i++)
{
for(int j=0;j<2;j++,k++)
e[i][j]=a.num[k];
e[i][2]='\0';
}
for(i=0,k=dight2-1;i<dight2;i++,k--)
{
sum1=sum1+zh1(e,i)*pow(10,k);
}
if(strcmp(op,"增加")==0) sum2+=sum1;
if(strcmp(op,"减少")==0) sum2-=sum1;
sum1=0;
}
printf("%s ",a.name);
if(sum2>999&&sum2%1000==0)
{zh2(sum2/1000);printf("千");}
else if(sum2>999&&sum2%100==0)
{zh2(sum2/1000);printf("千");zh2((sum2%1000)/100);printf("百");}
else if(sum2>999&&sum2%10==0) {
zh2(sum2/1000);printf("千");zh2((sum2%1000)/100);
printf("百");zh2((sum2/10)%10);printf("十");}
else if(sum2>999&&sum2%10!=0){
zh2(sum2/1000);printf("千");zh2((sum2%1000)/100);
printf("百");zh2((sum2/10)%10);printf("十");zh2(sum2%10);}
else if(sum2>=100&&sum2%100==0){
zh2((sum2%1000)/100);printf("百");
}
else if(sum2>=100&&sum2%10==0){
zh2((sum2%1000)/100);printf("百");zh2((sum2/10)%10);printf("十");
}
else if(sum2>=100&&sum2%10!=0){
zh2((sum2%1000)/100);printf("百");zh2((sum2/10)%10);printf("十");zh2(sum2%10);
}
else if(sum2>9&&sum2!=10&&sum2%10==0){
zh2((sum2/10)%10);printf("十");
}
else if(sum2>9&&sum2!=10&&sum2%10!=0){
zh2((sum2/10)%10);printf("十");zh2(sum2%10);
}
else if(sum2==10) printf("十");
else if(sum2<10) zh2(sum2);
return 0;
}
int zh1(char f[][3],int i)
{
if(strcmp(f[i],"一")==0) return 1;
if(strcmp(f[i],"二")==0) return 2;
if(strcmp(f[i],"三")==0) return 3;
if(strcmp(f[i],"四")==0) return 4;
if(strcmp(f[i],"五")==0) return 5;
if(strcmp(f[i],"六")==0) return 6;
if(strcmp(f[i],"七")==0) return 7;
if(strcmp(f[i],"八")==0) return 8;
if(strcmp(f[i],"九")==0) return 9;
if(strcmp(f[i],"零")==0) return 0;
}
void zh2(int n)
{
if(n==0) printf("零");
if(n==1) printf("一");
if(n==2) printf("二");
if(n==3) printf("三");
if(n==4) printf("四");
if(n==5) printf("五");
if(n==6) printf("六");
if(n==7) printf("七");
if(n==8) printf("八");
if(n==9) printf("九");
}
输出示例: