C语言实训心得

设计题目是班级成绩管理系统。对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入,显示,修改,排序,保存等操作的管理。本系统采用一个结构体数组,每个数据... 设计题目是班级成绩管理系统。对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入,显示,修改,排序,保存等操作的管理。本系统采用一个结构体数组,每个数据的结构应当包括学号,姓名,M名课程名称。实训心得在3千字左右 展开
 我来答
匿名用户
2013-07-31
展开全部
源程序:

#include "stdio.h" /*I/O函数*/

#include "stdlib.h" /*其它说明*/

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

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

#include "mem.h" /*内存操作函数*/

#include "ctype.h" /*字符操作函数*/

#include "alloc.h" /*动态地址分配函数*/

#include "dos.h"

#define N 4 /*定义常数*/

typedef struct z1 /*定义数据结构*/

{

char no[12];

char name[20];

int score[N];

float sum;

float average;

int order;

struct z1 *next;

}STUDENT;

/*以下是函数原型*/

STUDENT *init(); /*初始化函数*/

STUDENT *create(); /*创建链表*/

STUDENT *delete(STUDENT *h); /*删除记录*/

void print(STUDENT *h); /* 显示所有记录*/

void lookup(STUDENT *h); /*查找*/

void save(STUDENT *h); /*保存*/

STUDENT *load(); /*读入记录*/

void computer(STUDENT *h); /*计算总分和均分*/

STUDENT *Modify(STUDENT *h); /*修改记录*/

void append(); /*追加记录*/

STUDENT *sort(STUDENT *h); /*按总分排序*/

STUDENT *index(STUDENT *h); /*按学号排序*/

int menu_select(); /*菜单函数*/

/******主函数开始*******/

main()

{

int i;

STUDENT *head; /*链表定义头指针*/

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

printf(" * * ******* * ***** ***** * * ******* \n");

printf(" * * * * * * * ** * * * \n");

printf(" * * * * ******* * * * * * *** * ******* \n" );

printf(" * * * * * * * * * * * * * \n");

printf(" * * ******* ******* ***** * *** * * * ******* \n");

printf("\n");

printf("\n");

printf("\n");

sleep(2);

head=init(); /*初始化链表*/

clrscr(); /*清屏*/

for(;;) /*无限循环*/

{

switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/

{ /*值不同,执行的函数不同,break 不能省略*/

case 0:head=init();break; /*执行初始化*/

case 1:head=create();break; /*创建链表*/

case 2:print(head);break; /*显示全部记录*/

case 3:head=delete(head);break; /*删除记录*/

case 4:lookup(head);break; /*按名字查找记录*/

case 5:save(head);break; /*保存文件*/

case 6:head=load(); break; /*读文件*/

case 7:computer(head);break; /*计算总分和均分*/

case 8:head=Modify(head); break; /*修改记录,一般会插在表尾*/

case 9:head=sort(head);break; /*按部分排序*/

case 10:append();break; /*追加记录*/

case 11:head=index(head);break; /*按学号排序*/

case 12: exit(0); /*如菜单返回值为14程序结束*/

}

}

}

/*菜单函数,返回值为整数*/

menu_select()

{

char *menu[]={"***************MENU***************", /*定义菜单字符串数组*/

" 00. init list", /*初始化*/

" 01. Enter list", /*输入记录*/

" 02. print list ", /*显示单链表中所有记录*/

" 03. Delete a record from list", /*从表中删除记录*/

" 04. Search record on name", /*按照姓名查找记录*/

" 05. Save the file", /*将单链表中记录保存到文件中*/

" 06. Load the file", /*从文件中读入记录*/

" 07. compute the score", /*计算所有学生的总分和均分*/

" 08. Modify an information ", /*修改某学号的信息*/

" 09. sort to make new file", /*排序*/

" 10. append record to file", /*追加记录到文件中*/

" 11. index on nomber", /*按学号排序*/

" 12. Quit"}; /*退出*/

char s[3]; /*以字符形式保存选择号*/

int c,i; /*定义整形变量*/

gotoxy(1,1); /*移动光标*/

textcolor(YELLOW); /*设置文本显示颜色为黄色*/

textbackground(BLUE); /*设置背景颜色为蓝色*/

gotoxy(10,2); /*移动光标*/

putch(0xc9); /*输出左上角边框┏*/

for(i=1;i<44;i++)

putch(0xcd); /*输出上边框水平线*/

putch(0xbb); /*输出右上角边框 ┓*/

for(i=3;i<20;i++)

{

gotoxy(10,i);putch(0xba); /*输出左垂直线*/

gotoxy(54,i);putch(0xba);

} /*输出右垂直线*/

gotoxy(10,20);putch(0xc8); /*输出左上角边框┗*/

for(i=1;i<44;i++)

putch(0xcd); /*输出下边框水平线*/

putch(0xbc); /*输出右下角边框┛*/

window(11,3,53,19); /* 制作显示菜单的窗口,大小根据菜单条数设计*/

clrscr(); /*清屏*/

for(i=0;i<16;i++) /*输出主菜单数组*/

{

gotoxy(10,i+1);

cprintf("%s",menu[i]);

}

textbackground(BLACK); /*设置背景颜色为黑色*/

window(1,1,80,25); /*恢复原窗口大小*/

gotoxy(10,21); /*移动光标*/

do{printf("\n make by wenwei");<br><br> printf("\n Enter you choice(0~13):"); /*在菜单窗口外显示提示信息*/<br><br> scanf("%s",s); /*输入选择项*/<br><br> c=atoi(s); /*将输入的字符串转化为整形数*/<br><br> }while(c<0||c>14); /*选择项不在0~14之间重输*/

return c; /*返回选择项,主程序根据该数调用相应的函数*/

}

STUDENT *init()

{ clrscr();

return NULL;

}

/*创建链表*/

STUDENT *create()

{

int i; int s;

STUDENT *h=NULL,*info; /* STUDENT指向结构体的指针*/

clrscr();

for(;;)

{

info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/

if(!info) /*如果指针info为空*/

{

printf("\nout of memory"); /*输出内存溢出*/

return NULL; /*返回空指针*/

}

inputs("enter no:",info->no,11); /*输入学号并校验*/

if(info->no[0]=='@') { clrscr();break; } /*如果学号首字符为@则结束输入,清屏后返回*/

inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/

printf("please input %d score \n",N); /*提示开始输入成绩*/

s=0; /*计算每个学生的总分,初值为0*/

for(i=0;i<N;i++) /*N门课程循环N次*/

{

do{

printf("score%d:",i+1); /*提示输入第几门课程*/

scanf("%d",&info->score[i]); /*输入成绩*/

if(info->score[i]>100||info->score[i]<0) /*确保成绩在0~100之间*/

printf("bad data,repeat input\n"); /*出错提示信息*/

}while(info->score[i]>100||info->score[i]<0);

s=s+info->score[i]; /*累加各门课程成绩*/

}

info->sum=s; /*将总分保存*/

info->average=(float)s/N; /*求出平均值*/

info->order=0; /*未排序前此值为0*/

info->next=h; /*将头结点做为新输入结点的后继结点*/

h=info; /*新输入结点为新的头结点*/

clrscr();

}

return(h); /*返回头指针*/

}

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

inputs(char *prompt, char *s, int count)

{

char p[255];

do{

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

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

if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/

}while(strlen(p)>count);

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

}

/*输出链表中结点信息*/

void print(STUDENT *h)

{

int i=0; /* 统计记录条数*/

STUDENT *p; /*移动指针*/

clrscr(); /*清屏*/

p=h; /*初值为头指针*/

printf("\n\n\n*********************************STUDENT************************************\n");

printf("|rec|nO | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");

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

while(p!=NULL) /*只要p不是尾结点,就输出记录*/

{

i++;

printf("|%3d|%-10s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->sum,p->average,p->order);

p=p->next;

}

printf("***********************************end**************************************\n");

getch(); /*输入任一键返回主菜单*/

clrscr(); /*清屏*/

}

/*删除记录*/

STUDENT *delete(STUDENT *h)

{

STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/

char s[12]; /*存放学号*/

char *pass="wenwei28";

char a[20],b=NULL;

int i=0;

clrscr();

printf("Input your password:");

while((i<20)&&(b!='\r'))

{ b=getch(); /*无回显输入*/

if(b==8)

{ if(i>0)

{a[--i]=NULL;<br><br> putchar(8); /*退格键*/<br><br> putchar(' '); /*以空格代替*/<br><br> putchar(8);<br><br> }

else putchar(7); /*没有任何字符的退格,响铃警告*/

}

else if(b!='\r')

{ a[i++]=b; /*只要不是退格和回车就接受*/

putchar('*');

}

else

{a[i]=NULL; break; /*密码输入完了,记得加个NULL到后面*/<br><br> }

}

if(strcmp(a,pass)!=0)

{clrscr();<br><br> printf("Password is mistake Tow seconds to return!");<br><br> sleep(2);clrscr();return h;<br><br>}

else {printf("Password is OK! Welcome to come!"); sleep(3);<br><br>}

clrscr(); /*清屏*/

printf("please deleted no\n"); /*显示提示信息*/

scanf("%s",s); /*输入要删除记录的学号*/

q=p=h; /*给q和p赋初值头指针*/

while(strcmp(p->no,s)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/

{

q=p; /*将p指针值赋给q作为p的前驱指针*/

p=p->next; /*将p指针指向下一条记录*/

}

if(p==NULL) /*如果p为空,说明链表中没有该结点*/

{ printf("\nlist no %s student\n",s);sleep(2);clrscr();return h;}

else /*p不为空,显示找到的记录信息*/

{

printf("*********************************have found********************************\n");

printf("|no | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");

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

printf("|%-12s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6-5.2f | %3d |\n", p->no,

p->name,p->score[0],p->score[1],p->score[ q=p; /*保存当前结点的指针,作为下一结点的前驱*/

p=p->next; /*指针后移,新读入数据链到当前表尾*/

}

q->next=NULL; /*最后一个结点的后继指针为空*/

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

printf("---You have success read data from file!!!---\n");

getch(); /*按任意键返回主菜单*/

clrscr();

return h; /*返回头指针*/

}

/*成绩统计*/

void computer(STUDENT *h)

{

STUDENT *p,*t,*q; /*定义移动指针*/

float saverage[N]={0}; /*均分初值为0*/

int i;

clrscr();

for (i=0;i<N;i++)

{ int n=0,j=0; /*保存记录条数初值为0*/

long s=0; /*总分初值为0*/

p=h; /*从头指针开始*/

while(p!=NULL) /*当p不为空时处理*/

{

s+=p->score[i]; /*累加总分*/

j++; /*统计记录条数*/

p=p->next; /*指针后移*/
h; /*返回头指针 就知道这么多了,我不太懂咯~~~~心得就不来写了,自己写哈!~!~!
匿名用户
2013-07-31
展开全部
机的C语言程序毕竟相比实现普通的排序、计数、统计等功能要复杂和综合一点
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式