此作业属于哪个课程 |
https://edu.cnblogs.com/campus/fzu/2020OOP/ 2020面向对象程序设计张栋班 |
此作业的要求 |
|
此作业的目标 |
1.学会安装c++开发环境 2.对c语言与c++进行一定的了解 3.在查阅资料的过程中了解c语言的编译过程 4.在寒假温习c语言,预习c++语言 5.自主学习,在寒假的玩乐中做一股学习的清流 |
作业正文 |
https://www.cnblogs.com/smallgrape/p/12236302.html |
参考文献 |
https://blog.csdn.net/weixin_40756041/article/details/88052207 https://www.cnblogs.com/knife-king/p/11090029.html c.biancheng.net/view/132.html https://zhidao.baidu.com/question/585606335.html
|
一.问答题
(1)c语言的缺点:
- 语法限制不太严格
假如写同样一个程序,在 Java 里面会报错,而在C语言里面是不会报错的。因为C语言设计的思想是:你想怎么写程序就怎么写,只要你的这种写法错得不是很离谱,就认为你这么写有特殊的含义,可以通过。但 Java 不行:只要你这么写有歧义,或者说这样写不太好,那么它都会报错。
举例:
比如C语言中你可以将一个浮点型数据赋给一个整型变量,编译时只会警告,因为会丢失精度,但是在 Java 中这样写就会报错,它在语法上就禁止你这样写。所以不同的语言对同样一个问题有不同的处理方式。
可是具体操作却并没有警告,由于Java的编译器认证码过期,要不然我还打算去实验一番Java是否会报错。
2.危险性高
语法要求不严格导致的结果是危险性高。因为有歧义的程序也可以通过,这样就会有很多漏洞,黑客往往会抓住这些漏洞进行攻击。所以说C语言比较危险。
3.比较难学
首先鉴于我学习的语言最深入了解的当属c语言,其实说它比较难学是没有参考对象的,但是我仍然认同这个看法,鉴于第一条语法要求不严格,我想这也是为什么C语言比较难学的原因,因为我学完之后编写一个程序很可能就是错的,但又很难发现。对,就是查找错误的过程,我觉得是比打一个新的代码还要麻烦的,我学习了一个学期,遇到很频繁的问题就是,明明我和别人的代码就差了一点点的地方不一样,就是会出现代码的分数没满分差一个点之类的问题,最后叫上好几个伙伴一起找错,最后都不了了之。
其次,c语言的指针真的内容很多,没那么好理解,但是据说指针是C语言高级于其它语言的一个特色,它可以实现与硬件的直接靠近。但是与此同时,在老师的教学过程中,总是在反复陈述,指针一定要初始化,否则它的不确定指向性是很危险的。
(2)C语言编译过程
1.编译预处理
■读取C语言源程序
■对其中的伪指令(以#开头的指令)和特殊符号进行处理。
■生成一个不含伪指令的输出文件。
输出文件中,将只有常量,如数字、字符串、变量的定义,以及C语言的关键字。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。此输出文件将作为编译程序的输出而被翻译成为机器指令。
2.编译阶段
■预编译程序所要做的工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
3. 优化阶段
■优化一部分是对中间代码的优化,这种优化不依赖于具体的计算机。
■另一种优化则主要针对目标代码的生成而进行的。
经过优化得到的汇编代码必须经过汇编程序的汇编转换成相应的机器指令,方可能被机器执行。
4.汇编过程
■将上一步的汇编代码转换成机器码,这一步产生的文件叫做目标文件,是二进制格式。
5.链接程序
■将有关的目标文件彼此相连接
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
二.实践题
(1)查看我的C++编译器版本
■打开VS
■输入cl.exe 回车
(2) 使用命令行编译一份C语言代码
■生成一份C语言代码的可执行文件放在桌面
■ctr+R ,窗口中输入cmd
■在弹出的新窗口按照生成文件的路径依次打开 直到最后一次输入文件名称
三.编程题
(1)题目需求,分解需求
■设置 钱包这个变量的类型(鉴于只会出现一到十的数据我觉得不会出现什么小数的增或减)钱包的初始值
■判断 钱包的钱数是增加还是减少
■识别 钱包钱数变化的数值(我的代码默认只能是一到十的数值)
■实现 程序的终止,即实现见”看看 钱包“即止
■输出 钱数的最终值将数字转换为文字(按题目要求数字只能是一到十,我以为只能是两位数,因为二十一,三十五,数字确实是一到十组成的。
(2)每个模块的思考
■设置 钱包这个变量的类型(鉴于只会出现一到十的数据我觉得不会出现什么小数的增或减)钱包的初始值
&错误的做法
我以为这些文字是属于字符的,是具有相应的ASC码的,所以初始值用字符来承接,而不是用字符串来。
char begin;//而不是字符数组 begin switch(begin) { case 零:sum=0;break; case 一:sum=1;break; case 二:sum=2;break; case 三:sum=3;break; case 四:sum=4;break; case 五:sum=5;break; case 六:sum=6;break; case 七:sum=7;break; case 八:sum=8;break; case 九:sum=9;break; case 十:sum=10;break; }
自然结果是一大串报错
&修改后的正确版本
char sort[3],wallet[3],begin[3],change[3],money[3]; scanf("%s%s%s%s",sort,wallet,change,begin); int sum,s,a[100],i; if(strcmp("零",begin)==0)sum=0; else if(strcmp("一",begin)==0)sum=1; else if(strcmp("二",begin)==0)sum=2; else if(strcmp("三",begin)==0)sum=3; else if(strcmp("四",begin)==0)sum=4; else if(strcmp("五",begin)==0)sum=5; else if(strcmp("六",begin)==0)sum=6; else if(strcmp("七",begin)==0)sum=7; else if(strcmp("八",begin)==0)sum=8; else if(strcmp("九",begin)==0)sum=9; else if(strcmp("十",begin)==0)sum=10;
■判断钱包的钱数是增加还是减少
if(strcmp("增加",change)==0) sum+=s; else if(strcmp("减少",change)==0) sum-=s; scanf("%s%s",wallet,change);
■识别钱包钱数变化的数值
if(strcmp("零",money)==0)s=0; else if(strcmp("一",money)==0)s=1; else if(strcmp("二",money)==0)s=2; else if(strcmp("三",money)==0)s=3; else if(strcmp("四",money)==0)s=4; else if(strcmp("五",money)==0)s=5; else if(strcmp("六",money)==0)s=6; else if(strcmp("七",money)==0)s=7; else if(strcmp("八",money)==0)s=8; else if(strcmp("九",money)==0)s=9; else if(strcmp("十",money)==0)s=10;
■能够实现程序的终止,即实现见”看看 钱包“即止
&错误版本
根本结束不了输入,通过我的好伙伴”调试“找到了问题所在,
结束标志是”看看 钱包“看起来好像是可以结束,但由于我的在循环中输入设置的是三个字符串变量,始终接收不到第三个字符串,于是出错。
scanf("%s%s%s",wallet,change,money); while(strcmp("钱包",wallet)==0) { switch(money) { case 零:s=0;break; case 一:s=1;break; case 二:s=2;break; case 三:s=3;break; case 四:s=4;break; case 五:s=5;break; case 六:s=6;break; case 七:s=7;break; case 八:s=8;break; case 九:s=9;break; case 十:s=10;break; } if(strcmp("增加",change)==0) sum+=s; else if(strcmp("减少",change)==0) sum-=s; scanf("%s%s%s",wallet,change,money); }
&修改后仍然错误的版本
确实第二次改变钱数的操作以及以后的任何次的输入看起来确实可以结束输入,可是第一次改变钱数的操作输入之后出现了让人啼笑皆非的错误。
scanf("%s%s%s",wallet,change,money); while(strcmp("钱包",wallet)==0) { scanf("%s",money); switch(money) { case 零:s=0;break; case 一:s=1;break; case 二:s=2;break; case 三:s=3;break; case 四:s=4;break; case 五:s=5;break; case 六:s=6;break; case 七:s=7;break; case 八:s=8;break; case 九:s=9;break; case 十:s=10;break; } if(strcmp("增加",change)==0) sum+=s; else if(strcmp("减少",change)==0) sum-=s; scanf("%s%s",wallet,change); }
&终极正确版本
感觉自己才智有限,while循环已经救不了我愚蠢的代码,所以转战for循环实现第一次与后面的区分。
scanf("%s%s%s",wallet,change,money); for(i=0;strcmp("钱包",wallet)==0;i++) { if(i!=0)scanf("%s",money); if(strcmp("零",money)==0)s=0; else if(strcmp("一",money)==0)s=1; else if(strcmp("二",money)==0)s=2; else if(strcmp("三",money)==0)s=3; else if(strcmp("四",money)==0)s=4; else if(strcmp("五",money)==0)s=5; else if(strcmp("六",money)==0)s=6; else if(strcmp("七",money)==0)s=7; else if(strcmp("八",money)==0)s=8; else if(strcmp("九",money)==0)s=9; else if(strcmp("十",money)==0)s=10; if(strcmp("增加",change)==0) sum+=s; else if(strcmp("减少",change)==0) sum-=s; scanf("%s%s",wallet,change); }
■输出钱数的最终值将数字转换为文字
&判断输出数值是几位数
for(i=0;;i++) { a[i]=sum%10; sum=sum/10; if(sum==0) break; }
&是一位数的情况
if(i==0) { switch(a[0]) { case 0:printf("零");break; case 1:printf("一");break; case 2:printf("二");break; case 3:printf("三");break; case 4:printf("四");break; case 5:printf("五");break; case 6:printf("六");break; case 7:printf("七");break; case 8:printf("八");break; case 9:printf("九");break; case 10:printf("十");break; } }
&是两位数的情况
else { switch(a[1]) { case 1:break; case 2:printf("二");break; case 3:printf("三");break; case 4:printf("四");break; case 5:printf("五");break; case 6:printf("六");break; case 7:printf("七");break; case 8:printf("八");break; case 9:printf("九");break; } switch(a[0]) { case 0:printf("十");break; case 1:printf("十一");break; case 2:printf("十二");break; case 3:printf("十三");break; case 4:printf("十四");break; case 5:printf("十五");break; case 6:printf("十六");break; case 7:printf("十七");break; case 8:printf("十八");break; case 9:printf("十九");break; } }
(3)测试数据
&一位数的情况
&两位数的情况
完整代码
#include<stdio.h>
#include<string.h>
int main()
{
char sort[3],wallet[3],begin[3],change[3],money[3];
scanf("%s%s%s%s",sort,wallet,change,begin);
int sum,s,a[100],i;
if(strcmp("零",begin)==0)sum=0;
else if(strcmp("一",begin)==0)sum=1;
else if(strcmp("二",begin)==0)sum=2;
else if(strcmp("三",begin)==0)sum=3;
else if(strcmp("四",begin)==0)sum=4;
else if(strcmp("五",begin)==0)sum=5;
else if(strcmp("六",begin)==0)sum=6;
else if(strcmp("七",begin)==0)sum=7;
else if(strcmp("八",begin)==0)sum=8;
else if(strcmp("九",begin)==0)sum=9;
else if(strcmp("十",begin)==0)sum=10;
scanf("%s%s%s",wallet,change,money);
for(i=0;strcmp("钱包",wallet)==0;i++)
{
if(i!=0)scanf("%s",money);
if(strcmp("零",money)==0)s=0;
else if(strcmp("一",money)==0)s=1;
else if(strcmp("二",money)==0)s=2;
else if(strcmp("三",money)==0)s=3;
else if(strcmp("四",money)==0)s=4;
else if(strcmp("五",money)==0)s=5;
else if(strcmp("六",money)==0)s=6;
else if(strcmp("七",money)==0)s=7;
else if(strcmp("八",money)==0)s=8;
else if(strcmp("九",money)==0)s=9;
else if(strcmp("十",money)==0)s=10;
if(strcmp("增加",change)==0)
sum+=s;
else if(strcmp("减少",change)==0)
sum-=s;
scanf("%s%s",wallet,change);
}
for(i=0;;i++)
{
a[i]=sum%10;
sum=sum/10;
if(sum==0)
break;
}
if(i==0)
{
switch(a[0])
{
case 0:printf("零");break;
case 1:printf("一");break;
case 2:printf("二");break;
case 3:printf("三");break;
case 4:printf("四");break;
case 5:printf("五");break;
case 6:printf("六");break;
case 7:printf("七");break;
case 8:printf("八");break;
case 9:printf("九");break;
case 10:printf("十");break;
}
}
else
{
switch(a[1])
{
case 1:break;
case 2:printf("二");break;
case 3:printf("三");break;
case 4:printf("四");break;
case 5:printf("五");break;
case 6:printf("六");break;
case 7:printf("七");break;
case 8:printf("八");break;
case 9:printf("九");break;
}
switch(a[0])
{
case 0:printf("十");break;
case 1:printf("十一");break;
case 2:printf("十二");break;
case 3:printf("十三");break;
case 4:printf("十四");break;
case 5:printf("十五");break;
case 6:printf("十六");break;
case 7:printf("十七");break;
case 8:printf("十八");break;
case 9:printf("十九");break;
}
}
return 0;
}
四.学习总结与反思
完成第二模块的过程中就耗费了我好多时间,寻找有效信息的过程着实坎坷,但是还是颇有收获,学会了通过可执行文件的存放位置实现直接打开此文件,若是像代码的文件,可以直接实现输入数据和结果输出。还有许多不足,继续加油。