环境是vs2010,我也不知道代码哪里出问题了,就是不能运行。请友友们帮我看看
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*(1)定义各种格式(2)定义 DATA 为了后面省写*/
#define N 1000#define FORMAT1 " _________________________________________________________________________________________\n"
#define FORMAT2 "| 学号 | 姓名 | 性别 | 语文 | 数学 | 英语 | 物理 | 总分 | 平均分 | 排名 |\n"
#define FORMAT3 "|________|________|________|________|________|________|________|________|________|________|\n"
#define FORMAT4 "|%8d|%8s|%8d|%8d|%8d|%8d|%8d|%8d|%8d|\n"
#define DATA p->num,p->name,p->sex,p->cscore,p->mscore,p->escore,p->phscore,p->sum,p->aver,p->place
typedef struct student {
int num; //学号
char name[20]; //姓名
char sex[20]; //性别
int cscore; //语文成绩
int mscore; //数学成绩
int escore; //英语成绩
int phscore; //物理成绩
int sum; //总成绩
int aver; //平均分
int place; //排名 }STU;t
ypedef struct pointer_info {
STU* pHead; //指向第一个数据单元的指针
int count; //数据单元的个数
char fname[20]; //数据记录的文件名
int saveflag; //1:未保存,0:已保存 }PI;
void Menu(); //主界面 void GetScore(PI* pi); //输入学生数据 void Query1(PI* pi); //按姓名查询学生信息void Query2(PI* pi); //按学号查询学生信息void Display(PI* pi); //显示数据记录 void Save(PI* pi); //保存数据记录 void Sort1(PI* pi); //按姓名排序void Sort2(PI* pi); //按学号排序void Sort3(PI* pi); //按总成绩排序 void Load(PI* pi); //加载数据记录文件 void New(PI* pi); //新建数据记录文件 void Wrong(); //错误提示 void printheader(); //格式化输出表头 int main() { int sel; STU* pstu; PI pi; pstu = (STU*)malloc(sizeof(STU) * N); //分配数据单元内存 pi.pHead = pstu; //初始化 pi 的成员 pi.count = 0; pi.fname[19] = '\0'; pi.saveflag = 0; Load(&pi); Menu(); //显示主界面 do { printf("请输入您的选择:"); scanf("%d", &sel); //获取键盘输入 if (sel == 0) printf("---------------------------------------谢谢使用------------------------------------\n"); { //输入 0,退出 if (pi.saveflag == 1) { //如果数据被修改但没有保存,则先保存 if (strlen(pi.fname)) { Save(&pi); } else { New(&pi); Save(&pi); } } break; } switch (sel) //根据键盘输入进入响应模块 { case 1: GetScore(&pi); break; //输入学生记录 case 2: Query1(&pi); break; //按姓名查询学生信息 case 3: Query2(&pi); break; //按学号查询学生信息 case 4: Sort1(&pi); break; //按姓名排序 case 5: Sort2(&pi); break; //按学号排序 case 6: Sort3(&pi);break; //按总成绩排序 case 7: Display(&pi); break; //显示学生记录 default: Wrong(); break; //按键有误 } } while (1); pstu = pi.pHead; free(pstu); //释放内存 return 0;}void printheader() { //格式化输出表头 printf(FORMAT1); printf(FORMAT2);}void Menu() { //主界面 system("cls"); printf("\t\t__________________________________________________________\n"); printf("\t\t| |\n"); printf("\t\t| --- ☆ 学 生 成 绩 管 理 系 统 ☆ ---|\n"); printf("\t\t|________________________________________________________|\n"); printf("\t\t| --- 系统说明描述: ---|\n"); printf("\t\t| --- ★1、输入学生成绩 ---|\n"); printf("\t\t| --- ★2、按姓名查询学生信息 ---|\n"); printf("\t\t| --- ★3、按学号查询学生信息 ---|\n"); printf("\t\t| --- ★4、按姓名排序 ---|\n"); printf("\t\t| --- ★5、按学号排序 ---|\n"); printf("\t\t| --- ★6、按总成绩排序 ---|\n"); printf("\t\t| --- ★7、打印学生信息 ---|\n"); printf("\t\t|________________________________________________________|\n"); printf("\n\n\n"); }void Wrong() { //按键错误信息 printf("输入有误!\n");}void GetScore(PI* pi){ STU *p,*q; int Num,Chinese,Math,English,Ph; char Name[20]; char Sex[20]; printf("请依输入10个学生信息:\n"); int i=1; for(;i<=3;i++) { p=pi->pHead,q=p+pi->count; printf("请输入第%d个学生信息\n",i); printf("学号 姓名 性别 语文 数学 英语 物理\n"); scanf("%d %s %s %d %d %d %d", &Num, Name, Sex, &Chinese, &Math, &English, &Ph); q->num=Num; strcpy(q->name,Name); strcpy(q->sex,Sex); q->cscore=Chinese; q->mscore=Math; q->escore=English; q->phscore=Ph; q->sum = q->cscore + q->mscore + q->escore+q->phscore; //计算总分 q->aver=q->sum/4; //计算平均分 q->place = 0; //排名暂时置 0 pi->count++; //数据单元自增 1 pi->saveflag = 1; //数据改变,为保存标志置 1 }}void Display(PI* pi) { //在屏幕上显示学生数据记录 STU* p; Menu(); p = pi->pHead; if (pi->count == 0) { printf("没有学生信息!\n"); return; } printheader(); //打印表格头部 for (int i = 1; i <= pi->count; i++) { //打印数据序列 printf(FORMAT3); printf(FORMAT4, DATA); p++; } printf(FORMAT1); //打印表格结尾}void Query2(PI* pi) {//按学号查询 int sel; int num; int i; STU* p; p = pi->pHead; //p 指向数据序列首部的指针 Menu(); printf("请输入你要查询的学号:"); scanf("%d", &num); for (i = 0; i <= pi->count; i++) { //学号搜索 if (num == p->num) { break; } p++; } if (i > pi->count) { printf("找不到这个学生学号!\n"); return; } else { printheader(); //找到则打印输出 printf(FORMAT4, DATA); printf(FORMAT1); } } void Query1(PI* pi) {//按姓名查询 int sel; int i; STU* p; char name[20]; p = pi->pHead; //p 指向数据序列首部的指针 Menu(); printf("请输入你要查询的姓名:"); scanf("%s", name); for (i = 1; i <= pi->count; i++) { //按姓名搜索 if (!strcmp(name, p->name)) { break; } p++; } if (i > pi->count) { printf("找不到这个学生姓名!\n"); return; } else { //找到则打印输出 printheader(); printf(FORMAT4, DATA); printf(FORMAT1); } } void Swap(STU* p1, STU* p2) { //交换两个数据单元 STU stmp; stmp = *p1; *p1 = *p2; *p2 = stmp;}void Sort1(PI* pi) { int i, j; STU* p; {for (i = 1; i <= pi->count; i++) { p = pi->pHead; for (j = 1; j <= pi->count - 1; j++, p++) { if (p->name > (p + 1)->name) { Swap(p, p + 1); } } } pi->saveflag = 1;} Display(pi);}void Sort2(PI* pi) {//冒泡法,按学号排序 int i, j; STU* p; { for (i = 1; i <= pi->count; i++) { p = pi->pHead; for (j = 1; j <= pi->count - 1; j++, p++) { if (p->num > (p + 1)->num) { Swap(p, p + 1); } } } pi->saveflag = 1; } Display(pi);} void Sort3(PI* pi) { int i, j; STU* p; { //冒泡法,按成绩排序 for (i = 1; i <= pi->count; i++) { p = pi->pHead; for (j = 1; j <= pi->count - 1; j++, p++) { if (p->sum < (p + 1)->sum) { Swap(p, p + 1); } } } p = pi->pHead; for (i = 1; i <= pi->count; i++) { //排序后的顺序就是排名 p->place = i; p++; } pi->saveflag = 1; } Display(pi); //排序后,打印输出}void New(PI* pi) { //新建数据记录文件 FILE* fp; char name[20]="stud"; char fname[20] = ".\\"; //当前文件夹 strcat(fname, name); //文件名称 strcat(fname, ".dat"); //文件后缀 ".dat" fp = fopen(fname, "wb"); //以只写方式打开二进制文件 if (fp == NULL) { printf("新建文件失败!\n"); return; } strcpy(pi->fname, fname); printf("新建数据文件 %s 成功!\n", name); fclose(fp);}void Load(PI* pi) { //加载数据记录文件 FILE* fp; STU* p = pi->pHead; char name[20]="stud.dat"; char fname[20] = ".\\"; strcat(fname, name); fp = fopen(fname, "rb"); //以只读方式打开二进制文件 if (fp == NULL) { printf("加载文件失败!\n"); return; } pi->count = 0; pi->saveflag = 0; while (!feof(fp)) { if (fread(p, sizeof(STU), 1, fp)) { pi->count++; p++; } } strcpy(pi->fname, name); printf("加载数据文件 %s 成功!\n", name); fclose(fp);}void Save(PI* pi) { FILE* fp; int numwriten; if (!strlen(pi->fname)) { //判断数据记录文件是否存在,如果不存在则新建一个 New(pi); } fp = fopen(pi->fname, "wb"); if (fp == NULL) { printf("打开文件失败!\n"); fclose(fp); return; } if (pi->count) { //如果数据不为空,则写入文件 numwriten = fwrite(pi->pHead, 1, pi->count * sizeof(STU), fp); pi->saveflag = 0; printf("保存文件成功!\n"); } else { printf("保存文件失败!\n"); } fclose(fp);}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*(1)定义各种格式(2)定义 DATA 为了后面省写*/
#define N 1000
#define FORMAT1 " _________________________________________________________________________________________\n"
#define FORMAT2 "| 学号 | 姓名 | 性别 | 语文 | 数学 | 英语 | 物理 | 总分 | 平均分 | 排名 |\n"
#define FORMAT3 "|________|________|________|________|________|________|________|________|________|________|\n"
#define FORMAT4 "|%8d|%8s|%8s|%8d|%8d|%8d|%8d|%8d|%8d|%8d|\n"
#define DATA p->num,p->name,p->sex,p->cscore,p->mscore,p->escore,p->phscore,p->sum,p->aver,p->place
typedef struct student {
int num; //学号
char name[20]; //姓名
char sex[20]; //性别
int cscore; //语文成绩
int mscore; //数学成绩
int escore; //英语成绩
int phscore; //物理成绩
int sum; //总成绩
int aver; //平均分
int place; //排名
} STU;
typedef struct pointer_info {
STU* pHead; //指向第一个数据单元的指针
int count; //数据单元的个数
char fname[20]; //数据记录的文件名
int saveflag; //1:未保存,0:已保存
} PI;
void Menu(); //主界面
void GetScore(PI* pi); //输入学生数据
void Query1(PI* pi); //按姓名查询学生信息
void Query2(PI* pi); //按学号查询学生信息
void Display(PI* pi); //显示数据记录
void Save(PI* pi); //保存数据记录
void Sort1(PI* pi); //按姓名排序
void Sort2(PI* pi); //按学号排序
void Sort3(PI* pi); //按总成绩排序
void Load(PI* pi); //加载数据记录文件
void New(PI* pi); //新建数据记录文件
void Wrong(); //错误提示
void printheader(); //格式化输出表头
int main() {
int sel;
STU* pstu;
PI pi;
pstu = (STU*)malloc(sizeof(STU) * N); //分配数据单元内存
pi.pHead = pstu; //初始化 pi 的成员
pi.count = 0;
pi.fname[19] = '\0';
pi.saveflag = 0;
Load(&pi);
Menu(); //显示主界面
do {
printf("请输入您的选择:");
scanf("%d", &sel); //获取键盘输入
if (sel == 0) { //输入 0,退出
printf("---------------------------------------谢谢使用------------------------------------\n");
if (pi.saveflag == 1) { //如果数据被修改但没有保存,则先保存
if (strlen(pi.fname)) { Save(&pi); } else { New(&pi); Save(&pi); }
}
break;
}
switch (sel) //根据键盘输入进入响应模块
{
case 1: GetScore(&pi); break; //输入学生记录
case 2: Query1(&pi); break; //按姓名查询学生信息
case 3: Query2(&pi); break; //按学号查询学生信息
case 4: Sort1(&pi); break; //按姓名排序
case 5: Sort2(&pi); break; //按学号排序
case 6: Sort3(&pi);break; //按总成绩排序
case 7: Display(&pi); break; //显示学生记录
default: Wrong(); break; //按键有误
}
} while (1);
pstu = pi.pHead;
free(pstu); //释放内存
return 0;
}
void printheader() { //格式化输出表头
printf(FORMAT1);
printf(FORMAT2);
}
void Menu() { //主界面
system("cls");
printf("\t\t__________________________________________________________\n");
printf("\t\t| |\n");
printf("\t\t| --- ☆ 学 生 成 绩 管 理 系 统 ☆ ---|\n");
printf("\t\t|________________________________________________________|\n");
printf("\t\t| --- 系统说明描述: ---|\n");
printf("\t\t| --- ★1、输入学生成绩 ---|\n");
printf("\t\t| --- ★2、按姓名查询学生信息 ---|\n");
printf("\t\t| --- ★3、按学号查询学生信息 ---|\n");
printf("\t\t| --- ★4、按姓名排序 ---|\n");
printf("\t\t| --- ★5、按学号排序 ---|\n");
printf("\t\t| --- ★6、按总成绩排序 ---|\n");
printf("\t\t| --- ★7、打印学生信息 ---|\n");
printf("\t\t|________________________________________________________|\n");
printf("\n\n\n");
}
void Wrong() { //按键错误信息
printf("输入有误!\n");
}
void GetScore(PI* pi){
STU *p,*q;
int Num,Chinese,Math,English,Ph;
char Name[20];
char Sex[20];
printf("请依输入10个学生信息:\n");
int i=1;
for(;i<=3;i++)
{
p=pi->pHead,q=p+pi->count;
printf("请输入第%d个学生信息\n",i);
printf("学号 姓名 性别 语文 数学 英语 物理\n");
scanf("%d %s %s %d %d %d %d", &Num, Name, Sex, &Chinese, &Math, &English, &Ph);
q->num=Num;
strcpy(q->name,Name);
strcpy(q->sex,Sex);
q->cscore=Chinese;
q->mscore=Math;
q->escore=English;
q->phscore=Ph;
q->sum = q->cscore + q->mscore + q->escore+q->phscore; //计算总分
q->aver=q->sum/4; //计算平均分
q->place = 0; //排名暂时置 0
pi->count++; //数据单元自增 1
pi->saveflag = 1; //数据改变,为保存标志置 1
}
}
void Display(PI* pi) { //在屏幕上显示学生数据记录
STU* p;
Menu();
p = pi->pHead;
if (pi->count == 0) {
printf("没有学生信息!\n");
return;
}
printheader(); //打印表格头部
for (int i = 1; i <= pi->count; i++) { //打印数据序列
printf(FORMAT3);
printf(FORMAT4, DATA);
p++;
}
printf(FORMAT1); //打印表格结尾
}
void Query2(PI* pi) {//按学号查询
// int sel;
int num;
int i;
STU* p;
p = pi->pHead; //p 指向数据序列首部的指针
Menu();
printf("请输入你要查询的学号:");
scanf("%d", &num);
for (i = 0; i <= pi->count; i++) { //学号搜索
if (num == p->num) {
break;
}
p++;
}
if (i > pi->count) {
printf("找不到这个学生学号!\n");
return;
} else {
printheader(); //找到则打印输出
printf(FORMAT4, DATA);
printf(FORMAT1);
}
}
void Query1(PI* pi) {//按姓名查询
int sel;
int i;
STU* p;
char name[20];
p = pi->pHead; //p 指向数据序列首部的指针
Menu();
printf("请输入你要查询的姓名:");
scanf("%s", name);
for (i = 1; i <= pi->count; i++) { //按姓名搜索
if (!strcmp(name, p->name)) {
break;
}
p++;
}
if (i > pi->count) {
printf("找不到这个学生姓名!\n");
return;
} else { //找到则打印输出
printheader();
printf(FORMAT4, DATA);
printf(FORMAT1);
}
}
void Swap(STU* p1, STU* p2) { //交换两个数据单元
STU stmp;
stmp = *p1;
*p1 = *p2;
*p2 = stmp;
}
void Sort1(PI* pi) {
int i, j;
STU* p;
{
for (i = 1; i <= pi->count; i++) {
p = pi->pHead;
for (j = 1; j <= pi->count - 1; j++, p++) {
if (p->name > (p + 1)->name) {
Swap(p, p + 1);
}
}
}
pi->saveflag = 1;
}
Display(pi);
}
void Sort2(PI* pi) {//冒泡法,按学号排序
int i, j;
STU* p;
{
for (i = 1; i <= pi->count; i++) {
p = pi->pHead;
for (j = 1; j <= pi->count - 1; j++, p++) {
if (p->num > (p + 1)->num) {
Swap(p, p + 1);
}
}
}
pi->saveflag = 1;
}
Display(pi);
}
void Sort3(PI* pi) {
int i, j;
STU* p;
{ //冒泡法,按成绩排序
for (i = 1; i <= pi->count; i++) {
p = pi->pHead;
for (j = 1; j <= pi->count - 1; j++, p++) {
if (p->sum < (p + 1)->sum) {
Swap(p, p + 1);
}
}
}
p = pi->pHead;
for (i = 1; i <= pi->count; i++) { //排序后的顺序就是排名
p->place = i;
p++;
}
pi->saveflag = 1;
}
Display(pi); //排序后,打印输出
}
void New(PI* pi) { //新建数据记录文件
FILE* fp;
char name[20]="stud";
char fname[20] = ".\\"; //当前文件夹
strcat(fname, name); //文件名称
strcat(fname, ".dat"); //文件后缀 ".dat"
fp = fopen(fname, "wb"); //以只写方式打开二进制文件
if (fp == NULL) {
printf("新建文件失败!\n");
return;
}
strcpy(pi->fname, fname);
printf("新建数据文件 %s 成功!\n", name);
fclose(fp);
}
void Load(PI* pi) { //加载数据记录文件
FILE* fp;
STU* p = pi->pHead;
char name[20]="stud.dat";
char fname[20] = ".\\";
strcat(fname, name);
fp = fopen(fname, "rb"); //以只读方式打开二进制文件
if (fp == NULL) {
printf("加载文件失败!\n");
return;
}
pi->count = 0;
pi->saveflag = 0;
while (!feof(fp)) {
if (fread(p, sizeof(STU), 1, fp)) {
pi->count++;
p++;
}
}
strcpy(pi->fname, name);
printf("加载数据文件 %s 成功!\n", name);
fclose(fp);
}
void Save(PI* pi) {
FILE* fp;
int numwriten;
if (!strlen(pi->fname)) { //判断数据记录文件是否存在,如果不存在则新建一个
New(pi);
}
fp = fopen(pi->fname, "wb");
if (fp == NULL) {
printf("打开文件失败!\n");
fclose(fp);
return;
}
if (pi->count) { //如果数据不为空,则写入文件
numwriten = fwrite(pi->pHead, 1, pi->count * sizeof(STU), fp);
pi->saveflag = 0;
printf("保存文件成功!\n");
} else {
printf("保存文件失败!\n");
}
fclose(fp);
}