軟件功能描述
功能模塊圖

2.信息管理模塊

功能說明:輸入、增加、刪除、修改學生信息同時返回上一級
查詢模塊

功能說明:根據(jù)性別民族等查找學生人數(shù)、按照課程最高分查詢學生信息、按照課程統(tǒng)計學生的平均分數(shù)同時返回上一級
成績排序模塊

功能說明:根據(jù)課程對學生成績進行排序
保存學生信息模塊

功能說明:通過該選項將學生信息保存至同目錄下students.txt文件中
退出模塊

功能說明:通過該選項退出學生管理系統(tǒng)
開發(fā)環(huán)境(C語言、Dev-C++5.6.3)
程序設(shè)計與實現(xiàn)
(一)數(shù)據(jù)結(jié)構(gòu)描述

(二)菜單模塊
1 主界面實現(xiàn)

2 函數(shù)原型及說明
int main(); 主函數(shù),負責菜單的調(diào)用
void one_menu;次級菜單,負責信息功能調(diào)用
void two_menu;次級菜單,負責查詢功能調(diào)用
student_sort();負責對學生成績進行排序功能調(diào)用
saveStu();負責對學生信息進行文件儲存
3 主要程序代碼



(三)輸入菜單模塊
1 主界面實現(xiàn)

2 函數(shù)原型及說明
input_student_info();首次輸入學生信息的功能調(diào)用
add_student_info();繼續(xù)增加學生信息功能調(diào)用
delete_student_info();刪除指定學生信息的功能調(diào)用
change_sutdent_info();修改指定學生信息的功能調(diào)用
3 主要程序代碼



(四)查詢模塊
1 查詢界面實現(xiàn)

2 函數(shù)原型及說明
search_student_sex_num();按照性別查詢學生人數(shù)的功能調(diào)用
search_student_num();查詢當前已存入信息的學生人數(shù)的功能調(diào)用
search_student_nation_num();按照民族查詢學生人數(shù)的功能調(diào)用
search_student_score_max();按照課程最高分查詢學生信息的功能調(diào)用
student_average_sco();統(tǒng)計課程學生平均分數(shù)的功能調(diào)用
3 主要程序代碼




(五)成績排序模塊
1 排序界面實現(xiàn)

2 函數(shù)原型及說明
void student_sort();按照成績給學生進行排序
3 主要代碼實現(xiàn)


(六)信息保存模塊
1 保存界面實現(xiàn)

2 函數(shù)原型及說明
void saveStu();對輸入的學生信息保存到同目錄下students.txt文件中
3 主要代碼實現(xiàn)

(七)信息讀入模塊
1 保存界面實現(xiàn)

2 函數(shù)原型及說明
void whiteStu();對保存的學生信息讀入程序中
3 主要代碼實現(xiàn)

開發(fā)中遇到的問題及解決辦法
問題一:
對學生信息的保存
解決該問題,需要掌握C語言文件的相關(guān)知識,通過查閱書籍和相關(guān)網(wǎng)課的學習以及CSDN中關(guān)于該功能的學習


學習感想
這門課結(jié)束之后,我總結(jié)了學習中遇到的一些問題,最為突出的,書本上的知識與老師的講解都比較容易理解,但是當自己采用剛學的知識點編寫程序時卻感到十分棘手,有時表現(xiàn)在想不到適合題意的算法,有時表現(xiàn)在算法想出來后,卻無法根據(jù)現(xiàn)有知識進行編程。
剛開始學的時候確實有很多地方我很不理解,每次上上機課時老師都會在頭歌平臺給我們出不同的設(shè)計題目,對于我們一個初學者來說,無疑是一個具大的挑戰(zhàn),撞了幾次壁之后,我決定靜下心來,仔細去寫程序。老師會給我們需要編程的內(nèi)容一些講解,順著老師的思路,來完成自己的設(shè)計,我們可以開始運行自己的程序,可是好多處的錯誤讓人看的可怕,還看不出到底是哪里出現(xiàn)了錯誤,但是程序還是得繼續(xù)下去,我多次請教了同學和在網(wǎng)絡(luò)中搜索并查詢相關(guān)知識,逐漸能自己找出錯誤,并加以改正。Dev-C++里檢查錯誤都是用英文來顯示出來的,經(jīng)過了這次課程設(shè)計,現(xiàn)在已經(jīng)可以了解很多錯誤在英文里的提示,這對我來說是一個突破性的進步,眼看著一個個錯誤通過自己的努力在我眼前消失,覺得很是開心。此次的程序設(shè)計能夠成功,離不開老師的指導和同學的熱情幫助。在這一段努力學習的過程中,我的編程設(shè)計能力有了明顯的提高。
其實現(xiàn)在想起來,收獲還真是不少,雖然說以前非常不懂這門語言,在它上面花費了好多心血,覺得它很難,是需用花費了大量的時間編寫出來的?,F(xiàn)在真正的明白了一些代碼的應(yīng)用,每個程序都有一些共同點,通用的結(jié)構(gòu),相似的格式。只要努力去學習,就會靈活的去應(yīng)用它。
參考文獻:
魏曉鳴.王曉強.程序設(shè)計基礎(chǔ)(C語言版).北京.清華大學出版社.2012
下面是附帶的源碼文章來源:http://www.zghlxwxcb.cn/news/detail-758605.html
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <windows.h>
int i=0;
int t=0;
//學生信息結(jié)構(gòu)體
struct student
{
int tel;
char name[20];
char sex[20];
char nation[20];
int age;
float math_score;
float c_score;
float english_score;
int ff;
};
struct student stu[100];
void save();
//輸入學生信息函數(shù)
void input_student_info()
{
char info;
for(;i<100;i++){
printf("\t");
printf("\t學生學號:\n");
scanf("%d",&stu[i].tel);
getchar();
printf("\t學生姓名:\n");
scanf("%s",&stu[i].name);
getchar();
printf("\t學生性別:\n");
scanf("%s",&stu[i].sex);
getchar();
printf("\t學生民族:\n");
scanf("%s",&stu[i].nation);
getchar();
printf("\t學生高數(shù)成績:\n");
scanf("%f",&stu[i].math_score);
getchar();
printf("\t學生C語言成績:\n");
scanf("%f",&stu[i].c_score);
getchar();
printf("\t學生年齡:\n");
scanf("%d",&stu[i].age);
getchar();
printf("\t學生英語分數(shù):\n");
scanf("%f",&stu[i].english_score);
printf("\t是否繼續(xù)輸入?是請輸入“y”,否則“n”\n");
scanf("%s",&info);
if(info=='n'){
t++;
break;
}else{
t++;
continue;
}
}
}
//增加學生的基本信息函數(shù)
void add_student_info()
{
char info;
for(;i+1<100;i++){
printf("\t");
printf("\t學生學號:\n");
scanf("%d",&stu[i].tel);
getchar();
printf("\t學生姓名:\n");
scanf("%s",&stu[i].name);
getchar();
printf("\t學生性別:\n");
scanf("%s",&stu[i].sex);
getchar();
printf("\t學生民族:\n");
scanf("%s",&stu[i].nation);
getchar();
printf("\t學生高數(shù)成績:\n");
scanf("%f",&stu[i].math_score);
getchar();
printf("\t學生C語言成績:\n");
scanf("%f",&stu[i].c_score);
getchar();
printf("\t學生年齡:\n");
scanf("%d",&stu[i].age);
getchar();
printf("\t學生英語分數(shù):\n");
scanf("%f",&stu[i].english_score);
printf("\t是否繼續(xù)輸入?是請輸入“y”,否則“n”\n");
scanf("%s",&info);
if(info=='n'){
t++;
break;
}else{
t++;
continue;
}
}
}
//刪除學生的基本信息函數(shù)
void delete_student_info()
{
printf("\t請輸入學生對應(yīng)的學號:\n");
int j=0;
scanf("%d",&j);
int jj=0;
for(;jj<100;jj++){
if(stu[jj].tel==j){
strcpy(stu[jj].name,stu[jj+1].name);
stu[jj].tel=stu[jj+1].tel;
strcpy(stu[jj].sex,stu[jj+1].sex);
strcpy(stu[jj].nation,stu[jj+1].nation);
stu[jj].math_score=stu[jj+1].math_score;
stu[jj].age=stu[jj+1].age;
stu[jj].c_score=stu[jj+1].c_score;
stu[jj].english_score=stu[jj+1].english_score;
}
}
printf("\t該學生信息已刪除\n");
t=t-1;
}
//修改學生的基本信息函數(shù)
void change_sutdent_info()
{
printf("\t請輸入學生對應(yīng)的學號:\n");
int j=0;
int number2;
scanf("%d",&j);
printf("\t請輸入要修改的選項:\n");
printf("\t1.姓名\n");
printf("\t2.性別\n");
printf("\t3.民族\n");
printf("\t4.高數(shù)課程成績\n");
printf("\t5.C語言課程成績\n");
printf("\t6.英語課程成績\n");
printf("\t7.學號\n\t");
printf("\t請輸入修改的選項:\n");
scanf("%d",&number2);
printf("\t請輸入修改的內(nèi)容:\n");
for(;j<100;j++){
if(stu[j].tel==j){
switch(number2){
case 1:scanf("%s",&stu[j].name);
case 2:scanf("%s",&stu[j].sex);
case 3:scanf("%s",&stu[j].nation);
case 4:scanf("%f",&stu[j].math_score);
case 5:scanf("%f",&stu[j].c_score);
case 6:scanf("%f",&stu[j].english_score);
case 7:scanf("%d",&stu[j].tel);
}
}
}
printf("\t學生信息已修改完成\n");
}
//查詢學生人數(shù)函數(shù)
void search_student_num()
{
printf("\t學生人數(shù):%d\n",t);
}
//按照性別查詢學生人數(shù)
void search_student_sex_num()
{
int x=0;
int number3=0;
char xingbie[20];
printf("\t你想查找的性別是:\n\t");
scanf("%s",&xingbie);
for(;x<100;x++){
if(strcmp(stu[x].sex,xingbie)==0){
number3++;
}
}
printf("\t學生人數(shù)是%d\n",number3);
}
//統(tǒng)計學生成績的平均分數(shù)
void student_average_sco()
{
float average1=0;
float average2=0;
float average3=0;
float sum1=0;
float sum2=0;
float sum3=0;
int i=0;
for(;i<100;i++){
if(stu[i].tel!=0){
sum1=sum1+stu[i].math_score;
}
}
average1=sum1/t;
int j=0;
for(;j<100;j++){
if(stu[j].tel!=0){
sum2=sum2+stu[j].c_score;
}
}
average2=sum2/t;
int k=0;
for(;k<100;k++){
if(stu[k].tel!=0){
sum3=sum3+stu[k].english_score;
}
}
average3=sum3/t;
printf("\t|| 1.高數(shù)成績的平均分數(shù) ||\n");
printf("\t|| 2.C語言成績的平均分數(shù) ||\n");
printf("\t|| 3.英語成績的平均分數(shù) ||\n");
printf("\t請選擇1--3:\n");
int sel1=0;
scanf("%d",&sel1);
switch(sel1)
{
case 1: printf("\t該課程的平均分數(shù)為%f\n",average1); break;
case 2: printf("\t該課程的平均分數(shù)為%f\n",average2); break;
case 3: printf("\t該課程的平均分數(shù)為%f\n",average3); break;
}
}
//按照民族查詢學生人數(shù)
void search_student_nation_num()
{
int y=0;
int number4=0;
char nation1[20];
printf("\t你想查找的民族是:\n\t");
scanf("%s",&nation1);
for(;y<100;y++){
if(strcmp(stu[y].nation,nation1)==0){
number4++;
}
}
printf("\t學生人數(shù)是%d\n",number4);
}
//給學生進行排序
void student_sort()
{
printf("\t|| 1.按照高數(shù)成績 ||\n");
printf("\t|| 2.按照C語言成績 ||\n");
printf("\t|| 3.按照英語成績 ||\n");
printf("\t請選擇1--3:\n");
int sel1=0;
scanf("%d",&sel1);
struct student tmp;
int i,j;
if(sel1==2){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].c_score<stu[i+1].c_score) //如果前面的小于后面的
{
tmp=stu[i]; //交換兩個數(shù)的位置,結(jié)構(gòu)體可以直接賦值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
for(i=0; i<100; i++)
{
printf("\t學號:%d 姓名:%s 成績 %f \n",stu[i].tel,stu[i].name,stu[i].c_score);
}
}else if(sel1==1){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].math_score<stu[i+1].math_score) //如果前面的小于后面的
{
tmp=stu[i]; //交換兩個數(shù)的位置,結(jié)構(gòu)體可以直接賦值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
for(i=0; i<100; i++)
{
printf("\t學號:%d 姓名:%s 成績 %f \n",stu[i].tel,stu[i].name,stu[i].math_score);
}
}else if(sel1==3){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].english_score<stu[i+1].english_score) //如果前面的小于后面的
{
tmp=stu[i]; //交換兩個數(shù)的位置,結(jié)構(gòu)體可以直接賦值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
for(i=0; i<100; i++)
{
printf("\t學號:%d 姓名:%s 成績 %f \n",stu[i].tel,stu[i].name,stu[i].english_score);
}
}
}
//查詢獲得某課程最高分的同學信息
void search_student_score_max()
{
printf("\t|| 1.按照高數(shù)成績 ||\n");
printf("\t|| 2.按照C語言成績 ||\n");
printf("\t|| 3.按照英語成績 ||\n");
printf("\t請選擇1--3:\n");
int sel1=0;
scanf("%d",&sel1);
struct student tmp;
int i,j;
if(sel1==2){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].c_score<stu[i+1].c_score) //如果前面的小于后面的
{
tmp=stu[i]; //交換兩個數(shù)的位置,結(jié)構(gòu)體可以直接賦值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
printf("\t學號:%d\n",stu[0].tel);
printf("\t姓名:%s\n",stu[0].name);
printf("\t性別:%s\n",stu[0].sex);
printf("\t民族:%s\n",stu[0].nation);
printf("\t高數(shù)成績:%f\n",stu[0].math_score);
printf("\tC語言成績:%f\n",stu[0].c_score);
printf("\t年齡:%d\n",stu[0].age);
printf("\t英語成績:%f\n",stu[0].english_score);
}else if(sel1==1){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].math_score<stu[i+1].math_score) //如果前面的小于后面的
{
tmp=stu[i]; //交換兩個數(shù)的位置,結(jié)構(gòu)體可以直接賦值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
printf("\t學號:%d\n",stu[0].tel);
printf("\t姓名:%s\n",stu[0].name);
printf("\t性別:%s\n",stu[0].sex);
printf("\t民族:%s\n",stu[0].nation);
printf("\t高數(shù)成績:%f\n",stu[0].math_score);
printf("\tC語言成績:%f\n",stu[0].c_score);
printf("\t年齡:%d\n",stu[0].age);
printf("\t英語成績:%f\n",stu[0].english_score);
}else if(sel1==3){
i=0;
j=0;
for(j=0; j<100-1; j++)
for(i=0; i<100-j-1; i++)
if (stu[i].english_score<stu[i+1].english_score) //如果前面的小于后面的
{
tmp=stu[i]; //交換兩個數(shù)的位置,結(jié)構(gòu)體可以直接賦值
stu[i]=stu[i+1];
stu[i+1]=tmp;
}
printf("\t學號:%d\n",stu[0].tel);
printf("\t姓名:%s\n",stu[0].name);
printf("\t性別:%s\n",stu[0].sex);
printf("\t民族:%s\n",stu[0].nation);
printf("\t高數(shù)成績:%f\n",stu[0].math_score);
printf("\tC語言成績:%f\n",stu[0].c_score);
printf("\t年齡:%d\n",stu[0].age);
printf("\t英語成績:%f\n",stu[0].english_score);
}
}
//保存學生信息
void saveStu(){
int i = 0;
FILE * fp;
fp = fopen("students.txt","w");
if(fp == NULL){
printf("\t文件打開失敗!\n");
exit(0);
}
fprintf(fp,"%d\n",t);
for(i = 0;i < t;i++){
fprintf(fp,"\t%d",stu[i].tel);
fprintf(fp,"\t%s",stu[i].name);
fprintf(fp,"\t%s",stu[i].sex);
fprintf(fp,"\t%s",stu[i].nation);
fprintf(fp,"\t%f",stu[i].math_score);
fprintf(fp,"\t%f",stu[i].c_score);
fprintf(fp,"\t%d",stu[i].age);
fprintf(fp,"\t%f\n",stu[i].english_score);
}
fclose(fp);
printf("\t寫入成功!\n");
}
void whiteStu(){
int i = 0;
FILE * fp;
fp = fopen("students.txt","r+");
if(fp == NULL){
printf("\t文件打開失敗!\n");
exit(0);
}
fscanf(fp,"%d\n",&t);
for(i = 0;i < t;i++){
fscanf(fp,"\t%d",&stu[i].tel);
fscanf(fp,"\t%s",&stu[i].name);
fscanf(fp,"\t%s",&stu[i].sex);
fscanf(fp,"\t%s",&stu[i].nation);
fscanf(fp,"\t%f",&stu[i].math_score);
fscanf(fp,"\t%f",&stu[i].c_score);
fscanf(fp,"\t%d",&stu[i].age);
fscanf(fp,"\t%f\n",&stu[i].english_score);
}
fclose(fp);
printf("\t讀入成功!\n");
}
//menu
void menu()
{
printf("\t======================================================\n");
printf("\t 學生信息管理系統(tǒng) \n");
printf("\t ********************************* \n");
printf("\t * 功能菜單 * \n");
printf("\t ********************************* \n");
printf("\t 1.信息管理 \n");
printf("\t 2.查詢 \n");
printf("\t 3.成績排序 \n");
printf("\t 4.保存學生信息 \n");
printf("\t 5.讀入學生信息 \n");
printf("\t 6.退出系統(tǒng) \n");
printf("\t * 退出前請保存學生信息 * \n");
printf("\t======================================================\n");
}
void two_menu()
{
printf("\t|| 1.按照性別查詢學生人數(shù) ||\n");
printf("\t|| 2.查詢當前學生人數(shù) ||\n");
printf("\t|| 3.按照民族查詢學生人數(shù) ||\n");
printf("\t|| 4.查詢某課程的最高分的學生信息 ||\n");
printf("\t|| 5.按照課程統(tǒng)計學生的平均分數(shù) ||\n");
printf("\t|| 6.返回上一級 ||\n");
printf("\t請選擇1--6:\n");
int selection;
scanf("%d",&selection);
switch(selection)
{
case 1: search_student_sex_num(); break;
case 2: search_student_num(); break;
case 3: search_student_nation_num(); break;
case 4: search_student_score_max(); break;
case 5: student_average_sco(); break;
case 6: break;
}
}
void one_menu()
{
printf("\t|| 1.首次輸入學生信息 ||\n");
printf("\t|| 2.增加學生信息 ||\n");
printf("\t|| 3.刪除學生信息 ||\n");
printf("\t|| 4.修改學生信息 ||\n");
printf("\t|| 5.返回上一級 ||\n");
printf("\t請選擇1--5:\n");
int selection;
scanf("%d",&selection);
switch(selection)
{
case 1: input_student_info(); break;
case 2: add_student_info(); break;
case 3: delete_student_info(); break;
case 4: change_sutdent_info(); break;
case 5: break;
}
}
//主函數(shù)
int main()
{
int selection;
while(true)
{
int selection;
menu();
printf("\t請選擇1--5:\n");
scanf("%d",&selection);
switch(selection)
{
case 1: one_menu(); break;
case 2: two_menu(); break;
case 3: student_sort(); break;
case 4:saveStu(); break;
case 5:whiteStu(); break;
case 6:
printf("\n\t>>>您已成功退出學生信息管理系統(tǒng),感謝使用!\n");
exit(0);
break;
default:
printf("\n\t>>>輸入有誤,請重新輸入!\n");
}
}
return 0;
}
//文件打開
/*
FILE *fp;
fp=fopen("C:\\Users\\subrewmaster\\Desktop\\student.dat","wb");// ("文件名","打開文件方式")
或
FILE *fp;
char *filename="C:\\Users\\subrewmaster\\Desktop\\student.dat";
fp=fopen(filename,"r");
如果打開出錯,fopen函數(shù)會返回一個空指針NULL
*/
//文件關(guān)閉
//fclose(fp);
//文件的順序讀寫
//字符讀寫函數(shù)fgetc()和fputc() 例:ch=fgetc(fp);
該內(nèi)容為個人記錄所用,錯誤難以避免,希望大佬們能在評論區(qū)提出建議或更好的方法!與君共勉文章來源地址http://www.zghlxwxcb.cn/news/detail-758605.html
到了這里,關(guān)于基于C語言的學生信息管理系統(tǒng)開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!