学生信息系统简单实现C语言

来源:互联网 发布:腾讯php面试题 编辑:程序博客网 时间:2024/04/30 11:30
/* * name:Student_information.cpp * author:xdc * time:2013年3月31日15:58:58 * * 问题描述: * 学籍管理问题中的数据元素包括学号、姓名、性别、出生日期、政治面貌和家庭住址等数据项。 * 功能要求: * ⑴ 插入:将某学生的基本信息插入到登记表中; *⑵ 删除:将满足条件的基本信息删除; * ⑶ 修改:对基本信息的数据项进行修改; *⑷ 查询:查找满足条件的学生; *⑸ 输出:将登记表中的全部(或满足条件)基本信息输出。 * *实现要点: *对学籍登记表采用顺序存储结构(也可以采用其他存储结构),在建立表时,由登记表的书写形式转化顺序表存储结构,还要把学生的书面形式转化为具体的类。 * *以上功能是基本内容,可以自行扩展。如: *  (1)排序或找前3名; *  (2)用文件来存储数据。 */# include <stdio.h># include <malloc.h>//包含了malloc函数# include <stdlib.h>//包含了exit函数# include <string.h>//包含strcpy函数# include <time.h>//测试运行时间/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*///学生基本信息typedef struct Student{char name[21];//姓名//__int64 sid;//学号,主键long sid;//学号,主键char ssex[3];//性别char nation[11];//民族//__int64 date_of_birth;//生日long date_of_birth;//生日char poli_sta[11];//政治面貌char addr[101];//家庭住址char depart[21];//院系char major[21];//专业//更多信息操作相同}* PSTU, STU;//用于操作学生信息集struct Stu_ctrl{PSTU pBase;//存储的是数组第一个元素的地址long len;//数组所能容纳的最大元素的个数long cnt;//当前数组有效元素的个数};void init_stu(struct Stu_ctrl * pStu, long length);//初始化bool append_stu(struct Stu_ctrl * pStu, STU val);//追加,追加和插入构成输入bool insert_stu(struct Stu_ctrl * pStu, long pos, STU val);//按位置插入,pos的值从1开始bool delete_stu_pos(struct Stu_ctrl * pStu, long pos, PSTU pVal);//按位置删除bool delete_stu_val(struct Stu_ctrl * pStu, char * prop, char * val);//按值删除long get(struct Stu_ctrl * pStu);//获取总人数long find(struct Stu_ctrl * pStu, char * prop, char * val);//按值查找并输出bool revise_stu(struct Stu_ctrl * pStu, char * prop, char * be_val, char * aft_val);//修改bool is_empty(struct Stu_ctrl * pStu);//判断是否为空bool is_full(struct Stu_ctrl * pStu);//判断是否为满void sort_stu_id(struct Stu_ctrl * pStu);//按学号排序void show_stu(struct Stu_ctrl * pStu);//整体输出void show_stu_one(struct Stu_ctrl * pStu, long pos);//单个输出void inversion_stu(struct Stu_ctrl * pStu);//逆置bool BF(char * S, char * T);//字符串匹配bool is_string(char * A, char * B);//判断字符串相等void input_stu(PSTU val);//信息输入bool top_n_stu(struct Stu_ctrl * pStu, /*char * prop,*/ long n);//前n名void add_arr_stu(struct Stu_ctrl * pStu);//添加学生信息bool revise_all_stu(struct Stu_ctrl * pStu, char * prop);//更据姓名或学号修改学生所有信息void run_stu_infor_test(struct Stu_ctrl * pStu);//测试函数///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////主函数,程序入口int main(void){double t;char ch;struct Stu_ctrl sdu_stu;//STU val = {"xdc", 2010, "男", "汉", 1990, "党员", "山东省济南市山大南路27号", "数学学院", "信息安全"};//init_stu(&sdu_stu, 10000);//假设用于存储10000个学生的信息printf("欢迎试用山东大学数学学院学生信息管理系统!\n\n");t=clock();run_stu_infor_test(&sdu_stu);//测试函数//测试时间    printf("耗时%f毫秒!(含信息输入时间)\n", (clock()-t));     scanf("%c", &ch);//system("Student_information4.1.exe>1.txt");return (0);}/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*//*************************************测试函数*************************************************************/void run_stu_infor_test(struct Stu_ctrl * pStu){STU val = {"xdc", 2010, "男", "汉", 1990, "党员", "山东省济南市山大南路27号", "数学学院", "信息安全"};init_stu(pStu, 10000);//假设用于存储10000个学生的信息printf("您还没有学生信息\n");append_stu(pStu, val);//添加初始信息add_arr_stu(pStu);//添加信息//input_stu(&val);//append_stu(pStu, val);//追加printf("插入信息\n\n");insert_stu(pStu, 2, val);//插入printf("排序\n\n");sort_stu_id(pStu);//按学号排序show_stu(pStu);//输出printf("删除信息\n\n");delete_stu_pos(pStu, 1, &val);//删除show_stu(pStu);//输出//if (BF("abbdsdh", "a"))//printf("suc\n");append_stu(pStu, val);//添加初始信息append_stu(pStu, val);//添加初始信息append_stu(pStu, val);//添加初始信息append_stu(pStu, val);//添加初始信息printf("查找信息\n\n");find(pStu, "name=", "xdc");//show_stu_one(pStu, 1);printf("删除信息\n\n");delete_stu_val(pStu, "name=", "x");//按值删除//if (is_string("qw ", "qw "))//printf("su213\n");printf("前n名\n\n");top_n_stu(pStu, 2);//free(sdu_stu);//system("Student_information4.1.exe>1.txt");}/*************************************信息表初始化*************************************************************/void init_stu(struct Stu_ctrl * pStu, long length){pStu->pBase = (PSTU)malloc(sizeof(STU) * length);if (NULL == pStu->pBase){printf("动态内存分配失败!\n");exit(-1); //终止整个程序}else{pStu->len = length;pStu->cnt = 0;}return;}/********************************判断是否为空*********************************************************/bool is_empty(struct Stu_ctrl * pStu){if (0 == pStu->cnt)return true;elsereturn false;}/*******************************判断是否为满***********************************************************************/bool is_full(struct Stu_ctrl * pStu){if (pStu->cnt == pStu->len)return true;elsereturn false;}/*******************************输出信息***********************************************************************/void show_stu(struct Stu_ctrl * pStu){printf("姓名\t学号\t性别\t民族\t出生日期\t政治面貌\t家庭住址\t院系\t专业\n");if ( is_empty(pStu) )   {printf("学生信息表为空!\n");}else{for (long i=0; i < pStu->cnt; ++i){//姓名printf("%s\t", pStu->pBase[i].name);//学号printf("%ld\t", pStu->pBase[i].sid); //性别printf("%s\t", pStu->pBase[i].ssex); //民族printf("%s\t", pStu->pBase[i].nation); //出生日期printf("%ld\t", pStu->pBase[i].date_of_birth); //政治面貌printf("%s\t", pStu->pBase[i].poli_sta); //家庭住址printf("%s\t", pStu->pBase[i].addr); //院系printf("%s\t", pStu->pBase[i].depart); //专业printf("%s\n", pStu->pBase[i].major); }}}/*******************************追加***********************************************************************/bool append_stu(struct Stu_ctrl * pStu, STU val){//满是返回falseif ( is_full(pStu) )return false;//不满时追加pStu->pBase[pStu->cnt] = val;(pStu->cnt)++;return true;}/*******************************按位置插入***********************************************************************/bool insert_stu(struct Stu_ctrl * pStu, long pos, STU val){long i;if (is_full(pStu))return false;if (pos<1 || pos>pStu->cnt+1)  //return false;for (i=pStu->cnt-1; i>=pos-1; --i){pStu->pBase[i+1] = pStu->pBase[i];}pStu->pBase[pos-1] = val;(pStu->cnt)++;return true;}/*******************************按位置删除**********************************************************************/bool delete_stu_pos(struct Stu_ctrl * pStu, long pos, PSTU pVal){int i;if ( is_empty(pStu) )return false;if (pos<1 || pos>pStu->cnt)return false;*pVal = pStu->pBase[pos-1];for (i=pos; i<pStu->cnt; ++i){pStu->pBase[i-1] = pStu->pBase[i];}pStu->cnt--;return true;}/*******************************逆置***********************************************************************/void inversion_stu(struct Stu_ctrl * pStu){int i = 0;int j = pStu->cnt-1;STU t;while (i < j){t = pStu->pBase[i];pStu->pBase[i] = pStu->pBase[j];pStu->pBase[j] = t;++i;--j;}return;}/*******************************按学号排序***********************************************************************/void sort_stu_id(struct Stu_ctrl * pStu){long i, j;STU t;for (i=0; i<pStu->cnt; ++i){for (j=i+1; j<pStu->cnt; ++j){if (pStu->pBase[i].sid > pStu->pBase[j].sid){t = pStu->pBase[i];pStu->pBase[i] = pStu->pBase[j];pStu->pBase[j] = t;}}}}/*******************************按值查找并输出******************************************************/long find(struct Stu_ctrl * pStu, char * prop, char * val){long i;long sum = 0;int temp = 0;if (is_string(prop, "name="))temp = 1;else if (is_string(prop, "sid="))temp = 2;else if (is_string(prop, "ssex="))temp = 3;else if (is_string(prop, "nation="))temp = 4;else if (is_string(prop, "date_of_birth="))temp = 5;else if (is_string(prop, "poli_sta="))temp = 6;else if (is_string(prop, "addr="))temp = 7;else if (is_string(prop, "depart="))temp = 8;else if (is_string(prop, "major="))temp = 9;else temp = 0;//printf("temp = %d", temp);printf("姓名\t学号\t性别\t民族\t出生日期\t政治面貌\t家庭住址\t院系\t专业\n");switch (temp){case 1:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].name, val)){show_stu_one(pStu, i);sum++;}}break;case 2:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF((char *)pStu->pBase[i].sid, val)){show_stu_one(pStu, i);sum++;}}break;case 3:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].ssex, val)){show_stu_one(pStu, i);sum++;}}break;case 4:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].nation, val)){show_stu_one(pStu, i);sum++;}}break;case 5:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF((char *)pStu->pBase[i].date_of_birth, val)){show_stu_one(pStu, i);sum++;}}break;case 6:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].poli_sta, val)){show_stu_one(pStu, i);sum++;}}break;case 7:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].addr, val)){show_stu_one(pStu, i);sum++;}}break;case 8:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].depart, val)){show_stu_one(pStu, i);sum++;}}break;case 9:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].major, val)){show_stu_one(pStu, i);sum++;}}break;default :printf("属性输入有误!\n");}printf("以上为您找到%ld条结果!\n", sum);return sum;}/*******************************字符串匹配*********************************************************************/bool BF(char * S, char * T){if (strstr(S, T))return (true);elsereturn (false);/*int i = 0, j = 0;while ((S[i] != '\0') && (T[j] != '\0')){if (S[i] == T[j]){i++;j++;}else{i = i-j+1;j = 0;}}if (T[j] == '\0')return (true);elsereturn (false);*/}/*******************************输出单个信息************************************************************/void show_stu_one(struct Stu_ctrl * pStu, long pos){//printf("姓名\t学号\t性别\t民族\t出生日期\t政治面貌\t家庭住址\t院系\t专业\n");//姓名printf("%s\t", pStu->pBase[pos].name);//学号printf("%ld\t", pStu->pBase[pos].sid); //性别printf("%s\t", pStu->pBase[pos].ssex); //民族printf("%s\t", pStu->pBase[pos].nation); //出生日期printf("%ld\t", pStu->pBase[pos].date_of_birth); //政治面貌printf("%s\t", pStu->pBase[pos].poli_sta); //家庭住址printf("%s\t", pStu->pBase[pos].addr); //院系printf("%s\t", pStu->pBase[pos].depart); //专业printf("%s\n", pStu->pBase[pos].major); }/*******************************判断字符串是否相等**********************************************/bool is_string(char * A, char * B){unsigned int i = strlen(A);unsigned int sum = 0;if (i != strlen(B))return (false);for (unsigned int j=0; j<i; j++){if (A[j] == B[j])sum++;}if (sum == i)return (true);elsereturn (false);}/*******************************按值删除********************************************************/bool delete_stu_val(struct Stu_ctrl * pStu, char * prop, char * val){long i;long sum = 0;int temp = 0;PSTU pval = pStu->pBase;//存储删除的值if (is_string(prop, "name="))temp = 1;else if (is_string(prop, "sid="))temp = 2;else if (is_string(prop, "ssex="))temp = 3;else if (is_string(prop, "nation="))temp = 4;else if (is_string(prop, "date_of_birth="))temp = 5;else if (is_string(prop, "poli_sta="))temp = 6;else if (is_string(prop, "addr="))temp = 7;else if (is_string(prop, "depart="))temp = 8;else if (is_string(prop, "major="))temp = 9;else temp = 0;//printf("temp = %d", temp);switch (temp){case 1:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].name, val)){delete_stu_pos(pStu, i, pval);sum++;}}break;case 2:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF((char *)pStu->pBase[i].sid, val)){delete_stu_pos(pStu, i, pval);sum++;}}break;case 3:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].ssex, val)){delete_stu_pos(pStu, i, pval);sum++;}}break;case 4:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].nation, val)){delete_stu_pos(pStu, i, pval);sum++;}}break;case 5:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF((char *)pStu->pBase[i].date_of_birth, val)){delete_stu_pos(pStu, i, pval);sum++;}}break;case 6:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].poli_sta, val)){delete_stu_pos(pStu, i, pval);sum++;}}break;case 7:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].addr, val)){delete_stu_pos(pStu, i, pval);sum++;}}break;case 8:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].depart, val)){delete_stu_pos(pStu, i, pval);sum++;}}break;case 9:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].major, val)){delete_stu_pos(pStu, i, pval);sum++;}}break;default :printf("属性输入有误!\n");}printf("为您找到%ld条结果.\n", sum);printf("已为您删除成功!\n");return (true);}/*******************************按值修改********************************************************/bool revise_stu(struct Stu_ctrl * pStu, char * prop, char * be_val, char * aft_val){long i;int temp = 0;if (is_string(prop, "name="))temp = 1;else if (is_string(prop, "sid="))temp = 2;else if (is_string(prop, "ssex="))temp = 3;else if (is_string(prop, "nation="))temp = 4;else if (is_string(prop, "date_of_birth="))temp = 5;else if (is_string(prop, "poli_sta="))temp = 6;else if (is_string(prop, "addr="))temp = 7;else if (is_string(prop, "depart="))temp = 8;else if (is_string(prop, "major="))temp = 9;else temp = 0;//printf("temp = %d", temp);switch (temp){case 1:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].name, be_val)){strcpy(pStu->pBase[i].name, aft_val);}}break;case 2:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF((char *)pStu->pBase[i].sid, be_val)){strcpy((char *)pStu->pBase[i].sid, aft_val);}}break;case 3:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].ssex, be_val)){strcpy(pStu->pBase[i].ssex, aft_val);}}break;case 4:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].nation, be_val)){strcpy(pStu->pBase[i].nation, aft_val);}}break;case 5:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF((char *)pStu->pBase[i].date_of_birth, be_val)){strcpy((char *)pStu->pBase[i].date_of_birth, aft_val);}}break;case 6:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].poli_sta, be_val)){strcpy(pStu->pBase[i].poli_sta, aft_val);}}break;case 7:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].addr, be_val)){strcpy(pStu->pBase[i].addr, aft_val);}}break;case 8:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].depart, be_val)){strcpy(pStu->pBase[i].depart, aft_val);}}break;case 9:for (i=0; i<pStu->cnt; i++){//模式匹配if (BF(pStu->pBase[i].major, be_val)){strcpy(pStu->pBase[i].major, aft_val);}}break;default :printf("属性输入有误!\n");return (false);}printf("修改成功!\n");return (true);}/**********************************基本信息输入****************************************************/void input_stu(PSTU val){int i=1;printf("请输入姓名(10个字以内):");i = 1;while (i){scanf("%s", &(val->name));if (strlen(val->name) > 20){printf("10字以内!请重新输入!\n");setbuf(stdin, NULL);//清空缓存getchar();i = 1;}elsei = 0;}//printf("您的输入是:%s\n", val->name);//testprintf("请输入学号(10位以内):");i = 1;while (i){scanf("%ld", &(val->sid));//需判断输入是否为数字if (val->sid >= 4000000000 || val->sid <0){printf("19位以内纯数字!请重新输入!\n");setbuf(stdin, NULL);//清空缓存getchar();i = 1;}elsei = 0;}//printf("您的输入是:%ld\n", val->sid);//testprintf("请输入性别(1个字):");i = 1;while (i){scanf("%s", &(val->ssex));if (strlen(val->ssex) > 2){printf("1个字!请重新输入!\n");setbuf(stdin, NULL);//清空缓存i = 1;}elsei = 0;}//printf("您的输入是:%s\n", val->ssex);//testprintf("请输入民族(10个字以内):");i = 1;while (i){scanf("%s", &(val->nation));if (strlen(val->nation) > 20){printf("10字以内!请重新输入!\n");setbuf(stdin, NULL);//清空缓存getchar();i = 1;}elsei = 0;}//printf("您的输入是:%s\n", val->nation);//testprintf("请输入出生日期(8位数字):");i = 1;//此处反复出错,究其原因是__int64在.cpp文件中会出问题,.c文件正常while (i){getchar();scanf("%ld", &(val->date_of_birth));//printf("您的输入是:%ld\n", val->date_of_birth);//test//测试中整型变量接收字符后会crashif (((val->date_of_birth) > 99999999) || ((val->date_of_birth) < 10000000))//if (strlen((char * )val->date_of_birth) != 8 ){printf("8位数字!请重新输入!\n");setbuf(stdin, NULL);//清空缓存i = 1;}elsei = 0;}printf("请输入政治面貌(10字以内):");i = 1;while (i){scanf("%s", &(val->poli_sta));if (strlen(val->poli_sta) > 20){printf("10字以内!请重新输入!\n");setbuf(stdin, NULL);//清空缓存i = 1;}elsei = 0;}printf("请输入家庭住址(50字以内):");i = 1;while (i){scanf("%s", &(val->addr));if (strlen(val->addr) > 100){printf("50字以内!请重新输入!\n");setbuf(stdin, NULL);//清空缓存i = 1;}elsei = 0;}printf("请输入院系(10字以内):");i = 1;while (i){scanf("%s", &(val->depart));if (strlen(val->depart) > 20){printf("10字以内!请重新输入!\n");setbuf(stdin, NULL);//清空缓存i = 1;}elsei = 0;}printf("请输入专业(10字以内):");i = 1;while (i){scanf("%s", &(val->major));if (strlen(val->major) > 20){printf("10字以内!请重新输入!\n");setbuf(stdin, NULL);//清空缓存i = 1;}elsei = 0;}}/**********************************输出前n名****************************************************/bool top_n_stu(struct Stu_ctrl * pStu /*, char * prop*/, long n){sort_stu_id(pStu);if (pStu->cnt < n){printf("学生不足%ld, 为你输出%ld条信息.\n", n, pStu->cnt);show_stu(pStu);return (true);}else{printf("排名前%ld的学生是:\n", n);for (long i=0; i<n; i++)show_stu_one(pStu, i);return (true);}}/**********************************添加学生信息****************************************************/void add_arr_stu(struct Stu_ctrl * pStu){char choice = 'y';int temp = 1;STU val;setbuf(stdin, NULL);//清空缓存printf("添加学生信息?y/n\n");scanf("%c", &choice);setbuf(stdin, NULL);//清空缓存if (choice == 'y')temp = 1;elsetemp = 0;while (temp){input_stu(&val);if (append_stu(pStu, val)){printf("信息添加成功。是否继续添加?y/n\n");getchar();//用于提取"\n",以便继续添加scanf("%c", &choice);setbuf(stdin, NULL);//清空缓存}else{printf("糟糕!信息添加好像不成功。是否重新添加?y/n\n");getchar();scanf("%c", &choice);setbuf(stdin, NULL);//清空缓存}if (choice == 'y')temp = 1;elsetemp = 0;}}/**********************************修改学生信息****************************************************///待完善bool revise_all_stu(struct Stu_ctrl * pStu, char * prop){return (true);}/**********************************获取总人数****************************************************/long get(struct Stu_ctrl * pStu){return (pStu->cnt);}