调试无错 但无法执行 请各位帮小弟看看那错了
/*头文件*/#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*其它说明*/
#include "string.h" /*字符串函数*/
#include "conio.h" /*屏幕操作函数*/
#include "memory.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "iostream.h"
#define N 5 /*定义常数*/
typedef struct z1 /*定义数据结构*/
{ char class_0[20];
int num;
char name[8];
int score[N];
float ave;
int order;
float sum;
struct z1 *next;
}STUDENT;
/*以下是函数原型*/
STUDENT *init(); /*初始化函数*/
STUDENT *create(); /*创建链表*/
STUDENT *del(STUDENT *h); /*删除记录*/
void print(STUDENT *h); /* 显示所有记录*/
void search(STUDENT *h); /*查找*/
void save(STUDENT *h); /*保存*/
STUDENT *load(); /*读入记录*/
void calculate(STUDENT *h); /*计算总分和均分*/
STUDENT *insert(STUDENT *h); /*插入记录*/
STUDENT *sort(STUDENT *h); /*排序*/
void inputs(char *prompt, char *s, unsigned count);
int main_menu()
{
char c;
do{
system("cls"); /*运行前清屏*/
printf("*********************************学生成绩管理系统*******************************\n"); /*定义菜单字符串数组*/
printf(" 1. 录入 \n");
printf(" 2. 输出 \n");
printf(" 3. 删除 \n");
printf(" 4. 查询 \n");
printf(" 5. 保存 \n");
printf(" 6. 读取 \n");
printf(" 7. 统计 \n");
printf(" 8. 插入 \n");
printf(" 9. 排序 \n");
printf(" 0. 退出 \n");
printf(" 请你选择所需的功能键(0~9):");
c=getchar(); /*读入选择*/
}while(c<'0'||c>'9');
return (int)(c-'0');;
}
/*主函数*/
void main()
{
STUDENT *head; /*链表定义头指针*/
head=init(); /*初始化链表*/
system("CLS"); /*清屏*/
for(;;) /*无限循环*/
{
switch(main_menu()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{ /*值不同,执行的函数不同,break 不能省略*/
case 1:head=create();break; /*创建链表*/
case 2:print(head);break; /*显示全部记录*/
case 3:del(head);break; /*删除记录*/
case 4:search(head);break; /*查找记录*/
case 5:save(head);break; /*保存文件*/
case 6:head=load(); break; /*读文件*/
case 7:calculate(head);break; /*统计总分和均分*/
case 8:head=insert(head); break; /*插入记录*/
case 9:head=sort(head);break; /*排序*/
case 0:exit(0); /*如菜单返回值为14程序结束*/
}
}
}
/*菜单函数,返回值为整数*/
STUDENT *init()
{
return NULL;
}
/*创建链表*/
STUDENT *create()
{
int i; int s;
int d;
STUDENT *h=NULL,*info; /* STUDENT指向结构体的指针*/
do{
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!info) /*如果指针info为空*/
{
printf("\n内存溢出"); /*输出内存溢出*/
return NULL; /*返回空指针*/
}
printf("请输入学号:");
scanf("%d",info->num);
inputs("输入姓名:",info->name,8); /*输入姓名,并进行校验*/
printf("请输入 %d 个科目的成绩(科目1为高等数学,科目2为C程序设计,科目3为大学英语,科目4为马克思主义政治经济学,科目5为大学体育): \n",N); /*提示开始输入成绩*/
s=0; /*计算每个学生的总分,初值为0*/
for(i=0;i<N;i++) /*N门课程循环N次*/
{
do{
printf("科目%d的成绩:",i+1); /*提示输入第几门课程*/
scanf("%d",&info->score[i]); /*输入成绩*/
if(info->score[i]>100||info->score[i]<0) /*确保成绩在0~100之间*/
printf("对不起,输入有错,请重新输入\n"); /*出错提示信息*/
}while(info->score[i]>100||info->score[i]<0);
s=s+(info->score[i]); /*累加各门课程成绩*/
}
info->sum=s; /*将总分保存*/
info->ave=(float)s/N; /*求出平均值*/
info->order=1; /*未排序前此值为0*/
info->next=h; /*将头结点做为新输入结点的后继结点*/
h=info; /*新输入结点为新的头结点*/
printf("返回上级菜单请按0,继续输入请按1:\n");
scanf("%d",&d);
}while(d);
return(h); /*返回头指针*/
}
/*输入字符串,并进行长度验证*/
void inputs(char *prompt, char *s, unsigned count)
{
char p[255];
do{
printf(prompt); /*显示提示信息*/
scanf("%s",p); /*输入字符串*/
if(strlen(p)>count)printf("\n 长度过长! \n"); /*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
/*输出链表中结点信息*/
void print(STUDENT *h)
{
int i=0; /* 统计记录条数*/
STUDENT *p; /*移动指针*/
system("CLS");/*清屏*/
p=h; /*初值为头指针*/
printf("\n\n\n******************************学生信息***********************************\n");
printf("|记录| 学号 | 姓名 |高等数学|C程序设计|大学英语| 马克思主义政治经济学| 大学体育| 总分 |平均成绩|排名|\n");
printf("|----|----------|---------------|--------|---------|--------|---------------------|---------|--------|--------|----|\n");
while(p!=NULL)
{
i++;
printf("|%4d|%-10s|%-15s|%8d|%8d|%8d|%21d|%8d|%7d| %5.2f | %3d|\n", i, p->num,p->name,p->score[0],p->score[1],
p->score[2],p->score[3],p->score[4],p->sum,p->ave,p->order);
p=p->next;
}
printf("*************************************************************************\n");
system("pause");
}
/* 从文件读数据*/
STUDENT *load()
{
STUDENT *p,*q,*h=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[10]; /*保存文件名*/
printf("读出文件的路径(如 c:\\data.txt):\n"); scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/
{
printf("打不开文件\n"); /*如不能打开,则结束程序*/
exit(1);
}
printf("\n-----读出文件!-----\n");
p=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!p)
{
printf("内存溢出!\n"); /*如没有申请到,则内存溢出*/
return h; /*返回空头指针*/
}
h=p; /*申请到空间,将其作为头指针*/
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(1!=fread(p,sizeof(STUDENT),1,fp))
break; /*如果没读到数据,跳出循环*/
p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*为下一个结点申请空间*/
if(!p->next)
{
printf("内存溢出!\n"); /*如没有申请到,则内存溢出*/
return h;
}
q=p; /*保存当前结点的指针,作为下一结点的前驱*/
p=p->next; /*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp); /*关闭文件*/
printf("---已成功读出文件!!!---\n");
system("pause");
return h; /*返回头指针*/
}
/*排序*/
STUDENT *sort(STUDENT *h)
{
int i=0;
{
STUDENT *p,*q,*r,*s;
r=new STUDENT;
r->next=h;
for(s=h;s->next;s=s->next)
{
p=s; q=p->next;
while(q)
{
if(p->sum<q->sum)
{
if(p==h)
{
p->next=q->next;
q->next=p;
h=q;
q=p->next;
}
else
{
r->next=q;
p->next=q->next;
q->next=p;
r=q;
q=p->next;
}
}
else
{
r=r->next;
p=p->next;
q=q->next;
}
}
r=s;
}
p=h;
while(p!=NULL) /*当p不为空时,进行下列操作*/
{
i++; /*结点序号*/
p->order=i; /*将名次赋值*/
p=p->next; /*指针后移*/
}
return (h);
}
}
/*统计总分和均值*/
void calculate(STUDENT *h)
{
STUDENT *p; /*定义移动指针*/
int i=0; /*保存记录条数初值为0*/
int s=0; /*总分初值为0*/
float average=0; /*均分初值为0*/
p=h; /*从头指针开始*/
while(p!=NULL) /*当p不为空时处理*/
{
s+=p->sum; /*累加总分*/
i++; /*统计记录条数*/
p=p->next; /*指针后移*/
}
average=(float)s/i;/* 求均分,均分为浮点数,总分为整数,所以做类型转换*/
printf("\n所有学生的总成绩为:%ld 平均成绩为 %5.2f\n",s,average);
system("pause");
}