求友友们帮我看看这个代码哪里出问题了?运行不起来。

环境是vs2010,我也不知道代码哪里出问题了,就是不能运行。请友友们帮我看看

img

#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);
}