这篇文章上次修改于 1014 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
除了汲取知识外,在贴近实际的场景下使用知识也是掌握知识必不可少的一步。对编程语言来说也是如此。笔者搜集整理了一些适合学习编程语言时做的项目,试图给大家一些启发。本文是第一篇。
BMP旋转
来自:北京大学程序设计实习
题目描述
BMP是一种不压缩的图片格式。图片中每一个点的色彩都被记录在文件中,因而BMP旋转与压缩算法无关,适于检验对一门语言的掌握程度。
具体任务为:编写一个程序,从命令行读取源文件名和目标文件名,将源文件顺时针旋转90度,输出到目标文件名。测试用的BMP文件见附件。
关于BMP文件格式的具体内容,请参考这个链接BMP_File_Format_Wikipedia。如打不开网站可以参考附件中的PDF。谷雨同学制作的这幅图也很棒:
一些提示点
- 想象自己写的程序是给用户使用的。考虑:如果用户输入出错怎么办?如果输出文件的位置已经存在文件,应该怎么处理?
- BMP文件有许多版本,我们这里主要考虑24位的版本,即没有调色盘,每个颜色用3个Byte表示的情况。但是你也可以写一个支持所有情况的程序,并不难。
- 为了日后的可维护性考虑,应该怎么表示并储存一个BMP文件?如果使用结构体储存,请注意,部分语言(如C++)在编译时会优化结构体,使其大小为4字节的整数倍。此时如果直接读入会导致错误。C++中可以使用
#pragma pack(1)
禁用该优化。 - 这个程序看起来挺小,但是写起来并不是那么容易。笔者当时写了一下午,失败了至少五次(现在还能找到程序生成的千奇百怪的图片)。如果你遇到了一些挫折,别泄气,会成功的!
附加任务和思考:
了解Git,尝试使用Git管理编辑历史,并尝试将文件上传到GitHub。
注记
图片,视频,文档……,这些丰富多彩的格式在我们眼中似乎有一种神秘感,我们似乎和这些文件从不相干。是啊,程序语言学习不就是学一些语法,知道怎么给数字排序,然后写一堆莫名其妙的算法题嘛,和计算机有什么关系?
这个小任务,给你一个管中窥豹的机会。看看吧!这些二进制流是怎么组织起来,改变了这个世界的——它们其实并不神秘。
附件:
没有评论