/*大作业SIMS*/
//头文件
 #ifndef __FUNC_C__
#define __FUNC_C__ #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 128
#define M 100 //账户最多人数
#define N 1000 //学生最多人数
#define USR_NAME_LEN 20
#define USR_PWD_LEN 20 typedef int USR_ROLE; //账号信息
typedef struct usr_account_tag
{
char usr_name[USR_NAME_LEN];
char usr_pwd[USR_PWD_LEN];
USR_ROLE usr_role; //管理员设置为1,其它设置为0
struct usr_account_tag *pNext_Usr_Account;
}USR_ACCOUNT, *pUSR_ACCOUNT; //学生信息
typedef struct usr_infor_tag
{
int usr_id; //学号
char usr_name[USR_NAME_LEN]; //姓名
int usr_course_id; //课程号
double usr_course_score; //课程分数
struct usr_infor_tag *pNext_Usr_Infor; //下一个学生信息 }USR_INFOR, *pUSR_INFOR; USR_ROLE system_init(pUSR_ACCOUNT *account_head, pUSR_INFOR *usr_infor_head, char *addres); USR_ROLE system_menu(USR_ROLE type);
USR_ROLE search_menu(USR_ROLE type);
void usr_infor_delete_menu(void);
void account_search_menu(void);
void show_usr_info(pUSR_INFOR pphead);
void show_usr_account(pUSR_ACCOUNT pphead); void search_usr_info_id(pUSR_INFOR *pphead, int id);
void search_usr_info_name(pUSR_INFOR *pphead, char *name); void save_usr_info(pUSR_INFOR *pphead, char *addres);
void add_usr_info(pUSR_INFOR *pphead, char *addres);
void delet_usr_info_by_id(pUSR_INFOR *pphead, int id);
void delet_usr_info_by_name(pUSR_INFOR *pphead, char name);
void delet_usr_account_by_name(pUSR_ACCOUNT *pphead, char* name);
void updat_usr_infor_by_id(pUSR_INFOR *pphead, int id);
void update_usr_account_by_name(pUSR_ACCOUNT *pphead, char* name);
void add_usr_account(pUSR_ACCOUNT *pphead, char *addres);
void save_usr_account(pUSR_ACCOUNT *pphead, char *addres);
void search_usr_account_by_name(pUSR_ACCOUNT *pphead, char* name); #endif


//函数部分,没有实现返回功能,因为考虑不周没有,函数没有返回值,每次打开只能进行一次操作就退出,

 #include "sims.h"

 USR_ROLE system_menu(USR_ROLE type)
{
int number;
int search_number;
if (type == ){
system("cls");
printf("\n*******************************************************************************\n");
printf("***************Student Information Management System*****************\n");
printf("*******************************************************************************\n");
printf("\n\n\t\t1. search student information");
printf("\n\t\t2. add student information");
printf("\n\t\t3. update student information");
printf("\n\t\t4. delete student information");
printf("\n\t\t5. add user account");
printf("\n\t\t6. update user account");
printf("\n\t\t7. delete user account");
printf("\n\t\t8. search user account");
printf("\n\t\t9. exit");
printf("\n\n\nselect a number between 1--9:");
return type;
}
else if (type == )
{
system("cls");
printf("\n*******************************************************************************\n");
printf("***************Student Information Management System****************\n");
printf("*******************************************************************************\n");
printf("\n\n\t\t1. search student information");
/*
printf("\n\t\t2. add student information");
printf("\n\t\t3. update student information");
printf("\n\t\t4. delete student information");
printf("\n\t\t5. add user account");
printf("\n\t\t6. update user account");
printf("\n\t\t7. delete user account");
printf("\n\t\t8. search user account");
*/
printf("\n\t\t9. exit");
printf("\n\n\nselect a number:");
return type;
}
else
{
return;
}
} USR_ROLE search_menu(USR_ROLE type)
{
system("cls");
if (type == ){
printf("\n0. search all");
printf("\n1. search by id");
printf("\n2. search by name");
printf("\n3. return");
printf("\nselect a number:");
}
else
{
printf("\n1. search by id");
printf("\n2. search by name");
printf("\n3. return");
printf("\nselect a number:"); }
return type;
} void account_search_menu(void)
{
system("cls");
printf("\n0. search all account");
printf("\n1. search account by name");
printf("\n2. exit");
printf("\nselect a number:"); } void usr_infor_delete_menu(void)
{
system("cls");
printf("\n1. delete by id");
printf("\n2. delete by name");
printf("\n3. return");
printf("\nselect a number:");
fflush(stdin);
} void show_usr_info(pUSR_INFOR pphead)
{
system("cls");
while (pphead != NULL){
printf("%-5d%-10s%-3d%7.2f\n", pphead->usr_id, pphead->usr_name, pphead->usr_course_id, pphead->usr_course_score);
pphead = pphead->pNext_Usr_Infor;
}
printf("\n");
} void show_usr_account(pUSR_ACCOUNT pphead)
{
system("cls");
while (pphead != NULL){
fprintf(stdout, "%-15s%-15s%3d\n", pphead->usr_name, pphead->usr_pwd, pphead->usr_role);
pphead = pphead->pNext_Usr_Account;
printf("\n");
}
} void search_usr_info_id(pUSR_INFOR *pphead, int id)
{
pUSR_INFOR pcur;
FILE *fp;
pcur = *pphead;
while (pcur != NULL){
if (pcur->usr_id == id){
break;
}
else
pcur = pcur->pNext_Usr_Infor;
}
if (pcur != NULL){
printf("%-5d%-10s%-3d%7.2f\n", pcur->usr_id, pcur->usr_name, pcur->usr_course_id, pcur->usr_course_score);
}
else
{
printf("cannot find\n");
}
} void search_usr_info_name(pUSR_INFOR *pphead, char *name)
{
pUSR_INFOR pcur;
FILE *fp;
pcur = *pphead;
while (pcur != NULL){
if (strcmp(name,pcur->usr_name)==){
break;
}
else
pcur = pcur->pNext_Usr_Infor;
}
if (pcur != NULL){
printf("%-5d%-10s%-3d%7.2f\n", pcur->usr_id, pcur->usr_name, pcur->usr_course_id, pcur->usr_course_score);
}
else
{
printf("cannot find\n");
}
} void search_usr_account_by_name(pUSR_ACCOUNT *pphead, char* name)
{
pUSR_ACCOUNT pcur;
pcur = *pphead;
while (pcur != NULL){
if (strcmp(pcur->usr_name, name) == )
break;
else
pcur = pcur->pNext_Usr_Account;
}
if (pcur != NULL){
fprintf(stdout, "%-15s%-15s%3d\n", pcur->usr_name, pcur->usr_pwd, pcur->usr_role);
}
else{
fprintf(stdout, "donot exist the name\n");
}
} void add_usr_info(pUSR_INFOR *pphead, char *addres)
{
pUSR_INFOR pnew = NULL;
pUSR_INFOR pcur, ppre;
char line[LEN];
system("cls");
fflush(stdin);
printf("input: id name course_id course_score\n");
while (memset(line, , sizeof(line)), fgets(line, sizeof(line), stdin) != NULL){
pnew = (pUSR_INFOR)calloc(, sizeof(USR_INFOR));
sscanf(line, "%d%s%d%lf", &pnew->usr_id, pnew->usr_name, &pnew->usr_course_id, &pnew->usr_course_score);
pcur = *pphead;
ppre = NULL;
//想增加判断学号是否已经存在,存在就拒接添加。
while (pcur != NULL)
{
if (pcur->usr_id == pnew->usr_id)
break;
else
pcur = pcur->pNext_Usr_Infor;
}
if (pcur == NULL){
pcur = *pphead;
ppre = NULL;
while (pcur != NULL && pcur->usr_id <= pnew->usr_id){ //按照学号升序排列
ppre = pcur;
pcur = pcur->pNext_Usr_Infor;
}
if (ppre == NULL){
pnew->pNext_Usr_Infor = *pphead;
*pphead = pnew;
}
else
{//中间和结尾都是这样,结尾时pcur为空
ppre->pNext_Usr_Infor = pnew;
pnew->pNext_Usr_Infor = pcur;
}
}
else
{
fprintf(stdout, "the %d usr_infor already exist.\n",pcur->usr_id);
}
} } void add_usr_account(pUSR_ACCOUNT *pphead, char *addres)
{
pUSR_ACCOUNT pnew = NULL;
pUSR_ACCOUNT pcur, ppre;
char line[LEN];
system("cls");
fflush(stdin);
printf("input: usr_name\tusr_pwd\tusr_role\n");
while (memset(line, , sizeof(line)), fgets(line, sizeof(line), stdin) != NULL){
pnew = (pUSR_ACCOUNT)calloc(, sizeof(USR_ACCOUNT));
sscanf(line, "%s%s%d", pnew->usr_name, pnew->usr_pwd, &pnew->usr_role);
pnew->pNext_Usr_Account = *pphead;
*pphead = pnew;
}
} void save_usr_account(pUSR_ACCOUNT *pphead, char *addres)
{
pUSR_ACCOUNT pcur;
FILE *fp_config, *fp_usr_account;
char line[LEN];
pcur = *pphead;
if ((fp_config = fopen(addres, "r")) == NULL){
printf("file cannot open fp_config\n");
return;
}
//已知usr_account在第一行,不知道怎么判断?
memset(line, , sizeof(line));
fgets(line, sizeof(line), fp_config);
line[strlen(line)-] = '\0';
if ((fp_usr_account = fopen(line, "w")) == NULL){
printf("file cannot open fp_usr_account\n");
return;
}
fclose(fp_config);
while (pcur != NULL){
if (fprintf(fp_usr_account, "%-10s%-10s%-5d\n", pcur->usr_name,pcur->usr_pwd,pcur->usr_role) == EOF)
printf("write error\n");
pcur = pcur->pNext_Usr_Account;
}
fclose(fp_usr_account);
} void save_usr_info(pUSR_INFOR *pphead, char *addres)
{
pUSR_INFOR pcur;
FILE *fp_config, *fp_usr_infor;
char line[LEN];
pcur = *pphead;
if ((fp_config = fopen(addres, "r")) == NULL){
printf("file cannot open fp_config\n");
return;
}
//已知usr_info在第二行所以采取读两次来调用,没有想到怎么用数组或者链表?
memset(line, , sizeof(line));
//第一行有\n,第二行没有\n
fgets(line, sizeof(line), fp_config);
memset(line, , sizeof(line));
fgets(line, sizeof(line), fp_config);
if ((fp_usr_infor = fopen(line, "w")) == NULL){
printf("file cannot open fp_usr_infor\n");
return;
}
fclose(fp_config);
while (pcur != NULL){
if (fprintf(fp_usr_infor, "%-5d%-10s%-5d%8.2f\n", pcur->usr_id,pcur->usr_name,pcur->usr_course_id,pcur->usr_course_score) == EOF)
printf("write error\n");
pcur = pcur->pNext_Usr_Infor;
}
fclose(fp_usr_infor);
} void delet_usr_info_by_id(pUSR_INFOR *pphead, int id)
{
pUSR_INFOR pcur, ppre;
FILE *fp;
pcur = *pphead;
ppre = NULL;
while (pcur != NULL){
if (pcur->usr_id == id){
break;
}
else{
ppre = pcur;
pcur = pcur->pNext_Usr_Infor;
} }
if (pcur != NULL){
if (ppre == NULL){
//删除第一个结点
*pphead = pcur->pNext_Usr_Infor;
}
else{
ppre->pNext_Usr_Infor = pcur->pNext_Usr_Infor; }
free(pcur);
pcur = NULL;
}
else
{
printf("donot exist in the file.\n");
}
if (*pphead == NULL){
free(*pphead);
*pphead = NULL;
}
} void delet_usr_info_by_name(pUSR_INFOR *pphead, char name)
{
pUSR_INFOR pcur, ppre;
FILE *fp;
pcur = *pphead;
ppre = NULL;
while (pcur != NULL){
if (strcmp(pcur->usr_name,name)==){
break;
}
else{
ppre = pcur;
pcur = pcur->pNext_Usr_Infor;
} }
if (pcur != NULL){
if (ppre == NULL){
//删除第一个结点
*pphead = pcur->pNext_Usr_Infor;
}
else{
ppre->pNext_Usr_Infor = pcur->pNext_Usr_Infor; }
free(pcur);
pcur = NULL;
}
else
{
printf("donot exist in the file.\n");
}
if (*pphead == NULL){
free(*pphead);
*pphead = NULL;
}
} //账户信息不能全部删除,需要加判断???
void delet_usr_account_by_name(pUSR_ACCOUNT *pphead, char* name)
{
pUSR_ACCOUNT pcur, ppre;
char line[LEN];
pcur = *pphead;
ppre = NULL;
while (pcur != NULL && strcmp(pcur->usr_name, name) != ){
ppre = pcur;
pcur = pcur->pNext_Usr_Account;
}
if (pcur != NULL){
ppre->pNext_Usr_Account = pcur->pNext_Usr_Account;
fprintf(stdout, "delete ok.\n");
}
else
{
fprintf(stdout, "delete error, donot exit\n");
} } void updat_usr_infor_by_id(pUSR_INFOR *pphead, int id)
{
pUSR_INFOR pcur;
char line[LEN];
pcur = *pphead;
while (pcur != NULL){
if (pcur->usr_id == id){
break;
}
else
pcur = pcur->pNext_Usr_Infor;
}
if (pcur != NULL){
//只能修改后面三项内容
fflush(stdin);
memset(line, , sizeof(line));
printf("updat NO.%d new infor\nname\tcouse_id\tcours_score:\n ", pcur->usr_id);
fgets(line, sizeof(line), stdin);
sscanf(line, "%s%d%lf", pcur->usr_name, &pcur->usr_course_id, &pcur->usr_course_score); }
else
{
printf("cannot find the id_infor\n");
}
} void update_usr_account_by_name(pUSR_ACCOUNT *pphead, char* name)
{
pUSR_ACCOUNT pcur;
char line[LEN];
pcur = *pphead;
while (pcur != NULL && strcmp(pcur->usr_name, name) != ){
pcur = pcur->pNext_Usr_Account;
}
if (pcur != NULL){
memset(line, , sizeof(line));
fflush(stdin);
fprintf(stdout, "usr_pwd\t\tusr_role:\n");
fgets(line, sizeof(line), stdin);
sscanf(line, "%s%d", pcur->usr_pwd, &pcur->usr_role);
}
else
{
fprintf(stdout, "updata usr_account error\n");
} }

//函数接口设计不好,因此都是主函数调用,程序比较混乱

 #include "sims.h"

 int main(int argc, char *argv[])
{
pUSR_INFOR usr_infor_head = NULL;
pUSR_ACCOUNT account_head = NULL;
char *paddres; //传递配置文件地址
int digit;
int s_digit, d_digit;
int usr_id, delet_id;
char usr_name[LEN] = "";
char usr_account_name[LEN] = "";
USR_ROLE type,s_type; //登陆者身份标示
paddres = (char *)calloc(, sizeof(char));
paddres = argv[];
//加载初始账户密码和学生信息
type = system_init(&account_head, &usr_infor_head, paddres);
s_type = system_menu(type); //以管理员身份登录
if (s_type == ){ fflush(stdin);
scanf("%d", &digit);
while (digit < || digit > ) {
fflush(stdin);
//system("cls");
scanf("%d", &digit);
}
switch (digit){
case :
search_menu(s_type);
scanf("%d", &s_digit);
while (s_digit < || s_digit > ) {
fflush(stdin);
//system("cls");
scanf("%d", &s_digit);
}
switch (s_digit)
{
case :
//show all usr_infor
show_usr_info(usr_infor_head);
break;
case :
//search by id
fflush(stdout);
system("cls");
fflush(stdin);
printf("input usr_id:\n");
scanf("%d", &usr_id);
search_usr_info_id(&usr_infor_head, usr_id);
break;
case :
//search by name
system("cls");
fflush(stdin);
printf("input usr_name:\n");
scanf("%s", usr_name);
search_usr_info_name(&usr_infor_head, usr_name);
break;
case :
return;
//s_type = system_menu(type);
default:
break;
}
break; case :
//add
add_usr_info(&usr_infor_head, argv[]);
save_usr_info(&usr_infor_head, argv[]);
break;
case :
//update by id
fflush(stdout);
system("cls");
fflush(stdin);
printf("input usr_id:\n");
scanf("%d", &usr_id);
updat_usr_infor_by_id(&usr_infor_head, usr_id);
save_usr_info(&usr_infor_head, argv[]);
break;
case :
//delet by id
usr_infor_delete_menu();
scanf("%d", &d_digit);
if (d_digit == ){
system("cls");
fflush(stdin);
printf("input delet_usr_id:\n");
scanf("%d", &delet_id);
delet_usr_info_by_id(&usr_infor_head, delet_id);
save_usr_info(&usr_infor_head, argv[]);
}
else if (d_digit == ){
system("cls");
fflush(stdin);
printf("input delet_usr_name:\n");
scanf("%s",usr_name);
delet_usr_info_by_name(&usr_infor_head, usr_name);
save_usr_info(&usr_infor_head, argv[]);
}
else
{
return;
}
break;
case :
//add user account
add_usr_account(&account_head, argv[]);
//save
save_usr_account(&account_head, argv[]);
break;
case :
//update usr_account
system("cls");
fflush(stdin);
printf("input usr_account_name:\n");
scanf("%s", usr_account_name);
update_usr_account_by_name(&account_head, usr_account_name);
save_usr_account(&account_head, argv[]);
break;
case :
//delet usr_account_by_name
system("cls");
fflush(stdin);
printf("input usr_account_name:\n");
scanf("%s", usr_account_name);
delet_usr_account_by_name(&account_head, usr_account_name);
save_usr_account(&account_head, argv[]);
break;
case :
//search usr_account
account_search_menu();
scanf("%d", &s_digit);
while (s_digit < || s_digit > ) {
fflush(stdin);
//system("cls");
scanf("%d", &s_digit);
} if (s_digit == ){
//show all account
show_usr_account(account_head);
}
else if (s_digit == ){
//search by name
system("cls");
fflush(stdin);
printf("input usr_name:\n");
scanf("%s", usr_account_name);
search_usr_account_by_name(&account_head, usr_account_name);
}
else
exit;
break;
case :
exit;
break;
default:
printf("select a digit between 1--9:");
}
}
else if (s_type == )
//以访客身份登录
{
fflush(stdin);
scanf("%d", &digit);
while (digit < || digit > ) {
fflush(stdin);
//system("cls");
scanf("%d", &digit);
} if (digit == ){
search_menu(s_type);
scanf("%d", &s_digit);
while (s_digit < || s_digit > ) {
fflush(stdin);
scanf("%d", &s_digit);
}
}
if (s_digit == ){
//search by id
fflush(stdout);
system("cls");
fflush(stdin);
printf("input usr_id:\n");
scanf("%d", &usr_id);
search_usr_info_id(&usr_infor_head, usr_id);
}
else if (s_digit == ){
//search by name
system("cls");
fflush(stdin);
printf("input usr_name:\n");
scanf("%s", usr_name);
search_usr_info_name(&usr_infor_head, usr_name);
}
else //(s_digit == 3) 退出
{
exit;
}
}
else
exit; system("pause");
return ;
}

//算是我自己写的比较长的代码mark//

 

2015年5月9日 student information management system的更多相关文章

  1. 2015年12月28日 Java基础系列(六)流

    2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流2015年12月28日 Java基础系列(六)流

  2. 2015年12月13日 spring初级知识讲解(四)面向切面的Spring

    2015年12月13日 具体内容待补充...

  3. 2015年8月18日,杨学明老师《技术部门的绩效管理提升(研讨会)》在中国科学院下属机构CNNIC成功举办!

    2015年8月18日,杨学明老师为中国网络新闻办公室直属央企中国互联网络中心(CNNIC)提供了一天的<技术部门的绩效管理提升(研讨会)>培训课程.杨学明老师分别从研发绩效管理概述.研发绩 ...

  4. 2015年8月17日,杨学明老师《产业互联网化下的研发模式转型》在中国科学院下属机构CNNIC成功举办!

    2015年8月17日,杨学明老师为中国网络新闻办公室直属央企中国互联网络中心(CNNIC)提供了一天的<产业互联网化下的研发模式转型>内训课程.杨学明老师分别从产业互联网化的问题与挑战.传 ...

  5. 【C++】命令行Hangman #2015年12月15日 00:20:27

    增加了可以在构造Hangman对象时通过传入参数设定“最大猜测次数”的功能.少量修改.# 2015年12月15日 00:20:22 https://github.com/shalliestera/ha ...

  6. 我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)

    作业二:三级菜单 三级菜单 可一次进入各个子菜单 思路: 这个题看似不难,难点在于三层循环的嵌套,我的思路就是通过flag的真假来控制每一层的循环的,简单来说就是就是通过给每一层循环一个单独的布尔变量 ...

  7. 我的Python成长之路---第一天---Python基础(作业1:登录验证)---2015年12月26日(雾霾)

    作业一:编写登录接口 输入用户名密码 认证成功系那是欢迎信息 输错三次后锁定 思路: 1.参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则 1)认证流程参考的是Lin ...

  8. 我的Python成长之路---第一天---Python基础(1)---2015年12月26日(雾霾)

    2015年12月26日是个特别的日子,我的Python成之路迈出第一步.见到了心目中的Python大神(Alex),也认识到了新的志向相投的伙伴,非常开心. 尽管之前看过一些Python的视频.书,算 ...

  9. Git学习(二)(2015年11月18日)(2016年1月29日)

    2015年11月18日Git学习: .Shell 删除文件夹及其所有文件 rd/s/q 文件目录 ---------------当前为先创建本地Git库后与网上Git服务器关联------------ ...

随机推荐

  1. CentOS 修改主机名

    最新文章:Virson's Blog 1.临时修改主机名 地址:http://www.cnblogs.com/mawanglin2008/p/3530790.html 显示主机名: oracle@lo ...

  2. [ An Ac a Day ^_^ ] CodeForces 659D Bicycle Race 计算几何 叉积

    问有多少个点在多边形内 求一遍叉积 小于零计数就好了~ #include<stdio.h> #include<iostream> #include<algorithm&g ...

  3. 域名、网站名、url的定义

    网址:http://jingyan.baidu.com/article/2c8c281df0afd00008252aa7.html

  4. FreeMarker 实例

    1.jar包:freemarker-2.3.19.jar,将jar拷贝到lib目录下: 2.新建Web项目:TestFreeMarker 在web目录下新建ftl文件夹: 在ftl下新建模版文件ftl ...

  5. 12c 补丁架构 以及opatch 功能

    cd $ORACLE_HOME/ccr/bin ./emocmrsp oracle@qc550705:/oracle/app/oracle/product/12.1.0.2/db_1/ccr/bin& ...

  6. UVALive - 3026 Period kmp next数组的应用

    input n 2<=n<=1000000 长度为n的字符串,只含小写字母 output Test case #cas 长度为i时的最小循环串 循环次数(>1) 若没有则不输出 做法 ...

  7. 用xftp传送避免乱码问题

    用xftp传送文件时,需要输入ip地址,可连通的端口号,采用sftp协议 输入数据库传送,属性binary,二进制 上传文件,图片中文名称正常显示等,需要该属性支持UTF-8

  8. 翻译-你必须知道的28个HTML5特征、窍门和技术

    摘自by zhangxinxu from http://www.zhangxinxu.com 本文地址:http://www.zhangxinxu.com/wordpress/?p=1058 前端的发 ...

  9. 用Replace Pioneer 提取正则内容

    推荐用软件Replace Pioneer完成,支持正则表达式和文本替换,提取,很灵活容易. 以下举例说明怎样把<a href 和 </a>之间的内容提取出来,其他的全部删除. 1. ...

  10. js 放大镜用法bug解决

    <img id="zoom_02" src='img/zhang5.jpg' data-zoom-image="img/zhang5p.jpg" /> ...