C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)(多文件)
本文實(shí)例為大家分享了C語(yǔ)言實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
elemtype.h
/*****************************
* 這是學(xué)生成績(jī)管理系統(tǒng)中的記錄結(jié)構(gòu)文件。
* 文件名:elemtype.h
* 作者:
* 創(chuàng)建日期:2012-12-05
* 完成日期:2012-12-07
* 版本:1.0
* 修改記錄:
*
*
******************************/
#ifndef ELEMTYPE
#define ELEMTYPE
#include <stdio.h>
//用宏定義來(lái)規(guī)定各個(gè)字符串?dāng)?shù)據(jù)項(xiàng)的最大長(zhǎng)度。
//定義姓名最大長(zhǎng)度
#define MAX_NAME 30
//定義學(xué)生課程數(shù)量
#define SCORE_NUM 3
/*學(xué)生分類(lèi)信息*/
typedef enum
{
SCIENCE =0,//理科
ARTS,//文科
MEDICINE,//醫(yī)科
OTHER//其它
}StuType;
/*學(xué)生信息結(jié)構(gòu)體*/
typedef struct
{
char name[MAX_NAME+1];//學(xué)生姓名
StuType type;//學(xué)生分類(lèi),具體定義見(jiàn)學(xué)生分類(lèi)信息
int ID;//學(xué)號(hào)
float score[SCORE_NUM];//所修課程分?jǐn)?shù)
}ElemType;
/*函數(shù)功能:
從文件中讀取數(shù)據(jù)并保存到數(shù)組中,n為文件中保存的記錄條數(shù)
參數(shù)說(shuō)明:
filename-數(shù)據(jù)文件名稱
n-數(shù)組中當(dāng)前保存的有效記錄條數(shù)
array-用于存儲(chǔ)學(xué)生信息的數(shù)組
返回值:
true-成功添加了一條記錄;
false-添加記錄不成功
*/
bool ReadDataFromFile(char *filename, ElemType array[], int n);
/*函數(shù)功能:
顯示所有學(xué)生信息
參數(shù)說(shuō)明:
n-數(shù)組中當(dāng)前保存的有效記錄條數(shù)
array-用于存儲(chǔ)學(xué)生信息的數(shù)組
返回值:
無(wú)
*/
void DispalyAll(ElemType array[], int n);
/*函數(shù)功能:
修改學(xué)生信息,即從控制臺(tái)輸入一個(gè)學(xué)生信息,根據(jù)該信息在數(shù)組中進(jìn)行查找并修改
參數(shù)說(shuō)明:
n-數(shù)組中當(dāng)前保存的有效記錄條數(shù)
array-用于存儲(chǔ)學(xué)生信息的數(shù)組
返回值:
true-成功修改了一條記錄
false-修改記錄不成功
*/
bool ModifyStudentInfo(ElemType array[],int n);
/*函數(shù)功能:
計(jì)算某一科目平均分
參數(shù)說(shuō)明:
n-數(shù)組中當(dāng)前保存的有效記錄條數(shù)
array-用于存儲(chǔ)學(xué)生信息的數(shù)組
返回值:
-1-沒(méi)有找到對(duì)應(yīng)記錄
對(duì)應(yīng)記錄的下標(biāo)
*/
void CalcSubjectScore(ElemType array[], int n );
/*函數(shù)功能:
根據(jù)學(xué)號(hào)查找學(xué)生,計(jì)算其平均分
參數(shù)說(shuō)明:
n-數(shù)組中當(dāng)前保存的有效記錄條數(shù)
array-用于存儲(chǔ)學(xué)生信息的數(shù)組
返回值:
-1-沒(méi)有找到對(duì)應(yīng)記錄
對(duì)應(yīng)記錄的下標(biāo)
*/
void CalcStudentScore(ElemType array[], int n );
/*函數(shù)功能:
添加學(xué)生信息,即從控制臺(tái)輸入一條學(xué)生信息,然后將輸入的學(xué)生信息保存到數(shù)組中
參數(shù)說(shuō)明:
n-數(shù)組中當(dāng)前保存的有效記錄條數(shù)
array-用于存儲(chǔ)學(xué)生信息的數(shù)組
返回值:
true-成功添加了一條記錄,提示:此種情況下n需要增加1
false-添加記錄不成功
*/
void SortStu(ElemType array[], int n);
/*函數(shù)功能:
把數(shù)組中的數(shù)據(jù)寫(xiě)到文件中保存
參數(shù)說(shuō)明:
filename-數(shù)據(jù)文件名稱
n-數(shù)組中當(dāng)前保存的記錄條數(shù)
array-用于存儲(chǔ)學(xué)生信息的數(shù)組
返回值:
true-成功添加了一條記錄;
false-添加記錄不成功
*/
bool WriteDataToFile(char *filename, ElemType array[], int n);
#endifelemtype.cpp
#include "elemtype.h"
#include <stdlib.h>
#include <string.h>
//
///function
///從文件中讀取學(xué)生信息,保存到一個(gè)足夠大的數(shù)組中。
bool ReadDataFromFile(char *filename, ElemType array[], int n)
{
FILE* fp;
int i;
if ((fp=fopen(filename,"rb"))==NULL )
{
return false;
}
for (i=0; i<n; i++)
{
fread(array+i,sizeof(ElemType),1,fp);
}
fclose(fp);
return true;
}
void DispalyAll(ElemType array[], int n)
{
//add your code here
int i;
printf("%s%10s%9s%12s%10s%10s\n","NAME","TYPE","ID","SCORE1","SCORE2","SCORE3");
for(i=0;i<n;i++)
{
printf("%s",array[i].name);
switch(array[i].type)
{
case 0:
printf("%10s","SCIENCE");
break;
case 1:
printf("%10s","ARTS");
break;
case 2:
printf("%10s","MEDICIEN");
break;
case 3:
printf("%10s","OTHER");
default:
break;
}
printf("%10d%10.2f%10.2f%10.2f\n",array[i].ID,array[i].score[0],array[i].score[1],array[i].score[2]);
}
printf("\n");
}
bool ModifyStudentInfo(ElemType array[],int n)
{
//add your code here
int number;
int i,j;
printf("輸入需要修改學(xué)生信息的學(xué)生學(xué)號(hào):");
scanf("%d",&number);
for(i=0;i<n;i++)
{
if(number==array[i].ID)
{
printf("請(qǐng)輸入該同學(xué)的新信息,按姓名,學(xué)科種類(lèi),學(xué)號(hào),各科成績(jī)的順序\n");
printf("(學(xué)科種類(lèi)只需填對(duì)應(yīng)代碼---理科0,文科1,醫(yī)科2,其他3):\n");
scanf("%s %d %d",array[i].name,&array[i].type,&array[i].ID);
for(j=0;j<SCORE_NUM;j++)
{
scanf("%f",&array[i].score[j]);
}
return true;
break;
}
}
return false;
}
void CalcSubjectScore(ElemType array[], int n)
{
//add your code here
int i,j;
float sum[SCORE_NUM]={0},ave[SCORE_NUM];
for(j=0;j<SCORE_NUM;j++)
{
for(i=0;i<n;i++)
{
sum[j]=sum[j]+array[i].score[j];
}
ave[j]=sum[j]/n;
}
for(j=0;j<SCORE_NUM;j++)
{
printf("科目 %d 均分:%.2f\n",j+1,ave[j]);
}
}
void CalcStudentScore(ElemType array[], int n)
{
//add your code here
int findID,i,j;
float sum=0;
printf("請(qǐng)輸入查找學(xué)生的學(xué)號(hào):");
scanf("%d",&findID);
for(i=0;i<n;i++)
{
if(findID==array[i].ID)
{
for(j=0;j<SCORE_NUM;j++)
{
sum=sum+array[i].score[j];
}
break;
}
}
printf("該學(xué)生總分為:%.2f\n",sum);
}
void SortStu(ElemType array[], int n)
{
//add your code here
int j;
printf("請(qǐng)輸入添加的學(xué)生信息(按姓名,學(xué)科種類(lèi),學(xué)號(hào),各科分?jǐn)?shù)的順序)\n");
printf("(學(xué)科種類(lèi)只需輸入對(duì)應(yīng)代碼---理科0,文科1,醫(yī)科2,其他3):\n");
scanf("%s %d %d",array[n].name,&array[n].type,&array[n].ID);
for(j=0;j<SCORE_NUM;j++)
{
scanf("%f",&array[n].score[j]);
}
n=n+1;
printf("添加成功!\n");
DispalyAll(array,n);
}
//
///function
///把數(shù)組中所有有效記錄以二進(jìn)制形式保存到文件中
bool WriteDataToFile(char *filename, ElemType array[], int n)
{
//add your code here
int i;
FILE* fp;
if( (fp=fopen(filename,"rw"))==NULL )
{
printf("cannot open file\n");
return false;
}
for(i=0;i<n+1;i++)
{
fwrite(array+i,sizeof(ElemType),1,fp);
}
fclose(fp);
return true;
}main.cpp
//這是主測(cè)試文件
#include "elemtype.h"
#define MAX_STUDENT_NUM 100
void displayInfo();
void run(ElemType* array, int n);
int main()
{
int n = 5;//n 為數(shù)組中有效記錄條數(shù),初始文件中為5
ElemType total[MAX_STUDENT_NUM];
char filename[] = "student.dat";
if (!ReadDataFromFile(filename,total,n))
{
printf("打開(kāi)文件%s失敗",filename);
}
displayInfo();
run(total,n);
return 0;
}
//
///function
void displayInfo()
{
puts("********************************************************************" );
puts(" 歡迎使用x大學(xué)計(jì)算機(jī)(軟件)學(xué)院學(xué)生管理系統(tǒng)V1.0" );
puts("********************************************************************\n" );
}
//
///function
void run(ElemType* array, int n)
{
int option = 0;
//提示用戶選擇操作
puts(" ");
puts("請(qǐng)選擇操作:\n" );
puts("0:直接退出 ");
puts("1:顯示所有學(xué)生信息 ") ;
puts("2:修改某個(gè)學(xué)生信息 ") ;
puts("3:計(jì)算所有學(xué)生某一科平均分 ") ;
puts("4:計(jì)算某一個(gè)學(xué)生分?jǐn)?shù) ") ;
puts("5:添加一個(gè)學(xué)生信息 ") ;
puts("6:寫(xiě)回文件并退出 \n" ) ;
do
{
scanf("%d", &option );
//根據(jù)用戶選擇調(diào)用相關(guān)函數(shù)完成指定的操作
switch(option )
{
//顯示所有學(xué)生信息
case 1:
DispalyAll(array,n);
break;
//修改某個(gè)學(xué)生信息
case 2:
{
if( ModifyStudentInfo(array,n) )
{
printf("\n");
DispalyAll(array,n);
printf("修改成功!\n");
}
else
printf("未找到此學(xué)生!\n");
}
break;
//計(jì)算所有學(xué)生某一科平均分
case 3:
CalcSubjectScore(array,n);
break;
//計(jì)算某一個(gè)學(xué)生分?jǐn)?shù)
case 4:
CalcStudentScore(array,n);
break;
//添加一個(gè)學(xué)生信息
case 5:
SortStu(array,n);
break;
//寫(xiě)回文件并退出
case 6:
{
if( WriteDataToFile("student.dat",array,n) )
{
printf("保存成功!\n");
DispalyAll(array,n+1);
}
break;
}
default:
break;
}
}while(option != 0 );
}以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解C語(yǔ)言中accept()函數(shù)和shutdown()函數(shù)的使用
這篇文章主要介紹了詳解C語(yǔ)言中accept()函數(shù)和shutdown()函數(shù)的使用,用來(lái)操作socket相關(guān)的網(wǎng)絡(luò)通信,需要的朋友可以參考下2015-09-09
C語(yǔ)言數(shù)組長(zhǎng)度的計(jì)算方法實(shí)例總結(jié)(sizeof與strlen)
數(shù)組一旦創(chuàng)建,程序運(yùn)行期間,長(zhǎng)度不可改變,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言數(shù)組長(zhǎng)度的計(jì)算方法,主要利用的是sizeof與strlen,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06
VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口
這篇文章主要介紹了VS2019使用Windows桌面應(yīng)用程序模塊創(chuàng)建Win32窗口,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
如何在C++類(lèi)的外部調(diào)用類(lèi)的私有方法
這篇文章主要介紹了如何在C++類(lèi)的外部調(diào)用類(lèi)的私有方法,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09
C語(yǔ)言入門(mén)篇--四大常量(字面,const修飾,宏,枚舉)及標(biāo)識(shí)符
本篇文章是c語(yǔ)言基礎(chǔ)篇,主要講述一下常量,常量即不可被直接修改的量(const修飾的常變量可間接修改,后續(xù)文章會(huì)繼續(xù)說(shuō)明)請(qǐng)大家持續(xù)關(guān)注腳本之家2021-08-08
詳解C語(yǔ)言如何實(shí)現(xiàn)雙向帶頭循環(huán)鏈表
雙向帶頭循環(huán)鏈表應(yīng)該是鏈表中非常方便的一種,可以很容易的在任意位置上進(jìn)行插入和刪除,可以很容易的對(duì)鏈表進(jìn)行管理。本文將利用C語(yǔ)言實(shí)現(xiàn)雙向帶頭循環(huán)鏈表,需要的可以參考一下2022-08-08

