| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2509 人关注过本帖
标题:用C写的学生管理系统,比较简单
只看楼主 加入收藏
tanjm1988
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-4-25
收藏
得分:0 
谢谢,下一份学习。
2013-06-28 22:48
wangqq_66
Rank: 2
等 级:论坛游民
帖 子:2
专家分:10
注 册:2013-6-29
收藏
得分:0 
下一个看看
2013-06-29 16:11
瓜皮
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-6-27
收藏
得分:0 
顶一个
2013-06-29 22:46
xp0213
Rank: 7Rank: 7Rank: 7
来 自:湖北武汉
等 级:黑侠
威 望:1
帖 子:210
专家分:522
注 册:2011-10-26
收藏
得分:0 
v
2013-06-30 20:41
ab13402364
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-5-22
收藏
得分:0 
不错
2013-06-30 22:06
aKARL
Rank: 1
等 级:新手上路
帖 子:36
专家分:6
注 册:2013-7-1
收藏
得分:0 
TC不显示汉字怎么办呢
2013-07-01 09:16
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
源码在此,看起来写的不错,学习一下。

#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "stdlib.h"
#define CMD_START printf ("   <<<======================= 开始执行命令 =========================>>>\n");
/* 用来标记一个命令执行的开始*/
#define CMD_END  printf ("   <<<======================= 命令执行结束 =========================>>>\n");
/* 用来标记一个命令执行的结束 ,这两个语句是为了提供更好的用户界面而写的 */
#define  DATA_FILE "data.dat"
/* 这是数据文件名 */
#define TEMP_FILE  "temp.dat"
/* 这是一个临时的文件的名字,在删除记录的函数中使用的,详细内容参考 Delete() 函数 */
typedef struct tagStudent
{
char ID[30];
char Name[30];
char Class[255];
char Sex;
int Math;  
int English;
int Compute;
int Philosophy;
int  PE;
struct tagStudent *next;
} Student;
int ShowMenu();
int WriteData(FILE* , Student* );
void Output_Rec(Student*);
void Input_Rec(Student*); /* 让用户输入 记录的 各个项目的 值,在添加记录时用到了*/
void CopyRec(Student* , Student* ); /* 复制一条记录 到 另一个记录中 */
void Print(); /* 实现查看数据文件内容的函数 */
void Add();  /* 添加记录的函数 */
void Delete(); /* 删除记录的函数 */
void Statistics(); /* 对数据进行统计分析的函数 */
void Find(int); /* 实现查找功能的函数,参数决定 是按 ID 查找 还是按 Name 查找 */
int quit; /* 一个全局变量,在下面的 main() 函数中,用来决定何时退出主循环 */
main()
{
int cmd; /* 用户所选的 菜单 项目 的标号 */
quit = 0; /* 初始化 为 不退出 */
while( ! quit )
{
  cmd = ShowMenu(); /* 显示 主菜单,并返回用户所选择的 菜单项 的 编号 */
  CMD_START /* 在屏幕上打印一行分隔符,告诉用户这是一个子功能的开始 */
  switch( cmd ) /* 用多项分支 根据 用户的选择 调用 相应的函数 */
  {
     case 1:
    Print();getch();break; /* 用户选择 1 号菜单,程序执行 查看的数据文件的函数 */
     case 2:
    Add(); getch();break; /* 用户选择 2 号菜单,程序执行 添加记录的函数 */
     case 3:
    Delete();getch();break; /* 用户选择 3 号菜单,程序执行 删除记录的函数 */
     case 4:
    Statistics();getch();break; /* 用户选择 4 号菜单,程序执行 统计数据的函数 */
     case 5:
    Find(5);getch();break; /* Find_ID ,5 号菜单执行按 ID(学号)查找的功能 */
     case 6:
    Find(6);getch();break; /* Find_Name,6 号菜单执行 按 Name(姓名)查找的功能 */
     case 7:
    quit = 1; /* 用户选择了退出菜单 */
    printf("\n\t\t   感谢您的使用O(∩_∩)O谢谢···\n\n\t\t    祝您天天开心O(∩_∩)O~~\n\n\t\t     Bye Bye ( ^_^ )/~~拜拜···\n");
    getch();break;
     default:
    printf(" 请输入您想要操作所对应的数字···\n");
    printf ("   <<<======================== 命令执行结束 ==========================>>>\n");
    getch();break;
    /* 用户所输入的 序号不在所处理的范围内 */
  }
  CMD_END /* 打印一行分隔符,告诉用户 他所选择的菜单的功能已经执行完毕 */
  system("cls");
  if (quit != 1) /* 检查用户是否 要求 退出 */
  {
   printf(" 按任意键返回主菜单....\n");
   getch(); /* 用 一个 无回显 的 字符输入函数 来实现暂停执行,按 任意键 继续的功能*/
  }
}
}
int ShowMenu()
{
int cmd = 0; /* 保存用户的选择 */
/* 定义 程序所支持的菜单项目 */
char Menu_SeeData[]  = "\t1 .\tView the Records in the data file\n"; /* 查看数据文件*/
char Menu_Add[]   = "\t2 .\tAdd New Record\n"; /* 添加记录 */
char Menu_Delete[]  = "\t3 .\tDelete an old Record\n"; /* 删除记录 */
char Menu_Statistics[]  = "\t4 .\tMake a Statistics\n"; /* 统计分析 */
char Menu_Find_ID[]  = "\t5 .\tFind a Record from the ID\n"; /* 按 学号(ID) 查找 */
char Menu_Find_Name[] = "\t6 .\tFind a Record from the Name\n"; /* 按 姓名(Name)查找 */
char Menu_Quit[]  = "\t7 .\tQuit\n"; /* 退出*/
/* 在屏幕上打印 主菜单 */
system("COLOR e");
system("cls");
printf ("\n       *                    欢迎使用学生管理系统                      * \n");
printf ("\n      *                                                                *\n");
printf ("   <<<============================= * ==================================>>>\n");
printf ("      >\t\t\t       ①、显示学生信息      \t\t\t<\n");
printf ("      >\t\t\t       ②、录入学生信息      \t\t\t<\n");
printf ("      >\t\t\t       ③、删除学生信息      \t\t\t<\n");
printf ("      >\t\t\t       ④、学生成绩分析      \t\t\t<\n");
printf ("      >\t\t\t       ⑤、按学号查找        \t\t\t<\n");
printf ("      >\t\t\t       ⑥、按姓名查找        \t\t\t<\n");
printf ("      >\t\t\t       ⑦、退出系统         \t\t\t<\n\n");
printf ("    <<----------------------------- * ---------------------------------->>\n");
printf("\n\n\t请输入对应数字:");
scanf("%d" , &cmd); /* 接受用户 选择 */
printf("\n");
system("cls");
return cmd; /* 返回用户的输入,交给主循环处理 */
}
void Print() /* 打印 数据文件的 记录内容 */
{
FILE* fp = NULL; /* 文件指针 */
Student rec; /* 存放从文件中读取的记录 */
int i = 0; /* 实现 计数 和 分屏打印的功能 */
fp = fopen(DATA_FILE , "rb"); /* 以 二进制读方式 打开数据文件 */
if(fp == NULL) /* 打开文件出错 */
{
  printf(" 打开文件失败: %s\n" , DATA_FILE);
  getch();
  return ;
}
while(ReadData(fp , &rec)) /* ReadData() 函数出错或到文件末尾时返回 0,可以做循环条件 */
{
  Output_Rec(&rec); /* 正确读取,将记录输出 */
  printf(" ---------------------------------------------------------------\n");
  i++;
  if(i>1 && i % 3 == 0)
  {
   printf("\n 按任意键结束 ... \n");
   getch();
  }
}
printf("\n一共有\t%d\t条记录 .\n" , i );
fclose(fp);
system("pause");
}
void Add() /* 添加记录 */
{
Student rec;
FILE* fp = NULL;
char a;
Input_Rec( &rec );
fp = fopen(DATA_FILE ,"ab");
if( fp == NULL)
{
  printf(" 打开目标文件失败··· \n");
  return ;
}
if( WriteData(fp, &rec) == 1)
  printf("\n\n插入数据成功···\n\n");
else
  printf("\n\n 写入文件失败···\n");
  printf("是否继续添加:y/n\n");
  scanf("%c",&a);
  scanf("%c",&a);
  if(a=='N' || a=='n')
  {
      fclose(fp);
      system("cls");
      ShowMenu();
  }
  else
  Add();
}
void Delete() /* 删除记录 */
{
Student rec;
FILE* fpr,*fpw;
char buf[30];
char cmd[255];
char num1;
int del_count;
del_count = 0;
printf("\n 请输入您想删除的学生学号: .");
printf("\n 学号 : ");
scanf("%s" , buf);
fpr = fopen(DATA_FILE ,"rb"); /* 从 原来的记录文件中读取数据,跳过将要删除的记录*/
 while(ReadData(fpr ,&rec))
  {
   if(strcmp(rec.ID , buf) == 0)
   {
    del_count++;
    Output_Rec(&rec);
    printf(" ---------------------------------------------------------------\n");
   }
  }
 printf("您确定要删除以上信息吗?Y/N\n");
 scanf("%c",&num1);
 scanf("%c",&num1);
 if(num1=='N' || num1=='n')
{
system("cls");
ShowMenu();
}

if( fpr == NULL)
{
  printf(" 打开文件失败 ... \n");
  return ;
}
fpw = fopen(TEMP_FILE,"wb"); /* 打开一个 临时文件 保存不删除的记录 */
if( fpw == NULL)
{
  printf(" 打开目标文件失败··· \n");
  return ;
}
while(ReadData(fpr , &rec)) /* 读取 要保留的记录 */
{
  if(strcmp(rec.ID , buf) != 0)
  {
   WriteData(fpw, &rec); /* 写入临时文件 ,然后删除 原数据文件,
          再将临时文件该名为原数据文件的名字*/
  }
  else
  {
   del_count++; /* 跳过的记录数目,即删除的数目 */
  }
}
fclose(fpr);
fclose(fpw);
strcpy(cmd , "del "); /* 构造命令串,用 system() 函数执行 */
strcat(cmd ,DATA_FILE);
system(cmd);
rename(TEMP_FILE,DATA_FILE); /* 直接调用C 语言的改名函数将临时文件改名为数据文件的名字*/
printf("\n\t%d条记录已经删除 ···\n",del_count);
system("pause");

}
void Statistics() /* 统计分析函数 */
{
int i50,i60,i70,i80,i90;
float avg;
int sum ,sum_high,sum_low;
Student stu_high,stu_low;
Student stu_math_high,stu_english_high;
Student stu_compute_high,stu_philosophy_high,stu_PE_high;
Student stu_math_low,stu_english_low;
Student stu_compute_low, stu_philosophy_low,stu_PE_low;
FILE* fp;
Student rec;
int count; /* 一个计数器,用于判断是否第一次读取数据 */
count = sum = sum_high = sum_low = i50 = i60 = i60 = i70 =i80 = i90 = 0;
fp = NULL; /* 对 数据初始化 */
fp = fopen(DATA_FILE ,"rb");
if(fp == NULL)
{
  printf("\n读取文件失败···\n");
  return;
}
while(ReadData(fp , &rec)) /* 读取数据 */
{
  count++;
  sum = rec.Math + rec.English + + rec.PE+ rec.Philosophy;

  avg = ((float)sum) / 5;
  if(avg < 60)
   i50++;
  else if(avg <70)
   i60++;
  else if(avg < 80)
   i70++;
  else if(avg < 90)
   i80++;
  else
   i90++;
  if(count <= 1) /* 第一次读取,执行初始化,不进行比较 */
  {
   sum_high = sum_low = sum;
   CopyRec(&stu_high , &rec);
   CopyRec(&stu_low ,&rec);
  }
  else
  {
   if(sum > sum_high)
   {
    sum_high = sum; /* 得到最高总分 */
    CopyRec(&stu_high , &rec); /* 保存总分最高的学生的信息 */
   }
   if(sum < sum_low)
   {
    sum_low = sum; /* 得到最低分 */
    CopyRec(&stu_low , &rec); /* 保存总分最低的学生的信息 */
   }
  }
  if(count == 1) /* 同上面一样,执行初始化*/
  {
   CopyRec(&stu_math_high,&rec);
   CopyRec(&stu_english_high , &rec);
   CopyRec(&stu_compute_high, &rec);
   CopyRec(&stu_philosophy_high,&rec);
   CopyRec(&stu_PE_high , &rec);
   CopyRec(&stu_math_low,&rec);
   CopyRec(&stu_english_low , &rec);
   CopyRec(&stu_compute_low, &rec);
   CopyRec(&stu_philosophy_low,&rec);
   CopyRec(&stu_PE_low , &rec);
  }
  else
  {
   /* High */
   /* 保存各科的最高分的学生的信息 */
   if(rec.Math > stu_math_high.Math)
    CopyRec(&stu_math_high ,&rec);
   if(rec.English > stu_english_high.English)
    CopyRec(&stu_english_high ,&rec);
   if( > stu_compute_)
    CopyRec(&stu_compute_high , &rec);
   if(rec.Philosophy > stu_philosophy_high.Philosophy)
    CopyRec(&stu_philosophy_high , &rec);
   if(rec.PE > stu_PE_high.PE)
    CopyRec(&stu_PE_high , &rec);
   /* low */
   /* 保存各科的最低分的学生的信息 */
   if(rec.Math < stu_math_low.Math)
    CopyRec(&stu_math_low ,&rec);
   if(rec.English < stu_english_low.English)
    CopyRec(&stu_english_low ,&rec);
   if( < stu_compute_)
    CopyRec(&stu_compute_low , &rec);
   if(rec.Philosophy < stu_philosophy_low.Philosophy)
    CopyRec(&stu_philosophy_low , &rec);
   if(rec.PE < stu_PE_low.PE)
    CopyRec(&stu_PE_low , &rec);
  }
}
if(count < 1)
{
  printf("\n 文件没有记录···\n");
}
else
{
  printf("\n 各分数段人数分布如下:\n");
  printf("\t    <  60\t:\t%d\n",i50);
  printf("\t60  -  69\t:\t%d\n",i60);
  printf("\t70  -  79\t:\t%d\n",i70);
  printf("\t80  -  90\t:\t%d\n",i80);
  printf("\t   >=  90\t:\t%d\n",i90);
  printf(" ---------------------------------------------------------------\n");
  system("pause");
  printf("\n 最高分的学生\n");
  printf(" 分数是 : %d\n" , sum_high);
  printf(" 该学生是 :\n");
  Output_Rec(&stu_high);
  printf("\n 最低分的学生\n");
  printf(" 分数是 : %d\n" , sum_low);
  printf(" 该学生是 :\n");
  Output_Rec(&stu_low);
  printf(" ---------------------------------------------------------------\n");
  printf(" 数学最高分 :\n");
  Output_Rec(&stu_math_high);
  printf(" 数学最低分 :\n");
  Output_Rec(&stu_math_low);
  printf(" ---------------------------------------------------------------\n");
  printf(" 英语最高分 :\n");
  Output_Rec(&stu_english_high);
  printf(" 英语最低分 :\n");
  Output_Rec(&stu_english_low);
  printf(" ---------------------------------------------------------------\n");
  printf(" 计算机最高分 :\n");
  Output_Rec(&stu_compute_high);
  printf(" 计算机最低分 :\n");
  Output_Rec(&stu_compute_low);
  printf(" ---------------------------------------------------------------\n");
  printf(" 哲学最高分 :\n");
  Output_Rec(&stu_philosophy_high);
  printf(" 哲学最低分 :\n");
  Output_Rec(&stu_philosophy_low);
  printf(" ---------------------------------------------------------------\n");
  printf(" 体育最高分 :\n");
  Output_Rec(&stu_PE_high);
  printf(" 体育最低分 :\n");
  Output_Rec(&stu_PE_low);
  printf(" ---------------------------------------------------------------\n");
  system("pause");
}
fclose(fp);
}
void Find(int isFind_From_ID) /* 查找函数 */
{
char buf[30];
Student rec;
int find_count;
FILE* fp;
find_count = 0;
fp = fopen(DATA_FILE ,"rb");
if( fp == NULL)
{
  printf("\n 打开文件失败 ...\n");
  return;
}
switch(isFind_From_ID)
{
case 5: /*ID,按 学号查找*/
  printf("\n 请输入您要查找学生的学号: ");
  scanf("%s",buf);
  while(ReadData(fp ,&rec))
  {
   if(strcmp(rec.ID , buf) == 0)
   {
    find_count++;
    Output_Rec(&rec);
    printf(" ------------------------------------------------------\n");
   }
  }
  getch();
  break;
case 6: /*Name ,按 姓名 查找*/
  printf("\n请输入您要查找学生姓名 : ");
  scanf("%s",buf);
  while(ReadData(fp , &rec))
  {
   if(strcmp(rec.Name, buf) >=0)
   {
    find_count++;
    Output_Rec(&rec);
    printf(" -----------------------------------------------------\n");
   }
  }
  getch();
  break;
default:
  printf(" \n请输入正确索引 ...\n"); /*处理isFind_From_ID既不是5也不是6的情况*/
}
if(find_count >0) /* 输出找到的记录数目 */
{
  printf("\n 一共找到\t%d\t条记录\n",find_count);
}
else
{
  printf("\n 抱歉~\n 找不到您想要查找的···\n");
  printf("\n 建议您使用其他关键字···\n");
}
fclose(fp);
}
int ReadData(FILE* fp, Student* Dest_Rec) /*读取数据记录 */
{
int r;
if(( fp == NULL ) || ( Dest_Rec == NULL))
  return 0; /* ERROR */
r = fread(Dest_Rec ,sizeof(Student) ,1 ,fp);
if(r != 1)
  return 0;
 return 1;
}
int WriteData(FILE* fp, Student* Src_Rec) /* 写入数据记录 */
{
int r;
if((fp == NULL) || (Src_Rec == NULL))
  return 0; /* ERROR */
r = fwrite(Src_Rec , sizeof(Student) , 1, fp);
if(r != 1)
  return 0;
return 1;
}
void Output_Rec( Student* stu) /* 在屏幕上输出 一个学生的信息 */
{
 printf("\n");
 printf("  姓名 : %s", stu->Name);
 printf("\n  性别 : ");
if( stu->Sex == 'M' || stu->Sex == 'm' )
 printf("Male");
else
 printf("Female");
 printf("\n  学号 : %s\t\t班级 : %s\n",stu->ID,stu->Class);
 printf("  数学 = %d\t\t英语 = %d\t\t计算机 =%d\n" ,stu->Math ,stu->English, stu->Compute);
 printf("  哲学 = %d\t\t体育 = %d\n", stu->Philosophy ,stu->PE);
 printf("\n");
}
void Input_Rec( Student* stu) /* 让用户输入 一个学生的各项信息 */
{
if(stu == NULL)
  return;
printf("\n 姓名 = ");
scanf("%s",stu->Name);
printf("\t性别 = (F|M) ");
while(1)
{
  stu->Sex = getch(); /* 无回显输入 */
  if(stu->Sex == 'F' || stu->Sex == 'f' || stu->Sex == 'M' || stu->Sex == 'm')
  {
   printf("%c",stu->Sex); /* 将用户输入的字符输出,模拟正常输入数据时的回显 */
   break;
  }
}
printf("\n 学号 = ");
scanf("%s" , stu->ID);
printf("\n 班级 = ");
scanf("%s" , stu->Class);
printf("\n 数学 = ");
scanf("%d", &(stu->Math));
printf("\n 英语 = ");
scanf("%d" ,&(stu->English));
printf("\n 计算机 = ");
scanf("%d" , &(stu->Compute));
printf("\n 哲学 = ");
scanf("%d" , &(stu->Philosophy));
printf("\n 体育 = ");
scanf("%d" , &(stu->PE));
printf("\n");

}
void CopyRec(Student* dest_stu, Student* src_stu)
{
strcpy(dest_stu->Name ,src_stu->Name);
strcpy(dest_stu->ID ,src_stu->ID);
strcpy(dest_stu->Class ,src_stu->Class);
dest_stu->Sex = src_stu->Sex;
dest_stu->Math = src_stu->Math;
dest_stu->English = src_stu->English;
dest_stu->Compute = src_stu->Compute;
dest_stu->Philosophy = src_stu->Philosophy;
dest_stu->PE = src_stu->PE;
}

♂ 死后定当长眠,生前何须久睡。♀
2013-07-01 09:38
aKARL
Rank: 1
等 级:新手上路
帖 子:36
专家分:6
注 册:2013-7-1
收藏
得分:0 
回复 楼主 AlexXu
楼主NB,但想问一下按4程序查询的时候,屏幕只显示出最下方的PE,向上调的时候就会跳回主菜单,这个怎么弄呢?
2013-07-01 11:05
aKARL
Rank: 1
等 级:新手上路
帖 子:36
专家分:6
注 册:2013-7-1
收藏
得分:0 
回复 17楼 303770957
这个我能看到楼主的。。。。。。。
我的意思是TC不显示该怎么改,花了一上午时间终于搞定了,楼主NB啊,很多细节我现在还没看懂
2013-07-01 11:08
a991217655
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-7-1
收藏
得分:0 
还是能看懂的
2013-07-01 11:48
快速回复:用C写的学生管理系统,比较简单
数据加载中...
 
   



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

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