当前位置:文档之家› 嵌入式程序课程设计报告

嵌入式程序课程设计报告

嵌入式程序课程设计报告
嵌入式程序课程设计报告

嵌入式程序课程设计报告

设计题目:学生成绩管理系统

班级:

实验人:

学号:

实验指导老师:

嵌入式程序课程设计任务书

一、题目:

学生成绩管理系统设计

二、内容与要求

学生成绩信息包括:学期,学号,班别,姓名,四门课程成绩(语文、数学、英语和计算机)等。

主要功能:

(1)能按学期、按班级完成对学生成绩的录入、修改

(2)能按班级统计学生的成绩,求学生的总分及平均分

(3)能查询学生成绩,不及格科目及学生名单

(4)能按班级输出学生的成绩单

要求:使用二进制文件方式存储数据、

三、地点:实验2号楼4层硬件实验室

四、时间安排:

第6-18周星期五的12节

五、班级与指导老师:电嵌Q0941班;指导教师:李俊

六、参考文献:C语言课程设计、数据结构(C语言版)

内容提要:

随着科学的发展和社会的进步,许多过去由人工处理的繁杂事务开始交付计算机来完成。学生成绩管理系统可以说是每个教育单位的得力助手,它利用计算机对学生成绩进行统一管理,实现学生成绩信息管理工作流程的系统化、规范化和自动化,提高了广大教师的工作效率。因此,学生成绩管理系统对教育部门或单位起着越来越重要的作用。

正文:

1、设计目的

本程序旨在训练读者的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。本程序中涉及结构体、单链表、文件等方面的知识。通过本程序的训练,使读者能对C语言的文件操作有一个更深的了解,掌握利用单链表存储结构实现对学生成绩管理的原理,为进一步开发出高质量的信息管理系统打下坚实的基础。

2、总体设计

图6.1 学生成绩管理系统功能模块图

图6.2 主控函数执行流程图

如图6.1所示,此成绩管理系统主要利用单链表实现,它由如下五大功能模块组成。(1)输入记录模块。输入记录模块主要完成将数据存入单链表中的工作。在此成绩管理系统中,记录可以从以二进制形式存储的数据文件中读入,也可从键

盘逐个输入学生记录。学生记录由学生基本信息和成绩信息字段构成。当从

数据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录

逐条复制到单链表中。

(2)查询记录模块。查询记录模块主要完成在单链表中查找满足相关条件的学生记录。在此成绩管理系统中,用户可以按照学生的姓名或

学号在单链表中进行查找。若找到该学生的记录,则返回指向该学

生记录的指针。否则,返回一个值为NULL的空指针,并打印出未

找到该学生记录的提示信息。

(3)更新记录模块。更新记录模块主要完成对学生记录的维护。在此成绩管理系统中,它实现了对学生记录的修改、删除、插入和排序操

作。一般而言,系统进行了这些操作之后,需要将修改的数据存入

源数据文件。

(4)统计记录模块。统计记录模块主要完成对各门功课最高分和不及格

人数的统计。

(5)输出记录模块。输出记录模块主要完成两个任务。第一,它实现对学生记录存盘的操作,即将单链表中的各节点中存储的学生记录信

息写入数据文件中。第二,它实现将单链表中存储的学生记录信息

以表格的形式在屏幕上打印出来。

3、详细设计

函数功能描述:

1)void printheader(),用于在以表格形式显示学生记录时,打印输出表头

信息。

2)void printdata(Node *pp),用于在以表格形式显示学生记录时,打印输

出单链表pp中的学生信息。

3)void stringinput(char *t,int lens,char *notice),用于输入字符串,并进行字

符串长度验证(长度

形式传递的,所以t相当于该函数的返回值。Notice用于保存printf()

中输出的提示信息。

4)int numberinput(char *notice),用于输入数值型数据,notice用于保存

printf()中输出的提示信息,该函数返回用户输入的整型数据。

5)void Disp(Link l),用于显示单链表1中存储的学生记录,内容为student

中定义的内容。

6)Node* Locate(Link l,char findmess[],char nameornum[]),用于定位链表中

符合要求的节点,并返回指向该节点的指针。参数findmess[]保存要查

找的内容,nameornum[]保存按什么字段在单链表1中查找。

7)void Add(Link l),用于在单链表1中增加学生记录的节点。

8)void Qur(Link l),用于在单链表1中按学号或姓名查找满足条件的学生

记录,并显示出来。

9)void Del(Link l),用于先在单链表1中找到满足条件的学生记录的节点,

然后删除该节点。

10)void Modify(Link l),用于在单链表1中修改学生记录。

11)void Insert(Link l),用于在单链表1中插入学生记录。

12)void Tongji(Link l),用于在单链表1中完成学生记录的统计工作,统计

该班的总分第一名、单科第一名和各科不及格人数。

13)void Sort(Link l),用于在单链表1中完成利用插入排序算法实现单链表

的按总分字段的将序排序。

14)void Save(Link l),用于将单链表1中的数据写入磁盘中的数据文件。

15)主函数main(),整个成绩管理系统控制部分,其详细说明可参考图6.2。

模块化程序设计:

1)程序与处理

包括加载头文件,定义结构体、常量和变量,并对他们进行初始化工作。

#include "stdio.h" /*标准输入输出函数库*/

#include "stdlib.h" /*标准函数库*/

#include "string.h" /*字符串函数库*/

#include "conio.h" /*屏幕操作函数库*/

#define HEADER1 " --------------------------------STUDENT--------------------------------------\n"

#define HEADER2 " | number | name |Comp|Math|Eng |Chi | sum | ave |mici | \n"

#define HEADER3 " |---------------|---------------|----|----|----|----|--------|-------|-----| "

#define FORMAT " | %-10s |%-15s|%4d|%4d|%4d|%4d| %4d | %.2f |%4d |\n"

#define DATA p->data.num,p->https://www.doczj.com/doc/5517605613.html,,p->data.chgrade,p->data.egrade,p->data.mgrade,p->data .cgrade,p->data.total,p->data.ave,p->data.mingci

#define END " -----------------------------------------------------------------------------\n"

int saveflag=0; /*是否需要存盘的标志变量*/

/*定义与学生有关的数据结构*/

typedef struct student /*标记为student*/

{ char num[10]; /*学号*/

char name[15]; /*姓名*/

int cgrade; /*C语言成绩*/

int mgrade; /*数学成绩*/

int egrade; /*英语成绩*/

int chgrade; /*中文成绩*/

int total; /*总分*/

float ave; /*平均分*/

int mingci; /*名次*/

};

/*定义每条记录或结点的数据结构,标记为:node*/

typedef struct node

{ struct student data; /*数据域*/

struct node *next; /*指针域*/

}Node,*Link; /*Node为node类型的结构变量,*Link为node类型的指针变量*/

2)主菜单界面

用户进入成绩管理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用。

void menu() /*主菜单*/

{ system("cls"); /*调用DOS命令,清屏.与clrscr()功能相同*/ cprintf(" The Students' Grade Management System \n");

cprintf("

*************************Menu********************************\n"); cprintf(" * 1 input record 2 delete record *\n");

cprintf(" * 3 search record 4 modify record *\n");

cprintf(" * 5 insert record 6 count record *\n");

cprintf(" * 7 sort reord 8 save record *\n");

cprintf(" * 9 display record 0 quit system *\n");

cprintf("

*************************************************************\n");

/*cprintf()送格式化输出至文本窗口屏幕中*/

}

3)表格形式显示记录

由于记录显示操作经常进行,所以我们将这部分由独立的函数来实现,减少代码的重复,它将显示单链表1中存储的学生记录,内容为student结构中定义的内容。

void printheader() /*格式化输出表头*/

{ printf(HEADER1);

printf(HEADER2);

printf(HEADER3);

}

void printdata(Node *pp) /*格式化输出表中数据*/

{ Node* p;

p=pp;

printf(FORMAT,DATA);

}

void Wrong() /*输出按键错误信息*/

{ printf("\n\n\n\n\n***********Error:input has wrong! press any key to continue**********\n");

getchar();

}

void Nofind() /*输出未查找此学生的信息*/

{ printf("\n=====>Not find this student!\n");

}

void Disp(Link l) /*显示单链表l中存储的学生记录,内容为student结构中定义的内容*/

{ Node *p;

p=l->next; /*l存储的是单链表中头结点的指针,该头结点没有存储学生信息,指针域指向的后继结点才有学生信息*/

if(!p) /*p==NULL,NUll在stdlib中定义为0*/

{ printf("\n=====>Not student record!\n");

getchar();

return;

}

printf("\n\n");

printheader(); /*输出表格头部*/

while(p) /*逐条输出链表中存储的学生信息*/

{ printdata(p);

p=p->next; /*移动直下一个结点*/

printf(HEADER3);

}

getchar();

}

4)记录查找定位

用户进入成绩管理系统时,对某个学生的记录进行处理前,需要按照条件找到这条记录。此函数完成了结点定位的功能。

/*************************************************************

作用:用于定位链表中符合要求的节点,并返回指向该节点的指针

参数:findmess[]保存要查找的具体内容; nameornum[]保存按什么查找;

在单链表l中查找;

**************************************************************/

Node* Locate(Link l,char findmess[],char nameornum[])

{ Node *r;

if(strcmp(nameornum,"num")==0) /*按学号查询*/

{ r=l->next;

while(r)

{ if(strcmp(r->data.num,findmess)==0) /*若找到findmess值的学号*/

return r;

r=r->next;

}

}

else if(strcmp(nameornum,"name")==0) /*按姓名查询*/

{ r=l->next;

while(r)

{if(strcmp(r->https://www.doczj.com/doc/5517605613.html,,findmess)==0) /*若找到findmess值的学生姓名*/ return r;

r=r->next;

}

}

return 0; /*若未找到,返回一个空指针*/

}

5)格式化输入数据

在此成绩管理系统中,要求用户输入的只有字符型和数值型数据,所以我们设计了下面两个函数来单独处理,并对输出的数据进行检验。

/*输入字符串,并进行长度验证(长度

void stringinput(char *t,int lens,char *notice)

{ char n[255];

do{

printf(notice); /*显示提示信息*/

scanf("%s",n); /*输入字符串*/

if(strlen(n)>lens)printf("\n exceed the required length! \n"); /*进行长度校验,超过lens值重新输入*/

}while(strlen(n)>lens);

strcpy(t,n); /*将输入的字符串拷贝到字符串t中*/

}

/*输入分数,0<=分数<=100)*/

int numberinput(char *notice)

{ int t=0;

do{

printf(notice); /*显示提示信息*/

scanf("%d",&t); /*输入分数*/

if(t>100 || t<0) printf("\n score must in [0,100]! \n"); /*进行分数校验*/ }while(t>100 || t<0);

return t;

}

6)增加学生记录

在此成绩管理系统中,若数据文件为空,则从单链表的头部开始增加学生记录节点,否则,将此学生记录节点添加在单链表的尾部。

/*增加学生记录*/

void Add(Link l)

{ Node *p,*r,*s; /*实现添加操作的临时的结构体指针变量*/

char ch,flag=0,num[10];

r=l;

s=l->next;

system("cls");

Disp(l); /*先打印出已有的学生信息*/

while(r->next!=NULL)

r=r->next; /*将指针移至于链表最末尾,准备添加记录*/

while(1) /*一次可输入多条记录,直至输入学号为0的记录结点添加操作*/ {

while(1) /*输入学号,保证该学号没有被使用,若输入学号为0,则退出添加记录操作*/

{stringinput(num,10,"input number(press '0'return menu):"); /*格式化输入学号并检验*/

flag=0;

if(strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/ {return;}

s=l->next;

while(s) /*查询该学号是否已经存在,若存在则要求重新输入一个未被占用的学号*/

{ if(strcmp(s->data.num,num)==0)

{ flag=1;

break;

}

s=s->next;

}

if(flag==1) /*提示用户是否重新输入*/

{ getchar();

printf("=====>The number %s is not existing,try again?(y/n):",num);

scanf("%c",&ch);

if(ch=='y'||ch=='Y')

continue;

else

return;

}

else

{break;}

}

p=(Node *)malloc(sizeof(Node)); /*申请内存空间*/

if(!p)

{ printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/

}

strcpy(p->data.num,num); /*将字符串num拷贝到p->data.num中*/

stringinput(p->https://www.doczj.com/doc/5517605613.html,,15,"Name:");

p->data.cgrade=numberinput("C language Score[0-100]:"); /*输入并检验分数,分数必须在0-100之间*/

p->data.mgrade=numberinput("Math Score[0-100]:"); /*输入并检验分数,分数必须在0-100之间*/

p->data.egrade=numberinput("English Score[0-100]:"); /*输入并检验分数,分数必须在0-100之间*/

p->data.chgrade=numberinput("Chinese Score[0-100]:"); /*输入并检验分数,分数必须在0-100之间*/

p->data.total=p->data.chgrade+p->data.egrade+p->data.cgrade+p->data.mgrade; /*计算总分*/

p->data.ave=(float)(p->data.total/4); /*算平均分*/

p->data.mingci=0;

p->next=NULL; /*表明这是链表的尾部结点*/

r->next=p; /*将新建的结点加入链表尾部中*/

r=p;

saveflag=1;

}

return ;

}

7)查询学生记录

当用户执行此查询任务时,系统会提示用户进行查询字段的选择,即按学号或姓名进行查询。若此学生记录存在,则会打印输出此学生记录的信息。

void Qur(Link l) /*按学号或姓名,查询学生记录*/

{ int select; /*1:按学号查,2:按姓名查,其他:返回主界面(菜单)*/ char searchinput[20]; /*保存用户输入的查询内容*/

Node *p;

if(!l->next) /*若链表为空*/

{ system("cls");

printf("\n=====>No student record!\n");

getchar();

return;

}

system("cls");

printf("\n =====>1 Search by number =====>2 Search by name\n");

printf(" please choice[1,2]:");

scanf("%d",&select);

if(select==1) /*按学号查询*/

{ stringinput(searchinput,10,"input the existing student number:");

p=Locate(l,searchinput,"num");/*在l中查找学号为searchinput值的节点,并返回节点的指针*/

if(p) /*若p!=NULL*/

{ printheader();

printdata(p);

printf(END);

printf("press any key to return");

getchar();

}

else

Nofind();

getchar();

}

else if(select==2) /*按姓名查询*/

{ stringinput(searchinput,15,"input the existing student name:");

p=Locate(l,searchinput,"name");

if(p)

{ printheader();

printdata(p);

printf(END);

printf("press any key to return");

getchar();

}

else

Nofind();

Getchar();

}

else

Wrong();

getchar();

}

8)删除学生记录

在删除操作中,系统会按用户要求先找到该学生记录的节点,然后从单链表中删除该节点。

/*删除学生记录:先找到保存该学生记录的节点,然后删除该节点*/

void Del(Link l)

{ int sel;

Node *p,*r;

char findmess[20];

if(!l->next)

{ system("cls");

printf("\n=====>No student record!\n");

getchar();

return;

}

system("cls");

Disp(l);

printf("\n =====>1 Delete by number =====>2 Delete by name\n");

printf(" please choice[1,2]:");

scanf("%d",&sel);

if(sel==1)

{ stringinput(findmess,10,"input the existing student number:");

p=Locate(l,findmess,"num");

if(p) /*p!=NULL*/

{ r=l;

while(r->next!=p)

r=r->next;

r->next=p->next;/*将p所指节点从链表中去除*/

free(p); /*释放内存空间*/

printf("\n=====>delete success!\n");

getchar();

saveflag=1;

}

else

Nofind();

getchar();

}

else if(sel==2) /*先按姓名查询到该记录所在的节点*/

{ stringinput(findmess,15,"input the existing student name");

p=Locate(l,findmess,"name");

if(p)

{ r=l;

while(r->next!=p)

r=r->next;

r->next=p->next;

free(p);

printf("\n=====>delete success!\n");

getchar();

saveflag=1;

}

else

Nofind();

getchar();

}

else

Wrong();

getchar();

}

9) 修改学生记录

在修改学生记录操作中,系统会先按输入的学号查找到该记录,然后提示用户修改学生之外的值,但学号不能修改。

/*修改学生记录。先按输入的学号查询到该记录,然后提示用户修改学号之外的

值,学号不能修改*/

void Modify(Link l)

{ Node *p;

char findmess[20];

if(!l->next)

{ system("cls");

printf("\n=====>No student record!\n");

getchar();

return;

}

system("cls");

printf("modify student recorder");

Disp(l);

stringinput(findmess,10,"input the existing student number:"); /*输入并检验该学号*/

p=Locate(l,findmess,"num"); /*查询到该节点*/

if(p) /*若p!=NULL,表明已经找到该节点*/

{ printf("Number:%s,\n",p->data.num);

printf("Name:%s,",p->https://www.doczj.com/doc/5517605613.html,);

stringinput(p->https://www.doczj.com/doc/5517605613.html,,15,"input new name:");

printf("C language score:%d,",p->data.cgrade);

p->data.cgrade=numberinput("C language Score[0-100]:");

printf("Math score:%d,",p->data.mgrade);

p->data.mgrade=numberinput("Math Score[0-100]:");

printf("English score:%d,",p->data.egrade);

p->data.egrade=numberinput("English Score[0-100]:");

printf("Chinese score:%d,",p->data.chgrade);

p->data.chgrade=numberinput("Chinese Score[0-100]:");

p->data.total=p->data.chgrade+p->data.egrade+p->data.cgrade+p->data.mgrade;

p->data.ave=(float)(p->data.total/4);

p->data.mingci=0;

printf("\n=====>modify success!\n");

Disp(l);

saveflag=1;

}

else

Nofind();

}

10)插入学生记录

在插入学生记录操作中,系统会先按学号查找到要插入的节点位置,然后在该学号之后插入一个新节点。

/*插入记录:按学号查询到要插入的节点的位置,然后在该学号之后插入一个新节点。*/

void Insert(Link l)

{ Link p,v,newinfo; /*p指向插入位置,newinfo指新插入记录*/ char ch,num[10],s[10]; /*s[]保存插入点位置之前的学号,num[]保存输入的新记录的学号*/

int flag=0;

v=l->next;

system("cls");

Disp(l);

while(1)

{ stringinput(s,10,"please input insert location after the Number:");

flag=0;v=l->next;

while(v) /*查询该学号是否存在,flag=1表示该学号存在*/

{ if(strcmp(v->data.num,s)==0) {flag=1;break;}

v=v->next;

}

I f(flag==1)

break; /*若学号存在,则进行插入之前的新记录的输入操作*/

else

{ getchar();

printf("\n=====>The number %s is not existing,try again?(y/n):",s);

scanf("%c",&ch);

if(ch=='y'||ch=='Y')

{continue;}

else

{return;}

}

}

/*以下新记录的输入操作与Add()相同*/

stringinput(num,10,"input new student Number:");

v=l->next;

while(v)

{ if(strcmp(v->data.num,num)==0)

{ printf("=====>Sorry,the new number:'%s' is existing !\n",num);

printheader();

printdata(v);

printf("\n");

getchar();

}

v=v->next;

}

newinfo=(Node *)malloc(sizeof(Node));

if(!newinfo)

{ printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/

}

strcpy(newinfo->data.num,num);

stringinput(newinfo->https://www.doczj.com/doc/5517605613.html,,15,"Name:");

newinfo->data.cgrade=numberinput("C language Score[0-100]:");

newinfo->data.mgrade=numberinput("Math Score[0-100]:");

newinfo->data.egrade=numberinput("English Score[0-100]:");

newinfo->data.chgrade=numberinput("Chinese Score[0-100]:");

newinfo->data.total=newinfo->data.chgrade+newinfo->data.egrade+newinfo->dat

a.cgrade+newinfo->data.mgrade;

newinfo->data.ave=(float)(newinfo->data.total/4);

newinfo->data.mingci=0;

newinfo->next=NULL;

saveflag=1; /*在main()有对该全局变量的判断,若为1,则进行存盘操作*/

/*将指针赋值给p,因为l中的头节点的下一个节点才实际保存着学生的记录*/ p=l->next;

while(1)

{ if(strcmp(p->data.num,s)==0) /*在链表中插入一个节点*/

{newinfo->next=p->next;

p->next=newinfo;

break;

}

p=p->next;

}

Disp(l);

printf("\n\n");

getchar();

}

11) 统计学生记录

在统计学生记录操作中,系统会统计改版的总分第一名、单科第一名和各班不及格人数,并打印输出统计结果。

/*统计该班的总分第一名和单科第一,和各科不及格人数*/

void Tongji(Link l)

{ Node *pm,*pe,*pc,*pch,*pt; /*用于指向分数最高的节点*/

Node *r=l->next;

int countc=0,countm=0,countch=0,counte=0; /*保存四门成绩中不及格的人数*/ if(!r)

{ system("cls");

printf("\n=====>Not student record!\n");

getchar();

return ;

}

system("cls");

Disp(l);

pm=pe=pc=pch=pt=r;

while(r)

{ if(r->data.cgrade<60) countc++;

if(r->data.mgrade<60) countm++;

if(r->data.egrade<60) counte++;

if(r->data.chgrade<60) countch++;

if(r->data.cgrade>=pc->data.cgrade) pc=r;

if(r->data.mgrade>=pm->data.mgrade) pm=r;

if(r->data.egrade>=pe->data.egrade) pe=r;

if(r->data.chgrade>=pch->data.chgrade) pch=r;

if(r->data.total>=pt->data.total) pt=r;

r=r->next;

}

printf("\n------------------------------the TongJi result--------------------------------\n"); printf("C Language<60:%d (ren)\n",countc);

printf("Math <60:%d (ren)\n",countm);

printf("English <60:%d (ren)\n",counte);

printf("Chinese <60:%d (ren)\n",countch);

printf("-------------------------------------------------------------------------------\n");

printf("The highest student by total scroe name:%s totoal score:%d\n",pt->https://www.doczj.com/doc/5517605613.html,,pt->data.total);

printf("The highest student by English score name:%s totoal score:%d\n",pe->https://www.doczj.com/doc/5517605613.html,,pe->data.egrade);

printf("The highest student by Math score name:%s totoal score:%d\n",pm->https://www.doczj.com/doc/5517605613.html,,pm->data.mgrade);

printf("The highest student by C score name:%s totoal score:%d\n",pc->https://www.doczj.com/doc/5517605613.html,,pc->data.cgrade);

printf("The highest student by Chinese score name:%s totoal score:%d\n",pch->https://www.doczj.com/doc/5517605613.html,,pc->data.chgrade);

printf("\n\npress any key to return");

getchar();

}

12) 排序学生记录

在排序学生记录操作中,系统会利用插入排序算法实现单链表的按总分字段的降序排序,并打印排序前和后的结果。

/*利用插入排序法实现单链表的按总分字段的降序排序,从高到低*/

void Sort(Link l)

{ Link ll;

Node *p,*rr,*s;

int i=0;

if(l->next==NULL)

{ system("cls");

printf("\n=====>Not student record!\n");

getchar();

return ;

}

ll=(Node*)malloc(sizeof(Node)); /*用于创建新的节点*/

if(!ll)

{ printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/

}

ll->next=NULL;

system("cls");

Disp(l); /*显示排序前的所有学生记录*/

p=l->next;

while(p) /*p!=NULL*/

{ s=(Node*)malloc(sizeof(Node)); /*新建节点用于保存从原链表中取出的节点信息*/

if(!s) /*s==NULL*/

{ printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/

}

s->data=p->data; /*填数据域*/

s->next=NULL; /*指针域为空*/

rr=ll;

/*rr链表于存储插入单个节点后保持排序的链表,ll是这个链表的头指针,每次从头开始查找插入位置*/

while(rr->next!=NULL && rr->next->data.total>=p->data.total)

{rr=rr->next;} /*指针移至总分比p所指的节点的总分小的节点位置*/

if(rr->next==NULL)/*若新链表ll中的所有节点的总分值都比p->data.total 大时,就将p所指节点加入链表尾部*/

rr->next=s;

else /*否则将该节点插入至第一个总分字段比它小的节点的前面*/

{ s->next=rr->next;

rr->next=s;

}

p=p->next; /*原链表中的指针下移一个节点*/

}

l->next=ll->next; /*ll中存储是的已排序的链表的头指针*/

p=l->next; /*已排好序的头指针赋给p,准备填写名次*/

while(p!=NULL) /*当p不为空时,进行下列操作*/

{ i++; /*结点序号*/

p->data.mingci=i; /*将名次赋值*/

p=p->next; /*指针后移*/

}

Disp(l);

saveflag=1;

printf("\n =====>sort complete!\n");

}

13) 存储学生记录

在存储学生记录操作中,系统会将单链表中数据写入至磁盘中的数据文件,若用户对数据文件有修改后没有专门进行此操作,那么在退出系统时,系统会提示用户是否存盘。

/*数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时,会提示用户存盘*/

void Save(Link l)

{ FILE* fp;

Node *p;

int count=0;

fp=fopen("c:\\student","wb");/*以只写方式打开二进制文件*/

if(fp==NULL) /*打开文件失败*/

{ printf("\n=====>open file error!\n");

getchar();

return ;

}

p=l->next;

while(p)

{ if(fwrite(p,sizeof(Node),1,fp)==1)/*每次写一条记录或一个节点信息至文件*/ { p=p->next;

count++;

}

else

{break;

}

}

if(count>0)

{getchar();

printf("\n\n\n\n\n=====>save file complete,total saved's record number is:%d\n",count);

getchar();

saveflag=0;

}

else

{ system("cls");

printf("the current link is empty,no student record is saved!\n");

getchar();

}

fclose(fp); /*关闭此文件*/

}

14) 主函数main()

main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。详细分析可参考图6.2。

void main()

{ Link l; /*定义链表*/

FILE *fp; /*文件指针*/

int select; /*保存选择结果变量*/

char ch; /*保存(y,Y,n,N)*/

int count=0; /*保存文件中的记录条数(或结点个数)*/

Node *p,*r; /*定义记录指针变量*/

l=(Node*)malloc(sizeof(Node));

if(!l)

{ printf("\n allocate memory failure "); /*如没有申请到,打印提示信息*/ return ; /*返回主界面*/

}

l->next=NULL;

r=l;

fp=fopen("C:\\student","ab+"); /*以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/

if(fp==NULL)

{ printf("\n=====>can not open file!\n");

exit(0);

}

while(!feof(fp))

{ p=(Node*)malloc(sizeof(Node));

if(!p)

北京科技大学 嵌入式课程设计报告

《嵌入式控制系统》课程设计报告 学院 专业班级 姓名 学号 指导教师 _

目录 摘要 (4)

Abstract (4) 引言 (5) 带中断LED数码管驱动程序设计 (6) 1.设计内容 (6) 1.1 基本功能 (6) 1.2 扩展功能 (6) 1.3创新功能 (6) 2.实验设备 (6) 3.设计功能块说明 (6) 4.设计原理 (7) 4.1 LED发光原理 (7) 4.2 八位LED显示器 (8) 5. 实验步骤 (8) 5.1 驱动程序加载 (8) 5.2 添加控件 (8) 5.3基本功能的实现 (9) 5.4 使用指南 (10) 6. 实验结果 (10) 6.1 基本功能实现结果 (10) 6.2 LED数码管清零功能实现结果 (11) 6.3 中断计数功能实现结果 (12) 6.4 频率设置功能实现结果 (13) 7. 心得体会 (14) 附录 (16)

摘要 通过嵌入式控制系统课程的学习并结合本次课程设计,了解嵌入式系统的开发方法和流程,熟悉Intel XScale硬件平台及其应用处理机的使用方法,熟悉Windows CE嵌入式系统的基本原理、概念。能针对Intel XScale硬件平台、应用需求自行定制、优化WinCE操作系统,并独立编写可在Intel XScale嵌入式设备上运行的应用程序。 本课程设计主要实现了LED数码管的驱动程序,中断计数功能、LED显示清零功能、LED 数字显示频率设置的功能。 关键字:WINCE 中断数码管驱动 Abstract Learning Embedded Control Systems and combining the curriculum design can help us understand the Embedded Control Sy stems’ development methods and processes, and be familiar with Intel XScale Hardware platform and its usage. Know well the basic principles and concepts about WINCE. Design and optimize Windows Embedded Compact and compose Application software program that can operate on the Intel XScale Hardware platform. The main achievement of the curriculum design are drivers for LED, Interrupt Count, clean the results of the LED and set up the display frequency of the LED. Key words: WINCE Interrupt Digital Driving

C语言程序设计课程设计题目

1 一元稀疏多项式的运算 问题描述:设有两个带头指针的单链表表示两个一元稀疏多项式A、B,实现两个一元稀疏多项式的处理。 实现要求: ⑴输入并建立多项式; ⑵输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……c n,e n,其中n是多项式的项数,c i,e i分别为第i项的系数和指数。序列按指数降序排列; ⑶多项式A和B相加,建立多项式A+B,输出相加的多项式; ⑷多项式A和B相减,建立多项式A-B,输出相减的多项式; ⑸多项式A和B相乘,建立多项式A×B,输出相乘的多项式; ⑹设计一个菜单,至少具有上述操作要求的基本功能。 测试数据: (1) (2x+5x8-3.1x11)+(7-5x8+11x9) (2) (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15) (3)(x+x2+x3)+0 (4)(x+x3)-(-x-x-3) 2 成绩排序 假设某年级有4个班,每班有45名同学。本学期有5门课程考试,每门课程成绩是百分制。假定每个同学的成绩记录包含:学号、姓名各门课程的成绩共7项,其中学号是一个10位的字符串,每个学生都有唯一的学号,并且这4个班的成绩分别放在4个数组中,完成以下操作要求: ⑴编写一个成绩生成函数,使用随机数方法,利用随机函数生成学生的各门课程的成绩(每门课程的成绩都是0∽100之间的整数),通过调用该函数生成全部学生的成绩; ⑵编写一个平均成绩计算函数,计算每个同学的平均成绩并保存在成绩数组中; ⑶用冒泡排序法对4个班的成绩按每个同学的平均成绩的以非递增方式

进行班内排序; ⑷用选择排序法对4个班的成绩按每个同学的平均成绩的以非递增方式进行班内排序; ⑸对已按平均成绩排好序的4个班的同学的构造一个所有按平均成绩的以非递增方式排列的新的单链表; ⑹设计一个菜单,至少具有上述操作要求的基本功能。 3 迷宫问题 问题描述:以一个m×n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 实现要求: ⑴实现一个以链表作存储结构的栈类型,然后编写一个求解迷宫的非递归程序。求得的通路以三元组(i,j,d)的形式输出,其中:(i,j)指示迷宫中的一个坐标,d表示走到下一坐标的方向。 ⑵编写递归形式的算法,求得迷宫中所有可能的通路; ⑶以方阵形式输出迷宫及其通路。 [测试数据] 迷宫的测试数据如下:左上角(1,1)为入口,右下角(8,9)为出口。 1 2 3 4 5 6 7 8 实现提示:

嵌入式课程设计报告

嵌入式课程设计报告设计题目:电子密码锁

、 摘要 随着科技和人们的生活水平的提高,实现防盗的问题也变得尤为突出,传统机械锁构造简单,电子锁的保密性高,使用灵活性好。根据需要设计运用W90P170开发板,制作一款电子密码锁,密码锁通过键盘输入密码,通过在LCD的文字和图片显示当前密码锁的状态。实现设置密码,密码验证,错误密码自锁、图片显示的功能。 目录

一、选题意义及系统功能 (3) 二、硬件设计及描述 (4) 三、软件设计及描述 (5) 四、程序代码 (6) 五、课程设计体会 (11) 六、运行结果 (12) 七、心得体会 (12) 八、参考文献 (13) 九、附录 (13) 一、选题意义及功能描述 1、选题意义 电子密码锁是通过密码输入来控制电路或是芯片工作,从而控制机械的开关闭合、开锁的电子产品。随着科技提高和人们生活水平的提高,对电子密码锁的需求增加。电子密码做较传统的机械锁安全性能更高。 特点如下: (1)保密性好,编程量大,随机开锁的成功率几乎为零。

(2)密码可变,用户可以随时改变密码,防止密码被盗,同时也可以避免人员的更替而使锁的密级下降。 (3)误码输入保护,输入密码多次错误是,系统进行自锁。 (4)无活动零件,不会磨损,寿命长。 (5)使用灵活性好,无需佩戴钥匙,操作简单。 2、功能描述 基本功能: (1)从键盘输入任意6位数字作为密码,将这六位数字经过USI总线存储到Flash芯片中,设置密码完成。 (2)从键盘输入密码,比较键盘输入的密码与Flash中存储的密码是否相同。 (3)如果密码正确,则LED灯点亮;如果密码不正确,则LED灯闪烁,而且如果连续三次输入密码错误则系统锁定,不允许再次输入密码。 扩展功能: (1)首先显示“请输入密码:”,显示密码锁背景图片1。 (2)如果密码正确则显示“密码正确”,显示成功进入系统的背景图片2。 (3)如果密码不正确则显示“密码不正确,请重新输入:” (4)如果连续三次输入密码错误则显示“对不起,您已经连续三次输入密码错误,系统锁定”,显示图片1。

Java课程设计小游戏

《高级语言程序设计》课程设计报告 1、程序设计说明书 【设计题目】 雷霆行动游戏程序 【问题描述】 雷霆行动是一款供大家休闲娱乐的小游戏,游戏通过鼠标控制我方飞机hero的移动,达到躲闪敌机的目的;利用鼠标键发射子弹和导弹,达到击毁敌机的目的,摧毁敌机有积分。此游戏为闯关积分类小游戏。 【软件功能】 1.按鼠标左键,游戏开始。 2.利用鼠标移动控制hero自由移动,闪躲敌方子弹。 3.利用鼠标左键发射子弹,实现打中敌方飞机的功能;利用鼠标右键释放导弹,实现摧毁大量敌 机的功能,击中一个敌方飞机积一分。 4.hero碰到对方子弹会消耗生命,消耗生命的多少,依据子弹的不同而不同。 5.一关之后会进入下一关。 6.游戏右上角红色的进度条表示hero的生命,当红色全部消失之后,游戏结束,显示死亡。 7.游戏结束后,可重新开始,同1。 【算法思想】 1.创建游戏主界面,确定窗口的坐标。 2.设计游戏开始界面显示信息及信息坐标。 3.设置游戏进行中的信息,hero的移动、释放子弹和导弹,达到击毁敌机的目的。 4.处理游戏进行中的子弹、大爆、爆炸、敌机消失和存在的条件。 5.设置进入下一关的条件。 6.设计游戏结束界面显示信息及信息坐标。 7.处理游戏重新开始满足的条件。 8.装载图像。 9.对游戏进行调试和改进,使这个游戏更加完善。 【类的设计】 本程序共有七个类: 1.MainPanel 属性:BBv为子弹数组,EEv为敌机数组,BOMBv为爆炸数组,EBv为敌机子弹数组,DBv 为大爆数组,E-num为敌机数量,E-max敌机最大数,E-vel为敌机速度,E-mov为敌机 横移几率,E-hit为敌机开火几率,Sum为击毁敌机数量,hero-hp为hero生命,back至 db-2均为图片,tracker为媒体跟踪器,y为背景滚动变量,seq为hero的动画变量,isfire 为hero开火,isblast为是否发爆,blastnum为大爆的数量,blastc为控制大爆,f、ff、s、 ss均为游戏界面上显示的信息; 方法:MainPanel(Game)构造方法,paint(Graphics)建立游戏开始界面如显示的文字,run()控制对象移动,BBmove(int,int)子弹的移动方法,DBmove(int,int)大爆的移动方法, mouseDragged(MouseEvent) 鼠标的拖拽用来保证hero不出界,mouseMoved(MouseEvent) 鼠标的移动用来控制hero移动,mousePressed(MouseEvent) 鼠标按键在组件上按下时调 用,重新开始游戏,mouseClicked(MouseEvent)鼠标按键在组件上单击(按下并释放) 时调用,释放子弹,mouseReleased(MouseEvent)鼠标按钮在组件上释放时调用, mouseEntered(MouseEvent)鼠标进入组件上调用,mouseExited(MouseEvent)鼠标离开组 件时调用;

《嵌入式系统开发技术》设计报告

嵌入式系统开发技术 设计报告 组长: 成员: 中国石油大学(华东)计算机与通信工程学院计算机科学系 二0 年12 月

一、引言 OpenCV的全称是:Open Source Computer Vision Library。OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列C 函数和少量C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。它的应用领域非常广泛,包括人机互动、物体识别、图像分割、人脸识别、机器视觉、汽车安全驾驶等。随着手机性能的不断提高,OpenCV往安卓上移植已经成为可能,安卓设备移植上OpenCV之后将能够进行复杂的图像处理和视频分析工作,人们不必拘泥于使用固定的设备进行图像以及视频的处理,从而增加了处理的灵活性。 本课程设计实现的就是OpenCV到安卓的移植以及在安卓上实现一个简单的图像处理应用。Android应用程序是通过Android SDK(Software Development Kit)利用Java编程语言进行开发,同时也可以通过JNI调用C动态库,不过这种开发方式存在技术障碍,伴随着Android NDK(Native Development Kit)的问世,使得“JA V A+C”的开发方式走向成熟。 二、总体设计 1、功能描述 本课程设计分为以下四个模块,各模块功能介绍如下: Android-OpenCV项目: OpenCV中大部分重要API在该项目中已经封装成了JA V A接口,为安卓上的OpenCV开发提供C、C++函数支持。 Android NDK: 它包括从C / C++生成原生代码库所需要的工具和build files,能够将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中,支持所有未来Android平台的一些列原生系统头文件和库。在本课程设计中担任重要角色,包括交叉编译OpenCV源代码、编译测试程序等。 Cygwin: Windows下模拟Linux操作环境,在其中执行NDK编译。 Eclipse: Android开发环境,开发android程序,生成可执行的.apk文件,连接真机或虚拟机进行调试。 2、设计特色 本课程设计的特色在于成功的将android-opencv移植到eclipse开发环境中去,实现了在android设备开发图像处理、视频分析应用,提高了android设备的使用价值。编译环境采用Android NDK+Cygwin,方便开发者在windows环境下开发“java+c”程序。 3、体系结构

程序设计基础课程设计

设计题目:学生成绩管理系统班级:计0902 姓名:付乐颖 学号:20091221067 完成日期:2010.10.15

1. 课程设计目的和要求 随着科学的发展和社会的进步,许多过去有人工处理的繁杂事务开始交付计算机来完成。学生成绩管理系统可以说是一个得力助手,它利用计算机对学生成绩进行统一管理,实现学生成绩信息管理工作流程的系统化、规范化和自动化,提高了广大教师的工作效率。 本程序旨在训练学生的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件等的各种基本操作,使学生能对C语言的文件操作有一个更深的理解。为进一步开发出高质量的信息管理系统打下坚实的基础。 2. 课程设计任务内容 学生包含以下信息项:学号、姓名、学院、班级、高数成绩、英语成绩、C语言成绩、总分、平均分。系统的主要功能包括: 1. 创建学生成绩信息文件,根据提示输入学生的各项信息,计算出总分和平均分,然后按学号对学生信息进行排序,并将排序后的学生成绩信息存储到一个二进制文件中。 2. 增加学生信息,在原有学生信息文件的基础上增加新的学生成绩信息,要求:增加后的学生信息仍按学号排序,并继续保存至原文件。 3. 删除学生信息,提示用户输入要进行删除操作的学号,如果在文件中有该信息存在,则将该学号所对应的学生信息删除,否则输出提示信息,并提示用户选择是否继续进行删除操作。 4. 修改学生信息,提示用户输入要进行修改操作的学号,如果在文件中有该息存在,则将提示用户输入该学号对应的要修改的选项,结果保存至原文件,并提示用户选择是否继续进行修改操作。 5. 按不同条件对学生信息进行查询操作,输出满足条件的学生信息。 (1) 按学号查询,输入一个学号,输出对应的学生信息。

三子棋小游戏课程设计

三子棋小游戏课程设计 计算机学院计算机科学与技术专业《程序设计综合课程设计》报告 (2011/2012学年第一学期) 学生姓名: 学生班级: 学生学号: 指导教师: 2012年01月04日 三 子 棋 小 游 戏 目录 第一章程序设计的目的和要求 1 1.1课程设计的目的 ......1 1.2课程设计的要求 1 第二章课程设计任务内容 3 2.1课程设计题目 3 2.2课程设计介绍 3 第三章详细设计说明 ..4 3.1 流程逻 辑............................................................ .4 3.2 限制条 件 (5)

3.3 运行结 果 (5) 3.4 实验过 程 (8) 第四章实验总结及特色 11 4.1调试结果及截图 11 第五章课程设计心得及体会 13 附录? 参考文献 15 附录? 程序代码 16 第一章课程设计目的和要求 目的 通过此次课程设计,进一步加深对C++语言和运用的了解,将理论知识运用于开发的实践,并在实践中逐步掌握软件工具的使用。 巩固已经学习过的C++理论知识;进一步学习程序设计、程序调试的能力。 进一步学习面向对象编程的知识和程序调试的能力; 增强Visual C++编程环境的应用能力 掌握并且熟练应用《C++程序设计》中所学知识,并学会运用。 掌握函数功能的划分方法,并运用此方法解决问题。学会程序测试方案的制定,并且实现程序的测试。 通过此次实践,积累经验,提高分析和解决问题的能力。 第二节要求 课程设计需要从整体来考虑,在大的方向下来考虑小的模块,在继续分工。作到最小化,可执行化。

嵌入式系统设计课设报告分析解析

福州大学 《嵌入式系统设计课设》 报告书 题目:基于28027的虚拟系统 姓名: 学号: 学院:电气工程与自动化学院 专业:电气工程与自动化 年级: 起讫日期: 指导教师:

目录 1、课程设计目的 (1) 2、课程设计题目和实现目标 (1) 3、设计方案 (1) 4、程序流程图 (1) 5、程序代码 (1) 6、调试总结 (1) 7、设计心得体会 (1) 8、参考文献 (1)

1、课程设计目的 《嵌入式系统设计课设》是与《嵌入式系统设计》课程相配套的实践教学环节。《嵌入式系统设计》是一门实践性很强的专业基础课,通过课程设计,达到进一步理解嵌入式芯片的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。培养大胆发明创造的设计理念,为今后就业打下良好的基础。 通过课程设计,掌握以下知识和技能: 1.嵌入式应用系统的总体方案的设计; 2.嵌入式应用系统的硬件设计; 3.嵌入式应用系统的软件程序设计; 4.嵌入式开发系统的应用和调试能力 2、课程设计题目和实现目标 课程设计题目:基于28027的虚拟系统 任务要求: A、利用28027的片上温度传感器,检测当前温度; B、通过PWM过零中断作为温度检测A/D的触发,在PWM中断时 完成温度采样和下一周期PWM占空比的修正;PWM频率为1K; C、利用按键作为温度给定;温度给定变化从10度到40度。 D、当检测温度超过给定时,PWM占空比增减小(减小幅度自己设 定);当检测温度小于给定时,PWM占空比增大(增大幅度自己 设定); E、把PWM输出接到捕获口,利用捕获口测量当前PWM的占空比; F、把E测量的PWM占空比通过串口通信发送给上位机; 3、设计方案-----介绍系统实现方案和系统原理图 ①系统实现方案: 任务A:利用ADC模块通道A5获取当前环境温度。 任务B:PWM过零触发ADC模块,在PWM中断服务函数中,将当前环境温度和按键设定温度进行比较,并按照任务D的要求修订PWM占空比。

程序设计基础课程设计报告 内容样例

第一章目的与要求 书上有。 第二章需求分析 软件设计的一个重要的环节就是需求分析。本章在对ATM取款机管理系统的应用情况作了全面调查的基础上,确定系统目标,并对系统所需要的基础功能进行分析,从而确定用户的需求。以下是ATM取款机管理系统所需要的需求分析。 ATM管理系统包括六个模块:登录,挂失功能,修改密码,取款功能,转账功能,查询功能。 ①登录: 输入银行卡的账号,密码,验证银行卡的卡号,密码是否正确,之后进入主界面 ②挂失功能: 确认是否对银行卡进行挂失,挂失后账户无法操作 ③修改密码: 用户可自由对其银行卡密码进行修改,修改之后的新密码将会覆盖其原密码 ④取款功能: 用户可自由取得所持银行卡内的存款,所取款数必须在其原有账户余额之内 ⑤转账功能: 用户可将本账户中的存款转入其他账户,转账过程中,需要转入账户的账

号 ⑥查询功能: 用户可查询用户信息,其中包括用户姓名、用户身份证号码、银行卡号以及存款余额 模拟ATM取款机的操作: 首先录入账户信息,格式如下 ㈠、登录功能:输入帐号和密码进行登录,如密码错误提示重新输入密码,如帐号错误提示无此帐户。 ㈡、查询功能:查询账户余额。 ㈢、取款功能:取款,更新余额。 ㈣、挂失功能:挂失后,该账户不能进行任何操作。 ㈤、修改密码:输入原密码和新设置密码。 ㈥、转账功能:输入转账的转出账户以及转账金额,进行转账。

第三章设计分析 3.1、ATM系统管理 3.1.1系统基本功能 首先,确定系统中存在两种用户,一种是ATM,可以进行信息录入和后台管理。另外一种是取款人,取款人主要是进行信息的查询,不能进行信息录入。所以在创建类的时候,先创建一个ATM类,然后创建取款人类,并与ATM 类形成有元,进而继承ATM的所有功能,并添加录入信息的功能。 基本功能: 登录功能---------输入帐号和密码进行登录,如密码错误提示重新输入密码,如帐号错误提示无此帐户。 查询功能---------查询账户余额。 取款功能---------取款,更新余额。 挂失功能---------挂失后,该账户不能进行任何操作。 修改密码---------输入原密码和新设置密码。 转账功能---------输入转账的转出账户以及转账金额,进行转账。、

嵌入式系统课程设计报告

湖北民族学院 信息工程学院 课程设计报告书 题目 :基于A RM的数字式万年历 课程:嵌入式系统课程设计 专业:电子信息科学与技术 班级: 03114411 学号: 031441119 学生姓名:田紫龙 指导教师:易金桥 2017年6 月20 日

信息工程学院课程设计任务书 学号031441119学生姓名田紫龙专业(班级)0314411 设计题目基于 ARM 的数字式万年历 1.能测量温度并且实时显示; 2.具有时间显示功能,能够显示年月日,时分秒,并且可以手动调节时间。 设 3. 具有 12 小时制和 24 小时制切换功能。 计 技 术 参 数 对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。温度采集 选用 DS18B20芯片,万年历采用直观的数字显示,数据显示采用1602 液晶显 示模块,可以在LCD1602 上同时显示年、月、日、周日、时、分、秒,还具有 设 时间校准整点灯光提醒等功能。制作仿真和实物。 计 要 求 [1]苏平 . 单片机的原理与接口技术 [M]. 北京 : 电子工业出版社, 2006,1-113. [2]王忠民 . 微型计算机原理 [M]. 西安 : 西安科技大学出版社, 2003,15-55. [3]左金生 . 电子与模拟电子技术 [M]. 北京 : 电子工业出版社, 2004,105-131. [4]新编单片机原理与应用(第二版). 西安电子科技大学出版社, 2007.2 [5]张萌 . 单片机应用系统开发综合实例 [M]. 北京:清华大学出版社, 2007.7 [6] 朱思荣. 51 单片机实现公历与农历、星期的转换[Z].当当电子网 [7]李广弟 . 单片机原理及应用 [M] 北京航空航天大学出版社 ,2004 年 参[8] 王越明 . 电子万年历的设计 [J]. 黑龙江科技信息, 2004 年 考 资 料 2017年 6 月 20 日

计算机图形学课程设计——扫雷游戏程序设计

计算机图形学课程设计——扫雷游戏程序设计

《计算机图形学》课程设计报告 VC++扫雷游戏的程序设计 专业班级: 小组成员:

指导老师: 日期:2012年12月24日 1、需求分析 本课程设计实现类似于Windows XP操作系统自带的扫雷游戏。该设计以V isual C++ 6.0为开发环境, Windows 7/XP为程序运行平台。在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体,采用了MFC机制解决问题的方法。整个游戏程序包括了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴随着GDI绘图。程序通过调试运行,实现简单的设计目标,满足扫雷游戏初学者的需要。 通过本课程设计,以便更好的巩固计算机图形学相关知识,掌握课程设计基本的方法和技巧,同时增加同学之间的团队合作精神以及培养分析问题、解决问题的能力。 2.总体设计 2.1 功能概述 扫雷游戏的游戏界面如图1所示。在这个界面中,由众多面积均等的小方块所组成的区域称之为雷区,雷区的大小由用户设置的游戏等级决定。

图1 游戏开始时,系统会在雷区中随机布下若干个地雷。安放地雷的小方块称之为雷方块,其他的称之为非雷方块。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块 中有多少雷方块。玩家可以根据这些信息去判断是否可以鼠标点击方块, 并把认为是地雷的方块打上标识。当玩家将所有地雷找出后,其余的非雷方块区域都已打开,此时游戏结束。在游戏过程中,一旦错误地打开了雷方块则立即失败,游戏结束。 游戏规则总结: ●开始:按左键开始游戏,按按钮或菜单重新开始。 ●左键:按下时,是雷则结束,非雷则显示数字。 ●数字:代表此数字周围一圈八格中雷的个数。 ●右键:奇次按下表示雷,偶数按下表示对上次的否定。 ●结束:左键按到雷结束,找出全部雷结束。 在游戏开始后,雷区上方有两个计数器。右边的计数器显示用户扫

嵌入式MINIQQ程序设计项目开发总结报告

编号: [嵌入式MiniQQ程序设计] 项目开发总结报告(GB8567——88) [公司名称]北京邮电大学 [作者] [日期]2015/05/18

目录 1.引言 (1) 1.1.编写目的 (1) 1.3.参考资料 (1) 2.实际开发结果 (1) 2.1.产品 (1) 2.2.基本流程 (2) 2.3.进度 (2) 2.4.费用 (2) 开发工作评价 (2) 2.5.对生产效率的评价 (3) 2.6.对技术方法的评价 (3) 2.7.出错原因的分析 (3) 3.经验与教训 (3)

1.引言 1.1.编写目的 为了便于用户使用我们的MiniQQ,现做出一个一个说明性文档,旨在对本组设计思想,实现的功能性能的分析,输入项、输出项,流程逻辑,接口,存储分配,关键程序代码,限制条件与测试计划等做一个的详细说明。这项详细的说明书也是以后编程人员修改本代码的主要线索,为非本组成员修改和提高该程序的功能和性能有效地提供了便利的信息。1.2.定义 本文件中用到的专门术语包括窗口,控件,套接字 1.3.参考资料 [1] 《嵌入式实验指导书1~6》 [2] 《嵌入式Linux系统开发技术详解--基于ARM》,孙纪坤,人民邮电出版社. [3] 《嵌入式GUI开发设计—基于MiniGUI》ISBN 978-7-121-08606-9 2009.5 电子工业出版社 [4] 《ARM体系结构与编程》,杜春雷,清华大学出版社 [5] 《嵌入式Linux程序设计案例与实验教程》俞辉主编,ISBN 978-7-111-26327-2 2009.3 机械工业出版社 2.实际开发结果 2.1.产品 具有登录和聊天功能的miniQQ

程序设计基础课程设计

1 矩阵的操作(6人) 设有两个矩阵A=(a ij)m×n,B=(b ij)p×q 实现要求: ⑴编写矩阵输入函数INPUT_MAT,通过该函数完成矩阵的输入并返回保存矩阵的数组和对应矩阵的行数、列数。(不能使用全局变量) ⑵编写矩阵输出函数OUTPUT_MAT,通过该函数完成矩阵的输出。 ⑶求矩阵的转置,矩阵的转置A’=(a ji)n×m,转置前输出原矩阵,转置后输出转置矩阵。 ⑷求矩阵A、B的和。矩阵A和B能够相加的条件是:m=p,n=q;矩阵A和B如果不能相加,请给出提示信息;若能够相加,则求和矩阵C并输出C。 C=A+B=(c ij)m×n,其中c ij=a ij+b ij ⑸求矩阵A、B的积。矩阵A和B能够相乘的条件是:p=n;矩阵A和B 如果不能相乘,请给出提示信息;若能够相乘,则求积矩阵D并输出D。 D=A×B=(d ij)m×q,其中d ij=∑a ik×b kj,k=1,2,……,n ⑹设计一个菜单,具有求矩阵的转置、求矩阵的和、求矩阵的积、退出等基本的功能。在求矩阵的和或求矩阵的积时要求能够先提示输入两个矩阵的,然后再进行相应的操作。

2 数据汇总 (6人) 问题描述: 在数据处理中经常需要对大量数据进行汇总,将相同关键字记录的某些数据项的值叠加起来,生成一个分类汇总表。 假设某超级市场销售有m种商品(假设商品的编号为1,2,3,┅┅,m),有n台前台收款机(假设收款机的编号为1,2,3,┅┅,n)进行收款,以记录的形式提供给计算机,每个记录表示某台收款机的一种商品一次交易的数量和销售额。记录由4个域组成:收款机编号、商品编号、销售数量、销售金额。构造一个结构体类型,每次销售数据以一个结构体变量保存在一个数据文件中。实现要求: ⑴编写实现将数据记录插入到数据文件的最后的函数; ⑵编写以收款机为单位的数据分类处理函数。构造n个单链表,每个链表保存一台收款机的销售记录,这n个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪台收款机。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到n个单链表; ⑶统计每台收款机的销售总额; ⑷编写以商品为单位的数据分类处理函数。构造m个单链表,每个链表保存一种商品的销售记录,这m个单链表的头指针存放在一个指针数组中,通过数组的下标就可以知道是哪种商品。读取数据文件的记录,将所有的销售记录(数据文件中的全部记录)分解插入到m个单链表; ⑸以商品为单位,统计每种商品的销售总额。 ⑹设计一个菜单,具有插入数据记录、按收款机统计销售总额、按商品统计销售总额、退出系统等最基本的功能。

广东海洋大学嵌入式系统课程设计

《嵌入式系统》设计报告学生姓名 Adao (学号) 所在学院数学与计算机学院 所在班级计科1141 指导教师 成绩

目录 1.课程设计目的 (2) 2.系统分析与设计 (2) 3.系统结构图 (2) 4.实现过程 (3) 5.实验效果 (5) 6.代码分析 (6) 7.系统测试出现的问题和解决的方案 (7) 8.系统优缺点 (7) 9.心得体会 (8) 参考文献 (8)

双按键控制流水灯系统开发 1.课程设计目的: 本次课程设计目的主要是对之前所学习的STM32的某个实验进行更深入的学习与了解,弄懂引脚,端口等相关的配置,对实验原理和具体实现有一定的理解,能做到自己通过原理图和使用库函数等把功能实现出来。我选择的是EXTI-外部中断实验并加以整合,具有一定实用功能的系统,可以对外提供服务。 2.系统分析与设计: 本课程设计所定义的系统主要功能为,通过两个按键KEY1(PA0)、KEY2(PC13)可以实现对流水灯进行同步控制,即一个开关控制产生的灯的状态可以被另一个开关去改变,按键控制需要对两个按键的端口,引脚等进行相关配置,并在两个引脚的中断服务程序中完成对流水灯状态同步控制的操作。本还想通过使用SysTick(系统滴答定时器)功能对流水灯进行精确定时,但由于时间比较匆促,最终没有实现。 3.系统结构图: 图3-1

4.实现过程: 1、GPIO的输入模式有上拉输入模式、下拉输入模式、浮空输入模式和模拟输入模式。GPIO 中的每个引脚可以通过配置端口配置寄存器来配置它的模式。每个引脚的模式由寄存器的4个位控制。 上拉/下拉输入模式:1000 浮空输入模式:0100 模拟输入模式:0000 2、STM32的所有GPIO都可以用作外部中断源的输入端。STM32的中断由中断控制器NVIC 处理。STM32的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,其属性编号越小,表面它的优先级别越高。抢占属性会出现嵌套中断。 3、编写NVIC_Configuration()函数配置NVIC控制器的函数。 static void NVIC_Configuration(uint8_t IRQ) { NVIC_InitTypeDef NVIC_InitStructure; //将NVIC中断优先级分组设置为第1组 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 配置中断源 */ NVIC_InitStructure.NVIC_IRQChannel = IRQ;//设置中断线 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//设置抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//设置响应优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //对NVIC中断控制器进行初始化 } 4、调用GPIO_EXTILineConfig()函数把GPIOA、Pin0和GDIOC、PIN13设置为EXTI输入线。 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13); 5、填写EXTI的初始化结构体,然后调用EXTI_Init()把EXTI初始化结构体的参数写入寄存器。编写EXTI_PA0_Config()函数完成各种需要的初始化。 void EXTI_Pxy_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* config the extiline clock and AFIO clock */

《贪吃蛇游戏课程设计》报告

贪吃蛇游戏程序设计 一、课程设计任务 贪吃蛇小游戏程序设计 二、设计要求 通过游戏程序设计,提高编程兴趣与编程思路,巩固C语言中所学的知识,合理的运用资料,实现理论与实际相结合。 (1).收集资料,分析课题,分解问题,形成总体设计思路; (2).对于设计中用到的关键函数,要学会通过查资料,弄懂其用法,要联系问题进行具体介绍; (3).上机调试,查错,逐步分析不能正常运行的原因,确保所设计的程序正确,并且能正常运行; (4).完成课程设计报告,并进行答辩 三、需求分析 3.1、程序功能 贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。 3.2、设计思想 程序关键在于表示蛇的图形及蛇的移动。用一个小矩形快表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用俩节表示。移动时必须从蛇头开始,所以蛇不能向相反的方向移动,如果不按任意键,蛇自行在当前方向上前移,但按下有效方向键后,蛇头朝着该方向移动,一步移动一节身体,所以按下有效方向键后,先确定蛇头的位置,而后蛇

的身体随蛇头移动,图形的实现是从蛇头新位置开始画出蛇,这时,由于未清屏的原因,原来的蛇的位置和新蛇的位置差一个单位,所以看起来蛇多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现与消失也是画矩形块和覆盖矩形块。为了便于理解,定义两个结构体:食物与蛇。 3.3、流程图

四、设计的具体实现 (1)函数定义 函数定义是对各个基础函数的定义,并且设置需要运用的信息,便于调用 #define N 200 #define M 200 #include"graphics.h" #include #include #include #include #include #include #include #define LEFT 97//A #define RIGHT 100//D #define DOWN 115//S #define UP 119//W #define Esc 0x011b int i,key; int score=0; int gamespeed=250;//游戏速度可根据实际情况自行调整 struct Food { int x;//食物的横坐标 int y;//食物的纵坐标 int yes;//判断是否要出现食物的变量}food;//食物的结构体 struct Snake { int x[M]; int y[M]; int node;//蛇的节数 int direction;//蛇的移动方向 int life;//蛇的生命,0表示活着,1表示死亡 }snake; void Init();//图形驱动 void Close();//图形结束 void DrawK();//开始画面 void GamePlay();//玩游戏的具体过程void GameOver();//游戏结束 void PrScore();//输出成绩 (2)主函数main( ) 主函数是程序的主流程,首先定义使用到的常数、全局变量及函数原型说明,然后初始化图形系统,调用函数DrawK()画出开始画面,调用函数GamePlay(),即玩游戏的具体过程,游戏结束后调用Close()关闭图形系统,结束程序 void main()//主函数 { Init();//图形驱动 DrawK();//开始画面

嵌入式操作系统课程设计报告

嵌入式系统设计报告 系(院):计算机科学学院 专业班级:计科11201 姓名:微尘 学号: 201203300 指导教师:王剑 设计时间:2015.6.22 - 2015.7.3 设计地点:4教硬件实验室

目录 一、课程设计的目的 (2) 1.1设计目的 (2) 1.2任务介绍 (2) 二、实验及开发环境 (3) 2.1 实验室环境 (3) 2.2 个人计算机课后开发环境 (3) 三、总体设计 (3) 四、详细设计 (4) 4.1 Windows CE系统编译与安装 (4) 4.2 编程驱动LED和数码管显示正确的信息 (7) 4.3 编程驱动电机运转 (8) 4.4 个人设计小程序 (10) 五、课程设计小结 (17) 5.1 设计小结 (17)

一、课程设计的目的 1.1设计目的 本次课程设计的目的是了解嵌入式系统、嵌入式操作系统,掌握基于嵌入式系统的应用开发基本知识。了解嵌入式操作系统Windows CE的特点,Windows CE的主要模块及各自的功能。掌握嵌入式操作系统Windows CE 的配置、编译、移植方法。了解Visual Studio .NET开发环境,掌握基于Windows CE平台的应用程序设计方法。 1.2任务介绍 以下任务需基于实验室的XSBase270开发平台完成 1.嵌入式操作系统Windows CE平台的搭建 使用Platform Builder编译出自己的Windows CE 5.0操作系统,然后根据实验提供的EBOOT引导程序将编译出的Windows CE 5.0系统安装(刷入)到实验平台。 2.IO接口控制-七段数码管的LED显示控制程序 了解Windows CE下I/O访问机制的原理。了解LED和七段数码管的显示和控制原理。掌握Windows CE下访问硬件I/O寄存器的方法。 3.IO接口控制-点击控制设计 了解Window CE下I/O访问机制和原理。掌握Windows CE下访问硬件I/O寄存器的方法,以及使用Visual Studio .NET对硬件设备编程的一般方法。 4.编写实用小程序并在指定的Windows CE平台上运行调试(选做) 这一部分我选择的是在Windows CE平台上使用Visual Studio 2005基于.NET利用C#语言编写一个简易计算器小程序。从而体验对嵌入式设备编程与普通PC编程的区别。

《测量程序设计课程设计》指导书-2015

测量数据处理程序设计指导书 设计名称:测量数据处理程序设计 计划周数:2周 适用对象:测绘工程专业本科 先修课程:测量学,测量平差基础,大地控制测量,测量程序设计 一、设计目的 测量数据处理程序设计是学生在系统学习完大地控制测量学、测量平差基础、测量程序设计等相关课程之后,为了系统理解控制网平差的整体过程及综合运用科学工具而安排的。通过课程设计主要达到以下几个目的:掌握控制网平差课程设计具体内容、方法和步骤;通过理论联系实际,进一步巩固已学到的专业理论知识,并加深对理论的认识;培养学生对编写代码,上机调试和编写说明书等基本技能;锻炼学生阅读各类编程参考书籍及加以编程运用的能力。 二、设计内容及日程 在VB、 VC软件或matlab科学计算软件的平台上,选择的具体课程设计题目,进行程序设计与实现,共计10个工作日,工作程序如下: 三、设计的组织: 1.设计领导 (1)指导教师:由教研室指派教师、实验员兼任。

职责:全面组织设计大纲的实施,完成分管工作及相关技术指导。 (2)设计队长:学生班长兼任。 职责:协助教师做好本班学生的人员组织工作。 (3)设计组长:每组一人。 职责:组织执行下达的设计任务,安排组内各成员的工作分工。 2.设计分组 学生实习作业组由3~4人组成(含组长一人)。 四、设计内容 在VB、VC或MATLAB 软件平台上,按选择的设计题目进行相关程序开发 1、闭合导线简易平差、附合导线简易平差支导线计算 2、闭合水准网计算、附合水准网简易平差 3、地形图编号(新、旧两种方法) 4、误差椭圆的参数的计算与绘制误差椭圆 5、水准网严密平差 6、高斯正反算计算 7、高斯投影换带计算 8、七参数大地坐标转换(WGS84-bj54坐标转换、WGS84-CGCS2000坐标转换) 9、四参数坐标转换(西安80-bj54坐标转换、CGCS2000-bj54坐标转换、CGCS2000-西安80坐 标转换(平面) 10、大地高转换为正常高的计算 11、工程投影变形超限的处理 12、遥感图像数据处理 13、曲线(曲面)拟合 14、摄影测量空间后方交会 15、****管理信息系统设计与开发 五、上交成果 1) 小组利用vb、vc或matlab编写的软件包一个及测试数据一份 2)小组关于所开发程序设计说明书一份 3) 个人课程设计的心得一份 4)小组答辩PPT一份

09嵌入式网络协议及其应用开发课程设计报告1

课程设计说明书 学生信息 系别计算机工程学院专业计算机科学与技术 班级姓名学号 课程设计信息 课程名称嵌入式软件开发课程设计 课程设计题目基于QT的直流电机设计 课程设计时间学期第 1~16 周 小组情况指导教师 批改情况 成绩评阅教师批改时间2012年5月 6 日2011-2012学年第2 学期

目录 1.课程设计内容 (3) 2.课程设计目的 (3) 3.背景知识 (3) 4.工具/准备工作 (3) 5.设计步骤与方法 (3) 5.1.步骤 1:设计直流电机控制界面 (3) 5.1.1. 步骤1.1:添加控件事件代码 (4) 5.2. 步骤2:编译程序 (5) 5.2.1. 步骤2.1:redhat主机下编译程序 (5) 5.2.2. 步骤2.2:在ARM板下测试直流电机界面–嵌入式下运行 (6) 6.软件测试截图 (7) 7.设计结果及分析 (7) 8.设计结论 (7) 9.问题及心得体会 (7) 10.对本设计过程及方法、手段的改进建议 (8) 11.任务分配 (8) 12.参考文献【1】C++ GUI Qt4编程(第2版) 兰切特 (Jasmin Blanchette)、萨默菲尔德(Mark Summerfield)、闫锋欣、曾泉人子工业出版社2008 (8) 13.课程设计评价(教师) (8)

课程设计报告 1. 课程设计内容 本课程设计的内容是设计一个基于QT的直流电机设计,支持电机正反转以及设置参数以控制转速。 2. 课程设计目的 考察自己对课程的掌握程度,以及自己实际的动手能力,编程能力。 3. 背景知识 1.嵌入式linux下驱动程序的基本编译方法 2.掌握直流电机控制基本原理 3.QT软件的应用 4. 工具/准备工作 硬件: 安装有QT的PC机一台 软件: WindowsXP操作系统 VMware Workstation 7.0 Red Hat QT 4.6.3 5. 设计步骤与方法 5.1.步骤 1:设计直流电机控制界面 利用QT Creator,ui文件来编写一个良好的用户交互界面:

相关主题
文本预览
相关文档 最新文档