c語言成績簿
A. 用c語言編一個成績記錄簿
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#defineMAX1000
typedefstructLesson//定義課程結構體
{
intLesson_Num;
charLesson_Name[50];
intLesson_Mark;
intLesson_Credit;
}Lesson;
typedefstructStudent//定義學生的結構體
{
charName[50];
intNum;
intLesson_Count;
LessonL[20];
}Student;
StudentS[MAX];
staticintStudent_Count=0;//記錄學生數的變數
voidPrintInterface();//列印界面
intAddStudent();//添加,帶返回值,提示操作成功
intDelStudent();//刪除,帶返回值,提示操作成功
voidCheckStudent();//查學生成績
voidCheckClass();//查班成績表
voidWriteFile();//寫入文本文件
voidReadFile();//讀取文本文件
voidmain()
{
intChoice;
while(1)
{
PrintInterface();
scanf("%d%*c",&Choice);//"%*c"是吸收回車的,因為後面會輸入字母類型
if(Choice>=0&&Choice<=6)//選擇操作合法
{
switch(Choice)
{
case0:exit(1);
case1:
{
system("cls");
if(AddStudent())printf(" 添加成功...回車繼續 ");
elseprintf(" 添加失敗...回車繼續 ");
getchar();
getchar();
system("cls");
break;
}
case2:
{
system("cls");
if(DelStudent())printf(" 刪除成功...回車繼續 ");
elseprintf(" 刪除失敗...回車繼續 ");
getchar();
getchar();
system("cls");
break;
}
case3:
{
system("cls");
CheckStudent();
system("cls");
break;
}
case4:
{
system("cls");
CheckClass();
system("cls");
break;
}
case5:WriteFile();system("cls");break;
case6:ReadFile();system("cls");break;
default:;
}
}
else
{
printf("無此功能..重新選擇..回車確定 ");//選擇操作非法
getchar();
system("cls");//清屏函數
}
}
}
voidPrintInterface()
{
printf(" -------------------------- ");
printf(" |1、添加| ");
printf(" || ");
printf(" |2、刪除| ");
printf(" || ");
printf(" |3、查學生成績| ");
printf(" || ");
printf(" |4、查班成績表| ");
printf(" || ");
printf(" |5、寫入文本文件| ");
printf(" || ");
printf(" |6、讀取文本文件| ");
printf(" || ");
printf(" |0、退出| ");
printf(" -------------------------- ");
printf(" 選擇操作:");
}
intAddStudent()
{
intS_count,i,j;
printf(" 添加中...... ");
printf(" 添加學生人數(如1、2……999):");
scanf("%d",&S_count);
if(Student_Count+S_count>=MAX)return0;//超過了數組上限
for(i=Student_Count;i<Student_Count+S_count;i++)
{
printf(" 第%d個學生: ",i-Student_Count+1);
printf(" 學生學號:");scanf("%d%*c",&S[i].Num);
printf(" 學生姓名:");gets(S[i].Name);
printf(" 該學生所修課程數:");scanf("%d",&S[i].Lesson_Count);
for(j=0;j<S[i].Lesson_Count;j++)
{
printf(" 第%d門課: ",j+1);
printf(" 課程編號:");scanf("%d%*c",&S[i].L[j].Lesson_Num);
printf(" 課程名稱:");gets(S[i].L[j].Lesson_Name);
printf(" 課程成績:");scanf("%d",&S[i].L[j].Lesson_Mark);
printf(" 課程學分:");scanf("%d",&S[i].L[j].Lesson_Credit);
if(S[i].L[j].Lesson_Mark<60)S[i].L[j].Lesson_Credit=0;//不及格的課程學分為0
}
}
Student_Count+=S_count;
return1;
}
intDelStudent()
{
char*D_Name;
intD_Num;
inti,j;
printf(" 填寫待刪除學生的信息: ");
printf(" 學生姓名:");gets(D_Name);
printf(" 學生學號:");scanf("%d",&D_Num);
for(i=0;i<Student_Count;i++)
{
if(!strcmp(S[i].Name,D_Name)&&S[i].Num==D_Num)
{
printf(" 找到該學生,刪除中...... ");
for(j=i+1;j<Student_Count;j++)
{
S[j-1]=S[j];
}
break;
}
}
if(i==Student_Count)
{
printf(" 未找到該學生...請核對所填信息 ");
return0;
}
else
{
Student_Count--;
return1;
}
}
voidCheckStudent()
{
intC_Choice;
charC_Name[50];
intC_Num;
inti,j;
printf(" 輸入所查學生信息(1.姓名\2.學號)選擇:");
scanf("%d%*c",&C_Choice);
printf(" 查找中...... ");
if(C_Choice==1||C_Choice==2)//選擇合法
{
if(C_Choice==1)
{
printf(" 姓名:");gets(C_Name);
for(i=0;i<Student_Count;i++)//全部窮舉,防止同名同姓
{
if(!strcmp(S[i].Name,C_Name))
{
printf(" 學號:%d 姓名:%s ",S[i].Num,S[i].Name);
printf(" 課程編號 課程名稱 課程成績 課程學分 ");
printf("----------------------------------------------------- ");
for(j=0;j<S[i].Lesson_Count;j++)
{
printf("%d %s %d %d ",S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name,S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
printf("----------------------------------------------------- ");
}
printf(" ");
}
}
}
else
{
printf(" 學號:");scanf("%d%*c",&C_Num);
for(i=0;i<Student_Count;i++)//不用全部窮舉,學號唯一
{
if(S[i].Num==C_Num)
{
printf(" 學號:%d 姓名:%s ",S[i].Num,S[i].Name);
printf(" 課程編號 課程名稱 課程成績 課程學分 ");
printf("----------------------------------------------------- ");
for(j=0;j<S[i].Lesson_Count;j++)
{
printf("%d %s %d %d ",S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name,S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
printf("----------------------------------------------------- ");
}
printf(" ");
break;
}
}
}
printf("查找完畢...回車繼續 ");
getchar();
}
else//選擇不合法
{
printf("選擇錯誤...回車繼續 ");
getchar();
return;
}
}
voidCheckClass()
{
intC_LNum;
doubleSSNum=0,PassSNum=0,SMark=0;
inti,j;
printf(" 請輸入課程編號:");
scanf("%d%*c",&C_LNum);
printf(" 查找中...... ");
printf("學號 姓名 課程名稱 課程成績 課程學分 ");
printf("---------------------------------------------------- ");
for(i=0;i<Student_Count;i++)
{
for(j=0;j<S[i].Lesson_Count;j++)
{
if(S[i].L[j].Lesson_Num==C_LNum)
{
printf("%d %s %s %d %d ",S[i].Num,S[i].Name,S[i].L[j].Lesson_Name,
S[i].L[j].Lesson_Mark,S[i].L[j].Lesson_Credit);
printf("---------------------------------------------------- ");
SMark+=S[i].L[j].Lesson_Mark;
SSNum++;
if(S[i].L[j].Lesson_Mark>=60)PassSNum++;
break;
}
}
}
printf(" 平均分:%.2lf 及格率:%.2lf%% ",SMark/SSNum,PassSNum/SSNum*100);
printf(" 查找完畢...回車繼續 ");
getchar();
}
voidWriteFile()
{
FILE*fp;
inti,j;
charAdr[100];
printf(" 請輸入寫入的文件地址: 地址輸入格式:例如d:\\Student.txt(\\為轉義字元):");
scanf("%s%*c",Adr);
printf(" 寫入中...... ");
if(fp=fopen(Adr,"w"))//寫入文件
{
fprintf(fp,"%d ",Student_Count);
for(i=0;i<Student_Count;i++)
{
fprintf(fp,"%d %s %d ",S[i].Num,S[i].Name,S[i].Lesson_Count);
for(j=0;j<S[i].Lesson_Count;j++)
{
fprintf(fp,"%d %s %d %d ",S[i].L[j].Lesson_Num,
S[i].L[j].Lesson_Name,S[i].L[j].Lesson_Mark,
S[i].L[j].Lesson_Credit);
}
}
printf(" 寫入完成...回車繼續 ");
fclose(fp);
}
else
{
printf(" 寫入失敗...回車繼續 ");
}
getchar();
}
voidReadFile()
{
FILE*fp;
inti,j;
charAdr[100];
printf(" 請輸入讀取(為防止讀入錯誤,希望與寫入文件內容格式一致)的文件地址: 地址輸入格式:例如d:\\Student.txt(\\為轉義字元):");
scanf("%s%*c",Adr);
printf(" 讀取中...... ");
if(fp=fopen(Adr,"r"))
{
fscanf(fp,"%d",&Student_Count);
for(i=0;i<Student_Count;i++)
{
fscanf(fp,"%d%s%d",&S[i].Num,&S[i].Name,&S[i].Lesson_Count);
for(j=0;j<S[i].Lesson_Count;j++)
{
fscanf(fp,"%d%s%d%d",&S[i].L[j].Lesson_Num,
&S[i].L[j].Lesson_Name,&S[i].L[j].Lesson_Mark,
&S[i].L[j].Lesson_Credit);
}
}
printf(" 讀取成功...回車繼續 ");
fclose(fp);
}
else
{
printf(" 讀取失敗...回車繼續 ");
}
getchar();
}
B. 學生成績記錄薄 c語言 課程設計報告
C語言程序設計報告
課題名稱:學生成績管理
1 系統概述:
本程序為一個學生成績管理系統,對學生的成績進行管理,學生的信息包括學號,姓名,學期,三門課程的成績,輸入這些信息,本程序可以自動計算總成績,可以按高分到低分進行排名,並對輸入信息的人數進行匯總.
2 數據結構設計:
(1)結構體;
(2)數組的設計:運用指針代替數組,使用指針來建立線性表,使程序更加簡潔,可讀性更強.
3 各函數的設計:
函數原型:void InitList(SqLinkList &L);
功能: 創建一個空的線性鏈表;
入口參數:L為要創建的線性鏈表;
出口參數:創建鏈表的L.head為空,L.length為0;
返回值: 無;
函數原型:void EmptyLinkList(SqLinkList &L);
功能: 清空整個線性鏈表;
入口參數:L為要清空的鏈表名稱;
出口參數:若清空成功則鏈表長度L.length為0;
返回值: 無;
函數原型:int ScanE(ElemType &e);
功能: 輸入學生信息;
入口參數:e為要輸入信息的學生名稱;
出口參數:e.num保存學號,e.name保存姓名,e.team保存所在學期,e.s1,e.s2,e.s3分別保存三門課程的成績;
返回值: 輸入合法返回1,否則返回0;
錯誤處理:若學號、姓名等輸入不合法會有提示及重輸;
函數原型:Status SqLinkListAppend(SqLinkList &L,ElemType e);
功能: 追加一個結點到線性鏈表中;
入口參數:e為所追加的結點名稱,L為e所追加到的線性鏈表的名稱;
出口參數:若追加成功,則e為頭結點,鏈表長度L.length增1;
返回值: 若追加成功返回1;
函數原型:Link SearchNode(SqLinkList L,int NUM);
功能: 查找學號為NUM的學生;
入口參數:查找的鏈表名稱L,學號NUM;
出口參數:若找到結點指針p指向該結點,否則指向空結點;
返回值: 結點指針p;
函數原型:void SearchTeam(SqLinkList L,int team);
功能: 查找學期為team的所有記錄並輸出其信息;
入口參數:查找的鏈表名稱L,要查找的學期team;
出口參數:無;
返回值: 無;
函數原型:void SearchUnpass(SqLinkList L,float s1,float s2,float s3);
功能: 查找所有有掛科記錄的學生並輸出其信息;
入口參數:查找的鏈表名稱L,要查找的各門學科成績s1,s2,s3;
出口參數:無;
返回值: 無;
函數原型:void SqLinkListSearch(SqLinkList L);
功能: 對鏈表進行分類查找;
入口參數:要查找的鏈表名稱L;
出口參數:無;
返回值: 無;
函數原型: void inputData(SqLinkList &L);
功能: 輸入數據,並追加一個結點;
入口參數: L為要追加結點的鏈表名稱;
出口參數: 無;
返回值: 無;
函數原型:void SqLinkListTraverse(SqLinkList L);
功能: 輸出鏈表中所有學生成績列表;
入口參數:L為要輸出信息的鏈表名稱;
出口參數:無;
返回值: 無;
函數原型:void PrintE(ElemType e);
功能: 輸出一個結點的所有信息;
入口參數:要輸出的結點名稱e;
出口參數:無;
返回值: 無;
4 使用程序的說明:
本程序為一個學生成績管理系統。對學生的成績信息進行管理,學生的信息包括學號、姓名、學期、三門課程的成績、平均成績、名次。本管理系統實現學生的學號、姓名、學期、每門課程的成績的錄入,並自動按平均分排名,使用時按屏幕上的提示,輸入使用代碼.如下圖所示:
例如:輸入代碼數字」1」,程序執行」輸入學生成績或已存在的學生成績進行修改」這條小程序.輸入學生個人信息後,如下圖所示:
如此分別輸入相應的程序代碼,就執行相應的程序段.
如下的程序是按學號進行成績排名:
當輸入」6」時,執行相應的程序,即匯總一共輸入學生的人數:
5 總結和體會:
通過對C語言學習,尤其是這學期本班開展C語言雙語教學,體會到學習難的同時,也真正了解到C語言作為一門高級的計算機語言的強大功能,特別是在當今實際生活,生產,辦公,信息管理等方面的強大作用. 這次合作我們遇到了許多的困難。時間的緊迫,知識的不足,給我很大的壓力。最終我還是還是完成了任務。團結就是力量是我這次最真切的感受。
6 程序代碼:
void InitList(SqLinkList &L) {
// 構造一個空的線性表L;
L.head = 0; //頭指針為空;
L.length = 0; //長度初始為0;
}
void EmptyLinkList(SqLinkList &L){
//入口參數為整個線性表的數據,功能為清空線性表;
Node *p;
if(!L.head)printf("系統中不存在記錄。\n");
//頭指針為空時沒有學生錄入;
else {
while (L.head){
//每個循環將下一結點賦值給頭指針,並釋放本結點空間,直至線性表清空;
p=L.head;
L.head=p->next;
free(p);
} //end while;
L.length=0; //長度為0;
printf("該管理系統學生信息已清空。\n");
}//end else;
}
int ScanE(ElemType &e){
//輸入一個學生的成績數據結點。返回0為無效結點數據,1為有效結點數據;
printf("\n學號:");
scanf("%d",&e.num);
if(e.num==0){
//學號為0輸入不合法,重新輸入;
printf("學號輸入不合法.\n");
return 0;
}
printf("\n姓名:");
scanf("%s",&e.name);
printf("\n學期:");
scanf("%d",&e.team);
while(e.team>12){
//系統只記錄小於12的學期數;
printf("輸入的學期不能大於12,請重新輸入:");
scanf("%d",&e.team);
}
printf("\n成績A:");
scanf("%f",&e.s1);
printf("\n成績B:");
scanf("%f",&e.s2);
printf("\n成績C:");
scanf("%f",&e.s3);
return OK;
}
Status SqLinkListAppend(SqLinkList &L,ElemType e){
//追加一個結點到線性表中;
Node *p;
p=SearchNode(L,e.num);
//查找學號為e.num的記錄並將其地址賦給指針p;
if (p==0){
//若不存在添加學號相同的結點,追加一個結點;
p=(Node *)malloc(sizeof(Node));
if (!p) return ERROR;
memcpy(&(p->data),&e,sizeof(ElemType));
p->next=L.head ;
L.head=p;
//追加的一個結點為首結點;
L.length++; //表長度加1;
}
else { //如果該學號記錄已存在,則進行修改操作;
memcpy(&(p->data),&e,sizeof(ElemType));
printf("該學生記錄已經存在,已完成修改操作。\n");
}
return OK;
}
Link SearchNode(SqLinkList L,int NUM){
//查找學生記錄,該學生的學號為NUM;
Node *p;
p=L.head; //p先指在頭結點;
while (p&& p->data.num !=NUM ) p=p->next;
//如果該學生的學號不為NUM則查找下一個結點;
return p;
}
void SearchTeam(SqLinkList L,int team){
//按學期查找並輸出所有該學期存在的記錄;
Node *p;
p=L.head;
int n,sum=0;
//sum記錄該學期的學生總人數;
printf("請輸入您要查詢的學生的學期:");
scanf("%d",&n);
printf("\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n");
while(p&&p->next){
//如果p結點和它的下一結點不為空,且該結點的學期等於要查找學期,則格式輸出所有該學期學生信息;
if(p->data.team==n){
PrintE(p->data);
sum++;
//查找到一個該學期的學生記錄計數加1;
}
p=p->next;
//轉向下一結點;
} //end while;
if(p->data.team==n){
//如果p的下一結點為空,且本結點學期為n,則格式輸出該結點信息;
sum++;
PrintE(p->data);
}
if(sum==0)printf("沒有這學期的記錄。\n");
if(sum)printf("該學期共有%d人的記錄.\n",sum);
}
void SearchUnpass(SqLinkList L,float s1,float s2,float s3){
//查找並輸出有掛科的學生信息;
Node *p;
p=L.head;
int sum=0;
//sum計數掛科總人數,初始為0;
printf("以下是有一門以上不及格科目的學生的成績:\n");
printf("\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n");
while(p&&p->next){
//如果p及其下一結點為真,且該結點有一門以上科目分數低於60則輸出該結點成績並使sum計數加1;
if((p->data.s1<60)||(p->data.s2<60)||(p->data.s3<60))
{
PrintE(p->data);
sum++;
} //end if;
p=p->next;
//轉到下一結點;
} //end while;
if((p->data.s1<60)||(p->data.s2<60)||(p->data.s3<60)){
//查看最後一個結點,若有掛科,sum加1並格式輸出結點信息;
sum++;
PrintE(p->data);
}
if(sum==0)printf("沒有不及格的記錄。\n");
if(sum)printf("共有%d人的掛科記錄.\n",sum);
}
void SqLinkListSearch(SqLinkList L){
//分類查找學生記錄;
Node *p;
p=L.head;
int n,reg; //reg為查詢方式的指令;
printf("1--按學號查詢\n2--按學期查詢\n3--掛科學生信息列表\n");
printf("請您輸入查詢方式:");
scanf("%d",®);
if(L.length){
if(reg>3)printf("對不起沒有您要求的選項。\n");
//若reg>3則輸入不合法;
else if(reg==1){
//reg==1按學號查詢;
printf("請輸入您要查詢的學生的學號:");
scanf("%d",&n);
while(p&&p->next&& p->data.num !=n) p=p->next;
//當p和他下一結點為真時且結點數據不為要查找數據時轉向下一結點;
if(p->data.num==n){
//找到所要查詢結點,格式輸出;
printf("\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n");
PrintE(p->data);
}
else printf("沒有您要查找的學號。\n");
} //end reg==1 if ;
else if(reg==2)SearchTeam(L,p->data.team);
//reg==2,調用SearchTeam函數按學期查詢並輸出;
else if(reg==3)SearchUnpass(L,p->data.s1,p->data.s2,p->data.s3);
//reg==3,調用SearchUnpass函數,輸出全部有掛科記錄的學生信息;
}//end if;
else printf("系統中無記錄.\n");
}
void inputData(SqLinkList &L){
//請求輸入學生成績,則追加一個結點並輸入;
ElemType e;
if (ScanE(e)) SqLinkListAppend(L,e); //輸入數據,追加一個結點;
}
void SqLinkListTraverse(SqLinkList L){
//所有學生信息列表輸出;
Node *p;
char c;
p=L.head;
if(p) //非空表;
{
printf("\n學號 姓名 學期 成績A 成績B 成績C 平均成績\n");
for (p=L.head ;p;p=p->next )PrintE(p->data);
//從第一個結點開始輸出所有信息直到結點為空;
}
else printf("系統中無記錄。\n");
//空表;
c=getchar();
}
void PrintE(ElemType e){
//輸出各科成績和平均成績;
printf("%d\t%s\t%d\t%f\t%f\t%f\t%f\n",e.num,e.name,e.team,e.s1,e.s2,e.s3,(e.s1+e.s2+e.s3)/3);
//格式輸出學生的學號、姓名、學期、A、B、C三門成績以及平均成績;
}