📄 2047.c
字号:
#include "stdio.h"
#include "stdlib.h" /*Other Intro*/
#include "string.h"
#include "conio.h" /*Screen oprt*/
#include "mem.h" /*Mem Oprt*/
#include "ctype.h" /*Char Oprt*/
#include "alloc.h" /*Dynamict Address Distribute*/
#define N 3
/*Define Data Structure*/
typedef struct node
{
char no[11];
char name[15];
int score[N];
float sum;
float average;
int order;
struct node *next;
}STUDENT;
/*Function Prototype*/
STUDENT *init();
STUDENT *create();
STUDENT *delete(STUDENT *h);
void print(STUDENT *h);
/*STUDENT *reverse(STUDENT *h);*/
void search(STUDENT *h);
void save(STUDENT *h);
STUDENT *load();
void computer(STUDENT *h);
STUDENT *insert(STUDENT *h);
STUDENT *sort(STUDENT *h);
STUDENT *index(STUDENT *h);
void total(STUDENT *h);
int menu_select();
void main()
{
int i;
STUDENT *head; /*链表定义头指针*/
head=init();
clrscr();
for(;;) /*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{ /*值不同,执行的函数不同,break 不能省略*/
case 0:head=init();break; /*执行初始化*/
case 1:head=create();break; /*创建链表*/
case 2:head=delete(head);break; /*删除记录*/
case 3:print(head);break; /*显示全部记录*/
case 4:search(head);break; /*查找记录*/
case 5:save(head);break; /*保存文件*/
case 6:head=load(); break; /*读文件*/
case 7:computer(head);break; /*计算总分和均分*/
case 8:head=insert(head); break; /*插入记录*/
case 9:head=sort(head);break; /*排序*/
case 10:head=index(head);break; /*索引*/
case 11:total(head);break; /*分类合计*/
case 12:exit(0); /*如菜单返回值为12程序结束*/
}
}
}
/*菜单函数,返回值为整数*/
menu_select()
{
char *menu[]={"***************MENU***************", /*定义菜单字符串数组*/
" 0. Init list", /*初始化*/
" 1. Enter a new list", /*输入记录*/
" 2. Delete a record from list", /*从表中删除记录*/
" 3. Print the list ", /*显示单链表中所有记录*/
" 4. Search record on number", /*按照姓名查找记录*/
" 5. Save the file", /*将单链表中记录保存到文件中*/
" 6. Load the file", /*从文件中读入记录*/
" 7. Calculate the score", /*计算所有学生的总分和均分*/
" 8. Insert a record to list ", /*插入记录到表中*/
" 9. Sort to make new file", /*排序*/
" 10. Index on number", /*索引*/
" 11. Total on number", /*分类合计*/
" 12. Quit"}; /*退出*/
char s[3]; /*以字符形式保存选择号*/
int c,i;
gotoxy(1,25); /*移动光标*/
printf("press any key enter into menu......\n"); /*压任一键进入主菜单*/
getch(); /*输入任一键*/
clrscr(); /*清屏幕*/
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<14;i++) /*输出主菜单数组*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK); /*设置背景颜色为黑色*/
window(1,1,80,25); /*恢复原窗口大小*/
gotoxy(10,21); /*移动光标*/
do{
printf("\n Please enter you choice(0~12):"); /*在菜单窗口外显示提示信息*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整形数*/
}while(c<0||c>12); /*选择项不在0~12之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
/*初始化该链表*/
STUDENT *init()
{
return NULL;
}
/*创建链表,校验是亮点*/
STUDENT *create()
{
int i; int s;
STUDENT *h=NULL,*info; /*STUDENT指向结构体的指针*/
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT));
if(!info) /*如果指针info为空*/
{
printf("\n out of memory"); /*输出内存溢出*/
return NULL;
}
inputs("enter no:",info->no,11);
if(info->no[0]=='@') break; /*如果学号首字符为@则结束输入*/
inputs("enter name:",info->name,15);
printf("please input %d score \n",N);
s=0; /*计算每个学生的总分,初值为0*/
for(i=0;i<N;i++)
{
do{
printf("score%d:",i+1);
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
printf("data error,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;
info->next=h; /*将头结点做为新输入结点的后继结点*/
h=info; /*新输入结点为新的头结点*/
}
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中*/
}
/*
STUDENT *reverse(STUDENT *h)
{
STUDENT *t, *r, *y;
if(h == NULL)
return NULL;
y = h;
while(y != NULL)
{
t = y->next;
y->next = r;
r = y;
y = t;
}
return r;
}
*/
/*输出链表中结点信息*/
void print(STUDENT *h)
{
int i=0; /* 统计记录条数*/
STUDENT *p;
clrscr();
printf("\n\n\n******************************STUDENT***********************************\n");
printf("|rec |no | name | sc1| sc2| sc3| sum | ave |order|\n");
printf("|-----|----------|---------------|----|----|----|--------|-------|-----|\n");
/* p = reverse(h);*/
while(p!=NULL)
{
i++;
printf("|%3d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],
p->score[2],p->sum,p->average,p->order);
p=p->next;
}
printf("**********************************end***********************************\n");
}
/*删除记录*/
STUDENT *delete(STUDENT *h)
{
STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/
char s[11];
clrscr();
printf("please input deleted number\n");
scanf("%s",s);
q=p=h;
while(strcmp(p->no,s)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/
{
q=p; /*将p指针值赋给q作为p的前驱指针*/
p=p->next;
}
if(p==NULL)
printf("\nlist no %s student\n",s);
else
{
printf("*****************************have found***************************\n");
printf("|no | name | sc1| sc2| sc3| sum | ave |order|\n");
printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |\n", p->no,
p->name,p->score[0],p->score[1],p->score[2],p->sum,
p->average,p->order);
printf("********************************end*******************************\n");
printf("do you want to delecte it?OK press Enter");
getch();
if(p==h)
h=p->next; /*修改头指针指向下一条记录*/
else
q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/
free(p);
printf("\n have deleted No %s student\n",s);
printf("Don't forget save\n");
}
return(h);
}
/*查找记录*/
void search(STUDENT *h)
{
STUDENT *p;
char s[15];
clrscr();
printf("please enter number for search\n");
scanf("%s",s);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -