0%

某不科学的C课设入门(华科自动化C课设)

一些关于华科自动化C课设的经验总结,之前在课设群里发过pdf版的,现整理到博客上,如有问题可在下面进行评论。

入门建议

预备知识

C课设的大部分需要的知识都已经在自动化大一下学期的C语言课程上学习过了,这里主要就谈一些需要自学的知识,建议大家在暑假期间学习一下。

  • 建立打开工程

    跑一跑学长学姐的代码,看看大致是一个怎样的内容。学会如何在bc上建立一个工程。(详细过程请参考《Borland C++建立工程菜鸟教程》)

  • 选择画图的模式,学习基本的画图方法

    两种模式可供选择——VGA和SVGA

    | | 优点 | 缺点 |
    | ———— | —————————————————————————————— | —————————————————————————————— |
    | VGA | 具有众多的画图函数(例如画圆、画方框等),画图显示速度快(基本一跳转画图就完成) | 分辨率低,可选择的颜色少,不能贴图 |
    | SVGA | 分辨率高,可选颜色多,可贴图 | 需要基于画点自己写画图函数,画图显示慢(页面显示时可以明显地看出画图的过程) |

    建议:不要求较为复杂的页面的课题选择VGA模式,因为画图比较方便而且显示效果比较好;如果需要画较为复杂的页面和图形,或者必须得贴图的课题选择SVGA模式。

    提醒:贴图须谨慎,非必要不贴图。每年的情况可能不同,打听一下今年的贴图的要求。

    VGA画图函数可以参考《C高级实用程序设计(王士元)》中的章节。

  • 鼠标的使用

  • 重点是找到一个好用的鼠标,然后学会如何使用。(当然如果愿意自己写一个也是可以的,这样会理解的更透彻一些)

    注意:不要用系统鼠标!!!

    系统鼠标是DOS下面自带的一个鼠标,在我们的电脑的bc跑的时候可以很好地显示,但是在验收用XP系统跑的时候,系统鼠标是无法显示出来的。

    如何区分是否是系统鼠标?

    看有没有画鼠标的图形,如果该鼠标文件里面没有任何画图的过程直接调出鼠标的形状即为系统鼠标。

  • 汉字显示

    与鼠标相同,只要找一个汉字库加入工程,然后学会使用就行。

    有些用Notepad++编写的同学会发现汉字乱码的情况,这是因为在编写的最初没有设置为简体汉字,Notepad++默认编码为UTF-8编码,在每次编写c文件前需要手动设为中文简体。

  • 文件操作

    需要自学文件的读取和写入的操作。由于不连网,所以课设中信息一般都是储存在文件中, 这时候的文件相当于课设系统的数据库。文件建议以二进制形式存储,这样读写的速度会更快。

其他建议

  1. 组内配合。C课设毕竟是个合作项目,很多人一开始忽视了搭档之间配合的重要性,最后一个人完成了大部分的工作,其实这样不仅会让你身心俱疲,而且也可能无法取得更高的分数(老师并不知道真正工作分配量,而且就算知道,不能和搭档较好的合作这个问题也会成为你的一个扣分项)。不建议组三人队,三人队对于课设来说人太多了些,但是已经组好了三人队也没关系,把功能多做一些,分摊到每个人的工作量不能小于二人队。
  2. 多找老师。找老师主要是两个方面:一是和老师讨论一下项目的总体规划(最好找出这道题的老师),不要让你的项目功能和老师想的偏差太大,可能的话多给几个老师看一下你的程序。二是找老师帮助debug,如果有bug一直都该不好,尽早找老师或者学长学姐问,不要拖。
  3. 仿照市面上已有的电脑版软件设计。课设最好的效果就是让人看起来像一个真实的软件。
  4. 尽早开始做。C课设至少要一到两个月的工作量,一般中期验收在10月中旬,终期验收在11月初或者中旬,所以建议最晚在9月中旬要开始工作,当然越早开始肯定是越好的啦。
  5. 验收前一周一定要去科技楼的电脑上跑一下程序,科技楼有一种银白色的主机是最后验收时跑的主机,(判断是否是最后验收时跑的方式的方法:工程在XP系统上直接运行,不需要打开BC),这种跑法可能会和你在自己电脑上或者科技楼非XP系统的电脑上跑得有很大的不同,所以一定要提前至少一周的时间去科技楼跑一下你的程序。最后有闲余的时间的话可以把程序里的warning全部消掉一下。
  6. 中期和终期报告尽量多写一些。中期验收会看报告页数,页数不够的会被打回去重写。
  7. 每个函数的行数不要过多。不要把一个页面所有的代码都堆在一个函数里,这样很可能让你带上重复代码来凑代码量的嫌疑,把带有功能的代码块提出成函数,这样也方便重复调用。
  8. 多功能性和稳定性。不一定要追求十分复杂的算法,重要的是扩展功能,特别是较为简单的题就得放开思路,使你的系统功能更加的丰富。

跑往届代码

《Borland C++建立工程菜鸟教程》中很详细地讲述了如何建立工程的问题,所以这里就只是简述一下怎么打开已有的工程(这里就用我们组的工程进行演示,文件夹名为stock)。

第一步:把代码放到BC的DISK_C文件夹下。

第二步:打开BC,在 File > Change Directory 里找到相应文件。

第三步:在 Project > Open Project File 中找到 .prj 文件,打开。

第四步:设置Directories

在Options > Directories中的第一行是头文件的地址,除了BC自带的头文件库外,还得添加自己程序的头文件所在地址。

第五步:上述几步都设置好了后就可以编译了

​ Compile > Build all

编译没有error,就可以跑了(Run > Run)

之后就自己去玩啦。。。。。

如何搭建项目框架

接下来我会演示我们组当时建立整个项目的框架,如何建工程《Borland C++建立工程菜鸟教程》中有讲,这里不在赘述。

Notepad++的使用

建议使用第三方编译器来打代码(如Notepad++)

Notepad++可在官网直接免费下载

用Notepad++新建一个文件后,一定要记得进行两个设置,一个是汉字(前面提过),一个是C语言。

编码>编码字符集>中文>GB2312(Simplified)

语言>C>C

项目框架的搭建

事例项目test 将放在文件夹中一起提供给大家。

文件夹中需要编写的只有.c 和 .h文件,其余为自动生成和库。

主函数的编写

主函数 main.c 主要由初始化部分和页面跳转部分组成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include "common.h"
#include "main.h"

void main(void)
{
/***********各种初始化*****************/
/*设定初始页面
调试的时候可以改变page的初始设定,直接跳转到需要调试的页面
*/
int page = 0;
//VGA画图的初始化
int graphdriver = VGA;
int graphmode = VGAHI;
initgraph(&graphdriver, &graphmode, "BGI");
//鼠标的初始化
mouseinit();

/*
*********页面跳转循环***********
每一个页面对应一个page值,
在各个页面的程序中,每一次有需要跳转页面的时候,就改变page值,且回到主程序
在主程序的循环中,通过page值的改变,跳转到相应页面
*/
while(1)
{
switch(page)
{
case 0://页面1(初始页面)
page = p1();
break;

case 1://页面2
page = p2();
break;

case 2://退出程序
closegraph();//关闭画图
exit(0);//退出程序
}
}
}

页面跳转依赖while循环和switch case的结合,之后新开页面直接增加case就可以。

页面函数的编写

页面函数主要是页面绘制和鼠标或者其他控制功能和页面跳转的两个部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "common.h"
#include "page1.h"

//因为需要返回page值,所以页面的函数需是int型
int p1(void)
{
int page = 0;

//防止鼠标在跳转页面时留痕
clrmous(MouseX,MouseY);
delay(100);

page1_screen();

/*循环,不停地监测异动,当异动导致page值改变,跳转页面*/
while(page == 0)
{
//获取鼠标的位置和状态
mou_pos(&MouseX,&MouseY,&press);

//点击跳转页面框,跳转到页面2界面
if(mouse_press(180, 170, 180+280, 170+60) == 1)
{
page = 1;//返回1到主函数的页面跳转循环
}

//点击退出程序框
else if(mouse_press(180, 170+60+40, 180+280, 170+60+40+60) == 1)
{
page = 2;//返回2到主函数的页面跳转循环
}
}
return page;
}

//绘制页面1界面
void page1_screen(void)
{
cleardevice();//把以前的页面清屏

setbkcolor(BLACK);//背景色设置

setfillstyle(SOLID_FILL, BLUE);//设定蓝色框
bar(180, 170, 180+280, 170+60);//跳转页面
setfillstyle(SOLID_FILL, RED);//设定红色框
bar(180, 170+60+40, 180+280, 170+60+40+60);//退出程序
}

页面1有两个框,点击蓝框跳转到页面2,点击红框退出程序。

页面2与页面1编写结构相同,只有一个红色的退出框。

页面1

页面2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "common.h"
#include "page2.h"

////因为需要返回page值,所以页面的函数需是int型
int p2(void)
{
int page = 0;

//防止鼠标在跳转页面时留痕
clrmous(MouseX,MouseY);
delay(100);

page2_screen();

/*循环,不停地监测异动,当异动导致page值改变,跳转页面*/
while(page == 0)
{
//获取鼠标的位置和状态
mou_pos(&MouseX,&MouseY,&press);

//点击退出程序框
if(mouse_press(180, 200, 180+280, 200+60) == 1)
{
page = 2;
}
}
return page;//返回2到主函数的页面跳转循环
}

//绘制页面2界面
void page2_screen(void)
{
cleardevice();//把以前的页面清屏

setbkcolor(BLACK);//背景色设置

setfillstyle(SOLID_FILL, RED);//设定红色框
bar(180, 200, 180+280, 200+60);//退出程序
}

头文件的编写

头文件的编写有多种形式,这里写的只是我们当时用的那种,其他编写形式也是可以的。

从上面的.c文件中可以看出,我们的每一个.c都调用了两个头文件。

一个是同样的common.h,一个是与其文件名相同的 .h文件。

test的common.h如下图所示:

1
2
3
4
5
6
7
8
9
10
11
#ifndef _COMMON_H_
#define _COMMON_H_

#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
#include<bios.h>
#include<dos.h>
#include"mouse.h"

#endif

我们用common.h装了所有需要用到的库文件和鼠标头文件,每次有新调用的库文件就加进去,这样每个.c文件都只要调用common.h,不需要再重新写调用的库文件。

另一种是与文件名相同的 .h文件,以main.h为例。

1
2
3
4
5
6
7
8
9
#ifndef _MAIN_H_
#define _MAIN_H_

#include "page1.h"
#include "page2.h"

void main(void);

#endif

与文件名相同的 .h文件包含两个部分,第一部分是其调用的位于其他文件的函数的头文件,如main中调用了p1()和p2()分别位于page1.h和page2.h;第二部分是该.c文件中所有的函数。

这样我们就搭建了一个有两个页面的简单工程。

最后祝学弟学妹们“0 warning, 0 error.”,之后的路就要靠学弟学妹们自己去探索,老妈子学姐就不再废话啦。