學生成績系統需求分析報告
『壹』 利用棧求表達式的值,可供小學生作業,並能給出分數的需求分析
代碼如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<string.h>
#include <conio.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define ERROR 0
#define OK 1
//定義表達式
typedef struct shiti
{
char a[20];
long result;
}xuanti;
typedef struct SqStack1
{ //建立數字棧
int *base;
int *top;
int stacksize;
}SqStack1;
typedef struct SqStack2
{//建立運算符棧
char *base;
char *top;
int stacksize;
}SqStack2;
void WriteToFile(xuanti *pstu,int num);
void ReadFromFile(xuanti *pstu,int num);
void page_title(char *menu_item)
{//建立菜單
printf(">>> 數學習題庫 <<<\n\n- %s -\n\n",menu_item);
}
void return_confirm()
{
printf("\n按任意鍵返回……\n");
getch();
}
void IntInitStack(SqStack1 *S1)
{
S1->base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!->base)
exit(ERROR);
S1->top=S1->base;
S1->stacksize=STACK_INIT_SIZE;
}//IntInitStack
void CharInitStack(SqStack2 *S2)
{
S2->base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!S2->base)
exit(ERROR);
S2->top=S2->base;
S2->stacksize=STACK_INIT_SIZE;
}//CharInitStack
long IntGetTop(SqStack1 *S1)
{ //取棧頂元素
long e1;
if((*S1).top==(*S1).base)
return 0;
e1=*((*S1).top-1);
return e1;
}//IntGetTop
char CharGetTop(SqStack2 *S2)
{ //取棧頂元素
char e2;
if((*S2).top==(*S2).base) return 0;
e2=*((*S2).top-1);
return e2;
}//IntGetTop
int IntPush(SqStack1 *S1,int e1)
{//入棧
*(*S1).top++=e1;
return OK;
}//IntPush
int CharPush(SqStack2 *S2,char e2)
{//入棧
*(*S2).top++=e2;
return OK;
}//CharPush
int IntPop(SqStack1 *S1)
{//出棧
int e1;
if((*S1).top==(*S1).base)
return 0;
e1=*--(*S1).top;
return e1;
}//IntPop
int CharPop(SqStack2 *S2)
{//出棧
char e2;
if((*S2).top==(*S2).base) return 0;
e2=*--(*S2).top;
return e2;
}//CharPop
char Precede(char a,char b)
{
int i,j;
char Table[8][8]={ ' ','+','-','*','/','(',')','#',
'+','>','>','<','<','<','>','>',
'-','>','>','<','<','<','>','>',
'*','>','>','>','>','<','>','>',
'/','>','>','>','>','<','>','>',
'(','<','<','<','<','<','=',' ',
')','>','>','>','>',' ','>','>',
'#','<','<','<','<','<',' ','=',
}; //優先順序表格
for(i=0;i<8;i++)
if(Table[0][i]==a) //縱坐標尋找
break;
for(j=0;j<8;j++) //橫坐標尋找
if(Table[j][0]==b)
break;
return Table[j][i];
}//Precede
int Operate(int a,char theta,int b)
{ //計算表達式值:主要是將大的表達式轉化成小的表達式進行逐步求值
int c;
if(theta=='+') c=a+b;
else if(theta=='-') c=a-b;
else if(theta=='*') c=a*b;
else c=a/b;
return c;
}//Operate
int IsOptr(char ch)
{
char ptr[10]={'+','-','*','/','(',')','#'};
for(int i=0;i<7;i++)
{
if(ch==ptr[i])
return true;
}
return false;
}
long result(char *a,SqStack1 *OPND,SqStack2 *OPTR)
{//求值
char theta;
int b,d,k=0,i=0,j=0,num2=0;
IntInitStack(OPND);
CharInitStack(OPTR);
CharPush(OPTR,'#');
while(a[i]!='=')
{
if(!IsOptr(a[i]))
{
k++;
if(k<=j)
{
num2=(int(a[i])-48);
i++;
}
if(k>j)
{
num2=num2*10+(int(a[i])-48);
k=j=0;
i++;
}
if(!IsOptr(a[i]))
k++;
if(k==j)
IntPush(OPND,num2);
}
else if(IsOptr(a[i]))
{
switch(Precede(a[i],CharGetTop(OPTR)))
{
case '<':CharPush(OPTR,a[i++]);
if(a[i]!='('&&a[i]!=')')
j++;
break;
case '=':CharPop(OPTR);i++;break;
case '>':theta=CharPop(OPTR);
d=IntPop(OPND);
b=IntPop(OPND);
IntPush(OPND,Operate(b,theta,d));
break;
}//switch
} //else if
}//while
printf("表達式的正確結果為:");
printf("%d\n",IntGetTop(OPND));
return (IntGetTop(OPND));
}//reslut
void Built_shitiKu()
{
int i,num;
xuanti *pstu;
printf("輸入試題數目:\n");
scanf("%d",&num);
fflush(stdin);
pstu=(xuanti *)malloc(num*sizeof(xuanti));//動態分配內存
if(pstu==NULL)
{
printf("沒有足夠的內存空間!\n");
return;
}
for(i=0;i<num;i++)
{//輸入試題
printf("第%d道試題:",i+1);
gets(pstu[i].a);
fflush(stdin);
printf("\n");
}
WriteToFile(pstu,num);//將pstu所指向的學生信息寫入文件中
memset(pstu,0,num*sizeof(xuanti));//將pstu所指向的內存塊清0
ReadFromFile(pstu,num);//從文件中讀取學生信息到pstu所指向的內存塊中
printf("試題列表:\n");
for(i=0;i<num;i++)
{//輸入試題
printf("第%d道試題:",i+1);
printf("%s",pstu[i].a);
printf("\n");
}
free(pstu);//釋放動態分配的內存
}
void WriteToFile(xuanti *pstu,int num)
{//將pstu所指向的試題息寫入文件shitiku.txt中
FILE *fp;
fp=fopen("shitiku.txt","at");
if(fp==NULL)
{
printf("不能創建shitiku.txt\n");
free(pstu);
exit(0);
}
fwrite(pstu,sizeof(xuanti),num,fp);
fclose(fp);
}
void ReadFromFile(xuanti *pstu,int num)
{//從試題庫中提取試題
FILE *fp;
fp=fopen("shitiku.txt","rt");
if(fp==NULL)
{
printf("不能打開shitiku.txt\n");
free(pstu);
exit(0);
}
fread(pstu,sizeof(xuanti),num,fp);
fclose(fp);
}
//******************************************
void RecMark(int *m,int num)
{//把得分記錄到markrec.txt中
FILE *mp;
mp=fopen("markrec.txt","at");
if(mp==NULL)
{
printf("不能創建markrec.txt\n");
free(m);
exit(0);
}
fwrite(m,sizeof(int),num,mp);
fclose(mp);
}//Recmark
void LookMark(int *m,int num)
{//查看得分記錄
FILE *mp;
mp=fopen("markrec.txt","rt");
if(mp==NULL)
{
printf("不能打開markrec.txt\n");
free(m);
exit(0);
}
fread(m,sizeof(int),num,mp);
fclose(mp);
}
//*************************************
void RecN(int *m,int num)
{//把m的值記錄到n_rec.txt中
FILE *mp;
mp=fopen("n_rec.txt","wt");
if(mp==NULL)
{
printf("不能創建n_rec.txt\n");
free(m);
exit(0);
}
fwrite(m,sizeof(int),num,mp);
fclose(mp);
}//Recmark
void LookN(int *m,int num)
{//查看m的值
FILE *mp;
mp=fopen("n_rec.txt","rt");
if(mp==NULL)
{
printf("不能打開n_rec.txt\n");
free(m);
exit(0);
}
fread(m,sizeof(int),num,mp);
fclose(mp);
}
//*************************************
int excersice_begin()
{
int i, j, temp, KEY[20];
int mark,count=0;
int *Mark;
char g;
SqStack1 s1,*OPND;
SqStack2 s2,*OPTR;
xuanti *XT;
OPND=&s1;
OPTR=&s2;
Mark=(int *)malloc(20*sizeof(int));
XT=(xuanti *)malloc(20*sizeof(xuanti));
ReadFromFile(XT,20);
do
{
mark=0;
srand((unsigned)time(NULL));
KEY[0] = rand()%20;
for(i=1;i<20;i++)
{
while(1)
{
temp = rand()%20;
for(j=0;j<i;j++)
{
if(KEY[j]==temp)
break;
}
if(j==i)
{
KEY[i]=temp;
break;
}
}
}
system("cls");
printf("隨機的10個練習題 :\n");
for(i=0;i<10;i++)
{
printf("第%d個練習題:",i+1);
printf("%s\n",XT[KEY[i]].a);
printf("請輸入計算結果:");
scanf("%ld",&XT[KEY[i]].result);
fflush(stdin);
if(XT[KEY[i]].result==result(XT[KEY[i]].a,OPND,OPTR))
{
mark+=10;
printf("答案正確!");
printf("\n\n");
}
else
{
printf("答案錯誤!");
printf("\n\n");
}
}
printf("****得分情況****\n");
printf("最後的得分為:%d\n",mark);
if(mark>=90)
printf("Very Good!\n");
else if(mark>=60)
printf("成績不錯。\n");
else printf("很遺憾成績不及格!\n");
printf("\n");
RecMark(Mark,count);
Mark[count]=mark;
count++;//記錄次數遞增
printf("是否繼續做練習?('y'—是,'n'—否):");
g=getchar();
fflush(stdin);
printf("\n");
if(count>=20)//超過最大記錄次數清0
count=0;
}
while(g=='y');
RecMark(Mark,count);
return count;
return_confirm();
}
void Look_Mark(int count)
{//printf("是否查看歷史得分?('y'—是,'n'—否):");
int *Mark;
int i;
Mark=(int *)malloc(20*sizeof(int));
system("cls");
printf("****查詢歷史得分情況****\n");
LookMark(Mark,count);
for(i=0;i<count;i++)
printf("****第%d次得%d分****\n", i+1, Mark[i]);
if(i>1)
{
if(Mark[i-1]>60||Mark[i-2]>60)
{
if(Mark[i-1]>Mark[i-2])
printf("有進步,還要加油哦。\n");
else if(Mark[i-1]==Mark[i-2]) printf("成績還可以,但沒有進步,還要多多努力呀!\n");
else printf("成績有點下降,要多多練習,不要氣餒!!\n");
}
else printf("成績很不好!要更加努力學習!\n");
}
else
{
if(Mark[0]>=90)
printf("Very Good!\n");
else if(Mark[0]>=60)
printf("成績不錯。\n");
else printf("很遺憾成績不及格!\n");
}
return_confirm();
}
void main()
{
int m=0;
int *RN;
char ch;
RN=(int *)malloc(1*sizeof(int));
RN[0]=0;
printf("***如果是第一次運行***\n");
printf("**請先建立 n_rec.txt**\n");
printf("*****否則會出錯 !*****\n");
printf("('y'--創建**'n'--不建)\n");
ch=getchar();
if(ch=='y')
RecN(RN,1);
LookN(RN,1);
RN[0]+=m;
fflush(stdin);
printf("是否向試題庫中添加試題: ");
printf("('y'--是,'n'--否)?\n");
ch=getchar();
if(ch=='y')
Built_shitiKu();
menu: page_title("操作選單");
printf("請用數字鍵選擇操作\n\n");
printf("1 開始練習\n");
printf("2 查看得分記錄\n");
printf("0 退出\n");
printf("******************\n");
RN[0]+=m;
m=0;
switch(getch())
{
case '1' : m=excersice_begin();
break;
case '2' : Look_Mark(RN[0]);
break;
case '0' : {
RecN(RN,1);
exit(0);
}
}
system("cls");
goto menu;
}
『貳』 文檔 學生成績管理系統需求分析
用EXCEL表格呀
『叄』 java學生管理系統的課設報告的需求分析怎麼寫
學生信息管理系統主要包括以下四個方面:
(1)學生檔案管理
(2)學生成績管理
(3)綜合教育學分管理
(4)綜合測評管理
對以上各個模塊的功能簡單描述如下:
(1)學生檔案管理:包括學生信息的添加、修改、查詢和刪除。其中學生信
息包括學號、姓名、性別、年級、專業、層次、相片、民族、出生日期、籍貫、政治面貌、系別名稱、班級、宿舍號碼、本人電話以及家庭聯系電話和家庭聯系地址。
(2)學生成績管理:包括學生成績的錄入、修改、查詢和刪除。成績信息包括學號、姓名、年級、專業、層次(本科或專科)、學期、課程名稱、課程成績(第一次成績和補考成績)。
(3)綜合教育學分管理:包括綜合教育學分的查詢、添加、修改和刪除。綜合教育學分信息包括項目名稱、項目級別、獲獎等次、所獲學分、指導教師、類別(必修或選修)、備注。
(4)綜合測評管理:包括綜合測評成績的錄入、修改、查詢和刪除等信息綜合測評。綜合測評信息包括學號、姓名、時間、活動名稱、活動成績、所獲學分。
『肆』 求一個學生成績管理系統,用C++完成
界面狀態下,按下「ESC」會退出該學生成績管理系統。返回源程序。
程序清單
/*-------------1-------------*/
#include<bios.h>
#include<dos.h> /*頭文件*/
#include<conio.h>
#include<ctype.h>
#include<process.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#define NULL 0
#define ESC 0x001b /* 退出 */
#define F1 0x3b00 /* 查看幫助信息,調用HelpMassage()函數 */
#define F2 0x3c00 /*輸入學生成績*/
#define F3 0x3d00 /*按學號查找*/
#define F4 0x3e00 /*按姓名查找*/
#define F5 0x3f00 /*列出所有學生成績*/
#define F6 0x4000 /*統計*/
struct stuType /*定義結構體變數*/
{
char NO[11]; /*學號長度為10*/
char XM[10];
float CJ[4]; /*包含4門成績*/
};
/*-------------2-------------*/
int JY_NO(char *stu_num,FILE *fp) /*檢驗學號的正確性*/
{ struct stuType stud;
int NO;
char *p=stu_num;
if(strcmp(stu_num,"#")==0) return 1; /*若輸入"#"返回真值,不再循環輸入*/
while(*p!='\0') /*學號必須是數字,否則返回重新輸入*/
{ NO=(int)*p;
if(NO<48||NO>57)
{ puts("\t\t\t非法學號!請重新輸入!\n");
return 0;
}
else p++; /*指針加1*/
}
if(strlen(stu_num)!=10) /*若學號長度不為10,則返回重新輸入*/
{ puts("\t\t\t學號長度不對!\n");
return 0;
}
if(getchar()!='\n') /*若學號後面的字元不是回車符,則學號長度大於10*/
{ printf("\t\t\t學號長度大於10個!請重新輸入!\n");
do{}while(getchar()!='\n'); /*用getchar接收多餘的字元*/
return 0;
}
else
{
rewind(fp); /*使文件指針指向頭*/
while(!feof(fp)) /*若文件指針未到結尾,就繼續執行下面的循環,feof遇到文件結束符返回非零值,否則返回0*/
{ fread(&stud,sizeof(struct stuType),1,fp); /*讀取一定長度的數據*/
if(strcmp(stu_num,stud.NO)==0) /*學號的唯一性*/
{ printf("\t\t\t學號重復,請重新輸入!\n");
printf("\t\t\t該學生成績如下:\n");
printf("\t\t\t語文:%.1f\n",stud.CJ[0]);
printf("\t\t\t數學:%.1f\n",stud.CJ[1]);
printf("\t\t\t英語:%.1f\n",stud.CJ[2]);
printf("\t\t\t總評:%.1f\n",stud.CJ[3]);
return 0;
}
}
}
return 1;
}
/*-------------3-------------*/
int JY_NO2(char *stu_num) /*檢驗學號*/
{ int NO;
char *p=stu_num;
if(strcmp(stu_num,"#")==0)return 1; /*若輸入「#」,則返回真值結束*/
if(strlen(stu_num)!=10) /*學號長度為10*/
{ puts("\t\t\t學號長度不對!\n");
return 0;
}
while(*p!='\0') /*學號必須用數字,若包含有字母,或其它字元則返回假值重新輸入*/
{ NO=(int)*p;
if(NO<48||NO>57)
{ puts("\t\t\t非法學號!請重新輸入!\n");
return 0;
}
else p++; /*指針加1*/
}
if(getchar()!='\n') /*檢驗學號長度是否大於10,並把多餘的字元去掉*/
{ printf("\t\t\t學號長度大於10個!請重新輸入!\n");
do{}while(getchar()!='\n');
return 0;
}
return 1;
}
/*-------------4-------------*/
int JY_XM(char *stu_XM) /*檢驗姓名*/
{ int PD;
char *p;
p=stu_XM;
while(*p!='\0') /*姓名只能用中文*/
{
PD=(int)*p;
if(PD>0)
{ puts("\t\t\t姓名只能用中文,請重新輸入!\n");
return 0;
}
else p++; /*使指針加1,指向下一漢字*/
}
if(getchar()!='\n') /*姓名長度不得大於5個*/
{ printf("\t\t\t姓名長度大於5個!請重新輸入!\n");
do{}while(getchar()!='\n');
return 0;
}
return 1; /*字元串全為漢字返回真*/
}
/*-------------5-------------*/
int JY_CJ(float stu_CJ) /*學生成績只能在0~100之間*/
{
if(stu_CJ<0||stu_CJ>100)
{ printf("\t\t\t輸入錯誤,成績只能在0~100之間!\n");
return 0;
}
return 1;
}
/*-------------6-------------*/
void CreatFile() /*輸入文件*/
{ FILE *fp;
struct stuType stu,stu0={"","",}; /*對stu0先賦值*/
fp=fopen("stu.dat","wb+"); /*打開或創建一個二進制文件,打開時將原來的內容刪除*/
if(fp==NULL)
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return;
}
else
{ while(1)
{ stu=stu0;
do{ printf("\n\t\t\t請輸入學號:"); /*輸入學號並檢驗其正確性*/
scanf("%10s",stu.NO);
}while(!JY_NO(stu.NO,fp));
if(strcmp(stu.NO,"#")==0)break;
do{ printf("\n\t\t\t請輸入姓名:"); /*輸入姓名並檢驗其正確性*/
scanf("%10s",stu.XM);
}while(!JY_XM(stu.XM));
do{ printf("\n\t\t\t請輸入語文成績:"); /*輸入成績並檢驗其正確性*/
scanf("%f",&stu.CJ[0]);
}while(!JY_CJ(stu.CJ[0]));
do{ printf("\n\t\t\t請輸入數學成績:"); /*同上*/
scanf("%f",&stu.CJ[1]);
}while(!JY_CJ(stu.CJ[1]));
do{ printf("\n\t\t\t請輸入英語成績:");
scanf("%f",&stu.CJ[2]);
}while(!JY_CJ(stu.CJ[2]));
do{ printf("\n\t\t\t請輸入總評成績:");
scanf("%f",&stu.CJ[3]);
}while(!JY_CJ(stu.CJ[3]));
fwrite(&stu,sizeof(struct stuType),1,fp); /*寫文件*/
}
}
fclose(fp); /*關閉文件*/
}
/*-------------7-------------*/
void Search_Xuehao() /*按學號查詢*/
{ FILE *fp;
int flag;
struct stuType stu,stud;
fp=fopen("stu.dat","rb");
if(fp==NULL) /*若文件打不開則輸出下面的信息*/
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return;
}
else
{ do{ puts("\n\t\t\t輸入「#」結束查詢");
do{ printf("\t\t\t請輸入要查詢的學號:");
scanf("%10s",stu.NO);
}while(!JY_NO2(stu.NO));
if(strcmp(stu.NO,"#")==0)break; /*若輸入「#」則結束循環*/
flag=0;
rewind(fp);
while(fread(&stud,sizeof(struct stuType),1,fp)) /*檢查文件指針結束*/
{ if(strcmp(stu.NO,stud.NO)==0) /*比較學號*/
{ puts("\t\t\t該學生成績如下:");
printf("\t\t\t學號:%s\n",stud.NO);
printf("\t\t\t姓名:%s\n",stud.XM);
printf("\t\t\t語文:%.1f\n",stud.CJ[0]);
printf("\t\t\t數學:%.1f\n",stud.CJ[1]);
printf("\t\t\t英語:%.1f\n",stud.CJ[2]);
printf("\t\t\t總評:%.1f\n",stud.CJ[3]);
flag=1; /*記錄學號是否查到*/
}
}
if(flag==0)puts("\t\t\t無此學號!");
}while(strcmp(stu.NO,"#")!=0);
}
fclose(fp); /*關閉文件*/
}
/*-------------8-------------*/
void Search_Xingming() /*按姓名查找*/
{ FILE *fp;
int flag=0;
struct stuType stu,stud;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return;
}
else
{ do{
do{ printf("\t\t\t請輸入要查詢的學生姓名:");
scanf("%10s",stu.XM);
}while(!JY_XM(stu.XM));
rewind(fp); /*文件指針指向頭*/
while(fread(&stud,sizeof(struct stuType),1,fp))
{ if(strcmp(stu.XM,stud.XM)==0) /*比較姓名是否相同*/
{ puts("\t\t\t該學生姓名如下:");
printf("\t\t\t學號:%s\n",stud.NO);
printf("\t\t\t姓名:%s\n",stud.XM);
printf("\t\t\t語文:%.1f\n",stud.CJ[0]);
printf("\t\t\t數學:%.1f\n",stud.CJ[1]);
printf("\t\t\t英語:%.1f\n",stud.CJ[2]);
printf("\t\t\t總評:%.1f\n",stud.CJ[3]);
flag=1; /*記錄姓名是否被查到*/
}
}
if(flag==0)puts("\n\t\t\t無此學生!");
puts("\t\t\t是否繼續(y--繼續,其他返回)?");
}while(getch()=='y');
}
fclose(fp);
/* puts("\t\t\t請按任意鍵繼續...");*/
/* getch();*/
}
/*-------------9-------------*/
int ListFile(void) /*輸出文件,列出所有學生成績*/
{ FILE *fp;
int REC=0; /*記錄學生人數*/
struct stuType stu;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return 1;
}
else{ printf("\t\t\t學生成績如下:\n");
printf("\t\t\t學號\t\t姓名\t語文\t數學\t英語\t總評\n");
rewind(fp);
while(fread(&stu,sizeof(struct stuType),1,fp))
{ /*每讀取一個長度的數據就輸出*/
printf("\t\t\t%s",stu.NO);
printf("\t%s",stu.XM);
printf("\t%.1f",stu.CJ[0]);
printf("\t%.1f",stu.CJ[1]);
printf("\t%.1f",stu.CJ[2]);
printf("\t%.1f",stu.CJ[3]);
printf("\n");
REC++;
if(REC%20==0) /*每輸出20個學生成績,停一下*/
{ printf("\t\t\t請按任意鍵繼續...\n");
getch();
}
}
}
fclose(fp); /*關閉文件*/
printf("\t\t\t請按任意鍵繼續...");
getch();
}
/*-------------10-------------*/
void Statistics() /*統計及格和優秀人數*/
{ FILE *fp;
int REC=0,pass[4]={0},good[4]={0}; /*REC--記錄個數,即人數,pass--及格人數,good--優秀人數*/
float highest[4]={0},score[4]={0}; /*highest--最高分,score--總分*/
struct stuType stu;
fp=fopen("stu.dat","rb");
if(fp==NULL)
{ printf("\t\t\t文件打開失敗!\n\t\t\t按任意鍵返回...");
getch();
return;
}
else { rewind(fp);
while(fread(&stu,sizeof(struct stuType),1,fp))
{ REC++;
score[0]=score[0]+stu.CJ[0]; /*語文*/
if(stu.CJ[0]>=60)pass[0]++;
if(stu.CJ[0]>=80)good[0]++;
if(highest[0]<stu.CJ[0])highest[0]=stu.CJ[0];
score[1]=score[1]+stu.CJ[1]; /*數學*/
if(stu.CJ[1]>=60)pass[1]++;
if(stu.CJ[1]>=80)good[1]++;
if(highest[1]<stu.CJ[1])highest[1]=stu.CJ[1];
score[2]=score[2]+stu.CJ[2]; /*英語*/
if(stu.CJ[2]>=60)pass[2]++;
if(stu.CJ[2]>=80)good[2]++;
if(highest[2]<stu.CJ[2])highest[2]=stu.CJ[2];
score[3]=score[3]+stu.CJ[3]; /*總評*/
if(stu.CJ[3]>=60)pass[3]++;
if(stu.CJ[3]>=80)good[3]++;
if(highest[3]<stu.CJ[3])highest[3]=stu.CJ[3];
}
if(REC==0) /*可以防止記錄為0是REC作除數而造成的錯誤*/
{ printf("\t\t\t未輸入學生記錄!按任意鍵返回...");
getch();
return;
}
else{
printf("\t\t\t\t 語文\t 數學\t 英語\t 總評\n"); /*輸出統計信息*/
printf("\t\t\t平均分: %.1f\t %.1f\t %.1f\t %.1f\n",score[0]/REC,score[1]/REC,score[2]/REC,score[3]/REC);
printf("\t\t\t最高分: %.1f\t %.1f\t %.1f\t %.1f\n",highest[0],highest[1],highest[2],highest[3]);
printf("\t\t\t優秀人數:%d\t %d\t %d\t %d\n",good[0],good[1],good[2],good[3]);
printf("\t\t\t及格人數:%d\t %d\t %d\t %d\n",pass[0],pass[1],pass[2],pass[3]);
}
}
fclose(fp);
printf("\n\t\t\t請按任意鍵繼續...");
getch();
}
/*-------------11-------------*/
void HelpMessage()
{ clrscr();
『伍』 學生成績管理系統 一、需求分析: 對於n個(至少5個)學生的m門(至少4門)成績進行有關統計:
hi,搞定了嗎?
『陸』 求C語言課程設計之學生成績管理系統的1 系統需求分析2 總體設計3功能設計4總體方案及功能模塊流程
C語言課程設計之學生成績管理系統的1 系統需求分析2 總體設計3功能設計4總體方案及功能模塊流程要原創嗎,我可為您操作.
『柒』 求.NET學生成績管理系統需求分析
沒法傳圖,自己想一下怎麼改吧……
一.開發目的:
總結軟體開發過程中的方法和技巧,更好的應用和資料庫技術
1.開發內容:開發一套學生成績管理系統軟體
採取的研究方法:採用面向對象的編程,結合網路和資料庫技術,實現控制和管理。通過系統分析、需求分析、概要設計、詳細設計、編寫代碼、軟體測試、軟體維護、經驗方法總結等一系列實驗方案,實驗軟體的開發。
2.具體開發方案:
分七個階段進行:
系統分析、需求收集和分析
概念設計
第一階段:系統分析、需求收集和分析
這一階段首先進行系統分析,分析確定系統的規模和范圍,確定軟體的總體要求以及所需要的硬體和支撐軟體,確定待開發軟體與外界的介面,根據用戶的情況確定軟體對操作的要求,以及待開發軟體總體上的約束和限制,完善項目計劃。
在這之後,這一階段的大部分時間將被用來進行需求收集和分析。向學校管理人員及學生了解情況,確定軟體系統的綜合要求,分析軟體系統的數據要求,導出系統的邏輯模型,修正項目開發計劃。
採用結構化分析方法,生成數據流圖、數據詞典及加工邏輯說明。
估計階段跨度:2006年某月初至某月中旬
第二階段:概要設計
在這一階段將確定軟體系統的結構,對全局數據結構進行設計,進行模塊劃分,確定每個模塊的功能 介面以及模塊間的調用關系。
採用與結構化方法銜接的結構化設計方法,生成結構圖及概念設計說明書。
估計階段跨度:2006年某月中旬至某月底
第三階段:詳細設計
為每個模塊設計實現的細節將成為這個階段的主要任務,還要對局部數據結構進行設計。
採用結構化設計方法。採用自頂向下逐步求精的設計方法和單入口單出口的控制結構。使得程序具有良好的結構,增強程序的可讀性。生成程序流程圖及詳細設計說明書。
詳細設計時,如果不滿意,須回到概要設計中重新完善設計。
估計階段跨度:2006年某月初至某月中旬
第四階段:編寫代碼
這一階段用來根據詳細設計說明書編寫代碼。
採用計算機語言編寫。追求高質量的代碼,生成源程序代碼、內部文檔。
估計階段跨度:2006年某月中旬至某月底
第五階段:軟體測試
這將是一個很重要也將是一個很耗時間和精力的階段。
在這一階段中將盡可能多地發現軟體中的錯誤和缺陷。如果有錯,還將退回到編碼階段進行調試。測試過程分為單元測試、集成測試和確認測試。
估計階段跨度:2006年某月初至某月中旬
第六階段:完善各項文檔及和報告,從整個開發過程和這些文檔中總結經驗和教訓,羅列各種方法和技巧。
估計階段跨度:2007年某月中旬至某月底。
需求分析說明書
一,引言
21世紀以高科技為核心的知識經濟將佔主導地位,國家的綜合國力和國際競爭力將越來越取決於科學技術創新水平。教育作為知識創新、傳播和應用的基礎,培養和輸送人才的搖籃,已經成為經濟發展和社會進步的基礎。盡管人類進步的程度隨著不同時代,不同地區而有所變化,教育的口徑卻在不斷擴寬,以便使過去僅供少數人使用的教育資源能夠為更多各種年齡、不同社會階層和背景的人們所用。在信息爆炸的時代,傳統教學管理面臨著諸多挑戰。
1.編寫目的:
開發基於互聯網的學生選課系統,提高管理工作的效率、提高信息的開放性、改善學生和教師對其最新信息查詢的准確性。
2.背景說明
隨著學校規模的不斷擴大,專業、班級、學生的數量急劇增加,有關學生選課的各種信息量也成倍增長,而目前許多高校的學生選課管理仍停留在復雜的人工操作上,重復工作較多,工作量大,效率低,因此,迫切需要開發基於互聯網的體育課信息管理系統來提高管理工作的效率。基於互聯網的學生選課管理系統,在學生選課的規范管理、科學統計和快速查詢方面具有較大的實用意義。它提高了信息的開放性,大大地改善了學生、教師對其最新信息查詢的准確性。
3.術語定義及參考資料
1. (美) Grady Booch,James Rumbaugh,Ivar Jacobson,《UML用戶指南》,機械工業出版社,2001年8月
2.Microsoft,MSDN
3.Microsoft, SQL Server2000聯機手冊
4.Roger S. Pressman。軟體工程——實踐者的研究方法。機械工業出版社,1997
5.IPL。Software Testing and Software Development Lifecycles。IPL,1996
6.Karl E. Wiegers《軟體需求》機械工業出版社,1999
7.張海藩《軟體工程導論》清華大學出版社。
4任務概述
4.1. 目標
系統開發的總體任務是實現學生選課信息關系的系統化、規范化和自動化。
4.2. 系統技術
學生選課系統要求具有信息處理的開發性,方便教師上傳學生成績、學生上網選課和查詢選課信息及成績等,因此本系統設計為基於WWW的網路資料庫應用系統,使用ASP腳本以Access為資料庫的開發技術,運行在支持ASP的伺服器上。
4.3基本設計概念和處理流程
採用基於SQL Server 的分布式資料庫管理系統。三層結構是目前用得最多的,這種結構比傳統的C/S結構增加了一個應用程序伺服器,應用程序伺服器包括了統一的界面、業務規則和數據處理邏輯等等,這樣客戶端程序就可以做得比較小,也就是常說的瘦客戶,更由於業務規則和數據處理邏輯的集中在伺服器上統一管理,客戶端無須進行復雜的計算,也不會因為錯誤的操作而影響到其他的用戶,所以他的可靠性、穩定性和效率都比較好。
4.4. 用戶的特點
為保證系統安全高效的運行,本系統把用戶劃分為3類:教務處、教師和學生。不同的用戶在系統中的作用和許可權也有所不同,所以它所需要完成的功能也就不同。
教務處可以完成本系統所有的功能:
1) 學生信息管理,除學生基本信息外,還可管理學生所選課程、成績等;
2) 教師信息管理,包括教師個人的基本情況和任課情況;
3) 項目及班數的設定:根據學校教務處所排課進行班級數及人數的統計,然後根據統計結果進行項目及班數的設定;
4) 排課:根據上一步分班情況安排任課教師;
5) 報表生成及輸出:生成教師擔任課程分班表、按項目生成學生成績表、按學生行政班生成成績表及所有報表的輸出。
教師在本系統的功能:查詢學生選課情況、自己任課情況、獲取自己所擔任課程分班表、錄入及修改成績等。
學生在本系統的功能:查詢本人信息、教師任課信息、選課、選課信息查詢、成績查詢。
5.需求規定
5.1. 對功能的規定
1.可實現學生選課注冊
2.方便實現學生選課信息查詢
3.可對學生成績檔案進行管理,成績表單生成簡便。
4.安全有效的用戶區分,管理
5.檔案數據的高安全性,保密性
6.有幫助文檔
5.2. 對性能的規定
使用穩定,操作性能好,操作方法易於掌握,系統的安全性強
6. 設計思想
用戶的需求具體表現在對各種信息的提供、編輯、處理及查詢統計上。這就要求資料庫結構能充分滿足各種信息的輸入、處理和輸出。通過分析學生選課管理系統的現實需求,學生選課管理系統各環節的基本數據及數據處理流程,在與管理人員溝通、交流與探討的基礎上,得到以下學生選課系統的數據流程圖
6.1. 資料庫的設計
通過對學生選課管理系統工作內容和相關數據流程分析,根據學生選課管理系統的需要,就可以設計出能滿足用戶需求的各種實體,以及它們之間的關系,由此得到資料庫所支持的數據模型,即資料庫的邏輯結構,具體情況如下:
1.學生信息表:開學時將教務處提供的學生信息庫按系統的要求修改庫結構並導入Access資料庫中,應包括如下信息:姓名、學號、院系、班級、性別、所選課程、任課教師、備注等。
2.教師信息表:包括教師姓名、教師代碼、性別、年齡、職稱、主要教授課程、兼任課程等。
3.課程信息:包括課程目錄、課程、課程代碼、教學內容、任務與目的、考試方法、要求等。
4.課程表:包括課程名稱、課程編號、任課教師、課程學分、上課時間。
5.成績單列表:包括學生姓名、學號、院系、班級、課程、任課教師、成績。
6.2. 系統功能特點
1.內容全面 系統全面覆蓋了體育課信息,可為學校、教師和學生提供全面准確的信息。
2.層次分明 系統採用模塊化程序設計結構。各模塊之間既相互獨立,又具有一定的聯系,各模塊可獨立編制、調試、查錯、修改和執行,結構嚴謹,便於擴展和維護。
7.系統需求分析
說明:
學校每年新生入學,畢業生離校和各種其它變動,如學籍變動,個人信息修改。每學期學校者要開設一定的課程提供給學生根據自己的情況來選擇,最後的選擇結果要給出學生的課程表。如何有效的管理這些學生信息,幫助學校和老師管理和掌握這些情況,這就是學生信息管理系統需要完成的任務。下面用軟體工程的思想和方法完成該系統的設計過程。
功能:
個人信息查詢和修改,包括流動,注冊,更新管理
可行性研究報告
1. 編寫目的
編寫這份可行性研究報告的目的是讓讀者能夠了解本系統的開發可行性。預期的讀者包括上級領導,相關開發人員以及管理人員。
一.可行性研究的前提
隨著科學技術的進步和社會經濟的發展,計算機在現實生活中扮演越來越重要的角色,PC機價格不斷的下降和生活水平的提高使得更多的中國家庭能夠擁有自己的改變世界的機器,與此同時,我們也已經注意到,在大學校園里,越來越多的計算機已經進入同學們的宿舍,成為他們學習,生活中的一部分。
學生成績管理方面,進入了信息化時代,我們有能力讓我們的生活變的更好,對於學生成績管理人員每日繁重的工作可以通過計算機來進行緩解,以實現管理自動化,工作人員對資料的管理,信息的發布,用電安全的控制均是人工作業,運作效率較低。因此,建立一個自動化的管理服務的計算機應用軟體是十分必要的
1.1 要求
C++.net,感測器,SQL.
1.2 目標
能夠快速的查詢出學生的各科成績以及所在班級等各種用途。
1.3 進行可行性研究的方法
對學生和校領導採用問卷調查的方法,詢問他們,以確定最佳的可行性研究方案。軟體採用現代流行WINDOWS操作界面。是標準的WIN32應用程序,可運行在WIN95\WIN98\WinMe\WIN2000\WINXP\WINNT等系統平台上的多任務應用程序。在運行時可以直觀的瀏覽、查詢和掌握學生的成績,同時能夠了解學生的基本信息所在系部、班級、宿舍的具體地址。結束了人工統計的耗時長、工作量大、錯誤率高的缺點。
1.4 評價尺度
1. 是否功能齊全,運行穩定。2.在網路功能方面是否方便管理。3.設置是否靈活開4.是否具有多任務,高效率的特點。5.是否具有界面友好,操作簡單的特點。
2 處理流程和數據流程
2. 所建議的系統
2.1 對所建議系統的說明
我們所建議的系統為學生成績管理系統。它是為了提高學生成績管理的自動化程度而開發的。它可以解決一下問題:改變學生成績輸入的麻煩以及查詢工作量大的問題還有輸出的不便。
3.影響
3.1 對設備的影響
由於以前無自動化管理的方案,所以所有設備都需要購買。
3.2.對軟體的影響
由於以前無自動化管理的方案,所以不需要考慮對現存應用軟體合支持軟體的影像。
3.3.對用戶單位機構的影響
為了建立和運行所建議系統,需要提高管理人員的技術水平。
3.4.對系統運行過程的影響
所建議系統沒有影響運行過程。
3.5.對開發的影響
所建議系統對軟體開發人員要求不高,但是對硬體要求比較高。
3.6.對地點和設施的影響
所建議系統對建築物無改造,可以利用原有的通信線路。
3.7 技術條件方面的可能性
本軟體有計算機系的學生開發,調試,由計算機系老師知道。可完成性很高。
4. 可選擇的其他系統方案
由於此系統方案是學生開發,而且資金有限所以暫時無其他系統方案。
5. 投資及效益分析
5.1 支出分析:
5.2 收益分析:
5.3 收益/投資比
5.4 投資回收周期
5.5 敏感性分析
6. 社會因素方面的可能性
所有軟體都選用正版。
所有技術資料都由提出方保管。
合同制定確定違約責任。
7.用戶使用可行性
由於學校的老師都有一定的計算機基礎,不用培訓就可以使用,所以用戶使用可行性通過。
8. 結論
通過上述分析可以知道這個軟體操作簡單、功能齊全、功能開放、運行穩定、多任務、高效率等特點。所以說是計算機與學生成績管理上的好軟體!
設計說明書
一.概要設計說明書
1.系統功能設計
2.資料庫概念設計
根據以上數據流圖導出資料庫所需數據項和數據結構
學生:學號,姓名,性別,生日,所在院系,所在班級:
課程:課程號,課程名,講師,上課時間,地點,課程簡介
選課結果:記錄號,選課學生,所選課程
學籍變更記錄:記錄號,變更情況,記錄時間,詳細描述
2.1資料庫概念結構設計的E-R 圖
說明:E-R圖中矩形代表實體,菱形代表實體間的聯系,圓角矩形代表實體的屬性
2.2資料庫邏輯結構設計
根據以上E-R圖,需要五個基本表:學生信息表、課程信息表、選課結果表、獎懲信息表、其中教師信息是處部表,不列出,由於使用打開系統的不光是教務人員,每個學生都要登錄到選課系統進行課程的選擇,因此,需要對不同的登錄人員進行密碼的認證和許可權的限制,防止越權行為,用戶名,密碼,許可權,保存在一個表中。
1. USER-PASS用戶密碼信息表字典
欄位名
數據類型
是否可空
說明
ID
CHAR
NOT NULL
用戶名(主鍵)
PASSWORD
CHAR
NOT NULL
密碼
AUTHORITY
CHAR
NOT NULL
許可權
2. COURSE課程信息表數據字典
欄位名
數據類型
是否可空
說明
ID
CHAR
NOT NULL
課程號(主鍵)
NAME
VARCHAR
NULL
課程名
TEACHER
VARCHAR
NILL
講師
CLASTIME
VARCHAR
NULL
上課時間
CLASSROM
CHAR
NULL
上課地點
INTRO
VARCHAR
NULL
簡介
3. COURSE-SELECT選課結果表數據字典
欄位名
數據類型
是否可空
說明
ID
SMALL INT
NOT NILL
記錄號(主鍵)
COURSE
CHAR
NULL
課程名
STUDENT
CHAR
NULL
選課學生(外部關鍵
4. STUDENT學生個人信息表數據字典
欄位名
數據類型
是否可空
說明
ID
SMALL INT
NOT NULL
學號(主鍵)
NAME
VARCHAR
NOT NULL
姓名
SEX
CHAR
NOTNULL
性別
CLASS
CHAR
NULL
班級
DEPARTMENT
CHAR
NULL
院系
BIRTHDAY
VARCHAR
NULL
生日
5. 獎懲記錄信息表
欄位名
數據類型
是否可空
說明
ID
SMLL INT
NOT NULL
記錄號(主鍵)
STUDENT
CHAR
NOT NULL
學號(外部鍵)
LEVEL
CHAR
NULL
獎懲代碼
TIME
DATA
NULL
時間
DESCRIPTION
VARCHAR
NULL
描述
二主要模塊詳細設計說明書
1用戶身份認證模塊
功能:按用戶輸入的用戶名和密碼是否合法
合法則進入應用程序
非法則顯示出錯信息
界面:由總控模塊調用
模塊說明細化為詳細邏輯IPO圖
用戶身份認證模塊
輸入 處理 輸出
連接資料庫表 連接資料庫錯誤中斷程序
捕捉錯誤
用戶名 獲取用戶名
用戶密碼 獲取用戶密碼
讀USER-PAS
判斷用戶名是否存在
判斷密碼是否存在 提示信息
捕捉異常
判斷用戶許可權是合法
隱藏登錄窗口
顯示主窗體
文件
USER-PASS表
2.選課模塊
功能:接受學生選課信息
刷新學生課程表
界面:調用添加、刪除模塊,列印課表模塊
將模塊說明細化為詳細邏輯
選課處理IPO圖
輸入 處理 輸出
課程編號 為課程號過濾 輸入課程編號異常提示
接受課程號
打開課程信息表
判斷是添加或是刪除
添加
檢索課程表讀該記錄
若該記錄存在
顯示所選課程詳細信息 執行添加語句
調用添加模塊
將選課結果刷新
刪除 執行刪除語句
調用刪除模塊
將穩定課結果刷新
提交 課表:課程編號,課程名
調用列印課表模塊文件
課程信息表
選課結果表
3. 課程申請模塊
功能:接受輸入的新添課程信息
將新課程信息存入課程信息表
刪除舊課程
界面:調用已開課程信息表
調用申請修改程序
將模塊細化為詳細邏輯IPO圖
課程管理模塊
輸入 處理 輸出
課程編號 添加新課程
獲取當前教師所選課程
打開已開課程表
查詢是否存在該記錄
若無該記錄則是新課程
調用添加模塊
提取課程編號
提取課程名稱
提取課程簡介
提交
若有該記錄則不是新課程
出錯處理 提示信息
刪除舊課程
文件
課程信息表
軟體測試
輸入數據
有效等價類
無效等價類
證件號碼
1、6位數字字元
2、有效數字字元
3、少於6個字元
4、大於6個字元
使用功能
5、選課
6、查詢
7、輸入其他文字
有效測試用例
測試數據 期望結果 測試范圍
123456 輸入有效 1
選課 輸入有效 5
5
無效測試用例
測試數據
期望結果
測試范圍
12jda1
輸入無效
2
1234561
輸入無效
4
12341
輸入無效
3
12t21
輸入無效
2、 3
排課
輸入無效
7
(折半查找演算法測試)2
測試名稱:模塊輸入課程編號過濾的測試方案
a) 規定課程編號為輸入4個字元,頭兩個字元為字母,後2個字元為數字例如TP38
b) 測試方法採用黑盒測試法中的等價類劃分法
劃分等價類
輸入數據
有效等價類
無效等價類
課程號
1 兩字母+兩數字
2有非數字或字母
字母
3 A--Z
4字母少於兩個或多於兩個
數字
5 00--99
6數字少於兩個或多於兩個
為有效等價類和每個無效等價類設計測試用例
測試數據
期望結果
測試范圍
HY76
輸入有效
1、3、5
@D78
輸入無效
2
S86
輸入無效
4
MA2
輸入無效
6
HY345
輸入無效
6
DEH94
輸入無效
4
測試名稱:課程查找模塊設計測試方案
a) 本模塊採用的是折半查找演算法主要是測試各程序在各種典型情況下是不能有效的進行查找
b) 測試方案採用選擇白盒測試法中的路徑覆蓋法
說明:由於輸入的課程編號已經被過濾,所以編號接受的范圍為00--99
『捌』 求一份C語言課程設計報告要求包括:系統需求分析,總體設計,詳細設計,程序調試分析。
C語言課程設計任務書
一、題目: 學生成績管理
二、目的與要求
1. 目的:
(1)基本掌握面向過程程序設計的基本思路和方法;
(2)達到熟練掌握C語言的基本知識和技能;
(3)能夠利用所學的基本知識和技能,解決簡單的程序設計問題
2. 要求
基本要求:
1. 要求利用C語言面向過程的編程思想來完成系統的設計;
2. 突出C語言的函數特徵,以多個函數實現每一個子功能;
3. 畫出功能模塊圖;
4. 進行簡單界面設計,能夠實現友好的交互;
5. 具有清晰的程序流程圖和數據結構的詳細定義;
6. 熟練掌握C語言對文件的各種操作。
創新要求:
在基本要求達到後,可進行創新設計,如系統用戶功能控制,對管理員級和一般級別的用戶系統功能操作不同
三、信息描述
輸入一個班10個學生的學號和每個學生考試三門功課(數學、英語、計算機基礎)的成績。編程計算出每個學生的總分和平均分,並按學生成績優劣排序,最後列印一張按高分到低分名次排序的成績單。要求:
1)排序用一個函數實現。
2)列印的成績單表項包括:序號,學號、數學、英語、計算機、總分、平均分。
3)按實驗報告電子模板格式填寫實驗內容。
四、功能描述
1. 學生基本信息及成績所選科目成績的錄入。
2. 基本信息的查詢(分系、班級;分科目)與修改。
3. 對每系或每班各科成績進行分析(即求單科平均成績、及格率和優秀率);
4. 對所開課程的成績分析(求其平均成績,最高分和最低分);
5. 對學生考試成績進行排名(單科按系別或班級進行排名,對每一個班級,同一學期學生總體成績進行排名,並顯示各科成績信息)
五、解決方案
1. 分析程序的功能要求,劃分程序功能模塊。
2. 畫出系統流程圖。
3. 代碼的編寫。定義數據結構和各個功能子函數。
4. 程序的功能調試。
5. 完成系統總結報告以及使用說明書
六、進度安排
此次課程設計時間為兩周,分四個階段完成:
1. 分析設計階段。指導教師應積極引導學生自主學習和鑽研問題,明確設計要求,找出實現方法,按照需求分析、總體設計、詳細設計這幾個步驟進行。
2. 編碼調試階段:根據設計分析方案編寫C代碼,然後調試該代碼,實現課題要求的功能。
3. 總結報告階段:總結設計工作,寫出課程設計說明書,要求學生寫出需求分析、總體設計、詳細設計、編碼、測試的步驟和內容。
4. 考核階段。
#include <stdio.h>
#include <stdlib.h>
#define STU_NUM 10 /*宏定義學生的數量*/
struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/
{
char stu_id[20]; /*學生學號;*/
float score[3]; /*三門課成績;*/
float total; /*總成績;*/
float aver; /*平均成績;*/
};
/*排序用一個函數來實現*/
void SortScore(student *stu,int n)
{
student stud;
for(int i = 0; i < n-1; i++)
for(int j = i+1 ; j < n; j++)
{
if(stu[i].total < stu[j].total)
{
stud = stu[i];
stu[i] = stu[j];
stu[j] = stud;
}
}
}
int main( )
{
student stu[STU_NUM]; /*創建結構體數組中有10個元素,分別用來保存這10個人的相關信息。*/
/*輸入這十個學生的相關信息*/
for(int i = 0; i<STU_NUM; i++)
{
printf("請輸入第%d個學生的學號:",i+1);
scanf("%s",&stu[i].stu_id);
printf("輸入第%d個學生的數學成績:",i+1);
scanf("%f",&stu[i].score[0]);
printf("輸入第%d個學生的英語成績:",i+1);
scanf("%f",&stu[i].score[1]);
printf("輸入第%d個學生的計算機成績:",i+1);
scanf("%f",&stu[i].score[2]);
stu[i].total = stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
stu[i].aver = stu[i].total/3;
}
printf("\n");
SortScore(stu,STU_NUM);/*調用排序函數*/
/*輸出排序後的各學生的成績*/
for(i = 0 ; i < STU_NUM; i++)
{
printf("序號: %d\t",i);
printf("學號:%s\t",stu[i].stu_id);
printf("數學:%f\t",stu[i].score[0]);
printf("英語:%f\t",stu[i].score[1]);
printf("計算機:%f\t",stu[i].score[2]);
printf("平均成績:%f\t",stu[i].aver);
printf("總分:%f\t",stu[i].total);
printf("\n\n");
}
return 0;
}
註:(源程序中主要標識符含義說明)
#define STU_NUM 10 /*宏定義學生的數量*/
struct student /*定義一個結構體用來存放學生學號、三門課成績、總分及平均成績*/
{
char stu_id[20]; /*學生學號;*/
float score[3]; /*三門課成績;*/
float total; /*總成績;*/
float aver; /*平均成績;*/
}
實驗結果:
輸入 :(只輸入後面的數字,前面的文字是自己產生的)。
請輸入第1個學生的學號:001
輸入第1個學生的數學成績:1
輸入第1個學生的英語成績:1
輸入第1個學生的計算機成績:1
請輸入第2個學生的學號:002
輸入第2個學生的數學成績:2
輸入第2個學生的英語成績:2
輸入第2個學生的計算機成績:2
請輸入第3個學生的學號:003
輸入第3個學生的數學成績:3
輸入第3個學生的英語成績:3
輸入第3個學生的計算機成績:3
請輸入第4個學生的學號:004
輸入第4個學生的數學成績:4
輸入第4個學生的英語成績:4
輸入第4個學生的計算機成績:4
請輸入第5個學生的學號:005
輸入第5個學生的數學成績:5
輸入第5個學生的英語成績:5
輸入第5個學生的計算機成績:5
請輸入第6個學生的學號:006
輸入第6個學生的數學成績:6
輸入第6個學生的英語成績:6
輸入第6個學生的計算機成績:6
請輸入第7個學生的學號:007
輸入第7個學生的數學成績:7
輸入第7個學生的英語成績:7
輸入第7個學生的計算機成績:7
請輸入第8個學生的學號:008
輸入第8個學生的數學成績:8
輸入第8個學生的英語成績:8
輸入第8個學生的計算機成績:8
請輸入第9個學生的學號:009
輸入第9個學生的數學成績:9
輸入第9個學生的英語成績:9
輸入第9個學生的計算機成績:9
請輸入第10個學生的學號:010
輸入第10個學生的數學成績:10
輸入第10個學生的英語成績:10
輸入第10個學生的計算機成績:10
輸出:
序號: 0 學號:010 數學:10.000000 英語:10.000000 計算機:10.000000
平均成績:10.000000 總分:30.000000
序號: 1 學號:009 數學:9.000000 英語:9.000000 計算機:9.000000
平均成績:9.000000 總分:27.000000
序號: 2 學號:008 數學:8.000000 英語:8.000000 計算機:8.000000
平均成績:8.000000 總分:24.000000
序號: 3 學號:007 數學:7.000000 英語:7.000000 計算機:7.000000
平均成績:7.000000 總分:21.000000
序號: 4 學號:006 數學:6.000000 英語:6.000000 計算機:6.000000
平均成績:6.000000 總分:18.000000
序號: 5 學號:005 數學:5.000000 英語:5.000000 計算機:5.000000
平均成績:5.000000 總分:15.000000
序號: 6 學號:004 數學:4.000000 英語:4.000000 計算機:4.000000
平均成績:4.000000 總分:12.000000
序號: 7 學號:003 數學:3.000000 英語:3.000000 計算機:3.000000
平均成績:3.000000 總分:9.000000
序號: 8 學號:002 數學:2.000000 英語:2.000000 計算機:2.000000
平均成績:2.000000 總分:6.000000
序號: 9 學號:001 數學:1.000000 英語:1.000000 計算機:1.000000
平均成績:1.000000 總分:3.000000
七、撰寫課程設計報告或課程設計總結
課程設計報告要求:
總結報告包括需求分析、總體設計、詳細設計、編碼(詳細寫出編程步驟)、測試的步驟和內容、課程設計總結、參考資料等,不符合以上要求者,則本次設計以不及格記。
C語言常見錯誤
書寫標識符時,忽略了大小寫字母的區別
main()
{
int a=5;
printf("%d",A);
}
編譯程序把a和A認為是兩個不同的變數名,而顯示出錯信息。C認為大寫字母和小寫字母是兩個不同的字元。習慣上,符號常量名用大寫,變數名用小寫表示,以增加可讀性。
2.忽略了變數的類型,進行了不合法的運算。
main()
{
float a,b;
printf("%d",a%b);
}
%是求余運算,得到a/b的整余數。整型變數a和b可以進行求余運算,而實型變數則不允許進行「求余」運算。
3.將字元常量與字元串常量混淆。
char c;
c="a";
在這里就混淆了字元常量與字元串常量,字元常量是由一對單引號括起來的單個字元,字元串常量是一對雙引號括起來的字元序列。C規定以「\」作字元串結束標志,它是由系統自動加上的,所以字元串「a」實際上包含兩個字元:『a'和『\',而把它賦給一個字元變數是不行的。
4.忽略了「=」與「==」的區別。
在許多高級語言中,用「=」符號作為關系運算符「等於」。如在BASIC程序中可以寫
if (a=3) then …
但C語言中,「=」是賦值運算符,「==」是關系運算符。如:
if (a==3) a=b;
前者是進行比較,a是否和3相等,後者表示如果a和3相等,把b值賦給a。由於習慣問題,初學者往往會犯這樣的錯誤。
5.忘記加分號。
分號是C語句中不可缺少的一部分,語句末尾必須有分號。
a=1
b=2
編譯時,編譯程序在「a=1」後面沒發現分號,就把下一行「b=2」也作為上一行語句的一部分,這就會出現語法錯誤。改錯時,有時在被指出有錯的一行中未發現錯誤,就需要看一下上一行是否漏掉了分號。
{ z=x+y;
t=z/100;
printf("%f",t);
}
對於復合語句來說,最後一個語句中最後的分號不能忽略不寫(這是和PASCAL不同的)。
6.多加分號。
對於一個復合語句,如:
{ z=x+y;
t=z/100;
printf("%f",t);
};
復合語句的花括弧後不應再加分號,否則將會畫蛇添足。
又如:
if (a%3==0);
I++;
本是如果3整除a,則I加1。但由於if (a%3==0)後多加了分號,則if語句到此結束,程序將執行I++語句,不論3是否整除a,I都將自動加1。
再如:
for (I=0;I<5;I++);
{scanf("%d",&x);
printf("%d",x);}
本意是先後輸入5個數,每輸入一個數後再將它輸出。由於for()後多加了一個分號,使循環體變為空語句,此時只能輸入一個數並輸出它。
7.輸入變數時忘記加地址運算符「&」。
int a,b;
scanf("%d%d",a,b);
這是不合法的。Scanf函數的作用是:按照a、b在內存的地址將a、b的值存進去。「&a」指a在內存中的地址。
8.輸入數據的方式與要求不符。①scanf("%d%d",&a,&b);
輸入時,不能用逗號作兩個數據間的分隔符,如下面輸入不合法:
3,4
輸入數據時,在兩個數據之間以一個或多個空格間隔,也可用回車鍵,跳格鍵tab。
②scanf("%d,%d",&a,&b);
C規定:如果在「格式控制」字元串中除了格式說明以外還有其它字元,則在輸入數據時應輸入與這些字元相同的字元。下面輸入是合法的:
3,4
此時不用逗號而用空格或其它字元是不對的。
3 4 3:4
又如:
scanf("a=%d,b=%d",&a,&b);
輸入應如以下形式:
a=3,b=4
9.輸入字元的格式與要求不一致。
在用「%c」格式輸入字元時,「空格字元」和「轉義字元」都作為有效字元輸入。
scanf("%c%c%c",&c1,&c2,&c3);
如輸入a b c
字元「a」送給c1,字元「 」送給c2,字元「b」送給c3,因為%c只要求讀入一個字元,後面不需要用空格作為兩個字元的間隔。
10.輸入輸出的數據類型與所用格式說明符不一致。
例如,a已定義為整型,b定義為實型
a=3;b=4.5;
printf("%f%d\n",a,b);
編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要注意。
11.輸入數據時,企圖規定精度。
scanf("%7.2f",&a);
這樣做是不合法的,輸入數據時不能規定精度。
12.switch語句中漏寫break語句。
例如:根據考試成績的等級列印出百分制數段。
switch(grade)
{ case 'A':printf("85~100\n");
case 'B':printf("70~84\n");
case 'C':printf("60~69\n");
case 'D':printf("<60\n");
default:printf("error\n");
由於漏寫了break語句,case只起標號的作用,而不起判斷作用。因此,當grade值為A時,printf函數在執行完第一個語句後接著執行第二、三、四、五個printf函數語句。正確寫法應在每個分支後再加上「break;」。例如
case 'A':printf("85~100\n");break;
13.忽視了while和do-while語句在細節上的區別。
(1)main()
{int a=0,I;
scanf("%d",&I);
while(I<=10)
{a=a+I;
I++;
}
printf("%d",a);
}
(2)main()
{int a=0,I;
scanf("%d",&I);
do
{a=a+I;
I++;
}while(I<=10);
printf("%d",a);
}
可以看到,當輸入I的值小於或等於10時,二者得到的結果相同。而當I>10時,二者結果就不同了。因為while循環是先判斷後執行,而do-while循環是先執行後判斷。對於大於10的數while循環一次也不執行循環體,而do-while語句則要執行一次循環體。
14.定義數組時誤用變數。
int n;
scanf("%d",&n);
int a[n];
數組名後用方括弧括起來的是常量表達式,可以包括常量和符號常量。即C不允許對數組的大小作動態定義。
15.在定義數組時,將定義的「元素個數」誤認為是可使的最大下標值。
main()
;
printf("%d",a[10]);
}
C語言規定:定義時用a[10],表示a數組有10個元素。其下標值由0開始,所以數組元素a[10]是不存在的。
16.初始化數組時,未使用靜態存儲。
int a[3]=;
這樣初始化數組是不對的。C語言規定只有靜態存儲(static)數組和外部存儲(exterm)數組才能初始化。應改為:
static int a[3]=;
17.在不應加地址運算符&的位置加了地址運算符。
scanf("%s",&str);
C語言編譯系統對數組名的處理是:數組名代表該數組的起始地址,且scanf函數中的輸入項是字元數組名,不必要再加地址符&。應改為:
scanf("%s",str);
18.同時定義了形參和函數中的局部變數。
int max(x,y)
int x,y,z;
{z=x>y?x:y;
return(z);
}
形參應該在函數體外定義,而局部變數應該在函數體內定義。應改為:
int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z);
}
C語言心得體會
通過這次實訓,增加了我學習軟體技術的興趣,雖然還不明確軟體技術包含的具體內容,但從C語言這門課程開始,已發現程序設計的樂趣,在學習C語言的過程中也學到了許多計算機應用基礎知識,對計算機的機體也有了一個大體的了解。
這次實訓是老師給了范常式序,經過自己的改寫,實現要求。先做簡單的輸出,一步步的再做其它圖案,在實際操作過程中犯的一些錯誤還會有意外的收獲,感覺實訓很有意思。在具體操作中對這學期所學的C語言的理論知識得到鞏固,達到實訓的基本目的,也發現自己的不足之出,在以後的上機中應更加註意,同時體會到C語言具有的語句簡潔,使用靈活,執行效率高等特點。發現上機實訓的重要作用,特別是對數組和循環有了深刻的理解。
通過實際操作,學會 C語言程序編程的基本步驟、基本方法,開發了自己的邏輯思維能力,培養了分析問題、解決問題的能力。深刻體會到「沒有做不到的,只有想不到的」,「團結就是力量」,「實踐是檢驗真理的標准」,「不恥下問」……的寓意。
計時在此希望以後應多進行這樣的實訓,加長設間,培養學生獨立思考問題的能力,提高實際操作水平。
八、參考資料 :《C語言程序設計教程》
『玖』 學生信息管理系統的需求分析
1.1信息操作功能來
(1)學生基本信自息的添加、修改和刪除。學生基本信息包括:學好(學號的前6位為班級號)、姓名、性別、出生日期和所在的專業。
(2)課程信息的添加、修改和刪除。課程信息包括:課程號、所屬專業、課程名稱、課程類型(專修、選修、方向、通修、公修)、開課學期、學時數和學分。
(3)學生成績信息的添加、修改和刪除。學生成績信息包括:學好、課程號、成績和學分。
1.2.查詢功能
可以通過學號來查學生基本信息,通過學號和學期號查詢學生的成績,通過課程號查詢該課程的信息。
1.3.統計功能
統計當前信息所顯示的信息數以及學生某個學期或所有學期課程的總學分。
1.4.分析功能
對某一個班級的某一門課程的成績分布進行分析,並以直方圖的形式顯示出來。
1.5.列印功能
列印和預覽當前顯示的信息。
『拾』 課程設計 學生成績管理系統 需求分析報告 ,設計說明書。
發了 你看看行不行