c語言程序設計學生成績管理系統
㈠ c語言程序設計(張冬梅) 學生成績管理系統 設計
只給你幾個提示吧、一:你應該好好網路一下C語言的文件操作、、二、用鏈表將文件的內容調入內存進行處理、、三、每個功能用不同的子函數實現、、四、用一些文字提示使用者選擇功能、用switch條件語句根據選擇調用不同函數、、、好好復習C語言結構體、指針、文件操作這幾個章節(這三個知識肯定是一個一章的)、、搞定了這幾個東西、什麼鏈表、樹都輕而易舉、、
㈡ C語言程序設計 學生成績管理系統 (急)
針對你的描述C語言程序設計 學生成績管理系統 (急),
我們可以為你提供一份適用於初學者的代碼,
有別的要求也可以與我們聯系,
聯系我們需要提供你的問題和電子郵件,
有可能幫你,但是絕對救急,
請用BaiHi為我留言,
此回復對於所有需求和和來訪者有效,
ES:\\
㈢ 學生成績管理系統(c語言程序設計)
本程序是用鏈表做的~因為是轉載~不保證正確性.
/*頭文件*/
#include <stdio.h>
#include<dos.h>
#include<stdlib.h> /*其它說明*/
#include<string.h> /*字元串函數*/
#include<mem.h> /*內存操作函數*/
#include<ctype.h> /*字元操作函數*/
#include<alloc.h> /*動態地址分配函數*/
#define LEN sizeof(STUDENT)
typedef struct stu /*定義結構體數組用於緩存數據*/
{char num[6];
char name[5];
int score[3];
int sum;
float average;
int order;
struct stu *next;
}STUDENT;
/*函數原型*/
STUDENT *init(); /*初始化函數*/
int menu_select(); /*菜單函數*/
STUDENT *create(); /*創建鏈表*/
void print(STUDENT *head); /* 顯示全部記錄*/
void search(STUDENT *head); /*查找記錄*/
STUDENT *delete(STUDENT *head); /*刪除記錄*/
STUDENT *sort(STUDENT *head); /*排序*/
STUDENT *insert(STUDENT *head,STUDENT *new); /*插入記錄*/
void save(STUDENT *head); /*保存文件*/
STUDENT *load(); /*讀文件*/
/*主函數界面*/
main()
{STUDENT *head,new;
head=init(); /*鏈表初始化,使head的值為NULL*/
for(;;) /*循環無限次*/
{switch(menu_select())
{
case 1:head=create();break;
case 2:print(head);break;
case 3:search(head);break;
case 4:head=delete(head);break;
case 5:head=sort(head);break;
case 6:head=insert(head,&new);break; /*&new表示返回地址*/
case 7:save(head);break;
case 8:head=load(); break;
case 9:exit(0); /*如菜單返回值為9則程序結束*/
}
}
}
/*初始化函數*/
STUDENT *init()
{
return NULL; /*返回空指針*/
}
/*菜單選擇函數*/
menu_select()
{int n;
struct date d; /*定義時間結構體*/
getdate(&d); /*讀取系統日期並把它放到結構體d中*/
printf("press any key to enter the menu......"); /*按任一鍵進入主菜單*/
getch(); /*從鍵盤讀取一個字元,但不顯示於屏幕*/
clrscr(); /*清屏*/
printf("********************************************************************************\n");
printf("\t\t Welcome to\n");
printf("\n\t\t The student score manage system\n");
printf("*************************************MENU***************************************\n");
printf("\t\t\t1. Enter the record\n"); /*輸入學生成績記錄*/
printf("\t\t\t2. Print the record\n"); /*顯示*/
printf("\t\t\t3. Search record on name\n"); /*尋找*/
printf("\t\t\t4. Delete a record\n"); /*刪除*/
printf("\t\t\t5. Sort to make new a file\n"); /*排序*/
printf("\t\t\t6. Insert record to list\n"); /*插入*/
printf("\t\t\t7. Save the file\n"); /*保存*/
printf("\t\t\t8. Load the file\n"); /*讀取*/
printf("\t\t\t9. Quit\n"); /*退出*/
printf("\n\t\t Made by Hu Haihong.\n");
printf("********************************************************************************\n");
printf("\t\t\t\t%d\\%d\\%d\n",d.da_year,d.da_mon,d.da_day); /*顯示當前系統日期*/
do{
printf("\n\t\t\tEnter your choice(1~9):");
scanf("%d",&n);
}while(n<1||n>9); /*如果選擇項不在1~9之間則重輸*/
return(n); /*返回選擇項,主函數根據該數調用相應的函數*/
}
/*輸入函數*/
STUDENT *create()
{int i,s;
STUDENT *head=NULL,*p; /* 定義函數.此函數帶回一個指向鏈表頭的指針*/
clrscr();
for(;;)
{p=(STUDENT *)malloc(LEN); /*開辟一個新的單元*/
if(!p) /*如果指針p為空*/
{printf("\nOut of memory."); /*輸出內存溢出*/
return (head); /*返回頭指針,下同*/
}
printf("Enter the num(0:list end):");
scanf("%s",p->num);
if(p->num[0]=='0') break; /*如果學號首字元為0則結束輸入*/
printf("Enter the name:");
scanf("%s",p->name);
printf("Please enter the %d scores\n",3); /*提示開始輸入成績*/
s=0; /*計算每個學生的總分,初值為0*/
for(i=0;i<3;i++) /*3門課程循環3次*/
{
do{
printf("score%d:",i+1);
scanf("%d",&p->score[i]);
if(p->score[i]<0 || p->score[i]>100) /*確保成績在0~100之間*/
printf("Data error,please enter again.\n");
}while(p->score[i]<0 || p->score[i]>100);
s=s+p->score[i]; /*累加各門成績*/
}
p->sum=s; /*將總分保存*/
p->average=(float)s/3; /*先用強制類型轉換將s轉換成float型,再求平均值*/
p->order=0; /*未排序前此值為0*/
p->next=head; /*將頭結點做為新輸入結點的後繼結點*/
head=p; /*新輸入結點為新的頭結點*/
}
return(head);
}
/* 顯示全部記錄函數*/
void print(STUDENT *head)
{int i=0; /* 統計記錄條數*/
STUDENT *p; /*移動指針*/
clrscr();
p=head; /*初值為頭指針*/
printf("\n************************************STUDENT************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Rec | Num | Name | Sc1 | Sc2 | Sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
while(p!=NULL)
{
i++;
printf("| %3d | %4s | %-4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
i, p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
p=p->next;
}
printf("-------------------------------------------------------------------------------\n");
printf("**************************************END**************************************\n");
}
/*查找記錄函數*/
void search(STUDENT *head)
{STUDENT *p; /* 移動指針*/
char s[5]; /*存放姓名用的字元數組*/
clrscr();
printf("Please enter name for searching.\n");
scanf("%s",s);
p=head; /*將頭指針賦給p*/
while(strcmp(p->name,s) && p != NULL) /*當記錄的姓名不是要找的,或指針不為空時*/
p=p->next; /*移動指針,指向下一結點*/
if(p!=NULL) /*如果指針不為空*/
{printf("\n*************************************FOUND************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
printf("-------------------------------------------------------------------------------\n");
printf("***************************************END**************************************\n");
}
else
printf("\nThere is no num %s student on the list.\n",s); /*顯示沒有該學生*/
}
/*刪除記錄函數*/
STUDENT *delete(STUDENT *head)
{int n;
STUDENT *p1,*p2; /*p1為查找到要刪除的結點指針,p2為其前驅指針*/
char c,s[6]; /*s[6]用來存放學號,c用來輸入字母*/
clrscr();
printf("Please enter the deleted num: ");
scanf("%s",s);
p1=p2=head; /*給p1和p2賦初值頭指針*/
while(strcmp(p1->num,s) && p1 != NULL) /*當記錄的學號不是要找的,或指針不為空時*/
{p2=p1; /*將p1指針值賦給p2作為p1的前驅指針*/
p1=p1->next; /*將p1指針指向下一條記錄*/
}
if(strcmp(p1->num,s)==0) /*學號找到了*/
{printf("**************************************FOUND************************************\n");
printf("-------------------------------------------------------------------------------\n");
printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n");
printf("-------------------------------------------------------------------------------\n");
printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",
p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order);
printf("-------------------------------------------------------------------------------\n");
printf("***************************************END**************************************\n");
printf("Are you sure to delete the student Y/N ?"); /*提示是否要刪除,輸入Y刪除,N則退出*/
for(;;)
{scanf("%c",&c);
if(c=='n'||c=='N') break; /*如果不刪除,則跳出本循環*/
if(c=='y'||c=='Y')
{
if(p1==head) /*若p1==head,說明被刪結點是首結點*/
head=p1->next; /*把第二個結點地址賦予head*/
else
p2->next=p1->next; /*否則將一下結點地址賦給前一結點地址*/
n=n-1;
printf("\nNum %s student have been deleted.\n",s);
printf("Don't forget to save.\n");break; /*刪除後就跳出循環*/
}
}
}
else
printf("\nThere is no num %s student on the list.\n",s); /*找不到該結點*/
return(head);
}
/*排序函數*/
STUDENT *sort(STUDENT *head)
{int i=0; /*保存名次*/
STUDENT *p1,*p2,*t,*temp; /*定義臨時指針*/
temp=head->next; /*將原表的頭指針所指的下一個結點作頭指針*/
head->next=NULL; /*第一個結點為新表的頭結點*/
while(temp!=NULL) /*當原表不為空時,進行排序*/
{
t=temp; /*取原表的頭結點*/
temp=temp->next; /*原表頭結點指針後移*/
p1=head; /*設定移動指針p1,從頭指針開始*/
p2=head; /*設定移動指針p2做為p1的前驅,初值為頭指針*/
while(t->average<p1->average&&p1!=NULL) /*作成績平均分比較*/
{
p2=p1; /*待排序點值小,則新表指針後移*/
p1=p1->next;
}
if(p1==p2) /*p1==p2,說明待排序點值大,應排在首位*/
{
t->next=p1; /*待排序點的後繼為p*/
head=t; /*新頭結點為待排序點*/
}
else /*待排序點應插入在中間某個位置p2和p1之間,如p為空則是尾部*/
{
t->next=p1; /*t的後繼是p1*/
p2->next=t; /*p2的後繼是t*/
}
}
p1=head; /*已排好序的頭指針賦給p1,准備填寫名次*/
while(p1!=NULL) /*當p1不為空時,進行下列操作*/
{
i++; /*結點序號*/
p1->order=i; /*將結點序號賦值給名次*/
p1=p1->next; /*指針後移*/
}
printf("Sorting is sucessful.\n"); /*排序成功*/
return (head);
}
/*插入記錄函數*/
STUDENT *insert(STUDENT *head,STUDENT *new)
{STUDENT *p0,*p1,*p2;
int n,sum1,i;
p1=head; /*使p1指向第一個結點*/
p0=new; /*p0指向要插入的結點*/
printf("\nPlease enter a new record.\n"); /*提示輸入記錄信息*/
printf("Enter the num:");
scanf("%s",new->num);
printf("Enter the name:");
scanf("%s",new->name);
printf("Please enter the %d scores.\n",3);
sum1=0; /*保存新記錄的總分,初值為0*/
for(i=0;i<3;i++)
{
do{
printf("score%d:",i+1);
scanf("%d",&new->score[i]);
if(new->score[i]>100||new->score[i]<0)
printf("Data error,please enter again.\n");
}while(new->score[i]>100||new->score[i]<0);
sum1=sum1+new->score[i]; /*累加各門成績*/
}
new->sum=sum1; /*將總分存入新記錄中*/
new->average=(float)sum1/3;
new->order=0;
if(head==NULL) /*原來的鏈表是空表*/
{head=p0;p0->next=NULL;} /*使p0指向的結點作為頭結點*/
else
{while((p0->average<p1->average)&&(p1->next!=NULL))
{p2=p1; /*使p2指向剛才p1指向的結點*/
p1=p1->next; /*p1後移一個結點*/
}
if(p0->average>=p1->average)
{if(head==p1)head=p0; /*插到原來第一個結點之前*/
else p2->next=p0; /*插到p2指向的結點之後*/
p0->next=p1;}
else
{p1->next=p0;p0->next=NULL;} /*插到最後的結點之後*/
}
n=n+1; /*結點數加1*/
head=sort(head); /*調用排序的函數,將學生成績重新排序*/
printf("\nStudent %s have been inserted.\n",new->name);
printf("Don't forget to save the new file.\n");
return(head);
}
/*保存數據到文件函數*/
void save(STUDENT *head)
{FILE *fp; /*定義指向文件的指針*/
STUDENT *p; /* 定義移動指針*/
char outfile[10];
printf("Enter outfile name,for example c:\\score\n");
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*為輸出打開一個二進制文件,為只寫方式*/
{
printf("Cannot open the file\n");
return; /*若打不開則返回菜單*/
}
printf("\nSaving the file......\n");
p=head; /*移動指針從頭指針開始*/
while(p!=NULL) /*如p不為空*/
{
fwrite(p,LEN,1,fp); /*寫入一條記錄*/
p=p->next; /*指針後移*/
}
fclose(fp); /*關閉文件*/
printf("Save the file successfully!\n");
}
/* 從文件讀數據函數*/
STUDENT *load()
{STUDENT *p1,*p2,*head=NULL; /*定義記錄指針變數*/
FILE *fp; /* 定義指向文件的指針*/
char infile[10];
printf("Enter infile name,for example c:\\score\n");
scanf("%s",infile);
if((fp=fopen(infile,"rb"))==NULL) /*打開一個二進制文件,為只讀方式*/
{
printf("Can not open the file.\n");
return(head);
}
printf("\nLoading the file!\n");
p1=(STUDENT *)malloc(LEN); /*開辟一個新單元*/
if(!p1)
{
printf("Out of memory!\n");
return(head);
}
head=p1; /*申請到空間,將其作為頭指針*/
while(!feof(fp)) /*循環讀數據直到文件尾結束*/
{
if(fread(p1,LEN,1,fp)!=1) break; /*如果沒讀到數據,跳出循環*/
p1->next=(STUDENT *)malloc(LEN); /*為下一個結點開辟空間*/
if(!p1->next)
{
printf("Out of memory!\n");
return (head);
}
p2=p1; /*使p2指向剛才p1指向的結點*/
p1=p1->next; /*指針後移,新讀入數據鏈到當前表尾*/
}
p2->next=NULL; /*最後一個結點的後繼指針為空*/
fclose(fp);
printf("You have success to read data from the file!\n");
return (head);
}
㈣ C語言程序設計 學生成績管理系統
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "stdlib.h"
#define CMD_START printf("\n\n######### Start a command #########\n");
/* 用來標記一個命令執行的開始*/
#define CMD_END printf( "\n######### End a command #########\n\n");
/* 用來標記一個命令執行的結束 ,這兩個語句是為了提供更好的用戶界面而寫的 */
#define DATA_FILE "data.dat"
/* 這是 數據文件名 */
#define TEMP_FILE "temp.dat"
/* 這是一個臨時的文件的名字,在刪除記錄的函數中使用的,
詳細內容參考 Delete() 函數 */
typedef struct tagStudent
{
char ID[30]; /* 學號 */
char Name[30]; /* 姓名 */
char Class[255]; /* 班級 */
char Sex; /* 性別 ,值為 F 或 f 或 M 或 m */
int Math; /* 數學成績 */
int English; /* 英語成績 */
int Compute; /* 計算機成績 */
int Philosophy; /* 哲學成績 */
int PE; /* 體育成績 */
} Student;
/* 這是學生信息結構體 */
int ShowMenu(); /* 在屏幕上列印 主菜單 的函數,它的返回值為 所選 菜單的 項目編號 */
int ReadData(FILE*,Student* ); /* 從一個 打開的數據文件中讀取 記錄的函數,錯誤返回 0 */
int WriteData(FILE* , Student* ); /* 向一個數據文件中 寫入 記錄的函數,錯誤返回 0 */
void Output_Rec(Student*); /* 在屏幕上 列印 一條記錄 */
void Input_Rec(Student*); /* 讓用戶輸入 記錄的 各個項目的 值,在添加記錄時用到了 */
void CopyRec(Student* , Student* ); /* 復制一條記錄 到 另一個記錄中 */
/* 題目中要求的函數 */
void Print(); /* 實現查看數據文件內容的函數 */
void Add(); /* 添加記錄的函數 */
void Delete(); /* 刪除記錄的函數 */
void Statistics(); /* 對數據進行統計分析的函數 */
void Find(int); /* 實現查找功能的函數,參數決定 是按 ID 查找 還是按 Name 查找 */
int quit; /* 一個全局變數,在下面的 main() 函數中,用來決定何時退出主循環 */
main()
{
int cmd; /* 用戶所選的 菜單 項目 的標號 */
quit = 0; /* 初始化 為 不退出 */
/* 這是程序的主循環,每次都將 主菜單列印出來,
供用戶選擇相應的 序號 來執行相應的功能 */
while( ! quit )
{
cmd = ShowMenu(); /* 顯示 主菜單,並返回用戶所選擇的 菜單項 的 編號 */
CMD_START /* 在屏幕上列印一行分隔符,告訴用戶這是一個子功能的開始 */
switch( cmd ) /* 用多項分支 根據 用戶的選擇 調用 相應的函數 */
{
case 1:
Print(); break; /* 用戶選擇 1 號菜單,程序執行 查看的數據文件的函數 */
case 2:
Add(); break; /* 用戶選擇 2 號菜單,程序執行 添加記錄的函數 */
case 3:
Delete(); break; /* 用戶選擇 3 號菜單,程序執行 刪除記錄的函數 */
case 4:
Statistics(); break; /* 用戶選擇 4 號菜單,程序執行 統計數據的函數 */
case 5:
Find(5); break; /* Find_ID ,5 號菜單執行 按 ID(學號)查找的功能 */
case 6:
Find(6); break; /* Find_Name,6 號菜單執行 按 Name(姓名)查找的功能 */
case 7:
quit = 1; /* 用戶選擇了退出菜單 */
printf(" Thank you for your using .\n\n Happy everyday !!\n\n Bye Bye ....\n");
break;
default:
printf(" Please Input a number between\t1\tto\t7.\n");
/* 用戶所輸入的 序號不在所處理的范圍內 */
}
CMD_END /* 列印一行分隔符,告訴用戶 他所選擇的菜單的功能已經執行完畢 */
if (quit != 1) /* 檢查用戶是否 要求 退出 */
{
printf(" Press any key to Return Main Menu ....\n");
getch(); /* 用 一個 無回顯 的 字元輸入函數 來實現暫停執行,按 任意鍵 繼續的功能 */
}
}
}
int ShowMenu()
{
int cmd = 0; /* 保存用戶的選擇 */
/* 定義 程序所支持的菜單項目 */
char Menu_SeeData[] = "\t1 .\tView the Records in the data file\n"; /* 查看數據文件 */
char Menu_Add[] = "\t2 .\tAdd New Record\n"; /* 添加記錄 */
char Menu_Delete[] = "\t3 .\tDelete an old Record\n"; /* 刪除記錄 */
char Menu_Statistics[] = "\t4 .\tMake a Statistics\n"; /* 統計分析 */
char Menu_Find_ID[] = "\t5 .\tFind a Record from the ID\n"; /* 按 學號(ID) 查找 */
char Menu_Find_Name[] = "\t6 .\tFind a Record from the Name\n"; /* 按 姓名(Name) 查找 */
char Menu_Quit[] = "\t7 .\tQuit\n"; /* 退出 */
/* 在屏幕上列印 主菜單 */
printf("\n\n############ Main Menu ###############\n");
printf( "##############################################\n\n");
printf(Menu_SeeData);
printf(Menu_Add);
printf(Menu_Delete);
printf(Menu_Statistics);
printf(Menu_Find_ID);
printf(Menu_Find_Name);
printf(Menu_Quit);
printf("\n##############################################");
printf("\n\n Input the index of your choice : ");
scanf("%d" , &cmd); /* 接受用戶 選擇 */
printf("\n");
return cmd; /* 返回用戶的輸入,交給主循環處理 */
}
void Print() /* 列印 數據文件的 記錄內容 */
{
FILE* fp = NULL; /* 文件指針 */
Student rec; /* 存放從文件中讀取的記錄 */
int i = 0; /* 實現 計數 和 分屏列印的功能 */
fp = fopen(DATA_FILE , "rb"); /* 以 二進制讀 方式 打開數據文件 */
if(fp == NULL) /* 打開文件出錯 */
{
printf(" Can not open the data file : %s\n" , DATA_FILE);
return ;
}
while(ReadData(fp , &rec)) /* ReadData() 函數出錯或到文件末尾時返回 0,可以做循環條件 */
{
Output_Rec(&rec); /* 正確讀取,將記錄輸出 */
printf(" ------------------------------------------");
/* 列印一行分隔符,營造好的用戶界面 */
i++; /* 計數器 加一 */
if( i % 4 == 0) /* 顯示 4 個暫停一下 */
{
printf("\n Press any key to continue ... \n");
getch();
}
}
printf("\n The current data file have\t%d\trecord .\n" , i );
fclose(fp); /* 關閉文件 */
}
void Add() /* 添加記錄 */
{
Student rec;
FILE* fp = NULL;
Input_Rec( &rec ); /* 讓用戶輸入新記錄的各項內容 */
fp = fopen(DATA_FILE ,"ab"); /* 以 添加 方式打開數據文件 */
if( fp == NULL)
{
printf(" Can not open the data file to write into ... \n");
return ;
}
if( WriteData(fp, &rec) == 1) /* 將 新記錄 寫入文件,並檢查 是否正確寫入*/
printf("\n\n Add New Record Success \n\n");
else
printf("\n\n Failed to Write New Record into the data file \n");
fclose(fp);
}
void Delete() /* 刪除記錄 */
{
Student rec;
FILE* fpr,*fpw; /* 兩個文件指針,分別用於 讀 和 寫 */
char buf[30]; /* 接受 用戶輸入的 ID 緩沖區 */
char cmd[255]; /* 執行的系統命令 */
int del_count; /* 實際 刪除的 記錄數目 */
del_count = 0;
printf("\n Please type the ID of the record you want me to delete .");
printf("\n The ID : "); /* 提示用戶 輸入 */
scanf("%s" , buf);
fpr = fopen(DATA_FILE ,"rb"); /* 從 原來的記錄文件中讀取數據,跳過將要刪除的記錄 */
if( fpr == NULL)
{
printf(" Can not open the data file to read record ... \n");
return ;
}
fpw = fopen(TEMP_FILE,"wb"); /* 打開一個 臨時文件 保存不刪除的記錄 */
if( fpw == NULL)
{
printf(" Can not open the data file to write into ... \n");
return ;
}
while(ReadData(fpr , &rec)) /* 讀取 要保留的記錄 */
{
if(strcmp(rec.ID , buf) != 0)
{
WriteData(fpw, &rec); /* 寫入臨時文件 ,然後刪除 原數據文件,
再將臨時文件該名為原數據文件的名字*/
}
else
{
del_count++; /* 跳過的記錄數目,即刪除的數目 */
}
}
fclose(fpr);
fclose(fpw);
strcpy(cmd , "del "); /* 構造命令串,用 system() 函數執行 */
strcat(cmd ,DATA_FILE);
system(cmd);
rename(TEMP_FILE,DATA_FILE); /* 直接調用 C 語言的改名函數將臨時文件改名為數據文件的名字*/
printf("\n I have delete\t%d\trecord .\n" ,del_count);
}
void Statistics() /* 統計分析函數 */
{
int i50,i60,i70,i80,i90; /*平均分小於60 ,60-69,70-79,80-89,>=90 的分數段的學生數目*/
float avg; /*平均分*/
int sum ,sum_high,sum_low; /* 總分,總分最高分,總分最低分 */
Student stu_high,stu_low; /* 總分最高和最低 學生的信息 */
Student stu_math_high,stu_english_high; /* 各科 最高分的學生記錄副本 */
Student stu_compute_high,stu_philosophy_high,stu_PE_high;
Student stu_math_low,stu_english_low; /* 各科最低的學生記錄副本 */
Student stu_compute_low, stu_philosophy_low ,stu_PE_low;
FILE* fp;
Student rec;
int count; /* 一個計數器,用於判斷是否第一次讀取數據 */
count = sum = sum_high = sum_low = i50 = i60 = i60 = i70 =i80 = i90 = 0;
fp = NULL; /* 對 數據初始化 */
fp = fopen(DATA_FILE ,"rb");
if(fp == NULL)
{
printf("\nCan not open the data file to read ...\n");
return;
}
while(ReadData(fp , &rec)) /* 讀取數據 */
{
count++; /* 計數器 加一 */
sum = rec.Math + rec.English + rec.Compute + rec.PE+ rec.Philosophy; /* 求和 */
/* average */
avg = ((float)sum) / 5; /* 平均分 */
/* 下面對各個分數段進行統計 */
if(avg < 60)
i50++;
else if(avg <70)
i60++;
else if(avg < 80)
i70++;
else if(avg < 90)
i80++;
else
i90++;
/*highest and loeest*/
if(count <= 1) /* 第一次讀取,執行初始化,不進行比較 */
{
sum_high = sum_low = sum;
CopyRec(&stu_high , &rec);
CopyRec(&stu_low ,&rec);
}
else
{
if(sum > sum_high)
{
sum_high = sum; /* 得到最高總分 */
CopyRec(&stu_high , &rec); /* 保存總分最高的學生的信息 */
}
if(sum < sum_low)
{
sum_low = sum; /* 得到最低分 */
CopyRec(&stu_low , &rec); /* 保存總分最低的學生的信息 */
}
}
/* subject highest and low */
if(count == 1) /* 同上面一樣,執行初始化 */
{
CopyRec(&stu_math_high,&rec);
CopyRec(&stu_english_high , &rec);
CopyRec(&stu_compute_high, &rec);
CopyRec(&stu_philosophy_high,&rec);
CopyRec(&stu_PE_high , &rec);
CopyRec(&stu_math_low,&rec);
CopyRec(&stu_english_low , &rec);
CopyRec(&stu_compute_low, &rec);
CopyRec(&stu_philosophy_low,&rec);
CopyRec(&stu_PE_low , &rec);
}
else
{
/* High */
/* 保存各科的最高分的學生的信息 */
if(rec.Math > stu_math_high.Math)
CopyRec(&stu_math_high ,&rec);
if(rec.English > stu_english_high.English)
CopyRec(&stu_english_high ,&rec);
if(rec.Compute > stu_compute_high.Compute)
CopyRec(&stu_compute_high , &rec);
if(rec.Philosophy > stu_philosophy_high.Philosophy)
CopyRec(&stu_philosophy_high , &rec);
if(rec.PE > stu_PE_high.PE)
CopyRec(&stu_PE_high , &rec);
/* low */
/* 保存各科的最低分的學生的信息 */
if(rec.Math < stu_math_low.Math)
CopyRec(&stu_math_low ,&rec);
if(rec.English < stu_english_low.English)
CopyRec(&stu_english_low ,&rec);
if(rec.Compute < stu_compute_low.Compute)
CopyRec(&stu_compute_low , &rec);
if(rec.Philosophy < stu_philosophy_low.Philosophy)
CopyRec(&stu_philosophy_low , &rec);
if(rec.PE < stu_PE_low.PE)
CopyRec(&stu_PE_low , &rec);
}
}/* While End */
if(count < 1)
{
printf("\n There is no record in the data file .\n");
}
else
{
/* average */
/* 輸出平均分的分段統計信息 */
printf("\n The count in each segment :\n");
printf("\t < 60\t:\t%d\n",i50);
printf("\t60 - 69\t:\t%d\n",i60);
printf("\t70 - 79\t:\t%d\n",i70);
printf("\t80 - 90\t:\t%d\n",i80);
printf("\t >= 90\t:\t%d\n",i90);
printf(" ------------------------------------------");
getch();
/*highest and loeest*/
/* 輸出總分最高的學生的信息 */
printf("\n The Highest Mark Student:\n");
printf(" The Mark is : %d\n" , sum_high);
printf(" The student is :\n");
Output_Rec(&stu_high);
/* 輸出總分最高的學生的信息 */
printf("\n The Lowest Mark Student:\n");
printf(" The Mark is : %d\n" , sum_low);
printf(" The student is :\n");
Output_Rec(&stu_low);
printf(" ------------------------------------------\n");
getch();
/* subject highest and low */
/* 輸出各科最高和最低分的統計信息 */
printf(" The Highest\tMath :\n");
Output_Rec(&stu_math_high);
printf(" The Lowest Math :\n");
Output_Rec(&stu_math_low);
printf(" ------------------------------------------\n");
getch(); /* 暫停 ,按任意鍵繼續 */
printf(" The Highest English :\n");
Output_Rec(&stu_english_high);
printf(" The Lowest English :\n");
Output_Rec(&stu_english_low);
printf(" ------------------------------------------\n");
getch();
printf(" The Highest Compute :\n");
Output_Rec(&stu_compute_high);
printf(" The Lowest Compute :\n");
Output_Rec(&stu_compute_low);
printf(" ------------------------------------------\n");
getch();
printf(" The Highest Philosophy :\n");
Output_Rec(&stu_philosophy_high);
printf(" The Lowest Philosophy :\n");
Output_Rec(&stu_philosophy_low);
printf(" ------------------------------------------\n");
getch();
printf(" The Highest PE :\n");
Output_Rec(&stu_PE_high);
printf(" The Lowest PE :\n");
Output_Rec(&stu_PE_low);
printf(" ------------------------------------------\n");
}
fclose(fp);
}
void Find(int isFind_From_ID) /* 查找函數 */
{
char buf[30]; /* 接受用戶輸入的條件的緩沖區 */
Student rec;
int find_count; /* 查找到的記錄數目 */
FILE* fp;
find_count = 0;
fp = fopen(DATA_FILE ,"rb");
if( fp == NULL)
{
printf("\n Can not open the data file to search ...\n");
return;
}
switch(isFind_From_ID)
{
case 5: /*ID,按 學號查找*/
printf("\n Please Input the ID : ");
scanf("%s",buf); /* 提示用戶輸入 */
while(ReadData(fp , &rec)) /* 讀取數據 */
{
if(strcmp(rec.ID , buf) == 0) /* 比較 */
{
find_count++;
Output_Rec(&rec); /* 輸出符合條件的記錄 */
printf(" ------------------------------------------\n");
}
}
break;
case 6: /*Name ,按 姓名 查找*/
printf("\n Please Input the Name : ");
scanf("%s",buf);
while(ReadData(fp , &rec))
{
if(strcmp(rec.Name , buf) == 0)
{
find_count++;
Output_Rec(&rec);
printf(" ------------------------------------------\n");
}
}
break;
default:
printf(" \nPlease type right index ...\n"); /*處理isFind_From_ID既不是5也不是6的情況*/
}
if(find_count >0) /* 輸出找到的記錄數目 */
{
printf("\n Have find out\t%d\trecord\n" ,find_count);
}
else
{
printf("\n I'm very sorry .\n I failed to find out the one you want .\n");
printf("\n I suggest that you change some other key words .\n");
}
fclose(fp);
}
int ReadData(FILE* fp, Student* Dest_Rec) /* 讀取數據記錄 */
{
int r;
if(( fp == NULL ) || ( Dest_Rec == NULL))
return 0; /* ERROR */
r = fread(Dest_Rec ,sizeof(Student) ,1 ,fp);
if(r != 1)
return 0;
return 1;
}
int WriteData(FILE* fp, Student* Src_Rec) /* 寫入數據記錄 */
{
int r;
if((fp == NULL) || (Src_Rec == NULL))
return 0; /* ERROR */
r = fwrite(Src_Rec , sizeof(Student) , 1, fp);
if(r != 1)
return 0;
return 1;
}
void Output_Rec( Student* stu) /* 在屏幕上輸出 一個學生的信息 */
{
printf("\n");
printf(" Name : %s", stu->Name);
printf("\t\tSex : ");
if( stu->Sex == 'M' || stu->Sex == 'm' )
printf("Male");
else
printf("Female");
printf("\n ID : %s\t\tClass : %s\n",stu->ID ,stu->Class);
printf("Math = %d\tEnglish = %d\tCompute = %d\n" ,stu->Math ,stu->English, stu->Compute);
printf("Philosophy = %d\t\tPE = %d\n", stu->Philosophy ,stu->PE);
printf("\n");
}
void Input_Rec( Student* stu) /* 讓用戶輸入 一個學生的各項信息 */
{
if(stu == NULL)
return;
printf("\n Name = ");
scanf("%s",stu->Name);
/* 下面這段代碼實現只能輸入 F ,f ,M ,m 的功能 */
printf("\tSex = (F|M) ");
while(1)
㈤ C語言程序設計學生成績管理系統
給你把核心大約寫一下吧你再具體修改一下
sum(中間成績求和數據)=o
for(i=0;i<5;i++)
{sum=科目數組名[i][0]+sum<br>}
sum/5=平均成績
sum1=0
for(i=0;i<5;i++)
{
for(j=0;j<50;j++)
{科目數組名[i][j]+sum1=sum1;
}
sum1/50=平均成績
輸出
}
至於找出學生和課程,你找出2維數組里的最大值,也是for循環也能完成,然後看他所在的行列,就能得出相應的學生和課程了、
㈥ c語言課程設計學生成績管理系統。 學生基本信息包括學號,姓名,性別,三門成績,請編程序,實現如下功能:
臨時寫的,沒有編譯,應該差不離。
#include <stdio.h>
#define MAX_CORE_NUM 3
#define MAX_STU_NUM 100
struct stu_info_t
{
int no;
char name[50];
int is_male;
int core[MAX_CORE_NUM];
int core_total;
int rank;
};
int class_min_stu[MAX_CORE_NUM];
int class_max_stu[MAX_CORE_NUM];
struct stu_info_t stu_info[MAX_STU_NUM];
int stu_num = 0;
int input_stu_info()
{
char q = 0;
int i = 0;
int j = 0;
char c = 0;
printf("請輸入所有學生信息:\n");
i = 0;
while (q != 'q' && q != 'Q' && i < MAX_STU_NUM)
{
printf("學號:");
scanf("%d", &(stu_info[i].no));
printf("姓名:");
scanf("%s", stu_info[i].name);
printf("性別(M/m - 男生,F/f - 女生):");
scanf("%c", &c);
if (c == 'M' || c == 'c')
stu_info[i].is_male = 1;
else
stu_info[i].is_male = 0;
stu_info[i].core_total = 0;
for (j = 0; j < MAX_CORE_NUM; j++)
{
printf("課程%d得分:", j+1);
scanf("%d", &(stu_info[i].core[j]));
stu_info[i].core_total += stu_info[i].core[j];
}
i++;
if (i >= MAX_STU_NUM)
{
printf("最多輸入%d個學生信息\n", MAX_STU_NUM);
break;
}
printf("退出(Q/q):");
scanf("%c", &q);
}
stu_num = i;
return 0;
}
int save_stu_info()
{
int i = 0;
int j = 0;
FILE * fp = NULL;
fp = fopen("students.txt", "rw");
if (fp == NULL)
return -1;
fprintf(fp, "\t學號\t姓名\t性別");
for (j = 0; j < MAX_CORE_NUM; j++)
{
fprintf(fp, "\t課程%d", j+1);
}
fprintf(fp, "\r\n");
for (i = 0; i < stu_num; i++)
{
fprintf(fp, "\t%d\t%s\t%s", stu_info[i].no, stu_info[i].name, (stu_info[i].is_male ? "男" : "女"));
for (j = 0; j < MAX_CORE_NUM; j++)
{
fprintf(fp, "\t%d", stu_info[i].core[j]);
}
fprintf(fp, "\r\n");
}
fclose(fp);
return 0;
}
int cal_rank()
{
int i = 0;
int j = 0;
int class_min;
int class_max;
struct stu_info_t t;
for (i = 0; i < stu_num - 1; i++)
{
for (j = i + 1; j < stu_num; j++)
{
if (stu_info[i].core_total < stu_info[j].core_total)
{
memcpy(&t, &stu_info[j], sizeof(struct stu_info_t));
memcpy(&stu_info[j], &stu_info[i], sizeof(struct stu_info_t));
memcpy(&stu_info[i], &t, sizeof(struct stu_info_t));
}
}
}
for (i = 0; i < stu_num; i++)
{
stu_info[i].rank = i + 1;
}
for (j = 0; j < MAX_CORE_NUM; j++)
{
class_min = 0;
class_max = 10000;
for (i = 0; i < stu_num; i++)
{
if (stu_info[i].core[j] < class_min)
{
class_min = stu_info[i].core[j];
class_min_stu[j] = i;
}
if (stu_info[i].core[j] > class_max)
{
class_max = stu_info[i].core[j];
class_max_stu[j] = i;
}
}
}
return 0;
}
int output_total()
{
int i = 0;
printf("\t學號\t姓名\t總分\t排名\n");
for (i = 0; i < stu_num; i++)
{
printf("\t%d\t%s\t%d\t%d\n", stu_info[i].no, stu_info[i].name, stu_info[i].core_total, stu_info[i].rank);
}
return 0;
}
int output_class()
{
int i = 0;
int j = 0;
int core = 0;
for (j = 0; j < MAX_CORE_NUM; j++)
{
core = stu_info[class_max_stu[j]].core[j];
printf("課程%d最高分:%d\n", j+1, core);
printf("\t學號\t姓名\n");
for (i = 0; i < stu_num; i++)
{
if (stu_info[i].core[j] == core)
{
printf("\t%d\t%s\n", stu_info[i].no, stu_info[i].name);
}
}
}
for (j = 0; j < MAX_CORE_NUM; j++)
{
core = stu_info[class_min_stu[j]].core[j];
printf("課程%d最低分:%d\n", j+1, core);
printf("\t學號\t姓名\n");
for (i = 0; i < stu_num; i++)
{
if (stu_info[i].core[j] == core)
{
printf("\t%d\t%s\n", stu_info[i].no, stu_info[i].name);
}
}
}
return 0;
}
void main()
{
input_stu_info();
save_stu_info();
cal_rank();
output_total();
output_class();
return;
}
㈦ C語言程序設計 班級學生成績管理系統
設計課題一:班級成績管理系統
一、 問題描述:
對一個有N個學生的班級,每個學生有M門課程。該系統實現對班級成績的錄入、顯示、修改、排序、保存等操作的管理。
二、功能要求:
1、本系統採用一個結構體數組,每個數據的結構應當包括:學號、姓名、M門課程名稱。
2、本系統顯示這樣的菜單:
請選擇系統功能項:
a、 成績錄入
b、 成績顯示
c、 成績保存
d、 成績排序
e、 成績修改(要求先輸入密碼)
f、 成績統計
(1) 顯示每門課程成績最高的學生的基本信息
(2) 顯示每門課程的平均成績
(3) 顯示超過某門課程平均成績的學生人數
g、 退出系統
3、執行一個具體的功能之後,程序將重新顯示菜單。
4、將學生成績保存到文件中。
三、演算法提示:
1、數據結構:結構體類型數組。
2、資料庫結構:下表構成該系統的基本資料庫。
姓名 學號 課程名稱1 課程名稱2 ●●●●●●
char Char float float
四、測試數據:
學生人數N=10
課程門數M=4
課程名:數學、語文、英語、政治
五、其它
對該系統有興趣的同學可以在實現上述基本功能後,完善系統的其它功能。
問題補充:
今天誰能給我答案啊!!!!!!!急急!!!!!!!
提問者: 342123465 - 一級
最佳答案
C語言課程設計報告—班級成績管理系統
需要分析:
學生成績管理系統有13種功能。把這13個功能做成13個子函數。在主函當數中設計一個菜單對這13個子數進行管理。來實現對整個系統的操作。
根據課題的要求。每一個學生的包括姓名(char)、學號(char)、M門課程的成績(float).再加上系統功能上的要求每一學生的信息還要總分和名次等。所以自然的想到要用結構體來定義每一個學生的信息結構。然後用鏈表把它們組成一個有序的整體。用對鏈表的操作來實現對所有學生信息的統一管理(成績顯示、成績排序、成績修改等)。最後為了以後按照處理後的順序保存到文件中。
. 各函數的功能:
概要設計:
程序的模塊組成:
主 函 數: int main()
新建函數:STUDENT *init()
輸入函數 :STUDENT *create()
顯示函數: void print(STUDENT *head)
刪除函數: STUDENT *delete(STUDENT *head)
按名字尋找函數: void lookup(STUDENT *head)
保存函數: void save(STUDENT *head)
按總分排序函數: STUDENT *sort(STUDENT *head)
計算總分和均分函數: void computer(STUDENT *h)
修改函數: STUDENT *Modify(STUDENT *head,STUDENT *new)
按學號排序函數: STUDENT *index(STUDENT *h)
菜單函數:int menu_select()
各個函數的主要功能:
輸入函數: 隨時輸入數據。
菜單函數:顯示系統主菜單。
顯示函數: 顯示所有學生的信息。
尋找函數: 方便學生查找自己的成績。
刪除函數: 刪除某學生的信息。
排序函數: 按總成績排序。
按學號排序函數: 按學號排序。
插入函數: 可以插入新的信息。
保存函數: 保存好學生成績,以免丟失。
統計函數:
l 顯示每門課程成績最高的學生的基本信息。
l 顯示每門課程的平均成績。
l 顯示超過某門課程平均成績的學生人數。
課題的功能模塊的劃分:
開始
菜單界面
功能選擇
初始化函數
輸入學生信息
刪除學生信息
顯示學生信息
查找學生信息
按成績排序
保存到文件
從文件讀數據
插入學生成績
分類合計
退出系統
結束
詳細設計: 整個系統除了主函數外,另外還有14個函數,實現八大功能:輸入功能、顯示功能、查找功能、排序功能、插入功能、保存功能、讀取功能。各個函數的詳細設計說明分別如下:
主函數 main()
利用無限次循環for(;;)和swithch()實現各函數的調用,系統根據輸入的數字選項來調用相應的函數。
菜單選擇函數 int menu_select()
這是一個無參函數,主要實現「功能選擇」的界面,在這個界面里有顯示系統的九大功能,根據每個功能前面的序號進行選擇。等執行完每一個函數功能後,返回菜單。
代碼設計: 初始化函數 STUDENT *init()
這是一個無參函數,裡面只有兩個語句,它的作用是使鏈表初始化,使head的值為NULL和一個清屏語句。比如:沒有這個函數的話,在你沒有輸入任何數據的情況下,去執行顯示功能的時候會顯示一些亂碼!
輸入記錄函數 STUDENT *create() 這是一個無參函數,用來執行學生成績記錄的輸入,當學生為@時停止輸入,函數結束後,帶回一個鏈表頭的指針指向一下個學生的信息插在表頭。
N-S流程圖如下:
head=NULL無條件循環
指針p指向新開辟的單元
指針p是否為空
是 否
輸入學號p->num
輸出 p->num是否為@
內存 是 否
溢出 輸入姓名p->name
停止 for(i=0;i<3;i++)
輸入 輸入成績
返回 p->sum=s;
菜單 p->average=(float)s/3;
顯示記錄函數 void print(STUDENT *head)
這是一個不返回值的有參函數,形參為「鏈表頭的指針」,負責對全部學生成績記錄的輸出,不足之處就是不能對學生成績進行分頁顯示。
演算法:先將p結點的指針指向第一個結點,將p結點(即第一個結點)的數據輸出。然後再將p結點的指針指向p指針的的指針(即下一結點),將p結點(即第一結點)的數據輸出。重復執行此步聚直到p指針指向NULL為止。
N-S流程圖如下:
p=head,使指向第一個結點
輸出p所指向的結點
p指向一下個結點
當p指的不是表尾
程序調試:
由於本課題中的許多知識點都沒有學過都要靠自己到課外的資料中去查找。在用的時候難免出現這樣那樣的錯誤。如開始設計出來的菜單不是預想的那樣,而是總個窗中出現混亂。解決的這個問題的辦法是調整。最後還是老師幫我幫我們找到了問題的所在——for 循環的次超過了鏈表中結點的數量。再就是自定義函數時由於課本的概念不清楚,多寫了空格鍵,以至函數調用不出來。又如:在設計修改學生信息時的密密碼時。當用戶發現輸入密碼錯誤按了退格鍵後,因為「*」並沒有消去。導致用戶再次按退格鍵,又出現前面的情況。最終導致輸入密碼錯誤。所以用了兩次退格鍵:
在對鏈表操作時,要特別鏈表指針的移動(p=p->next)和鏈表尾的判斷 (p= =NULL)。沒有指針的移動,就很容易出現死循環。而在運行過程中不能控制。所以你就會認為是死機。如果沒有鏈表尾的判斷。就會在運行過程出現想不到的錯誤。如:在顯示鏈表信息時,後面就會出現亂碼。
一個系統的菜單和提示信息非常重要。如果沒有這些用戶根本不知道怎麼用你設計的這個系統。在設計的調試過程中也無法順利的完成調試工作。有了一個清晰簡單的菜單和一些提示信息這後,調試過程完成的非常順利。
予我耐心解答的老師和同學,是他們為我小程序的成功起到了關鍵性的作用,那麼多個日夜,如此多的困難,同學們勤懇塌實,從開始到結束,沒有顯出一點倦意,始終熱情高漲,我感謝這種氛圍,感謝學校提供的良好條件。
回顧起此次課程設計,至今我仍感慨頗多,的確,從拿到題目到完成整個編程,從理論到實踐,在整整半個學期的日子裡,可以學到很多很多的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固,比如說結構體……通過這次課程設計之後,一定把以前所學過的知識重新溫故。
本次課程設計結束了,對於我的影響很大。我通過這次實踐學到了許多知識。學到了設計一個簡單的系統。要注意哪些方面。也使我知道自己哪些方面做得還不夠。
但我出總結出了一點點的經驗如下:
1、要對系統的功能和要求做出詳細的分析,並合理分解任務。
2、把分解出來的子任務,做給一個相對獨立的模塊。
3、在設計一個模塊之前,要簡單構想一下總界面的顯視情況。
4、針對構想出來的界面進行程序的編寫。
最後,感謝老師您對我的指導和從百忙中抽空看我的設計,謝謝!
附件:
源程序:
#include "stdio.h" /*I/O函數*/
#include "stdlib.h" /*其它說明*/
#include "string.h" /*字元串函數*/
#include "conio.h" /*屏幕操作函數*/
#include "mem.h" /*內存操作函數*/
#include "ctype.h" /*字元操作函數*/
#include "alloc.h" /*動態地址分配函數*/
#include "dos.h"
#define N 4 /*定義常數*/
typedef struct z1 /*定義數據結構*/
{
char no[12];
char name[20];
int score[N];
float sum;
float average;
int order;
struct z1 *next;
}STUDENT;
/*以下是函數原型*/
STUDENT *init(); /*初始化函數*/
STUDENT *create(); /*創建鏈表*/
STUDENT *delete(STUDENT *h); /*刪除記錄*/
void print(STUDENT *h); /* 顯示所有記錄*/
void lookup(STUDENT *h); /*查找*/
void save(STUDENT *h); /*保存*/
STUDENT *load(); /*讀入記錄*/
void computer(STUDENT *h); /*計算總分和均分*/
STUDENT *Modify(STUDENT *h); /*修改記錄*/
void append(); /*追加記錄*/
STUDENT *sort(STUDENT *h); /*按總分排序*/
STUDENT *index(STUDENT *h); /*按學號排序*/
int menu_select(); /*菜單函數*/
/******主函數開始*******/
main()
{
int i;
STUDENT *head; /*鏈表定義頭指針*/
printf("\n\n\n\n\n\n\n\n\n");
printf(" * * ******* * ***** ***** * * ******* \n");
printf(" * * * * * * * ** * * * \n");
printf(" * * * * ******* * * * * * *** * ******* \n" );
printf(" * * * * * * * * * * * * * \n");
printf(" * * ******* ******* ***** * *** * * * ******* \n");
printf("\n");
printf("\n");
printf("\n");
sleep(2);
head=init(); /*初始化鏈表*/
clrscr(); /*清屏*/
for(;;) /*無限循環*/
{
switch(menu_select()) /*調用主菜單函數,返回值整數作開關語句的條件*/
{ /*值不同,執行的函數不同,break 不能省略*/
case 0:head=init();break; /*執行初始化*/
case 1:head=create();break; /*創建鏈表*/
case 2:print(head);break; /*顯示全部記錄*/
case 3:head=delete(head);break; /*刪除記錄*/
case 4:lookup(head);break; /*按名字查找記錄*/
case 5:save(head);break; /*保存文件*/
case 6:head=load(); break; /*讀文件*/
case 7:computer(head);break; /*計算總分和均分*/
case 8:head=Modify(head); break; /*修改記錄,一般會插在表尾*/
case 9:head=sort(head);break; /*按部分排序*/
case 10:append();break; /*追加記錄*/
case 11:head=index(head);break; /*按學號排序*/
case 12: exit(0); /*如菜單返回值為12程序結束*/
}
}
}
/*菜單函數,返回值為整數*/
menu_select()
{
char *menu[]={"***************MENU***************", /*定義菜單字元串數組*/
" 00. init list", /*初始化*/
" 01. Enter list", /*輸入記錄*/
" 02. print list ", /*顯示單鏈表中所有記錄*/
" 03. Delete a record from list", /*從表中刪除記錄*/
" 04. Search record on name", /*按照姓名查找記錄*/
" 05. Save the file", /*將單鏈表中記錄保存到文件中*/
" 06. Load the file", /*從文件中讀入記錄*/
" 07. compute the score", /*計算所有學生的總分和均分*/
" 08. Modify an information ", /*修改某學號的信息*/
" 09. sort to make new file", /*排序*/
" 10. append record to file", /*追加記錄到文件中*/
" 11. index on nomber", /*按學號排序*/
" 12. Quit"}; /*退出*/
char s[3]; /*以字元形式保存選擇號*/
int c,i; /*定義整形變數*/
gotoxy(1,1); /*移動游標*/
textcolor(YELLOW); /*設置文本顯示顏色為黃色*/
textbackground(BLUE); /*設置背景顏色為藍色*/
gotoxy(10,2); /*移動游標*/
putch(0xc9); /*輸出左上角邊框┏*/
for(i=1;i<44;i++)
putch(0xcd); /*輸出上邊框水平線*/
putch(0xbb); /*輸出右上角邊框 ┓*/
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba); /*輸出左垂直線*/
gotoxy(54,i);putch(0xba); /*輸出右垂直線*/
}
gotoxy(10,20);putch(0xc8); /*輸出左上角邊框┗*/
for(i=1;i<44;i++)
putch(0xcd); /*輸出下邊框水平線*/
putch(0xbc); /*輸出右下角邊框┛*/
window(11,3,53,19); /* 製作顯示菜單的窗口,大小根據菜單條數設計*/
clrscr(); /*清屏*/
for(i=0;i<16;i++) /*輸出主菜單數組*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK); /*設置背景顏色為黑色*/
window(1,1,80,25); /*恢復原窗口大小*/
gotoxy(10,21); /*移動游標*/
do{printf("\n make by wenwei");
printf("\n Enter you choice(0~13):"); /*在菜單窗口外顯示提示信息*/
scanf("%s",s); /*輸入選擇項*/
c=atoi(s); /*將輸入的字元串轉化為整形數*/
}while(c<0||c>14); /*選擇項不在0~14之間重輸*/
return c; /*返回選擇項,主程序根據該數調用相應的函數*/
}
STUDENT *init()
{ clrscr();
return NULL;
}
/*創建鏈表*/
STUDENT *create()
{
int i; int s;
STUDENT *h=NULL,*info; /* STUDENT指向結構體的指針*/
clrscr();
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申請空間*/
if(!info) /*如果指針info為空*/
{
printf("\nout of memory"); /*輸出內存溢出*/
return NULL; /*返回空指針*/
}
inputs("enter no:",info->no,11); /*輸入學號並校驗*/
if(info->no[0]=='@') { clrscr();break; } /*如果學號首字元為@則結束輸入,清屏後返回*/
inputs("enter name:",info->name,15); /*輸入姓名,並進行校驗*/
printf("please input %d score \n",N); /*提示開始輸入成績*/
s=0; /*計算每個學生的總分,初值為0*/
for(i=0;i<N;i++) /*N門課程循環N次*/
{
do{
printf("score%d:",i+1); /*提示輸入第幾門課程*/
scanf("%d",&info->score[i]); /*輸入成績*/
if(info->score[i]>100||info->score[i]<0) /*確保成績在0~100之間*/
printf("bad data,repeat input\n"); /*出錯提示信息*/
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i]; /*累加各門課程成績*/
}
info->sum=s; /*將總分保存*/
info->average=(float)s/N; /*求出平均值*/
info->order=0; /*未排序前此值為0*/
info->next=h; /*將頭結點做為新輸入結點的後繼結點*/
h=info; /*新輸入結點為新的頭結點*/
clrscr();
}
return(h); /*返回頭指針*/
}
/*輸入字元串,並進行長度驗證*/
inputs(char *prompt, char *s, int count)
{
char p[255];
do{
printf(prompt); /*顯示提示信息*/
scanf("%s",p); /*輸入字元串*/
if(strlen(p)>count)printf("\n too long! \n"); /*進行長度校驗,超過count值重輸入*/
}while(strlen(p)>count);
strcpy(s,p); /*將輸入的字元串拷貝到字元串s中*/
}
/*輸出鏈表中結點信息*/
void print(STUDENT *h)
{
int i=0; /* 統計記錄條數*/
STUDENT *p; /*移動指針*/
clrscr(); /*清屏*/
p=h; /*初值為頭指針*/
printf("\n\n\n*********************************STUDENT************************************\n");
printf("|rec|nO | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");
printf("|---|----------|---------------|----|----|----|----|--------|--------|-----|\n");
while(p!=NULL) /*只要p不是尾結點,就輸出記錄*/
{
i++;
printf("|%3d|%-10s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6.2f | %3d |\n", i, p->no,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->sum,p->average,p->order);
p=p->next;
}
printf("***********************************end**************************************\n");
getch(); /*輸入任一鍵返回主菜單*/
clrscr(); /*清屏*/
}
/*刪除記錄*/
STUDENT *delete(STUDENT *h)
{
STUDENT *p,*q; /*p為查找到要刪除的結點指針,q為其前驅指針*/
char s[12]; /*存放學號*/
char *pass="wenwei28";
char a[20],b=NULL;
int i=0;
clrscr();
printf("Input your password:");
while((i<20)&&(b!='\r'))
{ b=getch(); /*無回顯輸入*/
if(b==8)
{ if(i>0)
{a[--i]=NULL;
putchar(8); /*退格鍵*/
putchar(' '); /*以空格代替*/
putchar(8);
}
else putchar(7); /*沒有任何字元的退格,響鈴警告*/
}
else if(b!='\r')
{ a[i++]=b; /*只要不是退格和回車就接受*/
putchar('*');
}
else
{a[i]=NULL; break; /*密碼輸入完了,記得加個NULL到後面*/
}
}
if(strcmp(a,pass)!=0)
{clrscr();
printf("Password is mistake Tow seconds to return!");
sleep(2);clrscr();return h;
}
else {printf("Password is OK! Welcome to come!"); sleep(3);
}
clrscr(); /*清屏*/
printf("please deleted no\n"); /*顯示提示信息*/
scanf("%s",s); /*輸入要刪除記錄的學號*/
q=p=h; /*給q和p賦初值頭指針*/
while(strcmp(p->no,s)&&p!=NULL) /*當記錄的學號不是要找的,或指針不為空時*/
{
q=p; /*將p指針值賦給q作為p的前驅指針*/
p=p->next; /*將p指針指向下一條記錄*/
}
if(p==NULL) /*如果p為空,說明鏈表中沒有該結點*/
{ printf("\nlist no %s student\n",s);sleep(2);clrscr();return h;}
else /*p不為空,顯示找到的記錄信息*/
{
printf("*********************************have found********************************\n");
printf("|no | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");
printf("|------------|---------------|----|----|----|----|--------|--------|-----|\n");
printf("|%-12s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6-5.2f | %3d |\n", p->no,
p->name,p->score[0],p->score[1],p->score[ q=p; /*保存當前結點的指針,作為下一結點的前驅*/
p=p->next; /*指針後移,新讀入數據鏈到當前表尾*/
}
q->next=NULL; /*最後一個結點的後繼指針為空*/
fclose(fp); /*關閉文件*/
printf("---You have success read data from file!!!---\n");
getch(); /*按任意鍵返回主菜單*/
clrscr();
return h; /*返回頭指針*/
}
/*成績統計*/
void computer(STUDENT *h)
{
STUDENT *p,*t,*q; /*定義移動指針*/
float saverage[N]={0}; /*均分初值為0*/
int i;
clrscr();
for (i=0;i<N;i++)
{ int n=0,j=0; /*保存記錄條數初值為0*/
long s=0; /*總分初值為0*/
p=h; /*從頭指針開始*/
while(p!=NULL) /*當p不為空時處理*/
{
s+=p->score[i]; /*累加總分*/
j++; /*統計記錄條數*/
p=p->next; /*指針後移*/
h; /*返回頭指針
}
㈧ c語言課程設計學生成績管理系統
我有類似的學生管理系統,而且功能比你說的還完善!我c語言課程設計的作品
㈨ C語言程序設計學生成績查詢系統
#include"stdio.h"
#include"string.h"
#define
N
1000
void
menu();
int
password();
int
de();
int
uninque(struct
STUDENT
shu[],int
len,int
xuehao);
void
shuchu(struct
STUDENT
shu[],int
len);
void
send(struct
STUDENT
shu[],int
len);
int
readFromFile(struct
STUDENT
shu[]);
void
chaxun(struct
STUDENT
shu[],int
len);
void
paixu(struct
STUDENT
shu[],int
len);
struct
STUDENT
{
int
num;
char
name[10];
int
score;
}
shu[N];
main()
{
int
len=0,key,choice;
do
{
key=password();
}while(key==0);
while(1)
{
menu();
printf("請輸入選項<1,2,3,4,5,6,7>\n");
scanf("%d",&choice);
switch(choice)
{
case
1:printf("輸入信息函數\n");
len=de(shu,len);
break;
case
2:printf("輸出函數被調用\n");
shuchu(shu,len);
break;
case
3:printf("保存到文件函數被調用\n");
send(shu,len);
break;
case
4:printf("從文件讀函數被調用\n");
len=readFromFile(
shu);
break;
case
5:printf("按學號查詢函數被調用\n");
chaxun(shu,len);
break;
case
6:printf("按成績排序函數被調用\n");
paixu(shu,len);
break
;
case
7:exit(0);break;
}
}
}
void
menu()
{
printf("\n");
printf("
*******************************************\n");
printf("
*
學生成績管理系統2.0
*\n");
printf("
*
1.輸入信息
*\n");
printf("
*
2.輸出信息
*\n");
printf("
*
3.保存到文件
*\n");
printf("
*
4.從文件讀
*\n");
printf("
*
5.按學號查詢
*\n");
printf("
*
6.按成績排序(由大到小)
*\n");
printf("
*
7.程序結束
*\n");
printf("
*******************************************\n");
}
int
password()
{
char
a[100];
char
key[]="asd";
printf("請輸入密碼\n");
scanf("%s",&a);
if(strcmp(a,key)==0)
return
1;
else
return
0;
}
int
de(struct
STUDENT
shu[],int
len)
{
int
i=len;
int
flag=0;
int
xuehao,bank,chengji;
while(i<N)
{
while(1)
{
printf("學號");
scanf("%d",&xuehao);
if(xuehao==0)
{
flag=1;
break;
}
bank=uninque(shu,i,xuehao);
if(bank==0)
{
shu[i].num=xuehao;
break;}
}
if(flag==1)
break;
printf("姓名");
scanf("%s",&shu[i].name);
while
(1)
{
printf("成績");
if(scanf("%d",&chengji)==1)
{break;}
printf("輸入格式錯誤,請重新輸入!");
while(getchar()!='\n')
continue;
}
while(getchar()!='\n')
continue;
shu[i].score=chengji;
i++;
}
return
i;
}
int
uninque(struct
STUDENT
shu[],int
len,int
xuehao)
{
int
i;
int
bank=0;
for
(i=0;i<len;i++)
{
if(xuehao==shu[i].num)
bank=1;
}
return
bank;
}
void
shuchu(struct
STUDENT
shu[],int
len)
{
int
i;
printf("%-4s
%-10s
%-3s","學號","姓名","成績\n\n");
for(i=0;i<len;i++)
{
printf("%-4d
%-10s
%-3d",shu[i].num,shu[i].name,shu[i].score);
printf("\n");
}
printf("\n\n");
}
void
send(struct
STUDENT
shu[],int
len)
{
int
i;
FILE
*fp;
fp=fopen("d:\\chegnji.txt","wb");
if(fp==NULL)
{
printf("打開文件出錯!\n");
exit(0);
}
for(i=0;i<len;i++)
fwrite(shu+i,sizeof(struct
STUDENT),1,fp);
fclose(fp);
}
int
readFromFile(struct
STUDENT
shu[])
{
FILE
*fp=NULL;
int
i=0;
fp=fopen("d:\\chegnji.txt","rb");
if(fp!=NULL)
{
printf("%-4s
%-10s
%-3s","學號","姓名","成績\n\n");
while(!feof(fp))
{
if(i>=N)
break;
if(fread(shu+i,sizeof(struct
STUDENT),1,fp))
printf("%-4d
%-10s
%-3d",shu[i].num,shu[i].name,shu[i].score);
printf("\n");
i++;
}
fclose(fp);
}
i=i-1;
return
i;
}
void
chaxun(struct
STUDENT
shu[],int
len)
{
int
i,nue,b=0;
while(1)
{printf("input
the
student
number
(input'0'
close)
");
scanf("%d",&nue);
b=0;
if(nue==0)
break;
for
(i=0;i<len;i++)
{
if(nue==shu[i].num)
{
printf("%-4s
%-10s
%-3s","學號","姓名","成績\n\n");
printf("%-4d
%-10s
%-3d\n",shu[i].num,shu[i].name,shu[i].score);
b=1;
}
}
if(b==0)
printf("The
number
is
not
exist!\n");
}
}
void
paixu(struct
STUDENT
shu[],int
len)
{
int
i,j;
struct
STUDENT
temp;
printf("%-4s
%-10s
%-3s","學號","姓名","成績\n\n");
for(i=0;i<len;i++)
{
for(j=i;j<len;j++)
{
if(shu[j].score>shu[i].score)
{
temp=shu[j];
shu[j]=shu[i];
shu[i]=temp;
}
}
printf("%-4d
%-10s
%-3d\n",shu[i].num,shu[i].name,shu[i].score);
}
}
㈩ C語言程序設計 學生成績管理信息系統
我還有代碼呢,要的話,馬上帖出來..給個紅棋吧,呵呵
一、 課題設計名稱
學生成績管理信息系統分析設計
二、 課題設計目的
通過本次課程的設計,加深對信息系統基礎理論和基本知識的理解,掌握使用信息系統分析、設計的基本方法,提高解決實際管理問題、開發信息系統的實踐能力。
三、 任務要求:
用信息系統開發工具(例如Visual Foxpro、Visual Basic、Delphi等)開發一個實用的中小型管理信息系統。
1、根據課程設計時間選擇適當規模大小的設計課題。
2、根據合理的進度安排,按照系統開發的流程及方法,踏實地開展課程設計活動。
3、課程設計過程中,根據選題的具體需求,在開發各環節中撰寫相關的技術文檔(小組各成員可分別完成某階段的技術文檔),最後要求提交詳細的課程設計報告。
4、開發出可以運行的管理信息系統,通過上機檢查。
四、 課題設計報告書要求:
1、 課題設計報告書第一頁為封面,封面上寫清楚標題、班級、姓名、指導老師、完成日期,格式自己設計。
2、 課題設計報告書第二頁為本任務書。
3、 課題設計報告書第三頁為教師評語。
4、 課題設計報告書第四頁為目錄。
5、 課題設計報告書第五頁開始為具體內容:
(1)可行性分析
(2)系統分析部分
1)業務流程圖
2)數據流程圖
3)功能分析圖
4)數據字典
5)數據加工處理的描述
6)管理信息系統流程設想圖(新系統模型)
(3)系統設計部分
1)功能結構圖設計
2)新系統信息處理流程設計
3)輸出設計(主要指列印輸出設計)
4)存儲文件格式設計(資料庫結構設計)
5)輸入設計(主要指數據錄入卡設計)
6)代碼設計(職工證號和部門代號等)
7)程序設計說明書
(4)附錄或參考資料
6、課題設計報告書最後一頁是本次課程設計的小節和參考文獻。
7、字數要求不少於4000字。
8、列印紙張使用B5紙,頁邊距設為上、下、左2厘米,右1.5厘米,
五、 如有雷同,將作不及格處理。
六、 完成時間:2007.1.5
計算機二系
尚晉
2007.10.28
教師評語
評分模塊 評分標准及分值 得分
平時成績(20分) 1. 態度(10分)
2. 考勤(10分)
分析與設計部分
(65分) 3. 需求分析(5分)
4. 系統復雜度(5分)
系統分析部分(20分) 5. 業務流程圖(5分)
6. 數據流程圖(5分)
7. 功能分析圖(3分)
8. 數據字典(7分)
系統設計部分
(35分) 9. 系統配置方案設計(5分)
10. 用戶界面導航圖(5分)
11. 界面設計(5分)
12. 有效性驗證(5分)
13. 錯誤處理(5分)
14. 編碼設計(5分)
15. 資料庫設計(5分)
報告部分(10分) 16. 條理清晰、語言精練准確(5分)
17. 描述圖形工具使用恰當(5分)
組長加分(5分) 18. 組織得力,合作完成情況好(5分)
總分(100分)
成績:
學生成績管理信息系統
1. 系統規劃
1.1項目開發的背景
伴隨著信息社會的到來,信息的極大豐富必然要求人們適應信息社會,信息和材料、能源一樣成為一種社會的基本生產資料,在人類的社會生產活動中發揮著重要的作用,其中最重要的前提就是充分利用人們的才智和學習能力。傳統的教學只教會了學生相關的知識,沒有教會學生如何利用這些知識,以及再學習的能力。特別對於「管理信息系統」這類實用性比較強的課程,更需要培養學生的實際動手能力。.教與學互動與結合,強調應用,不僅讓學生了解課程上講授的管理信息系統方法和原理,而且讓學生們利用這些知識解決實際問題。這對學生的實際工作能力是一個很好的鍛煉。密切結合學生獨立完成的系統開發作業,通過指導教師的點評,使學生能夠在較短的時間內,通過實踐,真正掌所學的知識。同時人們對信息和數據的利用與處理也已經進入了自動化、網路化和社會化的階段,因此,開發相關的管理信息系統已經成為各行各業的必要和必需了,管理信息系統作為一門邊緣學科,集管理科學、信息科學、系統科學、現代通信技術和電子計算機技術於一體,可以解決企業或組織所面臨的問題,對於成績管理員的勞動強度、提高工作質量和效率;方便管理人員對信息的查詢、提高信息資源的利用效率和管理水平都具有重要意義。
1.2 可行性分析
基於以上對問題的調查和分析,利用計算機給我們提供的信息,及時地了解學生的信息,並且形成一整套動態的管理就十分必要了。本系統開發的主要目的是對學生信息和成績的實現計算機管理。學生管理系統的建立,是在進行對大量用戶需求與調查分析得到的。
(1)技術可行性
成績管理系統主要是用於計算機教育部關於教學計劃、課程、教師信息、成績的查詢和管理。通過使用Microsoft公司提供的Visual FoxPro 6.0工具以及SQL Server資料庫可以實現對有關課的教學計劃、課程等的網上查詢和管理,主要目的是對學生成績實現計算機管理。
(2)經濟可行性
開發學生成績管理系統費用較底,可利用現有的微機設備,經濟上是可行的,非常適合於成績管理,因為該系統實現了將管理和查詢網路
化,極大地方便了管理員、教師、學生。
(3)操作可行性
本系統的界面設計簡單直觀,易於理解。它使用的控制項都是用戶常用的或常見的,操作起來很容易上手。不需要特別的培訓和講解,用戶便能使用該系統。
(4)組織與管理可行性
成績管理員是對學生的成績進行管理的,但過去由於採用人工方法進行管理,工作效率低,勞動強度大,所以他們希望採用計算機管理,將已有的管理經驗轉化到管理軟體中。這就使得系統調查、需求分析能夠得到有關人員的大力支持和積極配合。
1.3 制定系統開發計劃
開發學生成績管理系統的計劃見表1-1
表1-1 實驗小學學生成績管理系統開發簡略計劃表
序號 項目內容 時間進度 項目負責人
1 系統規劃和可行性分析 2007年12月 向萬秀
2 系統分析 2007年12月 張春先、向萬秀、刁勝
3 系統設計 2007年12月 向萬秀、張春先
4 系統實施與測試 2007年12月 向萬秀
5 系統評價與維護 2007年12月 張春先
6 安全保障措施 2007年12月 向萬秀、張春先
2系統分析
1現行系統業務流程的調查
對某學校進行實地調查,其現行的成績管理工作都是採用傳統的手工管理,經過對成績管理員、學生和教師的全面的調查研究,手工工作效率低,工作質量差,不適合現在學校成績管理系統的需求,所以需要改進傳統的成績管理模式。實現科學化管理。
對現行系統的調查業務流程圖如下圖1-1所示:
學生
1-1 業務流程圖
2 需求分析
(1) 功能描述
本系統包括用戶管理、學生注冊、班級信息錄入、學生信息錄入、班級課程錄入、學校專業信息錄入、課程信息錄入、學生成績錄入、教師信息錄入、各方面的查詢等等。
1.教學管理功能
① 新本學期所開設課程的錄入與查詢:例如在2006年上學期開設課程:C語言與經濟數學。
說明:所有的課程成績均由三部分組成:平時成績,上機成績, 筆試成績。所佔的比重分別為:30%,10%,60%,在該系統中這三部分及其比重是固定不變的。
② 對各系科的課程安排的錄入與查詢,課程安排即是該學期每個學科
的選課課程、任課教師以及上課時間和上課地點。
說明:每一個院系中所有的不同專業所選的課程都是一樣的。但是同一院系的學生不一定有同一個教師授課。
(2).成績管理的功能(教師使用)如下:
① 錄入成績:既可以單個錄入也可以批量錄入,其中批量錄入以成績單單位,每次從系統中調出一張成績單,編輯完成後一次性提交。
成績單:成績單包括學期、院系、專業、課程、任課教師、學生成績。
② 查詢成績:單個查詢(學生可使用),根據學生的學號或姓名查詢出該學生的所有課程的成績信息。批量查詢以成績單為單位,每次查詢出一張成績單。
③ 列印成績:可以一次列印一張成績單,也可以按要求批量列印。
④ 統計調整:對成績單中的成績進行統計,指出各個分數段的人數分布情況。因為有時學生的成績整體上偏低,需要進行調整,一次系統可以按照用戶設置的規則對成績單中的成績進行調整。
成績調整規則:將成績單中總分在某一分數段的學生成績調整到另外一個分數段。例如將50到60分的學生成績全部調整到60到65分之間。為了使調整過程盡可能合理,還可以對待調整分數段的學生成績進行限制,例如設置其筆試成績必須在50分以上,而平時成績則可以適當放寬。
⑤ 每學期考試不及各的學生自動納入新學期的跟考或輔修教學計劃中。
(3).許可權說明:
① 管理員可使用功能:教師信息管理、系科顯示、課程管理、教學計劃管理、學生成績查詢;
② 教師可使用成績管理各項功能:對學生成績的添、刪除、修改、查詢、分析、調整;
③ 學生可使用的功能:查詢單個學生所有成績,班級成績,學生平均成績,最高分,最低分等。
為學校教師和學生提供快捷的查詢手段,讓老師和學生能夠及時查詢學生成績信息,更快而又方便的進行查詢。
(4).性能要求
本系統採用計算機對學生成績進行管理,進一步提高辦學效益和現代化水平。幫助廣大教師提高工作效率,實現學生成績信息管理工作流程的系統化、規范化和自動化。如果本系統能被學校所採用,將會改變以前靠手工管理學生成績的狀況,可以樹立良好的辦學形象,提高工作效率。由於現在實行九年義務教育,學校學生不斷增加,該系統可高效的進行大規模的查詢。系統的安全保密性高,能防止非法訪問。
3新系統的邏輯模型的建立
(1) 新開發的學生成績管理系統的功能分析
在學生成績管理信息系統中,主要有三類外部實體:學生、教師、教務處工作人員。學生成績管理信息系統的大部分功能是為教務處工作人員設置的。經調查分析,新開發飛的學生成績管理信息系統應具有以下的功能。
(1.1) 查詢學生的基本信息和成績信息,包括學生信息的添加、修改、刪除等。
(1.2) 管理學生成績,包括考試管理,成績管理等。
(1.3) 成績的處理,即統計成績、分析成績等。
(2) 繪制數據流圖
繪制數據流圖時,只考慮學生和教務處兩個外部實體,頂層數據流圖如圖1-2所示。
學生成績錄入 教師課程信息
學生成績單
學生登錄信息
學生選課信息 輔修/跟考通知單
用戶名、密碼 部門信息
課程類型 學生成績信息
課程信息 學生考試信息
圖1-2 頂層數據流圖
0層數據流如圖1-3所示。由於1層圖沒有完整繪制,0層圖中只屬於一個加工的文件(例如許可權表)也在0層圖上出現。
0層數據流圖通過反應整個系統中不同數據流向,來揭示系統的組成結構以及各組成部門之間的關系,這種關系主要體現在對數據的操作和處理上。
用戶名、密碼
學生信息
部門信息
學生成績
學生信息
學生成績單
成績類型 輔修/跟考通知
學生成績 不及格成績
缺考
圖1-3 0層數據流圖
學生信息數據流程圖如圖1-4、1-5所示。
學生信息 審查1.1 合格單 是否新生1.2 新生信息
學生紀錄
學生成績
總學生紀錄表及成績
圖1-4 1層數據流圖
(3) 數據字典
數據字典是進行數據收集和數據分析所獲得的主要成果,是系統中各類數據描述的集合。數據字典通常包括數據項、數據流、數據存儲、處理邏輯。
數據項
名稱:學生信息
別名:學生信息
說明:學生信息=學生基本信息+學生記錄+學生成績記錄
類型:字元型
長度:12
取值范圍:0000000000001~99999999999
數據流條目:
合格單=姓名+系別+班級+專業
新生信息=入學時間+姓名+性別+年齡+專業+系別+班級
加工條目:
加工名:審查
編號:1.1
輸入:學生信息
輸出:合格單
加工邏輯:根據學生信息判斷是否是新生
加工邏輯
加工邏輯
加工名:是否是新生
編號:1.2
輸入:合格單
輸出:新生信息
加工邏輯:根據合格單建立新生信息
加工名:錄入、存儲學生信息、各科成績
編號:1。3
輸入:新生信息、考試成績
輸出:本次考試成績
2層數據流圖
學號、課程號 有效查詢 成績
考試成績 成績單
學生紀錄 班級 統計成績
各科
本次成績 升留級名單 學生紀錄
成績標准
圖1-5 2 層數據流圖
數據字典:
數據項
名稱:學號、課程號
別名:編號
說明:惟一標識一個學生編號
類型:字元型
長度:12
取值范圍:0000000000001~9999999999999
數據存儲文件
數據存儲條目:
數據存儲名稱:考試成績
組成:姓名+班級+專業+系別+成績+學號
組織方式:索引文件,以學號為關鍵字
加工處理
加工邏輯
加工名:有效性檢查
編號:2。1
輸入信息:學號、課程號
輸出信息:有效查詢
加工邏輯:根據所輸入的信息來檢查有效性
加工名:查詢成績
編號:2。2
輸入信息:考試成績
輸出信息:成績
加工邏輯:根據考試成績查詢成績
加工條目:
加工名:統計選擇
編號:3。1
輸入信息:學生記錄
輸出信息:按規定統計成績
加工邏輯:根據所輸入學生記錄,按班級、單科統計成績
數據存儲條目:
文件名:成績標准 組成:成績
加工條目:
加工名:是否升級
編號:4。1
輸入信息:本次成績、成績標准
輸出信息:升留級名單
加工邏輯:根據本次成績
IF 大於等於標准成績 ELSE 降級
ENDLF THEN 升級
加工名:更新記錄
編號:4。2
輸入信息:升留級名單
輸出信息:學生記錄
加工邏輯:根據升留級名單修學生記錄
3.系統設計
1. 系統總體結構設計與功能模塊劃分及系統功能描述
本系統的主要任務是實現對學校教導處的學生信息管理、成績管理、課程管理及相關查詢。其主要功能包括:
學生成績管理模塊,學生信息管理模塊、系統模塊等等。
學生信息管理功能
(1)班級管理。提供給班主任進行本班學生的信息更新、刪除。
(2)添加學生。以班級為單位,進行學生入庫。其中分為單個添加和成批添加。單個添加學生供數量較少的學生信息入庫;成批添加可以從現存的學生信息EXCEL文件中成批錄入到資料庫中。
(3)刪除學生。當學生畢業後,學生信息轉移備份資料庫中,系統的基本資料庫中需要刪除學生信息。該功能主要進行成批地刪除學生信息,如連續學號區段的多位學生信息刪除,整個班級的刪除,所有學生信息的刪除。
(4)新生管理。本部分的功能主要有新生導入、分班、及設置學號。新生導入實現從現存的EXCEL新生名單中錄入學生信息。分班功能實現按新生的報考專業、成績及性別進行分班。設置學號實現自動為各班學生編發學號。
學生信息備份。在學生信息刪除前,將其按班級為單位保存到備份資料庫。
(5)學生信息模塊主要包括對學生信息的存儲,審查記錄以及學生對學生整個信息的調查進行分類和查找。可以實現添加、修改、刪除、查詢學生信息管理的調查。
(6)學生基本信息管理功能包括:學生信息、學生記錄、學生成績、總學生記錄表和成績。
(7)學生基本信息包括:學生學號、學生班級號、課程號、學生聯系方式等等
(8)課程管理。提供本學期各年級各專業所開課程名稱的錄入、修改、刪除。它是學生成績管理的基礎。用以保證資料庫中一致性原則。
2.系統功能分析
系統開發的總體任務是實現學生信息關系的系統化,規范化和自動化。
學生基本信息所需要完成的功能主要有:
●學生信息的輸入,包括輸入學生基本信息、所在班級、所學課和 成 績等。
● 學生信息的查詢,包括輸入學生基本信息、所在班級、已學課程和成績 等。
● 學生信息的修改。
● 班級管理信息的輸入、查詢、修改,包括輸入班級設置,年級信息等。
● 基本課程信息的輸入、查詢、修改。
● 學生成績信息的輸入、查詢、修改。
對上述各功能進行集中、分塊、按照結構化程序設計的要求。
2.繪制學生信息管理模塊功能結構圖如圖
圖1-6 學生信息系統管理的功能結構圖
3.系統配置方案設計
鑒於本系統的業務性質,必須選擇具有較高的可靠性、穩定性和必要的容錯能力的計算機硬體和軟體系統,以保證任何情況下都不至於丟失、損壞數據。
必須具有較高的響應速度,以保證各項具體業務的順利進行。
應考慮具有良好的可維護性,可操作性和可擴充性,以保證將來系統規模的擴展和升級的需要。
4.開發與運行環境的使用
開發前台工具:Visual FoxPro 6.0
操作系統對整個網路起著重要的作用,Windows 2000作為一種強健的、多用途的操作系統,不僅能夠運行強有力的客戶/伺服器應用軟體,還可以提供可靠的文件與列印服務,再加其內置的通信與Internet/Internet服務功能,以及安裝、使用、管理和維護的方便性,因此,本系統採用Microsoft Windows 2000Server作為操作系統。
本系統准備採用客戶機/伺服器(C/S)結構模式。C/S結構的最大優勢在於廣泛採用了網路技術,將系統中的各部分任務分配給分布在網路上的擔任不同角色的計算機。把較復雜的計算機管理任務交給伺服器完成。再把一些頻繁與用戶打交道的任務交給客戶機完成。通過這種結構完全實現了網路上信息資源的共享。
開發基於C/S結構的管理系統所用到的開發工具包括前台開發工具和後台資料庫管理系統,主要根據開發者對開發工具的熟悉程度而定。本系統的前端開發工具採用Visual FoxPro 6.0。
5.編碼(Code)設計
6.資料庫設計
(1) 概念結構設計
經過本次實驗,概念結構設計的主要工作是根據用戶需求設計概論性數據模型。概念模型是一個面向問題的模型,它獨立於具體的資料庫管理系統,從用戶的角度看待資料庫,反映用戶的現實環境,與將來資料庫如何實現無關。概念模型設計的典型方法是E-R方法,即用實體—聯系模型表示。
E-R方法使用E-R圖來描述現實世界,E-R圖包含三個基本成分:實體、聯系、屬性。E-R圖直觀易懂,能夠比較准備地反映現實世界的信息聯系,從概念上表示一個資料庫的信息組織情況。
實體:是指客觀世界存在的事物,可以是人或物,也可以是抽象概念。E-R圖中各實體的關系說明如下。
學號記載學生成績管理系統中所登記的一類編號,而所有的學生姓名是所代表的是學生的代碼。中兩個實體之間為一對多關系。
學生可以選擇多門課程,一門課程可以有多個學生選擇。其中本系統中E-R圖包括學生性別、出生日期等等。課程中包括課程號、課程名、教師姓名等等。
M N
學生與課程之間的關系
課程名是惟一的,而選課的學生是多個的,這兩個實體之間為一對一關系。
一個學校有多位老師,這兩個實體之間為一對多關系。
學生與課程表中的同一課程對應多個不同的老師與學生,這兩個實體間為一對多關系。