c语言课程设计总结

c语言课程设计总结

平台用户的互动中精选与c语言课程设计总结相关的:1、c语言 课程设计 3、要C语言程序设计试验报告的小结,谁有? 4、学生成绩记录薄 c语言 课程设计报告 5、感觉C语言课程设计好难有没有 9、C语言课程设计 10、C语言课程设计 贪吃蛇
c语言课程设计总结
平台用户 2018-06-06 17:02:05

下面是精选平台用户互动时的最佳讨论

184***@qq.com
184***@qq.com


184***@qq.com:c语言 课程设计

设计一个课程管理系统。系统具有查询,输入,保存,排序等功能。系统有一个菜单界面,可供功能选择。定义课程结构体类型,用数组保存课程信息,用指针方式进行访问。定义多个功能函数,分别提供查询,输入,保存,排序等功能。查询功能比如可分别按课程编号、... 设计一个课程管理系统。系统具有查询,输入,保存,排序等功能。系统有一个菜单界面,可供功能选择。定义课程结构体类型,用数组保存课程信息,用指针方式进行访问。定义多个功能函数,分别提供查询,输入,保存,排序等功能。查询功能比如可分别按课程编号、课程名称等参数进行查询;需采用文件方式保存信息;排序功能比如可按学时排序,允许升序或降序排序求各位大神解救。麻烦发我邮箱184188719@qq.com
下面的解答已被6706人点赞

你好!
  有个基本程序,可以满足你的要求,你看看吧,可以根据需要修改程序

最后一次编辑时间 2015-06-30
纯真孩子丶丵
纯真孩子丶丵


纯真孩子丶丵:要C语言程序设计试验报告的小结,谁有?

下面的解答已被2577人点赞
通过对这一课题的设计和实现,我对Micosoft Visual C++环境进行了深一步的了解,并逐渐开始熟练Micosoft Visual C++环境的工作界面,以及对每一个快捷键的熟悉。并认识到,熟悉这些快捷键,极为便捷编写程序,但是还要更加熟悉。 编程时要养成良好的风格,注意相同内容的缩进和对齐。这样做,可以使程序代码出错的情况下,可以快速并且便捷的查找到错误的行,利于很好的修改。 通过这次编程我们深深的感受到对代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同人员之间的协作。 这个程序设计主要涉及到了C语言中的结构体、指针及文件操作等内容,只有充分掌握了C语言中的结构体、指针及文件操作等内容,才有可能组织好这些代码,使之符合运算逻辑,得到理想的结果。 善于总结,也是学习能力的一种体现,每次完成一个编程任务,完成一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高,生活就是这样,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变的话题。通过实际动手做,我们才真正领略到“艰苦奋斗”这一词的真正含义,我们想说,编程确实有些辛苦,但苦中也有乐,在这个团队的任务中,一起的工作可以让我们有说有笑,相互帮助,配合默契。对我们而言,知识上的收获重要,精神上的丰收是可喜的。挫折是一份财富,经历是一份拥有。这次实际操作必将成为我们人生旅途上一个非常美好的回忆! 回顾起此次课程设计,至今仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整半个月的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体,指针……通过这次课程设计之后,我把前面所学过的知识又重新温故了一遍。 同时,在*老师的身上我学得到很多实用的知识,在此表示感谢!同时,对给过我帮助的所有同学和指导老师再次表示忠心的感谢!
最后一次编辑时间 推荐于2017-09-20 10:16:58
冰封轮回
冰封轮回


冰封轮回:学生成绩记录薄 c语言 课程设计报告

这是题目: 学生成绩记录簿(限最多2人完成) 编制一个C语言成绩记录簿,每个学生信息包括:学号、姓名、C语言成绩。具体功能: (1)创建信息链表并以磁盘文件保存; (2)读取磁盘文件并显示输出所有学生的成绩; (3)按学号或姓名查询成绩; (... 这是题目:
学生成绩记录簿(限最多2人完成)
编制一个C语言成绩记录簿,每个学生信息包括:学号、姓名、C语言成绩。具体功能:
(1)创建信息链表并以磁盘文件保存;
(2)读取磁盘文件并显示输出所有学生的成绩;
(3)按学号或姓名查询成绩;
(4)添加成绩记录;
(5)修改指定姓名或学号的学生的成绩并可存盘;
(6)显示输出60分以下、60~79、80~89、90分以上各分数段的学生信息。
求这个问题的配套课程设计报告,
下面的解答已被9885人点赞
C语言程序设计报告

课题名称:学生成绩管理

1 系统概述:

本程序为一个学生成绩管理系统,对学生的成绩进行管理,学生的信息包括学号,姓名,学期,三门课程的成绩,输入这些信息,本程序可以自动计算总成绩,可以按高分到低分进行排名,并对输入信息的人数进行汇总.

2 数据结构设计:

(1)结构体;

(2)数组的设计:运用指针代替数组,使用指针来建立线性表,使程序更加简洁,可读性更强.

3 各函数的设计:

函数原型:void InitList(SqLinkList &L);

功能: 创建一个空的线性链表;

入口参数:L为要创建的线性链表;

出口参数:创建链表的L.head为空,L.length为0;

返回值: 无;

函数原型:void EmptyLinkList(SqLinkList &L);

功能: 清空整个线性链表;

入口参数:L为要清空的链表名称;

出口参数:若清空成功则链表长度L.length为0;

返回值: 无;

函数原型:int ScanE(ElemType &e);

功能: 输入学生信息;

入口参数:e为要输入信息的学生名称;

出口参数:e.num保存学号,e.name保存姓名,e.team保存所在学期,e.s1,e.s2,e.s3分别保存三门课程的成绩;

返回值: 输入合法返回1,否则返回0;

错误处理:若学号、姓名等输入不合法会有提示及重输;

函数原型:Status SqLinkListAppend(SqLinkList &L,ElemType e);

功能: 追加一个结点到线性链表中;

入口参数:e为所追加的结点名称,L为e所追加到的线性链表的名称;

出口参数:若追加成功,则e为头结点,链表长度L.length增1;

返回值: 若追加成功返回1;

函数原型:Link SearchNode(SqLinkList L,int NUM);

功能: 查找学号为NUM的学生;

入口参数:查找的链表名称L,学号NUM;

出口参数:若找到结点指针p指向该结点,否则指向空结点;

返回值: 结点指针p;

函数原型:void SearchTeam(SqLinkList L,int team);

功能: 查找学期为team的所有记录并输出其信息;

入口参数:查找的链表名称L,要查找的学期team;

出口参数:无;

返回值: 无;

函数原型:void SearchUnpass(SqLinkList L,float s1,float s2,float s3);

功能: 查找所有有挂科记录的学生并输出其信息;

入口参数:查找的链表名称L,要查找的各门学科成绩s1,s2,s3;

出口参数:无;

返回值: 无;

函数原型:void SqLinkListSearch(SqLinkList L);

功能: 对链表进行分类查找;

入口参数:要查找的链表名称L;

出口参数:无;

返回值: 无;

函数原型: void inputData(SqLinkList &L);

功能: 输入数据,并追加一个结点;

入口参数: L为要追加结点的链表名称;

出口参数: 无;

返回值: 无;

函数原型:void SqLinkListTraverse(SqLinkList L);

功能: 输出链表中所有学生成绩列表;

入口参数:L为要输出信息的链表名称;

出口参数:无;

返回值: 无;

函数原型:void PrintE(ElemType e);

功能: 输出一个结点的所有信息;

入口参数:要输出的结点名称e;

出口参数:无;

返回值: 无;

4 使用程序的说明:

本程序为一个学生成绩管理系统。对学生的成绩信息进行管理,学生的信息包括学号、姓名、学期、三门课程的成绩、平均成绩、名次。本管理系统实现学生的学号、姓名、学期、每门课程的成绩的录入,并自动按平均分排名,使用时按屏幕上的提示,输入使用代码.如下图所示:

例如:输入代码数字”1”,程序执行”输入学生成绩或已存在的学生成绩进行修改”这条小程序.输入学生个人信息后,如下图所示:

如此分别输入相应的程序代码,就执行相应的程序段.

如下的程序是按学号进行成绩排名:

当输入”6”时,执行相应的程序,即汇总一共输入学生的人数:

5 总结和体会:

通过对C语言学习,尤其是这学期本班开展C语言双语教学,体会到学习难的同时,也真正了解到C语言作为一门高级的计算机语言的强大功能,特别是在当今实际生活,生产,办公,信息管理等方面的强大作用. 这次合作我们遇到了许多的困难。时间的紧迫,知识的不足,给我很大的压力。最终我还是还是完成了任务。团结就是力量是我这次最真切的感受。

6 程序代码:

void InitList(SqLinkList &L) {

// 构造一个空的线性表L;

L.head = 0; //头指针为空;

L.length = 0; //长度初始为0;

}

void EmptyLinkList(SqLinkList &L){

//入口参数为整个线性表的数据,功能为清空线性表;

Node *p;

if(!L.head)printf("系统中不存在记录。\n");

//头指针为空时没有学生录入;

else {

while (L.head){

//每个循环将下一结点赋值给头指针,并释放本结点空间,直至线性表清空;

p=L.head;

L.head=p->next;

free(p);

} //end while;

L.length=0; //长度为0;

printf("该管理系统学生信息已清空。\n");

}//end else;

}

int ScanE(ElemType &e){

//输入一个学生的成绩数据结点。返回0为无效结点数据,1为有效结点数据;

printf("\n学号:");

scanf("%d",&e.num);

if(e.num==0){

//学号为0输入不合法,重新输入;

printf("学号输入不合法.\n");

return 0;

}

printf("\n姓名:");

scanf("%s",&e.name);

printf("\n学期:");

scanf("%d",&e.team);

while(e.team>12){

//系统只记录小于12的学期数;

printf("输入的学期不能大于12,请重新输入:");

scanf("%d",&e.team);

}

printf("\n成绩A:");

scanf("%f",&e.s1);

printf("\n成绩B:");

scanf("%f",&e.s2);

printf("\n成绩C:");

scanf("%f",&e.s3);

return OK;

}

Status SqLinkListAppend(SqLinkList &L,ElemType e){

//追加一个结点到线性表中;

Node *p;

p=SearchNode(L,e.num);

//查找学号为e.num的记录并将其地址赋给指针p;

if (p==0){

//若不存在添加学号相同的结点,追加一个结点;

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

if (!p) return ERROR;

memcpy(&(p->data),&e,sizeof(ElemType));

p->next=L.head ;

L.head=p;

//追加的一个结点为首结点;

L.length++; //表长度加1;

}

else { //如果该学号记录已存在,则进行修改操作;

memcpy(&(p->data),&e,sizeof(ElemType));

printf("该学生记录已经存在,已完成修改操作。\n");

}

return OK;

}

Link SearchNode(SqLinkList L,int NUM){

//查找学生记录,该学生的学号为NUM;

Node *p;

p=L.head; //p先指在头结点;

while (p&& p->data.num !=NUM ) p=p->next;

//如果该学生的学号不为NUM则查找下一个结点;

return p;

}

void SearchTeam(SqLinkList L,int team){

//按学期查找并输出所有该学期存在的记录;

Node *p;

p=L.head;

int n,sum=0;

//sum记录该学期的学生总人数;

printf("请输入您要查询的学生的学期:");

scanf("%d",&n);

printf("\n学号 姓名 学期 成绩A 成绩B 成绩C 平均成绩\n");

while(p&&p->next){

//如果p结点和它的下一结点不为空,且该结点的学期等于要查找学期,则格式输出所有该学期学生信息;

if(p->data.team==n){

PrintE(p->data);

sum++;

//查找到一个该学期的学生记录计数加1;

}

p=p->next;

//转向下一结点;

} //end while;

if(p->data.team==n){

//如果p的下一结点为空,且本结点学期为n,则格式输出该结点信息;

sum++;

PrintE(p->data);

}

if(sum==0)printf("没有这学期的记录。\n");

if(sum)printf("该学期共有%d人的记录.\n",sum);

}

void SearchUnpass(SqLinkList L,float s1,float s2,float s3){

//查找并输出有挂科的学生信息;

Node *p;

p=L.head;

int sum=0;

//sum计数挂科总人数,初始为0;

printf("以下是有一门以上不及格科目的学生的成绩:\n");

printf("\n学号 姓名 学期 成绩A 成绩B 成绩C 平均成绩\n");

while(p&&p->next){

//如果p及其下一结点为真,且该结点有一门以上科目分数低于60则输出该结点成绩并使sum计数加1;

if((p->data.s1<60)||(p->data.s2<60)||(p->data.s3<60))

{

PrintE(p->data);

sum++;

} //end if;

p=p->next;

//转到下一结点;

} //end while;

if((p->data.s1<60)||(p->data.s2<60)||(p->data.s3<60)){

//查看最后一个结点,若有挂科,sum加1并格式输出结点信息;

sum++;

PrintE(p->data);

}

if(sum==0)printf("没有不及格的记录。\n");

if(sum)printf("共有%d人的挂科记录.\n",sum);

}

void SqLinkListSearch(SqLinkList L){

//分类查找学生记录;

Node *p;

p=L.head;

int n,reg; //reg为查询方式的指令;

printf("1--按学号查询\n2--按学期查询\n3--挂科学生信息列表\n");

printf("请您输入查询方式:");

scanf("%d",®);

if(L.length){

if(reg>3)printf("对不起没有您要求的选项。\n");

//若reg>3则输入不合法;

else if(reg==1){

//reg==1按学号查询;

printf("请输入您要查询的学生的学号:");

scanf("%d",&n);

while(p&&p->next&& p->data.num !=n) p=p->next;

//当p和他下一结点为真时且结点数据不为要查找数据时转向下一结点;

if(p->data.num==n){

//找到所要查询结点,格式输出;

printf("\n学号 姓名 学期 成绩A 成绩B 成绩C 平均成绩\n");

PrintE(p->data);

}

else printf("没有您要查找的学号。\n");

} //end reg==1 if ;

else if(reg==2)SearchTeam(L,p->data.team);

//reg==2,调用SearchTeam函数按学期查询并输出;

else if(reg==3)SearchUnpass(L,p->data.s1,p->data.s2,p->data.s3);

//reg==3,调用SearchUnpass函数,输出全部有挂科记录的学生信息;

}//end if;

else printf("系统中无记录.\n");

}

void inputData(SqLinkList &L){

//请求输入学生成绩,则追加一个结点并输入;

ElemType e;

if (ScanE(e)) SqLinkListAppend(L,e); //输入数据,追加一个结点;

}

void SqLinkListTraverse(SqLinkList L){

//所有学生信息列表输出;

Node *p;

char c;

p=L.head;

if(p) //非空表;

{

printf("\n学号 姓名 学期 成绩A 成绩B 成绩C 平均成绩\n");

for (p=L.head ;p;p=p->next )PrintE(p->data);

//从第一个结点开始输出所有信息直到结点为空;

}

else printf("系统中无记录。\n");

//空表;

c=getchar();

}

void PrintE(ElemType e){

//输出各科成绩和平均成绩;

printf("%d\t%s\t%d\t%f\t%f\t%f\t%f\n",e.num,e.name,e.team,e.s1,e.s2,e.s3,(e.s1+e.s2+e.s3)/3);

//格式输出学生的学号、姓名、学期、A、B、C三门成绩以及平均成绩;

}
最后一次编辑时间 推荐于2016-08-10 03:58:16
孙叔2084
孙叔2084


孙叔2084:感觉C语言课程设计好难有没有

下面的解答已被203人点赞
如果你读过高中,考上了大学,c语言根本不算什么。慢慢来,需要时间和心血的
最后一次编辑时间 2017-12-30
牙上有韭菜
牙上有韭菜


牙上有韭菜:C语言课程设计

题目: 飞机订票设计。 功能: 本飞机共有80个座位,分为20排,每排4个位子。编号为A,B,C,D。如10D表示10排D座。A和D靠窗,19到20排为吸烟区。本系统可以让乘客自己选座号和区域,直到乘客满意为止,无法满足的话,只能改乘另一个航班。订上票的乘客需要... 题目: 飞机订票设计。

功能: 本飞机共有80个座位,分为20排,每排4个位子。编号为A,B,C,D。如10D表示10排D座。A和D靠窗,19到20排为吸烟区。本系统可以让乘客自己选座号和区域,直到乘客满意为止,无法满足的话,只能改乘另一个航班。订上票的乘客需要给出姓名和身份证号,最后要打印出乘客清单。

分布实施:

1、初步完成总体设计,搭好框架,确定人机对话的界面,确定两个函数;
2、完成最低要求:建立一个小系统,包括5排座位,两个区域,能供乘客选择;
3、进一步要求:完成全部功能的系统。

要求: 1、用C语言实现程序设计;
2、利用结构体数组实现信息的数据结构设计;
3、系统的各个功能模块要求用函数的形式实现;
4、界面友好(良好的人机交互),程序加必要的注释。

课程设计试验报告要求:

1、预习报告:题目、课程设计任务、数据结构、程序的总体设计(算法)、模块划分。
2、实验总结报告:流程图、主要源程序代码(需打印)、测试情况及调试中问题与解决方案、小结等。
下面的解答已被3307人点赞
我做好发给你了,注意接收] 
--------------------------------------------------------
//#include <stdafx.h>
#include < conio.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define OK 1
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OVERFLOW -2
#define PR printf
typedef int status;
typedef struct airline
{
char line_num[8];//航班号
char plane_num[8];//飞机号
char end_place[20];//目的的
int total;//座位总数
int left;//剩余座位
struct airline *next;//下一个结点
}airline;
typedef struct customer
{
char name[9];//顾客名
char line_num[8];//航班号
int seat_num;//座位号
struct customer *next;//下一个结点
}customer;
airline *init_airline()
{ //初始化链表
airline *l;
l=(airline*)malloc(sizeof(airline));
if(l==NULL)
{ exit(0);
}
l->next=NULL;
return l;
}
customer * init_customer(){//初始化链表
customer *l;
l=(customer*)malloc(sizeof(customer));
if(l==NULL){
exit(0);
}
l->next=NULL;
return l;
}
status insert_airline(airline **p,char *line_num,char *plane_num,char *end_place,int total,int left){//airline链表插入操作
airline *q;
q=(airline*)malloc(sizeof(airline));
strcpy(q->line_num , line_num);
strcpy(q->plane_num , plane_num);
strcpy(q->end_place , end_place);
q->total =total;
q->left =left;
q->next=NULL;
(*p)->next=q;
(*p)=(*p)->next;
// PR("insert %d ,%dis succssed!\n",e,bl);
return OK;
}
status insert_customer(customer **p,char *name,char *line_num,int seat){//customer链表插入操作
customer *q;
q=(customer*)malloc(sizeof(customer));
/* { PR("内存分配失败\n");
return OVERFLOW; }*/
strcpy(q->name , name);
strcpy(q->line_num , line_num);
q->seat_num =seat;
q->next=NULL;
(*p)->next=q;
(*p)=(*p)->next;
// PR("insert %d ,%dis succssed!\n",e,bl);
return OK;
}
airline *modefy_airline(airline *l,char *line_num)//修改airline链表中的数据
{ airline *p;
p=l->next ;
for(;p!=NULL;p=p->next )
{ if(strcmp(line_num,p->line_num )==0)
{ p->left ++;
// PR("modefy %s\n",p->line_num );
return l;
}
}
PR("没有这个航班,无法完成修改任务!\n");
return 0;
}
status delete_airline(airline *h,char *line_num)//删除航班
{ airline *p,*pr;
pr=h;
p=pr->next ;
while(p!=NULL)
{ if(strcmp(line_num,p->line_num )==0)
{ pr->next =p->next ;
PR("删除 %s 航班\n",p->line_num );
return OK;
}
pr=pr->next ;
p=pr->next ;
}
PR("无此航班,无法删除!\n");
return ERROR;
}
status delete_customer(customer *h,char *line_num)//删除顾客
{ customer *p,*pr;
pr=h;
p=pr->next ;
while(p!=NULL)
{ if(strcmp(line_num,p->line_num )==0)
{ pr->next =p->next ;
}
pr=pr->next ;
p=pr->next ;
}
// PR("无此航班,无法删除!\n");
return OK;
}
status delete_cus(customer *h,airline *l,char *name)//顾客退票
{ customer *p,*pr;
char line_num[8];
// qr=h;
pr=h;
p=pr->next ;
// PR("开始删除\n");
while(p!=NULL)
{ if(strcmp(name,p->name )==0)
{ strcpy(line_num,p->line_num );
l=modefy_airline(l,line_num);
pr->next =p->next ;
PR("顾客 %s 退票成功!\n",p->name );
return OK;
}
pr=pr->next ;
p=pr->next ;
}
PR("无此顾客,无法退票!\n");
return ERROR;
}
status save_airline(airline *l)//保存airline.dat
{ FILE *fp_airline;
char ch='#';
airline *p=l->next ;
char filename[]="c:\\airline.dat";
if((fp_airline=fopen(filename,"wb"))==NULL)
{ printf("can not open file to write:%s\n",filename);
return ERROR;
}
for(;p!=NULL;p=p->next )
{ // printf("%s,%s,%s,%d,%d\n",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left );
fprintf(fp_airline,"%s,%s,%s,%d,%d%c\n",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left ,ch);
}
fclose(fp_airline);
return OK;
}
status save_customer(customer *l)//保存顾客信息 customer.dat
{ FILE *fp_customer;
char ch='#';
customer *p=l->next ;
char filename[]="c:\\customer.dat";
if((fp_customer=fopen(filename,"wb"))==NULL)
{ printf("can not open file to write:%s\n",filename);
return ERROR;
}
for(;p!=NULL;p=p->next )
{ // PR("%s,%s,%d\n",p->name ,p->line_num ,p->seat_num );
fprintf(fp_customer,"%s,%s,%d%c",p->name ,p->line_num ,p->seat_num ,ch);
}
fclose(fp_customer);
return OK;
}
int changStrInt(char *ch)//把字符串转化为整型
{ int a=1,b=0,c=0,i;
for (i=strlen(ch)-1;i>=0;i--)
{ if (ch[i]<58&&ch[i]>47)
{ b=a*(ch[i]-48);
a=a*10;
c=c+b;

}
else
{ PR("%c 不合法,无法将此字符串转化为整形!\n",ch[i]);
return 0;
}
// printf("the c is %d\n",c);
}
return c;
}
status insert_air(airline *l,char *line_num,char *plane_num,char *end_place,int total,int left){//airline链表插入操作
airline *q;
q=(airline*)malloc(sizeof(airline));
strcpy(q->line_num , line_num);
strcpy(q->plane_num , plane_num);
strcpy(q->end_place , end_place);
q->total =total;
q->left =left;
q->next=l->next ;
l->next=q;
// PR("insert %d ,%dis succssed!\n",e,bl);
return OK;
}
status insert_cus(customer *l,char *name,char *line_num,int seat){//customer链表插入操作
customer *q;
q=(customer*)malloc(sizeof(customer));
strcpy(q->name , name);
strcpy(q->line_num , line_num);
q->seat_num =seat;
q->next=l->next ;
l->next=q;
return OK;
}
status load_airline(airline *l)
{ FILE *fp_airline;
int flag=0,i=0;
char ch;
char line_num[8];//航班号
char plane_num[8];//飞机号
char end_place[20];//目的的
char total_str[5];
char left_str[5];
int total;//座位总数
int left;//剩余座位
// airline *p=l;
char filename[]="c:\\airline.dat";
if((fp_airline=fopen(filename,"rb"))==NULL)
{ printf("can not open file to load:%s\n",filename);
return ERROR;
}
while(!feof(fp_airline))
{ ch=fgetc(fp_airline);
if(ch!='#')
{ if(flag==0&&ch!=',')
{ line_num[i]=ch;
i++;
}
else if(flag==1&&ch!=',')
{ plane_num[i]=ch;
i++;
}
else if(flag==2&&ch!=',')
{ end_place[i]=ch;
i++;
}
else if(flag==3&&ch!=',')
{ total_str[i]=ch;
i++;
}
else if(flag==4&&ch!=',')
{ left_str[i]=ch;
i++;
}
else if (ch==',')
{ flag++;
i=0;
}
/* else
{ PR("错误\n");
return ERROR;
}*/
}
else
{ flag=0;
i=0;
total=changStrInt(total_str);
left=changStrInt(left_str);
PR("%8s%8s%8s%9d%9d\n",line_num ,plane_num ,end_place ,total ,left );
insert_air(l,line_num,plane_num,end_place,total,left);
}
}
fclose(fp_airline);
return OK;
}
status load_customer(customer *l)
{ FILE *fp_customer;
int flag=0,i=0;
char ch;
char name[9];
char line_num[8];//航班号
char seat_num_str[5];
int seat_num;//座位
// customer *p=*l;
char filename[50]="c:\\customer.dat";
if((fp_customer=fopen(filename,"rb"))==NULL)
{ printf("can not open file to load:%s\n",filename);
return ERROR;
}
while(!feof(fp_customer))
{ ch=fgetc(fp_customer);
printf("%c\n",ch);
if(ch!='#')
{ if(flag==0&&ch!=',')
{ name[i]=ch;
i++;
}
else if(flag==1&&ch!=',')
{ line_num[i]=ch;
i++;
}
else if(flag==2&&ch!=',')
{ seat_num_str[i]=ch;
i++;
}
else if (ch==',')
{ flag++;
i=0;
}
else
{ PR("错误\n");
return ERROR;
}
}
else
{ flag=0;
seat_num=changStrInt(seat_num_str);
PR("%10s %10s %d\n",name ,line_num ,seat_num );
insert_cus(l,name,line_num,seat_num);
// p=p->next ;
}
}
fclose(fp_customer);
return OK;
}
status creat_airline(airline **l)//创建airline单链表
{ airline *p=*l;
int i=0;
char *line_num[3]={"bjnc01","bjsh02","shgz03"};
char *plane_num[3]={"plane1","plane2","plane3"};
char *end_place[3]={"nc","sh","gz"};
int total[3]={100,100,100};
int left[3]={51,50,78};
for (i=0;i<3;i++){
insert_airline(&p,line_num[i],plane_num[i],end_place[i],total[i],left[i]);
}
return OK;
}
status creat_customer(customer **l)////创建customer单链表
{ customer *p=*l;
int i=0;
char *name[3]={"ouyangj0","yhl","fs"};
char *line_num[3]={"bjnc01","bjsh02","shgz03"};
int seat_num[3]={1,5,10};
for (i=0;i<3;i++){
insert_customer(&p,name[i],line_num[i],seat_num[i]);
}
return OK;
}
status increase_air(airline *l,char *line_num,char *plane_num,char *end_place,int total)//增加航线
{ airline *p=l->next ;
for(;p->next !=NULL;p=p->next){}
insert_airline(&p,line_num,plane_num,end_place,total,total);
PR("增加航班 %s 成功!\n",line_num);
return OK;
}
status book(airline *l,char *line_num,customer *c,char *name)//订票函数
{ airline *p=l;
customer *q=c->next ;
p=l->next ;
for(;q->next !=NULL;q=q->next){}
// PR("%s\n",q->name );
for(;p!=NULL;p=p->next )
{ if(strcmp(line_num,p->line_num )==0)
{ if(p->left >0)
{ PR("恭喜您!订票成功!\n");
PR("你的座位号是: %d\n",(p->total -p->left +1));
insert_customer(&q,name,line_num,p->total -p->left +1);
p->left --;
return OK;
}
else PR("对不起,座位已满!\n");
return 0;
}
}
PR("对不起,没有这个航班号!\n");
return ERROR;
}
status print_airline(airline *l)//打印航线信息
{ airline *p=l->next ;
for(;p!=NULL;p=p->next )
{ PR("%8s%8s%8s%9d%9d\n",p->line_num ,p->plane_num ,p->end_place ,p->total ,p->left );
}
return OK;
}
status print_customer(customer *l)//打印顾客信息
{
customer *p=l->next ;
for(;p!=NULL;p=p->next )
{ PR("%10s %10s %d\n",p->name ,p->line_num ,p->seat_num );
}
return OK;
}
status inputpassword(char cc[9])//隐藏密码为*号的函数 -------------------楼主,注意这里!
{
char c;
int i;
for(i=0;c=getch();i++)
{
if(c==13) break; /*13是回车的ascii码,用'\n'不行,不知怎么回事*/
else
{
cc[i]=c;
printf("*");
}
}
cc[i]='\0';
//printf("\n");
//printf("%s",cc);
//getchar();
return strlen(cc);
}
void main()
{ char choice,choice2,name[9],line_num[8],password[9],plane_num[8],end_place[9];
char pass[9]="19851102",re_pass_1[9],re_pass_2[9];
int t=1,tt=1,total;
airline *air=init_airline();
customer *cus=init_customer();
PR(" 计算机0541课程设计 (一)\n");
PR(" 航空订票系统\n");
PR(" 成员:晏凯\n");
creat_airline(&air);
creat_customer(&cus);
// save_airline(air);
// save_customer(cus);
while(t==1)
{ PR("*----------------------------*\n");
PR("*--航空订票系统选择菜单------*\n");
PR("* 订票-------0 *\n");
PR("* 退票-------1 *\n");
PR("* 查询-------2 *\n");
PR("* 修改航线---3 *\n");
PR("* 读入文件---4 *\n");
PR("* 退出-------5 *\n");
PR("*----------------------------*\n");
PR("请选择: ");
choice = getch();
PR("%c\n",choice);
if(choice=='0')
{ PR("请输入你要订的航班号: ");
scanf( "%s",line_num);
PR("请输入你的姓名: ");
scanf( "%s",name);
book(air,line_num,cus,name);
save_airline(air);
save_customer(cus);
}
else if(choice=='1')
{ PR("\n请输入你的姓名: ");
scanf( "%s",name);
delete_cus(cus,air,name);
save_airline(air);
save_customer(cus);
}
else if(choice=='2')
{ PR("\n 航班号 飞机号 目的地 总票数 余票数\n");
print_airline(air);
PR(" 姓名 航班号 座位号\n");
print_customer(cus);
}
else if(choice=='3')
{ tt=1;
PR("请输入密码: ");
//scanf("%s",password);
inputpassword(password);-----------------楼主,注意这里!我改了!

if(strcmp(password,pass)==0)
{ while (tt==1){
PR("\n*------------------------------*\n");
PR("*-------航线信息修改:----------*\n");
PR("* 增加航班号-----'0' *\n");
PR("* 删除航班号-----'1' *\n");
PR("* 修改密码-------'2' *\n");
PR("* 查询航线信息---'3' *\n");
PR("* 退出航线修改---'4' *\n");
PR("*------------------------------*\n");
PR("请选择: ");

choice2=getch();
PR("%c\n",choice2);
if(choice2=='0')
{ PR("请输入你要增加的航班号: ");
scanf("%s",line_num);
PR("请输入飞机号: ");
scanf("%s",plane_num);
PR("请输入目的地: ");
scanf("%s",end_place);
PR("请输入座位总数: ");
scanf("%d",&total);
increase_air(air,line_num,plane_num,end_place,total);
save_airline(air);
save_customer(cus);
}
else if (choice2=='1')
{ PR("请输入你要删除的航班号: ");
scanf("%s",line_num);
delete_airline(air,line_num);
delete_customer(cus,line_num);
save_airline(air);
save_customer(cus);
}
else if(choice2=='2')
{ PR("注意:密码不能超过8位!\n");
PR("请输入新密码:");
scanf("%s",re_pass_1);
PR("请再输入一次: ");
scanf("%s",re_pass_2);
if(strcmp(re_pass_1,re_pass_2)==0)
{ strcpy(pass,re_pass_1);
PR("密码修改成功!请记住.\n");
}
else { PR("你两次输入的密码不一致!\n");
}
}
else if(choice2=='3')
{ PR("\n 航班号 飞机号 目的地 总票数 余票数\n");
print_airline(air);
}
else if(choice2=='4')
{ tt=0;
}
else {
PR("你的输入有误\n");
tt=0;
}
}//end while
}//end if
else {
PR("对不起!你输入的密码不正确!\n");
}
}//end else if 修改
else if(choice=='4')
{ load_airline(air);
load_customer(cus);
}
else if(choice=='5')
{ PR("再见!");
t=0;
}
else
{ PR("你的输入有误\n");
}
}
getch();
}
最后一次编辑时间 推荐于2016-09-08 11:55:42
清风清木
清风清木


清风清木:C语言课程设计 贪吃蛇

要求:一、 题目意义和设计思想
二、采用的主要技术、遇到的难点和解决方法
三、实现的主要功能和系统结构
四、心得体会
五、算法描述和相关技术说明
我们学校要我们编一个关于贪吃蛇的游戏,还要写出心得体会,如果能全部帮我完成的话,我可以提高悬赏金额,谢谢啦
下面的解答已被8314人点赞

2.1程序功能介绍

贪吃蛇游戏是一个经典小游戏,一条蛇在封闭围墙里,围墙里随机出现一个食物,通过按键盘四个光标键控制蛇向上下左右四个方向移动,蛇头撞倒食物,则食物被吃掉,蛇身体长一节,同时记10分,接着又出现食物,等待蛇来吃,如果蛇在移动中撞到墙或身体交叉蛇头撞倒自己身体游戏结束。

2.2程序整体设计说明

一个游戏要有开始部分,运行部分,结束部分(实际上开始部分与运行部分是一体的)。

2.2.1设计思路

这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时由于没有庆平的原因,原来蛇的位置和新蛇的位置差一个单位,所以看起来社会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块

2.2.2数据结构设计及用法说明 

开始部分:

游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重 要变量的初始化。

运行部分:

作为游戏的核心部分,这里包括的函数比较多,也就是模块比较多,首先让我模拟一下贪吃蛇的游戏模式:某个世界上突然出现一条蛇,它很短,它的运动神经异常,它没法停止自己的多动症在它的世界里就只有食物,它很饿,也很贪吃;同样在不明原因的情况下,食物从天而降,可惜的是没有落到嘴边;饥饿的主人公,不管它有没有毒,也不问食物的来历,径直向食物爬去;它吃到食物啦,它超出想象的同化能力让食物很快的成为自己身体的一部分,它的身子变长啦。当它吃到第一颗食物时,上帝有给它第二颗,于是它吃了第二颗,于是又变长了,于是又有第三颗……它的身子是一直的加长,它不管自己过长身体的麻烦——转身不便,继续吃下去,现在它是直接把巴张大,好让食物有个绿色通道。但是在某天的下午,它咬到了自己,它才想起自己是一条毒蛇,于是晕死过去(不是毒死);又或者它往食物冲锋的时候,它失去控制,撞到了墙上。

第一轮循环:第一步,出现食物;第二步,蛇不停运动;第三步,检查蛇是撞到自己或墙壁;由第四步起游戏有两条支线(A、B):

A :第四步,蛇没有碰到自己或墙壁,蛇继续前进,绘制蛇的动作;第五步,判断蛇是否吃到食物,如果蛇吃到食物,身子变长,原来的食物消失;第六步,让玩家输入控制指令,让蛇在下一轮循环的第二步改变运动方向;第七步,第二轮循环的第一步,重复第一轮的步骤;

B:第四步,蛇碰到自己或墙壁,终止游戏。

结束部分:

游戏结束时,显示“GAME OVER”,已经是约定俗成的规律了,我的游戏也不例外。除了游戏结束画面外,我还设置了一个游戏退出画面,“善始善终”嘛。

有了上述的大致划分,我把整个程序划分成(13+2)个模块(其实就是函数)

2.2.3程序结构(流程图)

图2.1流程图

依据所需要处理的任务要求,规划输入数据和输出结果,决定存放数据的数据结构。

C语言中数据结构集中体现在数据类型上,因此在进行C语言程序设计时,应统筹规划程序中所使用的变量,数组,指针等,以及它们的类型等。这点是很重要的,如果在此期间选择不合适的变量或者数组,将来修改就十分困难。

现在分析一下贪吃蛇游戏中的元素,继而得出与它们对应的在程序中的描述:

蛇:

基本描述:长度,颜色,位置。

对应数据与数据类型:长度—虽然可以用坐标表示,但是这样的话,运算量将很大,所以换算成较大的单位—节数,以固定长度的每节描述;坐标--整型;颜色--整型; 位置--X,Y坐标。

增加的描述:蛇运动的方向,蛇的生命。

对应数据与数据类型:这些描述是为了与程序的按键的输入部分与判断游戏结束部分相联系而设的。方向只有四个方向:上下左右。可以设置与之对应的四个整型数:3、4、2、1。生命就只有两种情况:死或生,对应0或1。

食物:   

基本描述:颜色,位置。

对应数据与数据类型:由于颜色设成固定的,所以不再讨论。位置—X、Y坐标。

增加的描述:食物的存在。

对应数据与数据类型:这是为了避免重复出现食物而设置的,与绘制食物的函数有联系。只有两个值:0或1(没有食物或有食物)

其他的元素:墙,由于它在显示上是作为背景而存在的,所以并没有什么说明实际的墙壁就是四条直线组成的边框,由坐标描述。

还需要的变量:键盘键入的键值(作为全局变量,整型);经常要使用的循环变量;自定义的填充图案;说明文字的字符数组;游戏的记分;游戏的速度(蛇的速度)。

图2.2蛇的不停运动的关键算法的流程图

2.2.4各模块的功能及程序说明

主要模块的实现思路和算法的流程图说明:

关键所在——蛇不停移动的Snakemove():

蛇的不停移动,就是蛇的下一节取代前一节的位置,在计算机中就是蛇下一节的位置坐标变成前一节的位置坐标。在上文中,已定义蛇的位置坐标为数组类型,一组坐标对应一节的位置,假设有i+1节,由0到i节,第i节的坐标取第i-1节的坐标,第i-1节的坐标取第i-2节的坐标……直到第1节取第0节的坐标。而第0节的坐标,即蛇头的坐标要往某个方向变化,变化量为蛇每节的长度。蛇的这种坐标轮换需要循环语句使其继续下去。  

2.2.5程序结果

运行程序得到如下初始界面图:

图2.3程序结果图

用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块,蛇头用两节表示:

图2.4程序结果图

蛇没有碰到自己或墙壁,蛇继续前进:

图2.5程序结果图

游戏结束时,显示“GAME OVER”

图2.6程序结果图

2.3程序源代码及注释

#define N 200

#include <graphics.h>

#include <stdlib.h>

#include <dos.h>

#define LEFT 0x4b00

#define RIGHT 0x4d00

#define DOWN 0x5000

#define UP 0x4800

#define ESC 0x011b

int i,key;

int score=0;/*得分*/

int gamespeed=50000;/*游戏速度自己调整*/

struct Food{

int x;/*食物的横坐标*/

int y;/*食物的纵坐标*/

int yes;/*判断是否要出现食物的变量*/

}food;/*食物的结构体*/

struct Snake{

int x[N];

int y[N];

int node;/*蛇的节数*/

int direction;/*蛇移动方向*/

int life;/* 蛇的生命,0活着,1死亡*/

}snake;

void Init(void);/*图形驱动*/

void Close(void);/*图形结束*/

void DrawK(void);/*开始画面*/

void GameOver(void);/*结束游戏*/

void GamePlay(void);/*玩游戏具体过程*/

void PrScore(void);/*输出成绩*/

/*主函数*/

void main(void){

Init();/*图形驱动*/

DrawK();/*开始画面*/

GamePlay();/*玩游戏具体过程*/

Close();/*图形结束*/}

/*图形驱动*/

void Init(void){

int gd=DETECT,gm;

registerbgidriver(EGAVGA_driver);

initgraph(&gd,&gm,"c:\\program files\\winyes\\tc20h\\bgi");

cleardevice();}

/*开始画面,左上角坐标为(50,40),右下角坐标为(610,460)的围墙*/

void DrawK(void){

/*setbkcolor(LIGHTGREEN);*/

setcolor(11);

setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设置线型*/

for(i=50;i<=600;i+=10)/*画围墙*/   {

rectangle(i,40,i+10,49); /*上边*/

rectangle(i,451,i+10,460);/*下边*/   }

for(i=40;i<=450;i+=10)  {

rectangle(50,i,59,i+10); /*左边*/

rectangle(601,i,610,i+10);/*右边*/ }}

/*玩游戏具体过程*/

void GamePlay(void){

randomize();/*随机数发生器*/

food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/

snake.life=0;/*活着*/

snake.direction=1;/*方向往右*/

snake.x[0]=100;snake.y[0]=100;/*蛇头*/

snake.x[1]=110;snake.y[1]=100;

snake.node=2;/*节数*/

PrScore();/*输出得分*/

while(1)/*可以重复玩游戏,压ESC键结束*/   {

while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/      {

if(food.yes==1)/*需要出现新食物*/     {

food.x=rand()%400+60;

food.y=rand()%350+60;

while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/

food.x++;

while(food.y%10!=0)

food.y++;

food.yes=0;/*画面上有食物了*/     }

if(food.yes==0)/*画面上有食物了就要显示*/     {

setcolor(GREEN);

rectangle(food.x,food.y,food.x+10,food.y-10);     }

for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/         {

snake.x[i]=snake.x[i-1];

snake.y[i]=snake.y[i-1];     }

/*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/

switch(snake.direction)     {

case 1:snake.x[0]+=10;break;

case 2: snake.x[0]-=10;break;

case 3: snake.y[0]-=10;break;

case 4: snake.y[0]+=10;break;     }

for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/     {

if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0])        {

GameOver();/*显示失败*/

snake.life=1;

break;        }        }

if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<55||

snake.y[0]>455)/*蛇是否撞到墙壁*/    {

GameOver();/*本次游戏结束*/

snake.life=1; /*蛇死*/    }

if(snake.life==1)/*以上两种判断以后,如果蛇死就跳出内循环,重新开始*/

break;

if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/    {

setcolor(0);/*把画面上的食物东西去掉*/

rectangle(food.x,food.y,food.x+10,food.y-10);

snake.x[snake.node]=-20;snake.y[snake.node]=-20;

/*新的一节先放在看不见的位置,下次循环就取前一节的位置*/

snake.node++;/*蛇的身体长一节*/

food.yes=1;/*画面上需要出现新的食物*/

score+=10;

PrScore();/*输出新得分*/    }

setcolor(4);/*画出蛇*/

for(i=0;i<snake.node;i++)

rectangle(snake.x[i],snake.y[i],snake.x[i]+10,

snake.y[i]-10);

delay(gamespeed);

setcolor(0);/*用黑色去除蛇的的最后一节*/

rectangle(snake.x[snake.node-1],snake.y[snake.node-1],

snake.x[snake.node-1]+10,snake.y[snake.node-1]-10);     }  /*endwhile(!kbhit)*/

if(snake.life==1)/*如果蛇死就跳出循环*/

break;

key=bioskey(0);/*接收按键*/

if(key==ESC)/*按ESC键退出*/

break;

else

if(key==UP&&snake.direction!=4)

/*判断是否往相反的方向移动*/

snake.direction=3;

else

if(key==RIGHT&&snake.direction!=2)

snake.direction=1;

else

if(key==LEFT&&snake.direction!=1)

snake.direction=2;

else

if(key==DOWN&&snake.direction!=3)

snake.direction=4;

}/*endwhile(1)*/}

/*游戏结束*/

void GameOver(void){

cleardevice(); 

PrScore();

setcolor(RED);

settextstyle(0,0,4);

outtextxy(200,200,"GAME OVER");

getch();}

/*输出成绩*/

void PrScore(void){   

char str[10];

setfillstyle(SOLID_FILL,YELLOW);

bar(50,15,220,35);

setcolor(6);

settextstyle(0,0,2);

sprintf(str,"score:%d",score);

outtextxy(55,20,str);}

/*图形结束*/

void Close(void){   

getch();

closegraph();

}

最后一次编辑时间 2018-03-30