| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4695 人关注过本帖, 4 人收藏
标题:信息管理系统
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(4)
已结贴  问题点数:20 回复次数:15 
信息管理系统
最近看到了很多关于信息管理系统的贴,我自己也做了一个~算是对现阶段编程能力的一种自我检测吧~看看效果如何,发个来看看(噢,感觉做得有点特别~新手可能看不懂哦)~

vc编译环境运行~~如果其它编译器有问题不能通过,那就这样先吧~



[此贴子已经被作者于2017-1-6 02:02编辑过]

搜索更多相关主题的帖子: 能力 检测 信息 编译器 管理系统 
2017-01-06 01:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
代码超过1000行~看看能不能发~

原来可以~~~

程序代码:
/*动态更新,写在前面的话:注意文件保存格式用txt--学号设置不能重复输入
第一阶段完结~代码突破了1000行*/

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define SIZE_FUN 7//这个是菜单长度,最大为10,大于10会出错
#define LEN sizeof(Student)//这个是Student的大小
#define MEMBER(A) (int)A-(int)head//这个是用来获取结构体成员的地址的

typedef int FUN (int,void *p,void *p2[]);//定义新函数类型
typedef struct Student//初始化
{
    char num[3];
    char name[10];
    int score;
    struct Student *date;
    struct Student *back;
}Student;
Student *head=NULL;

typedef struct PRINT_SET//定义字库结构体
{
    char ss1[5];//这个是字库关键字
    char ss2[100];//这个似乎关键字对应的内容

}PRINT_SET;//这个是输出字库

int camp(const void *p1,const void *p2)//快排用的序函数
{
    return strcmp(((PRINT_SET *)p1)->ss1,((PRINT_SET *)p2)->ss1);
}
void print_set(const void *str)//字库管理函数
{
    static flag=1;

    static PRINT_SET p[]=
    {
        "1001","\n您需要查询的学生信息为:\n",
        "1002","\n没有找到需要查询学生的信息",
        "1010","\n请输入您需要查询学生的学号",
        "1011","\n请输入您需要查询学生的姓名",
        "1021","\n请输入您需要插入学生的学号",
        "1022","\n请输入您需要删除学生的学号",
        "1023","\n请输入您需要修改学生的学号",
        "1030","请输入读取文件路径:",
        "1031","请输入读取文件路径:",
        "2001","\n该学号已经存在,请重新输入\n",
        "3001","\n请输入:Y--进行创建,追加学生信息;N--返回菜单(请输入Y\\N)",
        "3011","\n请输入:Y--进行保存学生信息;N--返回菜单(请输入Y\\N)",
        "3012","\n请输入:Y--进行读取学生信息;N--返回菜单(请输入Y\\N)",
        "3031","\n请输入:Y--进行按学号查找学生信息;N--返回菜单(请输入Y\\N)",
        "3032","\n请输入:Y--进行按姓名查找学生信息;N--返回菜单(请输入Y\\N)",
        "3033","\n请输入:Y--进行按学号插入学生信息;N--返回菜单(请输入Y\\N)",
        "3034","\n请输入:Y--进行按学号删除学生信息;N--返回菜单(请输入Y\\N)",
        "3035","\n请输入:Y--进行清空学生信息;N--返回菜单(请输入Y\\N)",
        "3036","\n请输入:Y--进行按学号修改学生信息;N--返回菜单(请输入Y\\N)",
        "3100","即将返回上一步",
        "3101","信息已清空,即将返回菜单\n",
        "3134","\n是要插入该学生信息吗?(请输入Y\\N)",
        "3135","\n是要删除该学生信息吗?(请输入Y\\N)",
        "3136","\n是要修改该学生信息吗?(请输入Y\\N)",
        "3200","\n现在进行按学号排序",
        "3201","\n现在进行按姓名排序",
        "3202","\n现在进行按成绩排序",
        "3210","\n请输入:Y--进行按学号升序排序;N--返回菜单(请输入Y\\N)",
        "3211","\n请输入:Y--进行按姓名升序排序;N--返回菜单(请输入Y\\N)",
        "3212","\n请输入:Y--进行按成绩升序排序;N--返回菜单(请输入Y\\N)",
        "3220","\n请输入:Y--进行按学号降序排序;N--返回菜单(请输入Y\\N)",
        "3221","\n请输入:Y--进行按姓名降序排序;N--返回菜单(请输入Y\\N)",
        "3222","\n请输入:Y--进行按成绩降序排序;N--返回菜单(请输入Y\\N)",
        "4001","该表为空表,请先初始化信息\n",
        "9999","Y--退出系统;N--返回菜单(请输入Y\\N)",
    };//初始化输出字库

    PRINT_SET *PS=p;
    PRINT_SET *PB=NULL;

    if (strcmp(str,"0000")==0)//"0000"表示输出为空,即什么都不输出
        return;

    if (flag)
    {
        qsort(p,sizeof(p)/sizeof(PRINT_SET),sizeof(p[0]),camp);//帮字符按编号快速排序,虽然输入可以直接人为插入排序,但也习惯做一下
        flag=0;
    }

    if ((PB=(PRINT_SET *)bsearch(str,p,sizeof(p)/sizeof(PRINT_SET),sizeof(p[0]),camp))!=NULL)//bsearch函数二分法查找,提高效率
        printf("%s",PB->ss2);//输出字库中要查找的字符串
}

int n=0;

FUN dump;//dump为空函数,闲置菜单用的
FUN fun_0_0,fun_0_1,fun_0_2,fun_0_3,fun_0_4;//菜单列表
FUN fun_1_0,fun_1_1,fun_1_2,fun_1_3,fun_1_4,fun_1_5;
FUN fun_2_0,fun_2_1,fun_2_2,fun_2_3,fun_2_4;
FUN fun_3_0,fun_3_1,fun_3_2,fun_3_3,fun_3_4;
FUN fun_4_0,fun_4_1,fun_4_2,fun_4_3,fun_4_4,fun_4_5,fun_4_6;
FUN fun_5_0,fun_5_1,fun_5_2,fun_5_3,fun_5_4;
FUN fun_6_0,fun_6_1,fun_6_2,fun_6_3,fun_6_4,fun_6_5;
FUN fun_7_0,fun_7_1,fun_7_2,fun_7_3;


void menu(int flag,int ss,void *p,void *p2[]);//菜单信息
/*第一个参数,输入特殊值打破菜单循环(一般设置为0)~第二个参数,初始化读取菜单信息~
第三个参数,附加一个地址(作为传参)~第四个参数,一个地址列表(感觉第三个参数可以省略)~*/

void creat();//创建,追加学生信息

void insert(Student *p);//插入学生信息
void insert_perform(Student *p1,Student *p2);//插入函数执行主体
void del(Student *p);//删除学生信息
void del_perform(Student *p);//函数执行主体
void change(Student *p);//修改学生信息~
void change_perfoem(Student *p);//函数执行主体

void sorting(int k,int (*f)(Student *p1,Student *p2,int k));//排序

int sorting_max_str(Student *p1,Student *p2,int k);//按字符串排序
int sorting_min_str(Student *p1,Student *p2,int k);//按字符串排序
int sorting_max_num(Student *p1,Student *p2,int k);//按数字排序
int sorting_min_num(Student *p1,Student *p2,int k);//按数字排序

void find_one(int k,int (*f)(Student *p1,Student *p2,int k));//查找信息

float fine_average(int k);//查找平均分

void empty_list(void *say);//清空学生信息


void file_set(void *say[],void *st,void (*f)(FILE **fp));
void save(FILE **fp);//保存学生信息
void load(FILE **fp);//读取学生信息
void ch_ferror(FILE **fp,int k);//出错处理(可以完善)

void find_member(void *s,void *p,void *say[],void (*ff)(Student *),int k);//查找信息
/*第一个参数,输入格式字符串~第二个参数,输入地址~第三个参数,提示字库的关键字集合~第四个参数,指针函数(可以提高执行不同的功能)~
第五个参数,指代抽象结构体成员*/
void judge_input(const void *s,const void *p);//判断输入合法性
int judge_continue(char *say1,char *say2);//判断是否继续执行
int judge_empty(char *say1,char *say2);//判断是否为空表

void input(Student *p);//插入学生信息

void print_one(Student *p);//输出单个关键学生信息
void print_set(const void *str);//字库函数
void print_out();//输出所有学生信息

void dump_2(Student *p);//空函数2号

Student *judge_find(void *po,int s,void *say[],void (*ff)(Student *));//查找学生信息,指针函数是为以后插入和删除学生信息作铺垫的

typedef int (*COM)();//设置菜单列表

    COM A[][SIZE_FUN]=
    {
        {fun_0_0,fun_0_1,fun_0_2,fun_0_3,dump,dump,fun_0_4},
        {fun_1_0,fun_1_1,fun_1_2,fun_1_3,fun_1_4,dump,fun_1_5},
        {fun_2_0,fun_2_1,fun_2_2,fun_2_3,dump,dump,fun_2_4},
        {fun_3_0,fun_3_1,fun_3_2,fun_3_3,dump,dump,fun_3_4},
        {fun_4_0,fun_4_1,fun_4_2,fun_4_3,fun_4_4,fun_4_5,fun_4_6},
        {fun_5_0,fun_5_1,fun_5_2,fun_5_3,dump,dump,fun_5_4},
        {fun_6_0,fun_6_1,fun_6_2,fun_6_3,fun_6_4,dump,fun_6_5},
        {fun_7_0,fun_7_1,fun_7_2,dump,dump,dump,fun_7_3},
    };//菜单函数

    COM (*P)[SIZE_FUN]=A;

int main()//主函数
{

    menu(-1,0,NULL,NULL);

    return 0;
}
int fun_0_0(int ss,void *p,void *p2[])//这个是退出系统选项
{
    system("cls");
    if (judge_continue("9999","3100"))
        exit(0);

    return ss;
}
int fun_0_1(int ss,void *p,void *p2[])//缓冲区
{
    return 1;
}
int fun_0_2(int ss,void *p,void *p2[])//整理信息(先要判断是否为空表)
{
    system("cls");
    if (judge_empty("4001","3100"))
        return 0;

    return 2;
}
int fun_0_3(int ss,void *p,void *p2[])//缓冲区
{
    return 3;
}
int fun_0_4(int ss,void *p,void *p2[])//菜单列表
{
    printf("请输入:\n");
    printf("1:添加\\删除\\修改学生信息\n");
    printf("2:整理学生信息:\n");
    printf("3:存取(输出)学生信息\n");
    printf("0:退出\n");
    return ss;
}
int fun_1_0(int ss,void *p,void *p2[])//缓冲区--返回主菜单
{
    return 0;
}
int fun_1_1(int ss,void *p,void *p2[])//初始化//追加信息
{
    while (judge_continue("3001","3100"))
        creat();

    Sleep(2000);
    return ss;
}
int fun_1_2(int ss,void *p,void *p2[])//按学号插入学生信息
{
    char *say[]={"1001","1002","1021"};//备用字库标记
    char num[3]="\0";

    system("cls");
    while (judge_continue("3033","3100"))
         find_member("%s",num,say,insert,MEMBER(head->num));

    Sleep(2000);

    return ss;
}
int fun_1_3(int ss,void *p,void *p2[])//按学号删除学生信息~
{
    char *say[]={"1001","1002","1022"};
    char num[3]="\0";

    system("cls");
    while (judge_empty("4001","3100")==0&&judge_continue("3034","3100"))
        find_member("%s",num,say,del,MEMBER(head->num));

    Sleep(2000);

    return ss;
}
int fun_1_4(int ss,void *p,void *p2[])//修改学生信息
{
    char *say[]={"1001","1002","1023"};//备用字库标记
    char num[3]="\0";

    system("cls");
    while (judge_continue("3036","3100"))
         find_member("%s",num,say,change,MEMBER(head->num));

    Sleep(2000);

    return ss;
}
int fun_1_5(int ss,void *p,void *p2[])//菜单列表
{
    printf("请输入:\n");
    printf("1:初始化学生信息\n");
    printf("2:按学号插入学生信息\n");
    printf("3:按学号删除学生信息\n");
    printf("4:按学号修改学生信息\n");
    printf("0:返回上一步\n");
    return ss;
}
int fun_2_0(int ss,void *p,void *p2[])//缓冲区
{
    return 0;
}
int fun_2_1(int ss,void *p,void *p2[])//缓冲区
{
    return 4;
}
int fun_2_2(int ss,void *p,void *p2[])//缓冲区
{
    return 5;
}
int fun_2_3(int ss,void *p,void *p2[])//缓冲区
{
    system("cls");

    if (judge_continue("3035","3100"))
        empty_list("3101");

    Sleep(2000);
    return ss;
}
int fun_2_4(int ss,void *p,void *p2[])//菜单列表
{
    printf("请选择:\n");
    printf("1:查找学生信息\n");
    printf("2:排序\n");
    printf("3:清空学生信息\n");
    printf("0:返回上一步\n");
    return ss;
}
int fun_3_0(int ss,void *p,void *p2[])//缓冲区
{
    return 0;
}
int fun_3_1(int ss,void *p,void *p2[])//这个是保存信息
{
    void *say[]={"3011","3100","1030"};

    system("cls");
    if (judge_empty("4001","3100"))
    {
        Sleep(2000);
        return ss;
    }

    file_set(say,"w",save);
    Sleep(2000);
    return ss;
}
int fun_3_2(int ss,void *p,void *p2[])//这个是读取信息
{
    void *say[]={"3012","3100","1031"};

    system("cls");
    file_set(say,"r",load);
    Sleep(2000);
    return ss;
}
int fun_3_3(int ss,void *p,void *p2[])//这个是输出信息
{
    system("cls");
    print_out();

    return ss;
}
int fun_3_4(int ss,void *p,void *p2[])//菜单列表
{
    printf("请选择:\n");
    printf("1:保存学生信息\n");
    printf("2:读取学生信息\n");
    printf("3:输出学生信息\n");
    printf("0:返回上一步\n");
    return ss;
}
int fun_4_0(int ss,void *p,void *p2[])//缓冲区
{
    return 2;
}
int fun_4_1(int ss,void *p,void *p2[])//查找最高分(如果有多个,则输出多个)
{
    system("cls");

    printf("最高分的学生信息分为:\n");
    find_one(MEMBER(&head->score),sorting_max_num);

    system("pause");
    return ss;
}
int fun_4_2(int ss,void *p,void *p2[])//查找最低分(如果有多个,则输出多个)
{
    system("cls");

    printf("最低分的学生信息分为:\n");
    find_one(MEMBER(&head->score),sorting_min_num);

    system("pause");
    return ss;
}
int fun_4_3(int ss,void *p,void *p2[])//查找平均分
{
    system("cls");
    printf("平均分为:\n");
    printf("%.2f\n",fine_average(MEMBER(&head->score)));
    system("pause");
    return ss;
}
int fun_4_4(int ss,void *p,void *p2[])//这个是按学号查找
{
    char *say[]={"1001","1002","1010"};//备用字库标记
    char num[3]="\0";

    system("cls");
    while (judge_continue("3031","3100"))
         find_member("%[^\n]%*c",num,say,print_one,MEMBER(head->num));

    Sleep(2000);

    return ss;
}
int fun_4_5(int ss,void *p,void *p2[])////这个是按姓名查找
{
    char *say[]={"1001","1002","1011"};
    char s[10]="\0";

    system("cls");
    while (judge_continue("3032","3100"))
         find_member("%[^\n]%*c",s,say,print_one,MEMBER(head->name));

    Sleep(2000);

    return ss;
}
int fun_4_6(int ss,void *p,void *p2[])
{

    printf("请选择:\n");
    printf("1:查找最高分\n");
    printf("2:查找最低分\n");
    printf("3:查找平均分\n");
    printf("4:按学号查找\n");
    printf("5:按姓名查找\n");
    printf("0:返回上一步");

    return ss;
}
int fun_5_0(int ss,void *p,void *p2[])
{
    return 2;
}
int fun_5_1(int ss,void *p,void *p2[])//这个是按学号排序
{

    void *s[]={"3200","3210","3220",sorting_min_str,sorting_max_str,head->num};
    system("cls");

    menu(0,7,NULL,s);//进入菜单

    return ss;
}
int fun_5_2(int ss,void *p,void *p2[])//这个是按姓名排序
{
    void *s[]={"3201","3211","3221",sorting_min_str,sorting_max_str,head->name};
    system("cls");

    menu(0,7,NULL,s);//进入菜单

    return ss;
}
int fun_5_3(int ss,void *p,void *p2[])//这个是按成绩排序
{
    void *s[]={"3202","3212","3222",sorting_min_num,sorting_max_num,&head->score};
    system("cls");

    menu(0,7,NULL,s);//进入菜单

    return ss;
}
int fun_5_4(int ss,void *p,void *p2[])//菜单管理
{
    printf("请选择:\n");
    printf("1:按学号排序\n");
    printf("2:按姓名排序\n");
    printf("3:按成绩排序\n");
    printf("0:返回上一步\n");
    return ss;
}
int fun_6_0(int ss,void *p,void *p2[])//缓冲区
{
    return 0;
}
int fun_6_1(int ss,void *p,void *p2[])//修改学号
{
    char *say[]={"2001","0000"};

    printf("请输入学生学号");

    do
    {
        judge_input("%s",((Student *)p)->num);
    }while (judge_find(((Student *)p)->num,MEMBER(head->num),say,print_one)!=NULL);

    printf("修改成功\n");
    system("pause");

    return ss;
}
int fun_6_2(int ss,void *p,void *p2[])//修改姓名
{
    printf("请输入学生姓名");

    judge_input("%s",((Student *)p)->name);

    printf("修改成功\n");
    system("pause");

    return ss;
}
int fun_6_3(int ss,void *p,void *p2[])//修改成绩
{
    printf("请输入学生成绩");

    judge_input("%d",&((Student *)p)->score);

    printf("修改成功\n");
    system("pause");

    return ss;
}
int fun_6_4(int ss,void *p,void *p2[])//修改全部
{
    input(p);
    n--;//这里,因为调用input函数n会+1,修改完毕后n要-1;
    printf("修改成功\n");
    system("pause");

    return ss;
}
int fun_6_5(int ss,void *p,void *p2[])
{
    printf("请选择\n");
    printf("1:修改学号\n");
    printf("2:修改姓名\n");
    printf("3:修改成绩\n");
    printf("4:修改全部\n");
    printf("0:返回上一步\n");
    return ss;
}
int dump(int ss,void *p,void *p2[])
{
    return ss;
}
int fun_7_0(int ss,void *p,void *p2[])//这个是过渡缓冲的
{
    return 0;
}
int fun_7_1(int ss,void *p,void *p2[])
{
    if(judge_continue(p2[1],"3100"))
    {
        sorting(MEMBER(p2[5]),p2[3]);//升序
        printf("排序完毕!\n");
        print_set("3100");
    }

    Sleep(2000);

    return 0;
}
int fun_7_2(int ss,void *p,void *p2[])
{
    if(judge_continue(p2[2],"3100"))
    {
        sorting(MEMBER(p2[5]),p2[4]);//降序
        printf("排序完毕!\n");
        print_set("3100");
    }

    Sleep(2000);

    return 0;
}
int fun_7_3(int ss,void *p,void *p2[])//选择排序方式
{
    print_set(p2[0]);
    printf("请选择排序方式:\n");
    printf("1:升序\n");
    printf("2:降序\n");
    printf("0:返回菜单\n");
    return ss;
}
void menu(int flag,int ss,void *p,void *p2[])//菜单函数
{

    while (ss!=flag)
    {
        char cmd=0;//菜单主体

        system("cls");

        ss=(*(*(P+ss)+SIZE_FUN-1))(ss,p,p2);

        cmd=getch()-'0';

        if (cmd<0||cmd>SIZE_FUN-2)
            continue;
        
        ss=(*(*(P+ss)+cmd))(ss,p,p2);
        fflush(stdin);
    }
}
int judge_empty(char *say1,char *say2)//判断是否为空表
{
    if (n==0)
    {
        print_set(say1);
        print_set(say2);
        if (strcmp(say1,"0000")!=0)
            Sleep(2000);

        head=NULL;
    }

    return head==NULL;
}
void judge_input(const void *s,const void *p)//判断输入是否合法
{
    while (scanf(s,p)!=1)
    {
        printf("您输入的数据有误,请重新输入\n");
        fflush(stdin);
    }

    fflush(stdin);
}
void print_one(Student *p)//输出一个学生的信息
{
    printf("学号:%3s\t",p->num);
    printf("姓名:%-10s\t",p->name);
    printf("成绩:%3d\t\n",p->score);
}
int judge_continue(char *say1,char *say2)//判断是否继续执行
{
    char ch=0;

    while (1)
    {
        print_set(say1);

        ch=getch();

        system("cls");

        if (ch=='Y'||ch=='y')
            return 1;
        else if (ch=='N'||ch=='n')
        {
            print_set(say2);

            return 0;
        }
        else
            printf("\n判断只能在Y和N之间选择,请重新输入:");
    }

}
Student *judge_find(void *po,int s,void *say[],void (*ff)(Student *))//查找学生信息
{
    Student *p=head;

    while (p)
    {
        if (strcmp(po,(char *)p+s)==0&&p!=po)//通过字符串比较
        {
            print_set(say[0]);

            (*ff)(p);//调用指针函数

            return p;//这个返回值作用不大~~其实是判断是否找到该学生信息
        }

        p=p->date;
    }

    print_set(say[1]);

    return NULL;
}

void dump_2(Student *p)//这个空函数是用来缓冲的~
{

}

void creat()//创建//追加信息
{
    Student *p=head;

    if (judge_empty("0000","0000"))
    {
        p=head=(Student *)malloc(LEN);//判断空表
        head->date=NULL;
        head->back=NULL;
    }
    else
    {
        while (p->date)   //追加信息
        {
            p->date->back=p;
            p=p->date;
        }

        p->date=(Student *)malloc(LEN);
        p->date->back=p;
        p=p->date;
        p->date=NULL;
    }

    printf("现在正在创建第%d个学生的信息\n\n",n+1);

    input(p);

    printf("添加成功……\n");
}

void input(Student *p)//输入信息
{
    char *say[]={"2001","0000"};//初始化字库标记

    n++;
    printf("请输入学生学号");

    do
    {
        judge_input("%s",p->num);
    }while (judge_find(p->num,MEMBER(head->num),say,print_one)!=NULL);

    printf("请输入学生姓名");

    judge_input("%s",p->name);

    printf("请输入学生成绩");

    judge_input("%d",&p->score);
}

void print_out()//输出信息
{
    Student *p=head;

    if (judge_empty("4001","3100"))
        return;

    printf("现在统计人数有%d人\n",n);

    while (p)
    {
        print_one(p);
        p=p->date;
    }

    system("pause");
}
void insert(Student *p)//插入函数
{
    Student *pi=NULL;

    print_one(p);

    printf("\n");

    if (judge_continue("3134","3100")==0)
        return;

    pi=(Student *)malloc(LEN);

    input(pi);

    insert_perform(p,pi);
    printf("插入成功!\n");

    return;
}

void insert_perform(Student *p1,Student *p2)//插入执行主体
{
    if (p1==head)
    {
        p2->date=head;
        p2->back=NULL;
        head->back=p2;
        head=p2;

        return;
    }

    p2->back=p1->back;
    p1->back->date=p2;
    p2->date=p1;
    p1->back=p2;

    return;
}

void del(Student *p)//删除函数
{
    print_one(p);

    printf("\n");

    if (judge_continue("3135","3100")==0)
        return;

    del_perform(p);

    printf("该学生信息已成功删除!\n");
    system("pause");
    return;
}
void del_perform(Student *p)//删除执行主体
{
    if (p==head&&p->date==NULL)//当只有一个节点时
    {
        free(p);
        head=NULL;
        n--;
    }
    else if (p==head&&p->date!=NULL)//当删除节点在头指针并且不止一个节点时
    {
        p=p->date;
        free(p->back);
        p->back=NULL;
        head=p;
        n--;
    }
    else if (p->date!=NULL)
    {
        p->back->date=p->date;//一般情况下
        p->date->back=p->back;
        free(p);
        n--;
    }
    else
    {
        p->back->date=NULL;//当删除节点在尾部时
        free(p);
        n--;
    }
}
void change(Student *p)//修改函数
{

    print_one(p);

    printf("\n");

    if (judge_continue("3136","3100")==0)
        return;

    menu(0,6,p,NULL);//调用菜单

}
void find_member(void *s,void *p,void *say[],void (*ff)(Student *),int k)//按关键信息查找
{

    print_set(say[2]);

    judge_input(s,p);

    judge_find(p,k,say,ff);

}
void empty_list(void *say)//清空信息
{
    Student *p=head;
    if (judge_empty("4001","3100"))
    {
        Sleep(2000);
        return;
    }

    while (p->date)
    {
        p=p->date;
        free(p->back);
        n--;
    }

    free(p);
    n--;

    head=NULL;

    print_set(say);

    return;
}

float fine_average(int k)//查找平均分
{
    Student *p=head;
    float ave=0;

    while (p)
    {
        ave+=*((char *)p+k);
        p=p->date;
    }

    return ave/n;
}

void sorting(int k,int (*f)(Student *p1,Student *p2,int k))//排序
{
    Student *p1=head;
    Student *p2=head;
    Student *p3=head;
    Student *pt=head;

    while (p3->date)
    {
        p1=p2=p3;

        while (p1->date)
        {
            if (f(p1,p2,k))//具体排序规则
                p2=p1;

            p1=p1->date;
        }

        if (p2!=p3)
        {    
            pt=(Student *)malloc(LEN);
            *pt=*p2;
            insert_perform(p3,pt);//插入
            del_perform(p2);//删除
            n++;//后续处理~
        }
        else
            p3=p3->date;
    }
}

int sorting_max_str(Student *p1,Student *p2,int k)//从大到小排--字符串排序
{
    if (strcmp((char *)p1+k,(char *)p2+k)>0)
        return 1;

    return 0;
}

int sorting_min_str(Student *p1,Student *p2,int k)//从小到大排
{
    if (strcmp((char *)p1+k,(char *)p2+k)<0)
        return 1;

    return 0;
}

int sorting_max_num(Student *p1,Student *p2,int k)//内容排序
{
    if (*((char *)p1+k)>*((char *)p2+k))
        return 1;

    return 0;
}

int sorting_min_num(Student *p1,Student *p2,int k)
{
    if (*((char *)p1+k)<*((char *)p2+k))
        return 1;

    return 0;
}

void find_one(int k,int (*f)(Student *p1,Student *p2,int k))//查找信息
{
    Student *p1=head;
    Student *p2=head;

    while (p1)
    {
        if (f(p1,p2,k))//具体查找规则
             p2=p1;

        p1=p1->date;
    }

    p1=head;

    while (p1)
    {
        if (strcmp((char *)p1+k,(char *)p2+k)==0)
            print_one(p1);

        p1=p1->date;
    }

}


void file_set(void *say[],void *st,void (*f)(FILE **fp))//文件初始化数据~
{
    FILE *fp=NULL;

    int flag=0;

    char s[100]="\0";

    if (judge_continue(say[0],say[1])==0)
        return;

    print_set(say[2]);

    judge_input("%[^\n]%*c",s);

    if ((fp=fopen(s,st))==NULL)
    {
        printf("无法打出此文件\n");
        print_set("3100");
        Sleep(2000);
        return;
    }

    f(&fp);
}
void ch_ferror(FILE **fp,int k)//简单判断文件读写是否出错(这个可以完善)
{
    
    if (ferror(*fp)||k==0)
    {
        printf("警告,文件录入异常!\n");
        system("pause");
        clearerr(*fp);
    }
}
void save(FILE **fp)//保存数据
{
    Student *p=head;

    int flag=0;

    while (p)
    {
        ch_ferror(fp,fprintf(*fp,"%s ",p->num));//检查文件是否录入异常
        ch_ferror(fp,fprintf(*fp,"%s ",p->name));
        ch_ferror(fp,fprintf(*fp,"%d\n",p->score));

        p=p->date;
    }

    printf("保存完毕\n");

    fclose(*fp);

    print_set("3100");

    return;
}
void load(FILE **fp)//读取数据
{

    Student *p=head;//

    int flag=0;

    if (judge_empty("0000","0000")==0)
        empty_list("0000");

    n=1;
    p=head=(Student *)malloc(LEN);//为头节点分配空间
    p->back=NULL;

    while (1)
    {
        ch_ferror(fp,fscanf(*fp,"%s ",p->num));
        ch_ferror(fp,fscanf(*fp,"%s ",p->name));
        ch_ferror(fp,fscanf(*fp,"%d%*c",&p->score));//%*c可以不要~~~

        if (feof(*fp))
            break;

        p->date=(Student *)malloc(LEN);
        p->date->back=p;
        p=p->date;
        n++;
    }

    n--;
    p=p->back;//读取完毕人数要要减1~
    free(p->date);
    p->date=NULL;

    printf("读取完毕\n");

    fclose(*fp);

    print_set("3100");

    return;
}


[此贴子已经被作者于2017-1-6 09:23编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 01:59
核心利益
Rank: 2
等 级:论坛游民
威 望:2
帖 子:19
专家分:44
注 册:2016-12-31
收藏
得分:7 
向你学习,虽然来得晚,感觉长知识
2017-01-06 08:29
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 核心利益
其实我们学校没有布置什么大型的课程设计,但看见贴上关于信息管理系统的贴有很多,又问过一下,很多学校都有要求做,于是我自己动手做了一下~来对自己的编程能力的一种检验~
我本来打算写个新手版的,让大家能参考参考,但发现我写这种模式感觉不错,而写新手版的对我感觉好像发水帖……虽然初学者也许会难以理解,但感觉里面可以学到的东西很多,包括本人做这个的时候~



[此贴子已经被作者于2017-1-6 09:27编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 08:59
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
突然发现一个小问题~读取信息时竟然忘记清空链表,造成不必要的空间浪费,(我当时设计清空链表函数就是用在这里的,做完后却忘了)现已修正~~~

9:27再更~

更新了文件录入是否异常判断~~~对录入文档存在非法数据进行提示~

[此贴子已经被作者于2017-1-6 09:30编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 09:01
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:7 
有才

DO IT YOURSELF !
2017-01-06 09:06
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 wp231957
多谢大神点赞~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 09:25
xw0314
Rank: 2
等 级:论坛游民
帖 子:2
专家分:14
注 册:2016-12-23
收藏
得分:7 
回复 4楼 九转星河
我表示完全无压力,函数指针用的好
2017-01-06 10:30
山丹老司机
Rank: 2
等 级:论坛游民
帖 子:20
专家分:12
注 册:2016-11-1
收藏
得分:0 
大神,求抱大腿啊。
2017-01-12 11:47
一の小菜鸟
Rank: 1
等 级:新手上路
帖 子:20
专家分:1
注 册:2017-1-12
收藏
得分:0 
wow,大神这么长的程序你花了多长时间啊,,有一点儿错误的话怎么调试啊?!真厉害的说,羡慕
2017-01-13 18:39
快速回复:信息管理系统
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.308724 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved