用c语言写的学生学籍管理系统(参考了他人的写的)

首先先声明自己也是个新手,写这个时候也是仿照了别人的博客

参考lordly_cm的博客

首先说一下,自己写完这个小程序之后的心得吧!

  1. 终于把自己学的东西用上了,感到很开心
  2. 就是知道了,如何把数据存储在文件中,还有就是怎么在程序中加载之前已经存在的信息
  3. 认识到了关于文件的重要性

在摆上代码之前,还是要先介绍两个重要的函数,fwrite,fread,想必大家都了解,但是还是写一下吧,主要是复习一下

fwrite函数

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream)
这里面的buffer,是一个指针,就是你要写入的东西的指针,
size,就是一次写入的大小,stream,就是你要写入的文件的指针
关于size_t类型,大家还是看一下百度链接吧size_t

fread函数

和上面的fwrite很类似
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream)
这里类似,只是buffer是要从文件中写入的指针,stream是读取的文件指针

foef函数

int foef( fp )
判断文件是否读取完毕,如果读取完毕返回非零值,否则返回零值
下面是文件的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
typedef struct person
{
 char num[ 15 ];
 char name[ 20 ];
 char age[ 3 ] ;
 float English ;
 float special ; 
}person;

person per[ 100 ];

char * load_file( )
{
 char * filename;
 filename = ( char * )malloc( sizeof( char )*100 );
 filename = "c:\\users\\陈豪杰\\desktop\\学籍管理文件.txt";
 return filename; 
}

void logon()//设置登陆函数,在后期还可以添加密码功能
{
 printf( "\n\n\n\t\t\t 学生学籍管理系统\n\n" );
printf( "\n\n\n\t\t\t 2019.2.9\n\n" );
 printf( "\t\t\t 6栋313\n" );
 printf( "\n\n\n\t\t\t able\n" );
 system( "pause" );
 
 } 
 
 int menu_select( )  //选择需要实现的功能 
{
 int flag ;
 do{
  system( "cls" );
  printf( "\t\t***************\n" );
  printf( "\t\t_________________\n" );
  printf( "\t\t | 1. 添加纪录 | 2.显示记录\n\n" );
  printf( "\t\t | 3. 信息查询 | 4.数据计算\n\n" );
  printf( "\t\t | 5. 修改记录 | 6.删除记录\n\n" );
  printf( "\t\t | 7. 退出系统 \n\n" ); 
  printf( "\t\t***************\n" );
  printf( "\t\t_________________\n" );
  printf( "\t\t 请输入你想执行的操作的标号:" );
  scanf( "%d", &flag );
 }while( flag<1 || flag>7 );
 return flag;
 }

/*
 完成学生信息的录入工作
 */ 
void add( char * filename )
{
 FILE * fp;
 int i = 0 , n = 0 ;
 char sign = 'y'; //这里可以使用do-while循环,不用提前赋值; 
 system( "cls" );
 
 
 while( sign != 'n' && sign != 'N' )
 {
  printf( "\t\t------学生信息的添加----\n\n" );
  printf( "学号:\n" );
  scanf( "%s" , per[i].num );
  printf( "姓名:\n" );
  scanf( "%s", per[i].name );
  printf( "年龄:\n" );
  scanf( "%s", &per[i].age );
  printf( "英语:\n" );
  scanf( "%f", &per[i].English );
  printf( "专业:\n" );
  scanf( "%f", &per[i].special );
  printf( "是否继续添加Y/N:" );
  scanf( "\n%c", &sign );
  i++;
  n++;
  system( "cls" );
 }

 if( ( fp = fopen( filename , "a" )) == NULL )
 {
  printf( "no sourse file\n" );
  system( "pause" );
  return ;
 }
 for( i=0 ; i<n ; i++ )
  if( fwrite( &per[i], sizeof( person ) ,1, fp ) != 1 )
   printf( "file write error\n" );
 
 fclose( fp );
 system( "pause" );
 } 

void show( person  per_special )
{
 printf( "\t学号:%s\n" , per_special.num );
 printf( "\t姓名:%s\n" ,per_special.name );
 printf( "\t年龄:%s\n" , per_special.age );
 printf( "\t英语: %f\n" ,per_special.English );
 printf( "\t专业: %f\n" , per_special.special );
 printf( "\n" );
}
/*
学生信息浏览
*/
void scan( char * filename )
{
 char sign = 'y';
 FILE * fp;
 int i = 0 , n;
 system( "cls" );
 if( ( fp = fopen( filename , "r" ) ) == NULL )
  {
   printf( "open file error\n" );
   system( "pause" );
   return ; 
  }
 while( !feof( fp ) )//feof( fp )为判断是否读取到文件尾的函数判断
  {
   fread( &per[ i ], sizeof( person ) , 1 , fp );  
   i++;
   } 
 fclose( fp );

 
 printf( "**********************************\
   ********************************\n" );
 printf( "\t学号\t\t姓名\t年龄\t英语\t专业\n" );
 printf( "**********************************\
   ********************************\n" );
 for( n=0 ; n<i ; n++ )
  {
   printf( "\t%s\t%s\t%s\t%f\t%f",per[ n ].num,
  per[ n ].name,per[ n ].age,per[ n ].English,per[ n ].special  );
   printf( "\n" );
   } 
  
 system( "pause" );
 
 }

/*
模糊查询
*/ 
int *  fuzzy( person * per , int n  )
{
 char s[ 3 ];  //一个汉字是占据两个字节的,使用三个字节是为了末尾的结束标志。 
 int i = 0 , t = 0 , * result ;
 result = ( int *)malloc( sizeof( int ) * 100 );
 system( "cls" );
 printf( "请输入你想要查询的姓:" );
 scanf( "%s",s );
 for( i = 0 ; i < n ; i++ )
  if( per[ i ].name[ 0 ] == s[ 0 ] && per[ i ].name[ 1 ] == s[ 1 ] )
    {
     show( per[ i ] );
     result[ t ] = i ;
     t++;
    }
 if( t == 0 )
 printf( "没有这个姓的同学\n" );
 *( result+t ) = -1;
 return result ;
  
}


/*
按照名字查询
*/ 
int * name_order( person * per , int n )
{
 char s[ 20 ];
 int i = 0 , * result , t = 0 ;
 result = ( int *)malloc( sizeof( int ) * 100 );
 printf( "请输入查询的姓名:" ); 
 scanf( "%s" , s );
 for( ; i < n ; i++ )
  if( strcmp( per[ i ].name , s ) == 0 )
   {
    show( per[ i ] );
    result[ t ] = i;
    t++;
   }
 if( t == 0 )
 printf( "没有这个名字的同学\n" );
 *( result+t ) = -1;
 return result ;
}

/*
按照学号进行查询
*/ 
int * num_order( person * per , int n )
{
 char s[ 20 ] ;
 int i = 0 , * result, t = 0 ;
 result = ( int *)malloc( sizeof( int ) * 100 );
 printf( "请输入查询的学号:" ); 
 scanf( "%s" , s );
 for( ; i < n ; i++ )
  if( strcmp( per[ i ].num , s ) == 0 )
   {
    show( per[ i ] );
    result[ t ] = i;
    t++;
   }
 if( t == 0 )
 printf( "没有这个学号的同学\n" );
 *( result+t ) = -1;
 return result ;
}

/*
学生信息查询
可以分为不同的方式进行查询 
*/
void query( char * filename )
{
 FILE * fp ;
 int i = 0 , n = 0 , m ;
 system( "cls" );
 printf( "\t^^^^^^^^^^^^^^^^^^^\n" );
 printf( "\t|1--模糊查询 |\n" );
 printf( "\t|2--姓名 |\n" );
 printf( "\t|3--学号 |\n" );
 printf( "\t|4--返回 |\n" );
 printf( "\t^^^^^^^^^^^^^^^^^^^\n" );
 printf( "请输入你要的查询方式: " );
 scanf( "%d",&m );
 
 while( m!=1 && m!=2 && m!=3 && m!=4 )
  {
   printf( "方式错误,请重新选择方式: " );
   scanf( "%d" , &m ) ;
  }
 
 if( ( fp = fopen( filename , "r" ) )== NULL  )
  {
   printf( "cannot open the file\n" );
   system( "pause" );
   return ;
  }

 /*
 先将所有的数据都储存在数组中,
 方便后面的操作
 */ 
 while( !feof( fp ) )
 {
  fread( &per[ i ] , sizeof( person ), 1 , fp );
  i++ ;
   n++ ;
 }
  fclose( fp ) ;
 /*
 判断选择查询的方式
 */ 
 switch( m )
 {
  case 1: fuzzy( per , n ); break;
  case 2: name_order( per , n ); break;
  case 3: num_order( per , n ); break; 
  case 4: menu_select( ); break;
 }
 } 
 
 /*
按照英语成绩逆序排名
*/ 
void english_order( person * temp , int n )
{
 int i , order[ 100 ] , t , k ;
 for( i = 0 ; i < n ; i++ )
  {
   order[ i ] = i ;
  }
  
 for( i = 0 ; i < n ; i++ )
  {
   for( t= 0 ; t < n-i-1 ; t++ )
    {
     if( temp[ order[ t ] ].English > temp[ order[ t+1 ] ].English )
      {
       k = order[ t ];
       order[ t ] = order[ t+1 ];
       order[ t+1 ] = k;
      }
    }
  }
 for( i = 0 ; i < n ; i++ )
 {
  show( temp[ order[ i ] ] );
 }
}

/*
按照专业成绩逆序排名
*/ 
void special_order( person * temp , int n )
{
 int i , order[ 100 ] , t , k ;
 for( i = 0 ; i < n ; i++ )
  {
   order[ i ] = i ;
  }
  
 for( i = 0 ; i < n ; i++ )
  {
   for( t= 0 ; t < n-i-1 ; t++ )
    {
     if( temp[ order[ t ] ].special > temp[ order[ t+1 ] ].special )
      {
       k = order[ t ];
       order[ t ] = order[ t+1 ];
       order[ t+1 ] = k;
      }
    }
  }
 for( i = 0 ; i < n ; i++ )
 {
  show( temp[ order[ i ] ] );
 }
}

/*
按照总成绩逆序排名
*/ 
void total_order( person * temp , int n )
{
 int sum[ 100 ] , order[ 100 ] , i = 0 , k ,t ;
 for( ; i < n ; i++ )
  sum[ i ] = temp[ i ].English + temp[ i ].special ;
 
 for( i = 0 ; i < n ; i++ )
  {
   order[ i ] = i ;
  }
 for( i = 0 ; i < n ; i++ )
  for( t = 0 ; t < n-i ; t++ )
   {
    if( sum[ order[ t ] ] > sum[ order[ t+1 ] ] )
     {
      k = order[ t ];
      order[ t ] = order[ t+1 ];
      order[ t+1 ] = k;
     }
   }
 for( i = 0 ; i < n ; i++ )
 {
  show( temp[ order[ i ] ] );
 }
}

/*
数据排名
*/ 
void score_order( char * filename , int flag )
{
 FILE * fp;
 person temp[ 100 ] ;
 int  n = 0 , order[ 100 ] , Max_position = 0 ;
 if( ( fp = fopen( filename, "r" ) ) == NULL )
  {
   printf( "cannot open the file" );
   return ;
  }
 while( !feof( fp ) )
  {
   fread( &temp[ n ] , sizeof( person ) , 1 , fp );
   n++;
  }
 n--;
  
 
  switch( flag )
 {
  case 1:english_order( temp , n ) ; break ;
  case 2:special_order( temp , n ) ; break ;
  case 3:total_order( temp , n ); break ;
 }
 
  
}

/*
数据计算
*/
void data( char * filename )
{
 FILE * fp ;
 int sum , s[ 100 ] ,flag;
 system( "cls" );
 printf( "\t|1-----英语\n" );
 printf( "\t|2-----专业\n" );
 printf( "\t|3-----总分\n" );
 printf( "\t|4-----返回\n" );
 printf( "\t请输入你想要选择的排序方式:" );
 scanf( "%d",&flag );
 system( "cls" );
 switch( flag )
  {
   case 1: score_order( filename , 1 );break;
   case 2: score_order( filename , 2 ); break;
   case 3: score_order( filename , 3 ); break;
   case 4: menu_select( ) ;break;
  }
 } 
 
 /*
修改学生数据
*/
void amend( char * filename )
{
 FILE * fp;
 person temp[ 100 ];
 int i = 0 , n = 0 , * result , flag ;
 result = ( int *)malloc( sizeof( int ) * 100 );
 result[ 0 ] = -1 ;
 if( ( fp = fopen( filename , "r" ) ) == NULL )
  {
   printf( "cannot open the file" );
   return ;
  }
 while( !feof( fp ) )
  {
   fread( &temp[ n ] , sizeof( person ) , 1 , fp );
   n++;
  }
  n--;
 fclose( fp );
 system( "cls" );
 printf( "\t^^^^^^^^^^^^^^^^^^^\n" );
 printf( "\t|1--姓名 |\n" );
 printf( "\t|2--学号 |\n" );
 printf( "\t|3--返回 |\n" );
 printf( "请输入你要的查询方式: " );
 scanf( "%d", &flag );
 switch( flag )
 {
  case 1: result = name_order( temp , n ); break;
  case 2: result = num_order( temp , n ); break;
  case 3: break;
 }
 if( result[ 0 ] == -1 )
  return ;
 else
 {
  for( ; *( result+i )!=-1 ;  i++ )
  {
   printf( "学号:\n" );
   scanf( "%s" , temp[ result[ i ] ].num );
   printf( "姓名:\n" );
   scanf( "%s", temp[  result[ i ] ].name );
   printf( "年龄:\n" );
   scanf( "%s", &temp[  result[ i ] ].age );
   printf( "英语:\n" );
   scanf( "%f", &temp[  result[ i ] ].English );
   printf( "专业:\n" );
   scanf( "%f", &temp[  result[ i ] ].special );
   } 
 if( ( fp = fopen( filename , "w" ) ) == NULL )
  {
   printf( "cannot open the file" );
   return ;
  }
 for( i=0 ; i<n ; i++ )
  if( fwrite( &temp[i], sizeof( person ) ,1, fp ) != 1 )
   printf( "file write error\n" );
 fclose( fp );
 printf( "修改完成" );
 }
 
 } 
 
/*
删除学生数据
*/
void del( char * filename )
{
 FILE * fp;
 person temp[ 100 ];
 int i = 0 , n = 0 , * result , flag ,test[ 100 ] , k ;
 char decision;
 result = ( int *)malloc( sizeof( int ) * 100 );
 result[ 0 ] = -1 ;
 if( ( fp = fopen( filename , "r" ) ) == NULL )
  {
   printf( "cannot open the file" );
   return ;
  }
 while( !feof( fp ) )
  {
   fread( &temp[ n ] , sizeof( person ) , 1 , fp );
   n++;
  }
  n--;
 fclose( fp );
 
 for( ; i <= n ; i++ )  //便于后面的删除操作 
  test[ i ] = i ;
  
 system( "cls" );
 printf( "\t^^^^^^^^^^^^^^^^^^^\n" );
 printf( "\t|1--姓名 |\n" );
 printf( "\t|2--学号 |\n" );
 printf( "\t|3--返回 |\n" );
 printf( "请输入你要的查询方式: " );
 scanf( "%d", &flag );
 switch( flag )
 {
  case 1: result = name_order( temp , n ); break;
  case 2: result = num_order( temp , n ); break;
  case 3: break;
 }
  
 if( result[ 0 ] == -1 )
  return ;
 else
 { 
  for( i = 0 ; *( result+i )!=-1 ;  i++ )
  {
  
   show( temp[ result[ i ] ] );
   printf( "是否删除Y/N?: " );
   scanf( "\n%c", &decision );
   if( decision == 'Y' || decision == 'y' )
   {
    
    if( ( fp = fopen( filename , "w" ) ) == NULL )
     {
      printf( "cannot open the file\n" );
      return ;
      } 
    for( k = 0 ; k <= n-1 ; k++ )
     {
      if( k == *( result+i ) )
       continue;
     fwrite( &temp[ test[ k ] ] , sizeof( person ) , 1 , fp );
      } 
    fclose( fp );
    printf( "删除完成" );
   }
  }
 }
 
 }

void main() 
{
 char * filename;
 filename = load_file( );
 int n = 0;
 logon();
 for( ; ; )
 {
  switch( menu_select( ) )
  {
   case 1: add( filename ); break;
   case 2: scan( filename ); break;
   case 3: query( filename ); break;
   case 4: data( filename ); break; 
   case 5: amend( filename ); break;
   case 6: del( filename ); break;
   case 7: exit( 1 );
  } 
  system( "pause" );
 };
} 
 

因为是第一次写这种较多的代码,存在的bug挺多的,欢迎大家多多指正啊!

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

able陈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值