C语言程序设计第二次作业
C语言程序设计第二次作业——顺序结构
标签(空格分隔): C语言
转眼间我们又过了一周,博客园的作业也又到了第二次作业。我们到了大学后做作业的形式变得那么的高大上了。
(一)改错题
1.输出带框文字:在屏幕上输出以下3行信息。
#include <stido.h>
int mian()
{
printf("*************\n");
printf(" Welcome\n")
printf("*************\n);
return 0;
}
上面的这个程序就是我们将要剖析的“病号”了,我们来看一看他有什么病症吧。
首先,我们将这个程序运行一下看一看编译器给我们的报错信息吧。
--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------
检查文件依赖性...
正在编译 D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c...
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:1:20: stido.h: No such file or directory
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:6: error: syntax error before "printf"
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:6: error: missing terminating " character
构建中止 main: 3 个错误, 0 个警告
(win10坏了,现在只能用win7来做了)我们可以看到编译器错误在第一行,我们看一看第一行“#include <stido.h>
”在我们输入的时候是不是手指就帮你提示了它有错了?stdio.h写成了stido.h。这个问题我们很容易看出来,但也提示了我们在今后的编程中应该注意的问题:不要打错了字符。(因为我使用的编译器是C-Free5,所以会因为最后一行没有空而警告,不用在意)于是我们将这个错误改正:#include <stdio.h>
--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------
检查文件依赖性...
正在编译 D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c...
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:1:18: stido: No such file or directory
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:6: error: syntax error before "printf"
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:6: error: missing terminating " character
构建中止 main: 3 个错误, 0 个警告
我们又看到了bug的存在,这回在第五、六行。printf的拼写正确,那printf("");
的必备格式哪?第五行的printf语句中缺少每行必备的“;”第六行的printf语句中缺少一个"。这又是一个小的疏忽。我们其实还要注意我们在编译中所有的符号都应该是英文符号,如果使用中文符号是不可能编译成功的。虽然也有一些中文符号可以使用,但是使用英文符号的习惯更有利于我们以后的编程。
于是我们再把这个错误改正,再来看一看新的错误信息吧。
连续的几个错误提示。提示无法找到文件(我的win10就是因为提取了管理员权限后误删了一些系统文件连提示都不提示的,于是我的所有编译器都提示没有gcc.exe……等我下了一堆文件后无奈从装,从装又神奇的无法在uefi模式下读取到我的系统,现在我的win7还因为主板比较新而不能软激活。无奈)我们来看一看,这不就是我们李老师在课上说的“面错误”吗?把main写成了mian在括号中还没有void,这次再次让我们知道了在C语言中绝对不能把各种的英文单词写错。
我们把这个面错误改正后的结果如何呢?
恭喜,我们成功的运行了这个程序,成功的输出了我们想要的welcome!
我想我们今后的编程中修bug应该是绝对不会少的,这就需要我们更多的耐心,更不认输的精神。而我们今后如果想要更少的bug来让我们来修的话就应该在现在养成良好的编程习惯,就如那个void,虽然少了他程序照样运行,它就是我们口中的不重要,但如果我们想要在今后有更少的错误必须要在这些细节上格外注意!
我们将所有的格式加好后再来看看吧。
程序的易读性是非常重要的,即使会麻烦一些,但我们修bug时才会更加的容易。
#include <stdio.h>
int main(void)
{
printf("*************\n");
printf(" Welcome\n");
printf("*************\n");
return 0;
}
2.计算某个数x的平方赋给y
#include <stdio>
int main()
{
int x,y;
y=x*x;
printf("%d = %d * %d", x); /* 输出
printf("d * %d = %d", y);
return 0;
}
欢迎我们的第二位“患者”。
来让我们第一次运行它来找它的错误吧。
--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------
检查文件依赖性...
正在编译 D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c...
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:1:17: stdio: No such file or directory
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:7:33: unterminated comment
[Warning] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:11:2: warning: no newline at end of file
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:7: error: syntax error at end of input
构建中止 main: 3 个错误, 1 个警告
根据错误信息,我们可以知道。程序根本没有执行,头文件没有载入成功。检查第一行,源文件将#include <stdio.h>
写成了#include <stdio>
没有加.h,使头文件无法载入成功。
我们将错误改正#include <stdio.h>
再执行一遍。
--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------
检查文件依赖性...
正在编译 D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c...
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:8:33: unterminated comment
[Error] D:\Begining C\C语言程序设计第二次作业——顺序结构\main.c:8: error: syntax error at end of input
构建中止 main: 2 个错误, 0 个警告
检查编译器定位到的第8行,注释/* 输出
不符合任何一种注释格式。c语言中可以用三种形式表示注释
//注释内容
;/*注释内容*/
;/注释内容/
而此源文件不符合任何一种注释格式,我们应该改为//输出
或/输出/
或者/*输出*/
。
我们将注释改正后再运行一遍。
程序成功运行但输出了许多垃圾值,这时我们只能去检查输出语句看到有一个%d没有打上%。输出中有的%d没有想对应的函数值。并且x的值并没有输入值。甚至两个输出语句间没有\n来换行我们修改成这样后再次运行。
#include <stdio.h>
int main(void)
{
int x = 0,y = 0;
scanf("%d",&x);
y= x * x;
printf("%d = %d * %d\n", y,x,x); //输出
printf("%d * %d = %d", x,x,y);
return 0;
}
输入3时已经能够满足题目的要求,其实还可以将所有的数定义为双精度浮点数来满足更多的情况。或者再载入头文件#include <math.h>
并且用pow(x,2)
来定义x的平方。
(二)学习总结
1.不同的数据类型
我们从书上可以知道在整数常量中char占用1字节(8bit)而short型占用2字节(32bit)int和long型都占用4字节(32bit)而long long型占用8字节(64bit)的内存。那我们怎么用编译器来证明这些呢?老师给了我们sizeof()
命令来显示这些,那我们就来试一试吧。
//查看字节数
#include <stdio.h>
int main(void)
{
printf("char %d字节",sizeof(char));
return 0;
}
//查看字节数
#include <stdio.h>
int main(void)
{
printf("int %d字节\n",sizeof(int));
return 0;
}
//查看字节数
#include <stdio.h>
int main(void)
{
printf("long %d字节\n",sizeof(long));
return 0;
}
//查看字节数
#include <stdio.h>
int main(void)
{
printf("long long型占用%d字节\n",sizeof(long long));
return 0;
}
其实我们还可以用前后三个“`”的方式来插入代码。
//查看字节数
#include <stdio.h>
int main(void)
{
int size = sizeof(float);
printf("float型占用%d字节\n",size);
return 0;
}
//查看字节数
#include <stdio.h>
int main(void)
{
int size = sizeof(double);
printf("double型占用%d字节\n",size);
return 0;
}
2.宏定义
#include <stdio.h>
#include <limits.h>
int main()
{
int i,j;
i = INT_MAX;
j = INT_MIN;
printf("int类型最大值max = %d\nint类型最小值min = %d\n",i,j);
return 0;
}
运行结果:
加1后:
#include <stdio.h>
#include <limits.h>
int main()
{
int i,j;
i = INT_MAX + 1;
j = INT_MIN - 1;
printf("int类型最大值max = %d\nint类型最小值min = %d\n",i,j);
return 0;
}
运行结果:
可以看见我们的最大值和最小值对调了一下,这就是我们题干所说的溢出,这也就是为什么我们有时玩单机游戏时将金钱修改的过大却会变成负的情况的原因了,以后我们也应该注意用合适的类型存储数据来避免溢出的情况。
3.运行下面的程序,输入100 144 64,看看运行结果是什么?为什么?
#include <stdio.h>
int main(void)
{
int a,b,c;
scanf("%d%o%x",&a,&b,&c);
printf("%d %d %d\n",a,b,c);
return 0;
}
上面这个程序运行的结果:
我们看到输出结果全部变成了100。
世界上有10种人,会二进制的和不会二进制的。-来自网络
我们回到输入语句,%o是八进制数形式,%x是十六进制数形式,而代码在输出时却全部是10进制整形,于是编译器自动的把我们的8/16进制数转换为了10进制并输入了出来,于是我们在输出中就看到了一个数重复了三遍。
这是一个非常有趣味的小程序,成功打动了我来我们进入下一题。
4.总结
这一章我们把顺序结构学完了,在写这个总结时也已经开始学选择结构了,c语言的课程进度不等人有无数的作业等着我们,我们一定要在现阶段多努力,多跟上进度,把不明白的都弄懂了。慢慢的等我们入了门,我们也就------习惯了。。。。。。学计算机还想放松?想多了,以后是连续10个小时的加班等着你哪!
我们在现阶段正确的拼写还是非常重要的一点,不要让一个非常简单的拼写错误毁了你辛辛苦苦编写的程序,多练习,让手指记住我们要用的语句!我们不能只使用int、double类型,我们还学了许多许多,如果我们把这些虽然并不是那么常用却非常重要的东西忘记了还怎么叫我们精通C语言哪?同时我们还要注意程序的易读性,打好一个良好的基础是今后我们学c学java学cpp等等语言的保障。
(三)实验总结
我的学号是5为单数,要做的题目是1、3、5、7、9题。
1.求整数均值
(1)题目
本题要求编写程序,计算4个整数的和与平均值。题目保证输入与输出均在整型范围内。
(2)流程图
(3)源代码
#include <stdio.h>
int main(void)
{
double a = 0.0,b = 0.0,c = 0.0,d = 0.0;
double Sum = 0.0,Average = 0.0;
//printf("请输入4个数字,用空格隔开\n");
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
Sum = a + b + c + d;
Average = Sum/4.;
printf("Sum = %.0lf; Average = %.1lf",Sum,Average);
return 0;
}
李老师上课讲我们在实际编程时应该更贴近于用户,用输出语句来告知用户应该输入什么样的数据,但PTA的自动检查系统却不允许这样的语句存在,其实我们可以将一个输出语句转化为注释来兼顾这两点。
(4)测试数据及运行结果
我们将//去掉,程序成功运行,和是整数,平均值保留了一位小数,程序符合题目要求。第一题完成。
(5)实验分析
在这个程序中根据题目要求,平均数的声明是一定要声明成浮点数的。否则average输出时是会有问题的。而且要注意怎么保留一位小数,和最好声明成整数型,当然,声明成浮点型也是有办法正确输出的。好了,第一题就到这里吧,我们进入下一题。
(3)是不是太胖了
(1)题目
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤是公斤的两倍。现给定某人身高,请你计算其标准体重应该是多少?(顺便也悄悄给自己算一下吧……)
输入格式:
输入第一行给出一个正整数H(100 < H ≤ 300),为某人身高。
输出格式:
在一行中输出对应的标准体重,单位为市斤,保留小数点后1位。
输入样例:
169
输出样例:
124.2
(2)流程图
(3)源代码
//3.是不是太胖了
#include <stdio.h>
int main(void)
{
float H = 0.0f,Kg_std = 0.0f,Kg_C = 0.0f;
//printf("请输入你的身高。\n");
scanf("%f",&H);
Kg_std = (H - 100.0f) * 0.9f;
Kg_C = Kg_std * 2.0f;
printf("%.1f",Kg_C);
}
(4)测试数据及运行结果
程序编译成功,输出结果符合题目要求。
(5)实验总结
这个程序所有数据最好都使用浮点形式声明,所有计算数据都涉及小数。输出时应该注意保留小数位数。当然在PTA中时不能把//去掉的,不然就悲剧了,怎么改都没法作对的。顺便一说,我身高180却只有105斤。
5.计算物体自由下落的距离
(1)题目
一个物体从100米的高空自由落下。编写程序,求它在前3秒内下落的垂直距离。设重力加速度为10米/秒^2。
输入格式:
本题目没有输入。
输出格式:
按照下列格式输出
height = 垂直距离值
结果保留2位小数。
(2)流程图
(3)源代码
//5.计算物体自由下落的距离
#include <stdio.h>
#include <math.h> //求平方用一用。
int main(void)
{
float h = 0.0f,t = 0.0f;
const double g = 10;
t = 3.0f;
h = 0.5f * g * pow(t,2);
printf("height = %.2f\n",h);
return 0;
}
(4)测试数据及运算结果
(5)实验总结
这一道题比较简单,没有输入。你甚至可以只用一句输出语句来骗过题目。只要我们知道自由下落的公式就一定能把这道题作对。
9.逆序的三位数
(1)题目
程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。
输入格式:
每个测试是一个3位的正整数。
输出格式:
输出按位逆序的数。
输入样例:
123
输出样例:
321
(2)流程图
(3)源代码
//9.逆序的三位数
#include <stdio.h>
int main(void)
{
int x = 0,n_1 = 0,n_2 = 0,n_3 = 0;
int y = 0;
//printf("请输入你要换算的数。\n");
scanf("%d",&x);
n_3 = x / 100;
n_2 = x / 10 - n_3*10;
n_1 = x / 1 - n_2 * 10 - n_3 * 100;
y = n_1 * 100 + n_2 * 10 + n_3;
printf("%1d\n",y);
return 0;
}
(4)测试数据及运算结果
输入700时:
输入123时:
(5)实验总结
这一道题首先要会计算一个3位数个个位数为什么。然后就是会去前导零。当我们这两个都能熟练运用时这道题自然而然的就能够作对。
(四)PTA提交列表
顺序结构一:
顺序结构二:
随着这篇随笔的结束,我们C语言课程的第二周也就正式结束了。尘归尘,土归土。我们就要投身于第三周的C语言学习了。