软件工程专业的“乐趣”
学号:16340072
数据科学与计算机学院
目录
1.Helloworld作业
“Helloworld”–最简单的程序。或者说是一个让初学者感受程序乐趣的程序。程序内容就是在显示器显示”Helloworld”的字幕。
在软件工程专业课第一次上机,作业就是“Helloworld”程序。当时老师给我们的代码模样就是这样。
# include <stdio.h>
int main()
{
printf("Helloworld");
return 0;
}
然后我很天真地把代码“复制”地打到中大的vmatrix,提交后让中大作业评分系统评分。我满怀自信,这样“复制”,肯定有100分。结果却事与愿违,80分。我想这怎么可能,肯定系统出错,然后我在提交了一次。结果一样是80分。“系统错误,肯定是系统错误”,于是我就什么代码都不打,直接提交。Feekback:0;好吧,系统没有错误。所以我只好问一下拿了100分的同学,答案是什么。看了看,噢,原来Hello与world之间有个逗号。
# include <stdio.h>
int main()
{
printf("Hello,world");
return 0;
}
于是我把这个提交,结果还是没有100分。我再问一下同学。。。当我听后,一脸懵B,坑。。。原来world前面还有空格。。
# include <stdio.h>
int main()
{
printf("Hello, world");
return 0;
}
经过辛苦的尝试,我终于拿了100分。。。
然后我得了个结论:
其实“Helloworld”,好“难”。
2.浮点数二进制表示
浮点数(其实是正数与小数的结合吧,例如3.14)。因为计算机只能识别0,1(机器语言)。所以数据的储存也是以二进制保存。
以十进制与二进制相互转化为例。
(01110001)2转化十进制。
根据公式:
(01110001)2=0*27+1*26+……1*20=113;
十进制转化为二进制,就是不断除2取余数。这里就不详细说了
而浮点数转化为二进制储存更为复杂。第一次听课时,因为老师讲得太快,根本听不懂。于是我就上网查,想弄明白。结果搞了一个晚上,还是一脸懵B。最后就把转化的步骤记住就算了。
浮点数二进制由符号位、阶码、尾数 。
类型 | 符号位长度 | 阶码长度 | 尾数长度 |
---|---|---|---|
float | 1 | 8 | 23 |
double | 1 | 11 | 52 |
以下通过几个例子讲解浮点数如何转换为二进制数例一:已知:double类型38414.4。求:其对应的二进制表示。
分析:double类型共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位:
最高位63位是符号位,1表示该数为负,0表示该数为正;
62-52位,一共11位是指数位;
51-0位,一共52位是尾数位。
步骤:按照IEEE浮点数表示法,下面先把38414.4转换为十六进制数。
把整数部和小数部分开处理:整数部直接化十六进制:960E。小数的处理:1
0.4=0.5*0+0.25*1+0.125*1+0.0625*0+……
实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够53位就行了。隐藏位技术:最高位的1不写入内存(最终保留下来的还是52位)。
如果你耐心的话:
38414.4(10)=1001011000001110.0110011001100110011001100110011001100(检查时会数数数到斗鸡眼)
或者可以如下理解:
1.001011000001110 0110011001100110011001100110011001100×2^15
于是来看阶码,按IEEE标准一共11位,可以表示范围是-1024 ~ 1023。因为指数可以为负,为了便于计算,规定都先加上1023(2^10-1),在这里,阶码:15+1023=1038。二进制表示为:100 00001110;
符号位:因为38414.4为正对应 为0;
合在一起(注:尾数二进制最高位的1不要):
01000000 11100010 11000001 110 01100 11001100 11001100 11001100 11001100
就是这么“简单”。2
3.vmatrix作业评分系统
这节是我对学校vmatrix作业评分系统的吐槽。
这是vmatrix上的一道练习题。当时我遵循题目打了一套代码如下
# include <stdio.h>
int main()
{
double p[10000];
int N;
int i,j,k,t;
double M;
double v;
t=-1;
scanf("%d %lf",&N,&M);
int a =(N>=2 && N<=20);//&&表示"与",当括号内正确时,a==1.
int b =(M>=0.5 && M<=1);
if(a==1 &&b ==1)//判断M,N是否符合题目要求。
for(i=2;i<=N;i++)
{
for(j=1;j<i;j++)
{
t++;
p[t] = (double)j / (double)i;
k = t-1;
if(p[t] == p[0] && (t)!=0)
continue;
while(p[t]!=p[k] && k>0)
{
k--;
}
if(k!=0 && (t)!=0)
continue;
if(p[t]<=M)
printf("%d/%d\n",j,i);
}
}
return 0;
}
结果评分系统给了我99分。。。,说我的程序太复杂。于是我就删除了一些,改成如下。
# include <stdio.h>
int main()
{
double p[10000];
int N;
int i,j,k,t;
double M;
double v;
t=-1;
scanf("%d %lf",&N,&M);
for(i=2;i<=N;i++)
{
for(j=1;j<i;j++)
{
t++;
p[t] = (double)j / (double)i;
k = t-1;
if(p[t] == p[0] && (t)!=0)
continue;
while(p[t]!=p[k] && k>0)
{
k--;
}
if(k!=0 && (t)!=0)
continue;
if(p[t]<=M)
printf("%d/%d\n",j,i);
}
}
return 0;
}
就是少了判断M,N的取值范围。结果评分为100分。汗。
这个网上交作业。。网上评分好像是我们师兄大牛们做出来的,我们是第一届使用的,可能问题多多。所以就钻了几个空子拿100分。哈哈!!
希望师兄能改善一下评分系统吧,这样就能规范我的代码了。
4.制作小游戏
软件导论课最有趣的作业就是制作游戏。Constuct 2软件,让一个小白也会做游戏。虽然游戏有点无聊,但做出来挺有成就感。因为不会导出,所以无法让读者尝试了。我只能用图片来描述一下:
首先是游戏画面,然而一个开始键的设计就有好多讲究。
接着就是游戏开始画面了,鼠标单击是射出一发子弹。
当分数达到10时。会出现小泡。然后吃了之后就变成了super plane..
鼠标单击会射出三发子弹。
最终就是boss的出现了。(哈哈 好中二)
制作这个游戏最烦就是收集素材,然后还要PS,弄flash。。。所以制作游戏其实要通才的。
几个小时才能完成一个无聊的小游戏。。(其中还有上网看视频看怎么做)
最后希望读者能评论一下,你懂的!!
(最后就是希望读者能评论一下,你懂的!!)
- IEEE,全称是Institute of Electrical and Electronics Engineers,电气电子工程师学会。 ↩
- 详细解析:
http://zhidao.baidu.com/link?url=-qB9OpwMaFfwaclpMWb9KXRWMzTWgtYKaCPRE5zZVUNUnXYaeuRSOgrI_A0UO-pR2vmSdWo7eJzvtMyFtIah04L7W2Dd1lckT_O8nGrrdZ3 ↩