當前位置:編程學習大全網 - 編程語言 - 學生成績管理系統(C語言)的設計方法論述

學生成績管理系統(C語言)的設計方法論述

程序設計的基本目標是用算法對問題的原始數據進行處理,從而獲得所期望的效果。但這僅僅是程序設計的基本要求。要全面提高程序的質量,提高編程效率,使程序具有良好的可讀性、可靠性、可維護性以及良好的結構,編制出好的程序來,應當是每位程序設計工作者追求的目標。而要做到這壹點,就必須掌握正確的程序設計方法和技術。而C語言是壹種結構化語言。它層次清晰,便於按模塊化方式組織程序,易於調試和維護。所以采用結構化程序設計方法,對管理系統進行自頂向下,逐步細化,模塊化設計.

對題目的需求分析得出:管理系統對學生的成績信息進行管理,學生信息包括:學號、姓名、學期、每門課程的成績、平均成績、名次。實現:學生信息的錄入;修改;刪除和查詢,按學期、學號、姓名等查詢。

而對輸入的學生成績正確的計算了平均分、最高分、最低分、統計了不及格情況及各分數段的人數。並按要求的格式正確打印.

功能函數設計

這個程序比較煩瑣,要求計算平均分,還要算最高分、最低分、統計不及格人數和按不同科目的分數順序輸出,如果每壹個都寫壹個函數,程序會非常的大,同時效率也不是很高。在此用的應該是壹種比較好的方法,此處用到了以下幾個函數:

輸入函數:

void input (mark *s)/*數據輸入函數*/

輸出函數:

void print (mark *p)/*輸出學生的記錄的函數*/

void den(mark *p,mark *q,int *m)/*該函數的功能是將第壹個的記錄賦給第二個*/

此函數是為後面的sign函數的調用,把壹個人的信息存在壹個鏈表中,

void converse (mark *s,fsp *q)/*將學生的記錄轉放到中間變量q中*/

此函數實現的功能是把數學,英語,計算機的個作為壹個鏈表存儲在壹起,為後面的過程更簡便。

void sign(mark *s,mark *a,mark *b,mark *c,mark *d,fsp *q)

此函數的功能是對學生的各科成績及平均分進行排序。

void count(mark *s) /*統計各科平均分 各科的最高(低)分及各分數段的人數*/

void found(mark *s)/*輸入學生的學號查詢學生的成績情況*/

(1) 程序清單

#include <stdio.h>

#include <malloc.h>

#include <string.h>

#define N 7 /*學生的人數*/

typedef struct

{

char num[5];

char name[10]; /*記錄姓名和學號*/

float math,english,comput,average; /*各個科目及平均分*/

}mark; /*定義學生記錄結構體類型*/

typedef struct

{

float fen[4];

int n;

}fsp;/*定義學生記錄轉化的中間變量*/

void input (mark *s)/*數據輸入函數*/

{

int i;

mark *p;

printf("請輸入每個學生的記錄\n");

for(i=0,p=s;i<N;i++,p++)

{

scanf("%s%s%f%f%f",p->num,p->name,&p->math,&p->english,&p->comput);

p->average=(p->math+p->english+p->comput)/3;

}

}

void print (mark *p)/*輸出學生的記錄的函數*/

{

int i;

mark *s;

for(i=0,s=p;i<N;i++,s++)

printf("%s %s %.1f %.1f %.1f %.1f\n", s->num,s->name,s->math,s->english,s->comput,s->average);

}

void den(mark *p,mark *q,int *m)/*該函數的功能是將第壹個的記錄賦給第二個*/

{

int i; /*m中存放學生的位序號(按成績排序)*/

for(i=0;i<N;i++)

{ strcpy((q+i)->num,(p+*(m+i))->num);

strcpy((q+i)->name,(p+*(m+i))->name);

(q+i)->math=(p+*(m+i))->math;

(q+i)->english=(p+*(m+i))->english;

(q+i)->comput=(p+*(m+i))->comput;

(q+i)->average=(p+*(m+i))->average;

}

}

void converse (mark *s,fsp *q)/*將學生的記錄轉放到中間變量q中*/

{

fsp *p;

int i;

for(i=0,p=q;i<N;i++,p++)

{ p->n=i;

*(p->fen)=(s+i)->math;

*(p->fen+1)=(s+i)->english;

*(p->fen+2)=(s+i)->comput;

*(p->fen+3)=(s+i)->average;

}

}

void sign(mark *s,mark *a,mark *b,mark *c,mark *d,fsp *q)

{ /*對學生的各科成績及平均分進行排序*/

int t[N],i,j,k,x,n;/*t中存放學生的位序號(按成績排序)*/

float temp;/*排序過程中的中間變量 */

for(i=0;i<4;i++)/*i的不同指向不同的科目及平均成績 */

{ for(j=0;j<N;j++)

{ temp=*((q+j)->fen+i); x=j;/*初始化中間變量*/

for(k=j+1;k<N;k++)

if( *((q+k)->fen+i)<temp )

{ x=k; temp=*((q+k)->fen+i);}

if(x!=j)

{ temp=*((q+j)->fen+i);

*((q+j)->fen+i)=*((q+x)->fen+i);

*((q+x)->fen+i)=temp;

n=(q+j)->n; (q+j)->n=(q+x)->n; (q+x)->n=n;

}/*交換兩變量 */

t[j]=(q+j)->n;

}

switch(i)

{ case 0: den(s,a,t);break;

case 1: den(s,b,t);break;

case 2: den(s,c,t);break;

case 3: den(s,d,t);break;

}

}

}

void count(mark *s)/*統計各科平均分 各科的最高(低)分及各分數段的人數*/

{

float ave[3]={0};/*存放各科平均分 */

float m[3][2] ;

int num[3][5]={0};/*存放各分數段的人數*/

int i;

m[0][1]=m[0][0]=s->math;

m[1][0]=m[1][1]=s->english;

m[2][0]=m[2][1]=s->comput;

for(i=0;i<N;i++)

{ ave[0]+=(s+i)->math;

ave[1]+=(s+i)->english;

ave[2]+=(s+i)->comput;

if( (s+i)->math > m[0][0] )

m[0][0]=(s+i)->math;

else if( (s+i)->math < m[0][1] )

m[0][1]=(s+i)->math;

if( (s+i)->english > m[1][0] )

m[1][0]=(s+i)->english;

else if( (s+i)->english < m[1][1] )

m[1][1]=(s+i)->english;

if( (s+i)->comput > m[2][0] )

m[2][0]=(s+i)->comput;

else if( (s+i)->comput < m[2][1] )

m[2][1]=(s+i)->comput;

/*統計各科的最高(低)分*/

if((s+i)->math<60.0)

num[0][0]++;

else if((s+i)->math<70.0)

num[0][1]++;

else if((s+i)->math<80.0)

num[0][2]++;

else if((s+i)->math<90.0)

num[0][3]++;

else num[0][4]++;

/*統計數學各分數段的人數*/

if((s+i)->english<60.0)

num[1][0]++;

else if((s+i)->english<70.0)

num[1][1]++;

else if((s+i)->english<80.0)

num[1][2]++;

else if((s+i)->english<90.0)

num[1][3]++;

else num[1][4]++;

/*統計英語各分數段的人數*/

if((s+i)->comput<60.0)

num[2][0]++;

else if((s+i)->comput<70.0)

num[2][1]++;

else if((s+i)->comput<80.0)

num[2][2]++;

else if((s+i)->comput<90.0)

num[2][3]++;

else num[2][4]++;

/*統計計算機各分數段的人數 */

}

for(i=0;i<3;i++)

ave[i]=ave[i]/N;

printf("三門科的平均分分別為:\n%.1f %.1f %.1f\n",ave[0],ave[1],ave[2]);

printf("三門科的最高分與最底分分別為:\n");

printf("%.1f %.1f\n%.1f %.1f\n%.1f %.1f\n",

m[0][0],m[0][1],m[1][0],m[1][1],m[2][0],m[2][1]);

printf("三門科不及格 60-69 70-79 80-89 90分以上的人數分別為:\n");

printf("數學: %3d%5d%6d%6d%4d\n",num[0][0],num[0][1],num[0][2],num[0][3],num[0][4]);

printf("英語: %3d%5d%6d%6d%4d\n",num[1][0],num[1][1],num[1][2],num[1][3],num[1][4]);

printf("計算機:%3d%5d%6d%6d%4d\n",num[2][0],num[2][1],num[2][2],num[2][3],num[2][4]);

}

void found(mark *s)/*輸入學生的學號查詢學生的成績情況*/

{

char a[10];/*接受輸入的學號*/

int flag,i;/*循環變量*/

char * b="exit";

do

{ flag=0;

printf("請輸入所要查詢的學生的學號或姓名\n");

getchar();

gets(a);

for(i=0;i<N;i++)

if(strcmp(a,(s+i)->num)==0 || strcmp(a,(s+i)->name)==0 )

{printf("該生的學號,姓名,各門課程及平均成績為:\n%s %s %.1f %.1f %.1f %.1f\n"

,(s+i)->num,(s+i)->name,(s+i)->math,(s+i)->english,(s+i)->comput,(s+i)->average);/*成績打印*/

flag=1;}

if(flag==0) printf("查無此人\n");

}while(strcmp(a,b));

printf("查詢結束");

}

main()

{

mark *s,*a,*b,*c,*d;

fsp *p;

s=(mark*)malloc(N*sizeof(mark));

a=(mark*)malloc(N*sizeof(mark));

b=(mark*)malloc(N*sizeof(mark));

c=(mark*)malloc(N*sizeof(mark));

d=(mark*)malloc(N*sizeof(mark));

p=(fsp*)malloc(N*sizeof(fsp));/*各變量空間開辟 */

input(s);

printf("初始化學生的記錄為:\n");

print(s);

converse(s,p);

sign(s,a,b,c,d,p);

printf("按數學成績排序學生的記錄為:\n");

print(a);

printf("按英語成績排序學生的記錄為:\n");

print(b);

printf("按計算機成績排序學生的記錄為:\n");

print(c);

printf("按平均成績排序學生的記錄為:\n");

print(d);

count(s);

found(s);

getch();

}

  • 上一篇:編程入門 會的進來
  • 下一篇:26歲學歷不高的我是如何從工廠轉行做UI設計師的?
  • copyright 2024編程學習大全網