A. c語言設計學生成績管理系統
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<list>
#include<cstring>
#include<map>
#include<set>
#include<algorithm>
#include<queue>
using namespace std;
int n;
struct birth
{
int year,month,day;
};
struct node
{
int num,old,math,english,computer;
double ave;
char name[20],sex[10];
struct birth days;
}students[100];
double aver(int math,int english,int C)
{
return (math+english+C)/3.0;
}
void save(int n)
{
FILE *fp;
if ((fp=fopen("wade","wb"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
for (int i=0;i<n;i++)
if(fwrite(&students[i], sizeof(struct node),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
void input()
{
for (int i=0;i<n;i++)
{
printf("請輸入該同學的學號\n");
cin>>students[i].num;
printf("請輸入該同學的性別\n");
cin>>students[i].sex;
printf("請輸入該同學的年齡\n");
cin>>students[i].old;
printf("請輸入該同學的出生年\n");
cin>>students[i].days.year;
printf("請輸入該同學的出生月\n");
cin>>students[i].days.month;
printf("請輸入該同學的出生日\n");
cin>>students[i].days.day;
printf("請輸入該同學的數學成績\n");
cin>>students[i].math;
printf("請輸入該同學的英語成績\n");
cin>>students[i].english;
printf("請輸入該同學的C語言成績\n");
cin>>students[i].computer;
students[i].ave=aver(students[i].math,students[i].english,students[i].computer);
}
save(n);
}
void ouput()
{
FILE *fp;
fopen(fp);
for (int i=0;i<n;i++)
{
printf("%s同學的信息如下:\n",students[i].name);
printf("學號:%d\n性別:%s\n年齡:%d\n出生年:%d\n出生月:%d\n出生日:%d\n數學成績:%d\n英語成績:%d\nC語言成績:%d\n平均成績:%.2lf\n\n",students[i].num,students[i].sex,students[i].old,students[i].days.year,students[i].days.month,students[i].days.day,students[i].math,students[i].english,students[i].computer,students[i].ave);
}
}
int menu()
{
char ch;
int cnt;
printf("請按照以下提示輸入\n");
printf("1. 學生信息輸入\n");
printf("2. 學生信息輸出\n");
printf("3. 結束\n");
printf("Please input 1-3:\n");
do
{
ch=getchar();
cnt=ch-'0';
}while(cnt<=0 || cnt>3);
return cnt;
}
int main()
{
printf("請輸入班級總人數:\n");
scanf("%d",&n);
for(int i=0;i<300;i++)
{
switch(menu())
{
case 1:
input();break;
case 2:
ouput();break;
case 3:
printf("goodbye\n");
exit(0);
}
}
return 0;
}
樓主這是我自己寫的一個班的管理程序,你只要稍微改改改成不同班級的就可以了
B. c語言課程設計 學生成績管理系統
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int shoudsave=0; /* */
struct student
{
char num[10];/* 學號 */
char name[20];
char class[10];
char term[2];
int ygrade;
int cgrade;
int mgrade;
int egrade;
int totle;
int ave;
char neartime[10];/* 最近更新時間 */
};
typedef struct node
{
struct student data;
struct node *next;
}Node,*Link;
void menu()
{
printf("********************************************************************************");
printf("\t1登記學生資料\t\t\t\t\t2刪除學生資料\n");
printf("\t3查詢學生資料\t\t\t\t\t4修改學生資料\n");
printf("\t5保存學生資料\t\t\t\t\t0退出系統\n");
printf("********************************************************************************\n");
}
void printstart()
{
printf("-----------------------------------------------------------------------\n");
}
void Wrong()
{
printf("\n=====>提示:輸入錯誤!\n");
}
void Nofind()
{
printf("\n=====>提示:沒有找到該學生!\n");
}
void printc() /* 本函數用於輸出中文 */
{
printf(" 學號\t 姓名 班級 學期 語文成績 英語成績 數學成績 C語言成績 總分 平均分\n");
}
void printe(Node *p)/* 本函數用於輸出英文 */
{
printf("%-12s%s\t%s\t\%s\t%d\t%d\t%d\t %d\t %d\n",p->data.num,p->data.name,p->data.class,p->data.term,p->data.ygrade,p->data.egrade,p->data.mgrade,p->data.cgrade,p->data.totle,p->data.ave);
}
Node* Locate(Link l,char findmess[],char nameornum[]) /* 該函數用於定位連表中符合要求的接點,並返回該指針 */
{
Node *r;
if(strcmp(nameornum,"num")==0) /* 按學號查詢 */
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.num,findmess)==0)
return r;
r=r->next;
}
}
else if(strcmp(nameornum,"name")==0) /* 按姓名查詢 */
{
r=l->next;
while(r!=NULL)
{
if(strcmp(r->data.name,findmess)==0)
return r;
r=r->next;
}
}
return 0;
}
void Add(Link l) /* 增加學生 */
{
Node *p,*r,*s;
char num[10];
r=l;
s=l->next;
while(r->next!=NULL)
r=r->next; /* 將指針置於最末尾 */
while(1)
{
printf("請你輸入學號(以'0'返回上一級菜單:)");
scanf("%s",num);
if(strcmp(num,"0")==0)
break;
while(s)
{
if(strcmp(s->data.num,num)==0)
{
printf("=====>提示:學號為'%s'的學生已經存在,若要修改請你選擇'4 修改'!\n",num);
printstart();
printc();
printe(s);
printstart();
printf("\n");
return;
}
s=s->next;
}
p=(Node *)malloc(sizeof(Node));
strcpy(p->data.num,num);
printf("請你輸入姓名:");
scanf("%s",p->data.name);
getchar();
printf("請你輸入班級:");
scanf("%s",p->data.class);
getchar();
printf("請你輸入學期:");
scanf("%s",p->data.term);
getchar();
printf("請你輸入語文成績:");
scanf("%d",&p->data.ygrade);
getchar();
printf("請你輸入c語言成績:");
scanf("%d",&p->data.cgrade);
getchar();
printf("請你輸入數學成績:");
scanf("%d",&p->data.mgrade);
getchar();
printf("請你輸入英語成績:");
scanf("%d",&p->data.egrade);
getchar();
p->data.totle=p->data.ygrade+p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle / 3;
/* 信息輸入已經完成 */
p->next=NULL;
r->next=p;
r=p;
shoudsave=1;
}
}
void Qur(Link l) /* 查詢學生 */
{
int sel;
char findmess[20];
Node *p;
if(!l->next)
{
printf("\n=====>提示:沒有資料可以查詢!\n");
return;
}
printf("\n=====>1按學號查找\n=====>2按姓名查找\n");
scanf("%d",&sel);
if(sel==1)/* 學號 */
{
printf("請你輸入要查找的學號:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("\t\t\t\t查找結果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else if(sel==2) /* 姓名 */
{
printf("請你輸入要查找的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
printf("\t\t\t\t查找結果\n");
printstart();
printc();
printe(p);
printstart();
}
else
Nofind();
}
else
Wrong();
}
void Del(Link l) /* 刪除 */
{
int sel;
Node *p,*r;
char findmess[20];
if(!l->next)
{
printf("\n=====>提示:沒有資料可以刪除!\n");
return;
}
printf("\n=====>1按學號刪除\n=====>2按姓名刪除\n");
scanf("%d",&sel);
if(sel==1)
{
printf("請你輸入要刪除的學號:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:該學生已經成功刪除!\n");
shoudsave=1;
}
else
Nofind();
}
else if(sel==2)
{
printf("請你輸入要刪除的姓名:");
scanf("%s",findmess);
p=Locate(l,findmess,"name");
if(p)
{
r=l;
while(r->next!=p)
r=r->next;
r->next=p->next;
free(p);
printf("\n=====>提示:該學生已經成功刪除!\n");
shoudsave=1;
}
else
Nofind();
}
else
Wrong();
}
void Modify(Link l)
{
Node *p;
char findmess[20];
if(!l->next)
{
printf("\n=====>提示:沒有資料可以修改!\n");
return;
}
printf("請你輸入要修改的學生學號:");
scanf("%s",findmess);
p=Locate(l,findmess,"num");
if(p)
{
printf("請你輸入新學號(原來是%s):",p->data.num);
scanf("%s",p->data.num);
printf("請你輸入新姓名(原來是%s):",p->data.name);
scanf("%s",p->data.name);
getchar();
printf("請你輸入新班級(原來是%s):",p->data.class);
scanf("%s",p->data.class);
getch();
printf("請你輸入新學期(原來是%s):",p->data.term);
scanf("%s",p->data.term);
getchar();
printf("請你輸入新的語文成績(原來是%d分):",p->data.ygrade);
scanf("%d",&p->data.ygrade);
getchar();
printf("請你輸入新的c語言成績(原來是%d分):",p->data.cgrade);
scanf("%d",&p->data.cgrade);
getchar();
printf("請你輸入新的數學成績(原來是%d分):",p->data.mgrade);
scanf("%d",&p->data.mgrade);
getchar();
printf("請你輸入新的英語成績(原來是%d分):",p->data.egrade);
scanf("%d",&p->data.egrade);
p->data.totle=p->data.egrade+p->data.cgrade+p->data.mgrade;
p->data.ave=p->data.totle/3;
printf("\n=====>提示:資料修改成功!\n");
shoudsave=1;
}
else
Nofind();
}
void Disp(Link l)
{
int count=0;
Node *p;
p=l->next;
if(!p)
{
printf("\n=====>提示:沒有資料可以顯示!\n");
return;
}
printf("\t\t\t\t顯示結果\n");
printstart();
printc();
printf("\n");
while(p)
{
printe(p);
p=p->next;
}
printstart();
printf("\n");
}
void Tongji(Link l)
{
Node *pm,*pe,*pc,*pa; /* 用於指向不及格學生的接點 */
Node *r=l->next;
if(!r)
{
printf("\n=====>提示:沒有資料可以統計!\n");
return ;
}
pm=pe=pc=pa=r;
while(r!=NULL)
{
if(r->data.ygrade<60)
pa=r;
if(r->data.cgrade<60)
pc=r;
if(r->data.mgrade<60)
pm=r;
if(r->data.egrade<60)
pe=r;
r=r->next;
}
printf("------------------------------統計結果--------------------------------\n");
printf("語文不及格:\t%s %d分\n",pe->data.name,pe->data.ygrade);
printf("英語不及格:\t%s %d分\n",pe->data.name,pe->data.egrade);
printf("數學不及格:\t%s %d分\n",pm->data.name,pm->data.mgrade);
printf("c語言不及格:\t%s %d分\n",pc->data.name,pc->data.cgrade);
printstart();
}
void Sort(Link l)
{
Link ll;
Node *p,*rr,*s;
ll=(Link)malloc(sizeof(Node)); /* 用於做新的連表 */
ll->next=NULL;
if(l->next==NULL)
{
printf("\n=====>提示:沒有資料可以排序!\n");
return ;
}
p=l->next;
while(p)
{
s=(Node*)malloc(sizeof(Node)); /* 新建接點用於保存信息 */
s->data=p->data;
s->next=NULL;
rr=ll;
while(rr->next!=NULL && rr->next->data.totle>=p->data.totle)
rr=rr->next;
if(rr->next==NULL)
rr->next=s;
else
{
s->next=rr->next;
rr->next=s;
}
p=p->next;
}
free(l);
l->next=ll->next;
printf("\n=====>提示:排序已經完成!\n");
}
void Save(Link l)
{
FILE* fp;
Node *p;
int flag=1,count=0;
fp=fopen("c:\\student","wb");
if(fp==NULL)
{
printf("\n=====>提示:重新打開文件時發生錯誤!\n");
exit(1);
}
p=l->next;
while(p)
{
if(fwrite(p,sizeof(Node),1,fp)==1)
{
p=p->next;
count++;
}
else
{
flag=0;
break;
}
}
if(flag)
{
printf("\n=====>提示:文件保存成功.(有%d條記錄已經保存.)\n",count);
shoudsave=0;
}
fclose(fp);
}
void main()
{
Link l;/* 連表 */
FILE *fp; /* 文件指針 */
int sel;
char ch;
char jian;
int count=0;
Node *p,*r;
l=(Node*)malloc(sizeof(Node));
l->next=NULL;
r=l;
fp=fopen("C:\\student","rb");
if(fp==NULL)
{
printf("\n=====>提示:文件還不存在,是否創建?(y/n)\n");
scanf("%c",&jian);
if(jian=='y'||jian=='Y')
fp=fopen("C:\\student","wb");
else
exit(0);
}
printf("\n=====>提示:文件已經打開,正在導入記錄......\n");
while(!feof(fp))
{
p=(Node*)malloc(sizeof(Node));
if(fread(p,sizeof(Node),1,fp)) /* 將文件的內容放入接點中 */
{
p->next=NULL;
r->next=p;
r=p; /* 將該接點掛入連中 */
count++;
}
}
fclose(fp); /* 關閉文件 */
printf("\n=====>提示:記錄導入完畢,共導入%d條記錄.\n",count);
while(1)
{
menu();
printf("請你選擇操作:");
scanf("%d",&sel);
if(sel==0)
{
if(shoudsave==1)
{ getchar();
printf("\n=====>提示:資料已經改動,是否將改動保存到文件中(y/n)?\n");
scanf("%c",&ch);
if(ch=='y'||ch=='Y')
Save(l);
}
printf("\n=====>提示:你已經退出系統,再見!\n");
break;
}
switch(sel)
{
case 1:Add(l);break; /* 增加學生 */
case 2:Del(l);break;/* 刪除學生 */
case 3:Qur(l);break;/* 查詢學生 */
case 4:Modify(l);break;/* 修改學生 */
case 5:Save(l);break;/* 保存學生 */
case 9:printf("\t\t\t==========幫助信息==========\n");break;
default: Wrong();getchar();break;
}
}
}
C. C語言程序設計學生成績管理系統
#include "stdio.h"
/*定義學生結構體*/
struct Student
{
char ID[20];
char Name[20];
float Mark1;
float Mark2;
float Mark3;
float Average;
};
/*聲明學生數組及學生數量*/
struct Student students[1000];
int num=0;
/*求平均值*/
float Avg(struct Student stu)
{
return (stu.Mark1+stu.Mark2+stu.Mark3)/3;
}
/*通過學號返回數組下標*/
int Student_SearchByIndex(char id[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].ID,id)==0)
{
return i;
}
}
return -1;
}
/*通過姓名返回數組下標*/
int Student_SearchByName(char name[])
{
int i;
for (i=0;i<num;i++)
{
if (strcmp(students[i].Name,name)==0)
{
return i;
}
}
return -1;
}
/*顯示單條學生記錄*/
void Student_DisplaySingle(int index)
{
printf("%10s%10s%8s%8s%8s%10s\n","學號","姓名","成績","成績","成績","平均成績");
printf("-------------------------------------------------------------\n");
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[index].ID,students[index].Name,
students[index].Mark1,students[index].Mark2,students[index].Mark3,students[index].Average);
}
/*插入學生信息*/
void Student_Insert()
{
while(1)
{
printf("請輸入學號:");
scanf("%s",&students[num].ID);
getchar();
printf("請輸入姓名:");
scanf("%s",&students[num].Name);
getchar();
printf("請輸入成績:");
scanf("%f",&students[num].Mark1);
getchar();
printf("請輸入成績:");
scanf("%f",&students[num].Mark2);
getchar();
printf("請輸入成績:");
scanf("%f",&students[num].Mark3);
getchar();
students[num].Average=Avg(students[num]);
num++;
printf("是否繼續?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/*修改學生信息*/
void Student_Modify()
{
float mark1,mark2,mark3;
while(1)
{
char id[20];
int index;
printf("請輸入要修改的學生的學號:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("學生不存在!\n");
}
else
{
printf("你要修改的學生信息為:\n");
Student_DisplaySingle(index);
printf("-- 請輸入新值--\n");
printf("請輸入學號:");
scanf("%s",&students[index].ID);
getchar();
printf("請輸入姓名:");
scanf("%s",&students[index].Name);
getchar();
printf("請輸入成績:");
scanf("%f",&students[index].Mark1);
getchar();
printf("請輸入成績:");
scanf("%f",&students[index].Mark2);
getchar();
printf("請輸入成績:");
scanf("%f",&students[index].Mark3);
getchar();
students[index].Average=Avg(students[index]);
}
printf("是否繼續?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/*刪除學生信息*/
void Student_Delete()
{
int i;
while(1)
{
char id[20];
int index;
printf("請輸入要刪除的學生的學號:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if (index==-1)
{
printf("學生不存在!\n");
}
else
{
printf("你要刪除的學生信息為:\n");
Student_DisplaySingle(index);
printf("是否真的要刪除?(y/n)");
if (getchar()=='y')
{
for (i=index;i<num-1;i++)
{
students[i]=students[i+1];
}
num--;
}
getchar();
}
printf("是否繼續?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/*按姓名查詢*/
void Student_Select()
{
while(1)
{
char name[20];
int index;
printf("請輸入要查詢的學生的姓名:");
scanf("%s",&name);
getchar();
index=Student_SearchByName(name);
if (index==-1)
{
printf("學生不存在!\n");
}
else
{
printf("你要查詢的學生信息為:\n");
Student_DisplaySingle(index);
}
printf("是否繼續?(y/n)");
if (getchar()=='n')
{
break;
}
}
}
/*按平均值排序*/
void Student_SortByAverage()
{
int i,j;
struct Student tmp;
for (i=0;i<num;i++)
{
for (j=1;j<num-i;j++)
{
if (students[j-1].Average<students[j].Average)
{
tmp=students[j-1];
students[j-1]=students[j];
students[j]=tmp;
}
}
}
}
/*顯示學生信息*/
void Student_Display()
{
int i;
printf("%10s%10s%8s%8s%8s%10s\n","學號","姓名","成績","成績","成績","平均成績");
printf("-------------------------------------------------------------\n");
for (i=0;i<num;i++)
{
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[i].ID,students[i].Name,
students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average);
}
}
/*將學生信息從文件讀出*/
void IO_ReadInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","rb"))==NULL)
{
printf("不能打開文件!\n");
return;
}
if (fread(&num,sizeof(int),1,fp)!=1)
{
num=-1;
}
else
{
for(i=0;i<num;i++)
{
fread(&students[i],sizeof(struct Student),1,fp);
}
}
fclose(fp);
}
/*將學生信息寫入文件*/
void IO_WriteInfo()
{
FILE *fp;
int i;
if ((fp=fopen("Database.txt","wb"))==NULL)
{
printf("不能打開文件!\n");
return;
}
if (fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("寫入文件錯誤!\n");
}
for (i=0;i<num;i++)
{
if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)
{
printf("寫入文件錯誤!\n");
}
}
fclose(fp);
}
/*主程序*/
main()
{
int choice;
IO_ReadInfo();
while(1)
{
/*主菜單*/
printf("\n------ 學生成績管理系統------\n");
printf("1. 增加學生記錄\n");
printf("2. 修改學生記錄\n");
printf("3. 刪除學生記錄\n");
printf("4. 按姓名查詢學生記錄\n");
printf("5. 按平均成績排序\n");
printf("6. 退出\n");
printf("請選擇(1-6):");
scanf("%d",&choice);
getchar();
switch(choice)
{
case 1:
Student_Insert();
break;
case 2:
Student_Modify();
break;
case 3:
Student_Delete();
break;
case 4:
Student_Select();
break;
case 5:
Student_SortByAverage();
Student_Display();
break;
case 6:
exit();
break;
}
IO_WriteInfo();
}
}
D. 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
學生與課程之間的關系
課程名是惟一的,而選課的學生是多個的,這兩個實體之間為一對一關系。
一個學校有多位老師,這兩個實體之間為一對多關系。
學生與課程表中的同一課程對應多個不同的老師與學生,這兩個實體間為一對多關系。
E. 用C語言設計一個學生成績管理系統
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#defineMAX1000
/*定義學生成績信息結構*/
struct stu
{
char id[8];
char name[8];
(5)c語言課程設計報告學生成績管理系統擴展閱讀:
short:修飾int,短整型數據,可省略被修飾的int。(K&R時期引入)
long:修飾int,長整型數據,可省略被修飾的int。(K&R時期引入)
long long:修飾int,超長整型數據,可省略被修飾的int。(C99標准新增)
signed:修飾整型數據,有符號數據類型。(C89標准新增)
unsigned:修飾整型數據,無符號數據類型。(K&R時期引入)
restrict:用於限定和約束指針,並表明指針是訪問一個數據對象的唯一且初始的方式。(C99標准新增)
復雜類型關鍵字
struct:結構體聲明。(K&R時期引入)
union:聯合體聲明。(K&R時期引入)
enum:枚舉聲明。(C89標准新增)
typedef:聲明類型別名。(K&R時期引入)
sizeof:得到特定類型或特定類型變數的大小。(K&R時期引入)
inline:內聯函數用於取代宏定義,會在任何調用它的地方展開。(C99標准新增)
F. 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()
{static int a[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",a[10]);
}
C語言規定:定義時用a[10],表示a數組有10個元素。其下標值由0開始,所以數組元素a[10]是不存在的。
16.初始化數組時,未使用靜態存儲。
int a[3]={0,1,2};
這樣初始化數組是不對的。C語言規定只有靜態存儲(static)數組和外部存儲(exterm)數組才能初始化。應改為:
static int a[3]={0,1,2};
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);
}
G. C語言課程設計—學生成績管理系統<急!!!!!>注意要求,謝謝
#include <time.h>
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 80
void input();
void sort();
void display();
void insert();
void del();
void average();
void find();
void save();
void read();
void del_file();
void average();
void modify();
int now_no=0;
struct student
{
int no;
char name[20];
char sex[4];
float score1;
float score2;
float score3;
float sort;
float ave;
float sum;
};
struct student stu[MAX],*p;
main()/*主函數*/
{
int as;
start: printf("\n\t\t\t歡迎使用學生成績管理系統\n");
/*一下為功能選擇模塊*/
do
{
printf("\n\t\t\t\t1.錄入學員信息\n\t\t\t\t2.顯示學員信息\n\t\t\t\t3.成績排序信息\n\t\t\t\t4.添加學員信息\n\t\t\t\t5.刪除學員信息\n\t\t\t\t6.修改學員信息\n\t\t\t\t7.查詢學員信息\n\t\t\t\t8.從文件讀入學員信息\n\t\t\t\t9.刪除文件中學員信息\n\t\t\t\t10.保存學員信息\n\t\t\t\t11.退出\n");
printf("\t\t\t\t選擇功能選項:");
fflush(stdin);
scanf("%d",&as);
switch(as)
{
case 1:system("cls");input();break;
case 2:system("cls");display();break;
case 3:system("cls");sort();break;
case 4:system("cls");insert();break;
case 5:system("cls");del();break;
case 6:system("cls");modify();break;
case 7:system("cls");find();break;
case 8:system("cls");read();break;
case 9:system("cls");del_file();break;
case 10:system("cls");save();break;
case 11:system("exit");exit(0);
default:system("cls");goto start;
}
}while(1);
/*至此功能選擇結束*/
}
void input()/*原始數據錄入模塊*/
{
int i=0;
char ch;
do
{
printf("\t\t\t\t1.錄入學員信息\n輸入第%d個學員的信息\n",i+1);
printf("\n輸入學生編號:");
scanf("%d",&stu[i].no);
fflush(stdin);
printf("\n輸入學員姓名:");
fflush(stdin);
gets(stu[i].name);
printf("\n輸入學員性別:");
fflush(stdin);
gets(stu[i].sex);
printf("\n輸入學員成績1:");
fflush(stdin);
scanf("%f",&stu[i].score1);
printf("\n輸入學員成績2:");
fflush(stdin);
scanf("%f",&stu[i].score2);
printf("\n輸入學員成績3:");
fflush(stdin);
scanf("%f",&stu[i].score3);
printf("\n\n");
i++;
now_no=i;
printf("是否繼續輸入?(Y/N)");
fflush(stdin);
ch=getch();
system("cls");
}
while(ch!='n'&&ch!='N');
system("cls");
}
void sort()/*排序數據函數*/
{
struct student temp;
int i,j;
average();
for(i=1;i<now_no;i++)
{
for(j=1;j<=now_no-i;j++)
{
if(stu[j-1].ave<stu[j].ave)
{
temp=stu[j];
stu[j]=stu[j-1];
stu[j-1]=temp;
}
}
}
}
void display()/*顯示數據函數*/
{
int i;
char as;
average();
do
{
printf("\t\t\t班級學員信息列表\n");
printf("\t編號\t姓名\t性別\t成績1\t成績2\t成績3\t平均值\n");
for(i=0;i<now_no&&stu[i].name[0];i++)printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave);
printf("\t\t按任意鍵返回主菜單.");
fflush(stdin);
as=getch();
}
while(!as);
system("cls");
}
void insert()/*插入數據函數*/
{
char ch;
do
{
printf("\n\t\t輸入新插入學員隊信息\n");
printf("\n輸入學生編號:");
scanf("%d",&stu[now_no].no);
fflush(stdin);
printf("\n輸入學員姓名:");
fflush(stdin);
gets(stu[now_no].name);
printf("\n輸入學員性別:");
fflush(stdin);
gets(stu[now_no].sex);
printf("\n輸入學員成績1:");
fflush(stdin);
scanf("%f",&stu[now_no].score1);
printf("\n輸入學員成績2:");
fflush(stdin);
scanf("%f",&stu[now_no].score2);
printf("\n輸入學員成績3:");
fflush(stdin);
scanf("%f",&stu[now_no].score3);
printf("\n\n");
now_no=now_no+1;
sort();
printf("是否繼續輸入?(Y/N)");
fflush(stdin);
ch=getch();
system("cls");
}
while(ch!='n'&&ch!='N');
}
void del()/*刪除數據函數*/
{
int inum,i,j;
printf("輸入要刪除學員的編號:");
fflush(stdin);
scanf("%d",&inum);
for(i=0;i<now_no;i++)
{
if(stu[i].no==inum)
{
if(i==now_no)now_no-=1;
else
{
stu[i]=stu[now_no-1];
now_no-=1;
}
sort();
break;
}
}
system("cls");
}
void save()/*保存數據函數*/
{
FILE *fp;
int i;
char filepath[20];
printf("輸入要保存的文件路徑:");
fflush(stdin);
gets(filepath);
if((fp=fopen(filepath,"w"))==NULL)
{
printf("\n保存失敗!");
exit(0);
}
for(i=0;i<now_no;i++)
{
stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3;
stu[i].ave=stu[i].sum/3;
fprintf(fp,"\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave);
}
fclose(fp);
printf("學生信息已保存在%s中!\n",filepath);
system("pause");
system("cls");
}
void find()/*查詢函數*/
{
int i;
char str[20],as;
do
{
printf("輸入要查詢的學生姓名:");
fflush(stdin);
gets(str);
for(i=0;i<now_no;i++)
if(!strcmp(stu[i].name,str))
{
printf("\t編號\t姓名\t性別\t成績1\t成績2\t成績3\t平均值\n");
printf("\t%d\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",stu[i].no,stu[i].name,stu[i].sex,stu[i].score1,stu[i].score2,stu[i].score3,stu[i].ave);
}
printf("\t\t按任意鍵返回主菜單.");
fflush(stdin);
as=getch();
}
while(!as);
system("cls");
}
void average()/*求平均數*/
{
int i;
for(i=0;i<now_no;i++)
{
stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3;
stu[i].ave=stu[i].sum/3;
}
}
void modify()/*修改數據函數*/
{
int i;
char str[20],as;
printf("輸入要修改的學生姓名:");
fflush(stdin);
gets(str);
for(i=0;i<now_no;i++)
if(!strcmp(stu[i].name,str))
{
system("cls");
printf("\n\t\t輸入新插入學員隊信息\n");
printf("\n輸入學生編號:");
fflush(stdin);
scanf("%d",&stu[i].no);
printf("\n輸入學員性別:");
fflush(stdin);
gets(stu[i].sex);
printf("\n輸入學員成績1:");
fflush(stdin);
scanf("%f",&stu[i].score1);
printf("\n輸入學員成績2:");
fflush(stdin);
scanf("%f",&stu[i].score2);
printf("\n輸入學員成績3:");
fflush(stdin);
scanf("%f",&stu[i].score3);
printf("\n\n");
sort();
break;
}
system("cls");
}
void read()
{
FILE *fp;
int i;
char filepath[20];
printf("輸入要讀入的文件路徑:");
fflush(stdin);
gets(filepath);
if((fp=fopen(filepath,"r"))==NULL)
{
printf("找不到%s文件!\n",filepath);
system("pause");
exit(0);
}
now_no=0;
for(i=0;i<MAX&&!feof(fp);i++)
{
fscanf(fp,"\t%d\t%s\t%s\t%f\t%f\t%f\t%f\n",&stu[i].no,stu[i].name,stu[i].sex,&stu[i].score1,&stu[i].score2,&stu[i].score3,&stu[i].ave);
now_no++;
}
fclose(fp);
printf("保存的在文件%s中的所有信息已經讀入!\n",filepath);
system("pause");
system("cls");
}
void del_file()
{
FILE *fp;
char filepath[20];
printf("輸入要刪除的文件路徑:");
fflush(stdin);
gets(filepath);
fp=fopen(filepath,"w");
fclose(fp);
printf("保存的在文件%s中的所有信息已經刪除!\n",filepath);
system("pause");
system("cls");
}
自己改改就好了 謝謝 給分哦
H. 怎麼用c語言編寫一個學生成績管理系統啊急……
C語言課程設計報告-------學生成績簡單管理程序 一、系統菜單的主要功能 (1)輸入若干條記錄 (2)顯示所有記錄 (3)按學號排序 (4)插入一條記錄 (5)按姓名查找,刪除一條記錄 (6)查找並顯示一條記錄 (7)輸出統計信息 (新增) (8)從正文中添加數據到結構體數組中 (9)將所有數據寫入文件中 (0)退出程序 二、題目分析 該題主要考察學生對結構體,指針,文件的操作,以及C語言演算法的掌握,所以完成此道題目要求較強的設計能力,尤其是要有一種大局觀的意識。如何調程序也非常重要,通過這個程序可以學習到以前調試短程序沒有的的經驗。 菜單中的每一個選項都對應一個子程序,子程序的演算法幾乎囊獲了所有C語言學過的技巧,下面就各個子程序中的功能進行說明: 功能1和4的演算法相似,輸入一條記錄到結構體中去,其中有一部很關鍵,就是通過gets將所有的多餘的字元,回車讀去,否則就會出錯。 功能2是顯示所有的記錄,通過循環輸出,格式也比較重要。 功能3為按學號排序,因為學號定義成了字元數組的形式,因此在運用冒泡法進行排序的時候,要用到strcmp,strcpy等函數。 功能5為按姓名刪除記錄,先輸入姓名,再一一比較,如果沒有則返回失敗信息,如果找到就將此記錄都向前移一位,返回n-1。 功能6的演算法在5中就已經體現了,輸入姓名,一一比較。 功能7為新增的功能,因為考慮到原來給出的函數中竟然沒有對學生成績的統計功能,因此新增此功能,可以得出所有的記錄個數,最高、最低、平均分,並輸出相關的學生信息等。 功能8和9是對文件的操作,提前准備好數據。 三、程序正文部分 #include<stdio.h> /*引用庫函數*/ #include<stdlib.h> #include<ctype.h> #include<string.h> typedef struct /*定義結構體數組*/ { char num[10]; /*學號*/ char name[20]; /*姓名*/ int score; /*成績*/ }Student; Student stu[80]; /*結構體數組變數*/ int menu_select() /*菜單函數*/ { char c; do{ system("cls"); /*運行前清屏*/ printf("\t\t****Students' Grade Management System****\n"); /*菜單選擇*/ printf("\t\t | 1. Input Records |\n"); printf("\t\t | 2. Display All Records |\n"); printf("\t\t | 3. Sort |\n"); printf("\t\t | 4. Insert a Record |\n"); printf("\t\t | 5. Delete a Record |\n"); printf("\t\t | 6. Query |\n"); printf("\t\t | 7. Statistic |\n"); printf("\t\t | 8. Add Records from a Text File|\n"); printf("\t\t | 9. Write to a Text file |\n"); printf("\t\t | 0. Quit |\n"); printf("\t\t*****************************************\n"); printf("\t\t\tGive your Choice(0-9):"); c=getchar(); /*讀入選擇*/ }while(c<'0'||c>'9'); return(c-'0'); /*返回選擇*/ } int Input(Student stud[],int n) /*輸入若干條記錄*/ {int i=0; char sign,x[10]; /*x[10]為清除多餘的數據所用*/ while(sign!='n'&&sign!='N') /*判斷*/ { printf("\t\t\tstudent's num:"); /*交互輸入*/ scanf("\t\t\t%s",stud[n+i].num); printf("\t\t\tstudent's name:"); scanf("\t\t\t%s",stud[n+i].name); printf("\t\t\tstudent's score:"); scanf("\t\t\t%d",&stud[n+i].score); gets(x); /*清除多餘的輸入*/ printf("\t\t\tany more records?(Y/N)"); scanf("\t\t\t%c",&sign); /*輸入判斷*/ i++; } return(n+i); } void Display(Student stud[],int n) /*顯示所有記錄*/ { int i; printf("\t\t\t-----------------------------------\n"); /*格式頭*/ printf("\t\t\tnumber name score\n"); printf("\t\t\t-----------------------------------\n"); for(i=1;i<n+1;i++) /*循環輸入*/ { printf("\t\t\t%-16s%-15s%d\n",stud[i-1].num,stud[i-1].name,stud[i-1].score); if(i>1&&i%10==0) /*每十個暫停*/ {printf("\t\t\t-----------------------------------\n"); /*格式*/ printf("\t\t\t"); system("pause"); printf("\t\t\t-----------------------------------\n"); } } printf("\t\t\t"); system("pause"); } void Sort_by_num(Student stud[],int n) /*按學號排序*/ { int i,j,*p,*q,s; char t[10]; for(i=0;i<n-1;i++) /*冒泡法排序*/ for(j=0;j<n-1-i;j++) if(strcmp(stud[j].num,stud[j+1].num)>0) {strcpy(t,stud[j+1].num); strcpy(stud[j+1].num,stud[j].num); strcpy(stud[j].num,t); strcpy(t,stud[j+1].name); strcpy(stud[j+1].name,stud[j].name); strcpy(stud[j].name,t); p=&stud[j+1].score; q=&stud[j].score; s=*p; *p=*q; *q=s; } } int Insert_a_record(Student stud[],int n) /*插入一條記錄*/ {char x[10]; /*清除多餘輸入所用*/ printf("\t\t\tstudent's num:"); /*互動式輸入*/ scanf("\t\t\t%s",stud[n].num); printf("\t\t\tstudent's name:"); scanf("\t\t\t%s",stud[n].name); printf("\t\t\tstudent's score:"); scanf("\t\t\t%d",&stud[n].score); gets(x); n++; Sort_by_num(stud,n); /*調用排序函數*/ printf("\t\t\tInsert Successed!\n"); /*返回成功信息*/ return(n); } int Delete_a_record(Student stud[],int n) /*按姓名查找,刪除一條記錄*/ { char s[20]; int i=0,j; printf("\t\t\ttell me his(her) name:"); /*互動式問尋*/ scanf("%s",s); while(strcmp(stud[i].name,s)!=0&&i<n) i++; /*查找判斷*/ if(i==n) { printf("\t\t\tnot find!\n"); /*返回失敗信息*/ return(n); } for(j=i;j<n-1;j++) /*刪除操作*/ { strcpy(stud[j].num,stud[j+1].num); strcpy(stud[j].name,stud[j+1].name); stud[j].score=stud[j+1].score; } printf("\t\t\tDelete Successed!\n"); /*返回成功信息*/ return(n-1); } void Query_a_record(Student stud[],int n) /*查找並顯示一個記錄*/ { char s[20]; int i=0; printf("\t\t\tinput his(her) name:"); /*互動式輸入*/ scanf("\t\t\t%s",s); while(strcmp(stud[i].name,s)!=0&&i<n) i++; /*查找判斷*/ if(i==n) { printf("\t\t\tnot find!\n"); /*輸入失敗信息*/ return; } printf("\t\t\this(her) number:%s\n",stud[i].num); /*輸出該學生信息*/ printf("\t\t\this(her) score:%d\n",stud[i].score); } void Statistic(Student stud[],int n) /*新增功能,輸出統計信息*/ { int i,j=0,k=0,sum=0; float aver; /*成績平均值*/ for(i=0;i<n;i++) /*循環輸入判斷*/ { sum+=stud[i].score; if(stud[j].score>stud[i].score) j=i; if(stud[k].score<stud[i].score) k=i; } aver=1.0*sum/n; printf("\t\t\tthere are %d records.\n",n); /*總共記錄數*/ printf("\t\t\tthe hignest score:\n"); /*最高分*/ printf("\t\t\tnumber:%s name:%s score:%d\n",stud[j].num,stud[j].name,stud[j].score); printf("\t\t\tthe lowest score:\n"); /*最低分*/ printf("\t\t\tnumber:%s name:%s score:%d\n",stud[k].num,stud[k].name,stud[k].score); printf("\t\t\tthe average score is %5.2f\n",aver); /*平均分*/ } int AddfromText(Student stud[],int n) /*從文件中讀入數據*/ { int i=0,num; FILE *fp; /*定義文件指針*/ char filename[20]; /*定義文件名*/ printf("\t\t\tInput the filename:"); scanf("\t\t\t%s",filename); /*輸入文件名*/ if((fp=fopen(filename,"rb"))==NULL) /*打開文件*/ { printf("\t\t\tcann't open the file\n"); /*打開失敗信息*/ printf("\t\t\t"); system("pause"); return(n); } fscanf(fp,"%d",&num); /*讀入總記錄量*/ while(i<num) /*循環讀入數據*/ { fscanf(fp,"%s%s%d",stud[n+i].num,stud[n+i].name,&stud[n+i].score); i++; } n+=num; fclose(fp); /*關閉文件*/ printf("\t\t\tSuccessed!\n"); printf("\t\t\t"); system("pause"); return(n); } void WritetoText(Student stud[],int n) /*將所有記錄寫入文件*/ { int i=0; FILE *fp; /*定義文件指針*/ char filename[20]; /*定義文件名*/ printf("\t\t\tWrite Records to a Text File\n"); /*輸入文件名*/ printf("\t\t\tInput the filename:"); scanf("\t\t\t%s",filename); if((fp=fopen(filename,"w"))==NULL) /*打開文件*/ { printf("\t\t\tcann't open the file\n"); system("pause"); return; } fprintf(fp,"%d\n",n); /*循環寫入數據*/ while(i<n) { fprintf(fp,"%-16s%-15s%d\n",stud[i].num,stud[i].name,stud[i].score); i++; } fclose(fp); /*關閉文件*/ printf("Successed!\n"); /*返回成功信息*/ } void main() /*主函數*/ { int n=0; for(;;) { switch(menu_select()) /*選擇判斷*/ { case 1: printf("\t\t\tInput Records\n"); /*輸入若干條記錄*/ n=Input(stu,n); break; case 2: printf("\t\t\tDisplay All Records\n"); /*顯示所有記錄*/ Display(stu,n); break; case 3: printf("\t\t\tSort\n"); Sort_by_num(stu,n); /*按學號排序*/ printf("\t\t\tSort Suceessed!\n"); printf("\t\t\t"); system("pause"); break; case 4: printf("\t\t\tInsert a Record\n"); n=Insert_a_record(stu,n); /*插入一條記錄*/ printf("\t\t\t"); system("pause"); break; case 5: printf("\t\t\tDelete a Record\n"); n=Delete_a_record(stu,n); /*按姓名查找,刪除一條記錄*/ printf("\t\t\t"); system("pause"); break; case 6: printf("\t\t\tQuery\n"); Query_a_record(stu,n); /*查找並顯示一個記錄*/ printf("\t\t\t"); system("pause"); break; case 7: printf("\t\t\tStatistic\n"); Statistic(stu,n); /*新增功能,輸出統計信息*/ printf("\t\t\t"); system("pause"); break; case 8: printf("\t\t\tAdd Records from a Text File\n"); n=AddfromText(stu,n); /*新增功能,輸出統計信息*/ break; case 9: printf("\t\t\tWrite to a Text file\n"); WritetoText(stu,n); /*循環寫入數據*/ printf("\t\t\t"); system("pause"); break; case 0: printf("\t\t\tHave a Good Luck,Bye-bye!\n"); /*結束程序*/ printf("\t\t\t"); system("pause"); exit(0); } } } 四、函數調用關系圖 註:「→」代表調用 Input函數 列印鏈表記錄 Display函數 輸入若干條記錄 menu_select()函數 選擇菜單 Sort_by_num函數 顯示所有記錄 Delete_a_record函數 按姓名查找,刪除一條記錄 Query_a_record查找並顯示一條記錄 Statistic函數 輸出統計信息 (新增) AddfromText函數 從正文中添加數據到結構體數組中 Main函數 Insert_a_record插入一條記錄 WritetoText函數 將所有數據寫入文件中 退出程序 Reverse(head)函數 按學號排序 五、設計測試流程 1、進入界面 2、輸入選項1,回車; 按提示輸入數據: 3、回到主菜單; 輸入選項7,回車; 輸入文件名:data.txt,回車; 出現成功提示,則讀入文件操作成功。 4、回到主菜單,輸入2,回車 每10個暫停顯示數據 5、回到主菜單,輸入3,回車 出現排序成功信息。 6、回到主菜單,輸入4,回車 按提示插入一組數據 7、回到主菜單,輸入5,回車 按提示輸入姓名,刪除數據 出現刪除成功的信息 8、回到主菜單,輸入6,回車 輸入姓名進行查詢 9、回到主菜單,輸入7,回車 出現統計信息 10、回到主菜單,輸入9,回車 輸入result.txt,回車 出現成功寫入文件的信息 11、回到主菜單,輸入0,回車退出系統
I. c語言課程設計之學生成績管理系統設計的程序
#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<string.h>
#define MAX 80
#define max 3
int nu=0;
struct classname
{
char name[20];
float score;
};
struct student
{
char no[20];
char std_name[20];
struct classname km[max];
float ave;
float sum;
int save;
};
struct student stu[MAX],*p;
void chushi()
{
int i,j;
for(i=0;i<MAX;i++)
{
for(j=0;j<20;j++)
{
stu[i].no[j]=NULL;
stu[i].std_name[j]=NULL;
stu[i].km[j].name[j]=NULL;
stu[i].km[j].score=0;
}
stu[i].ave=0;
stu[i].sum=0;
stu[i].save=0;
}
}
void av()/*求平均值*/
{
int i;
for(i=0;i<nu;i++)
{
stu[i].sum=stu[i].km[1].score+stu[i].km[2].score+stu[i].km[3].score;
stu[i].ave=stu[i].sum/3;
}
}
void first_check()
{
FILE *p;
int i,j;
struct classname frist[max];
for(i=0;i<max;i++)
{
for(j=0;j<20;j++)
frist[i].name[j]=NULL;
frist[i].score=0;
}
if ((p=fopen("c:\\kemu.txt","r"))==NULL)
{
printf("您好,歡迎使用學生成績管理系統\n\n因為您是第一次使用,請輸入科目名稱(三科)\n\n");
p=fopen("c:\\kemu.txt","w");
printf("輸入課程1名稱:");
scanf("%s",frist[0].name);
fprintf(p,"%s\n",frist[0].name);
printf("輸入課程2名稱:");
scanf("%s",frist[1].name);
fprintf(p,"%s\n",frist[1].name);
printf("輸入課程3名稱:");
scanf("%s",frist[2].name);
fprintf(p,"%s\n",frist[2].name);
}
system("cls");
fclose(p);
}
void save_nu()
{
FILE *p;
p=fopen("c:\\renshu.txt","w");
fprintf(p,"%d\n",nu);
fclose(p);
}
void Save_add(int n)
{
FILE * p;
int i;
p= fopen("c:\\cheji.txt","at");
if (p == NULL)
{
printf("文件不存在!!\n");
exit(0);
}
save_nu();
for (i = 0;i<n;i++)
if(stu[i].save==1)
{
stu[i].sum=stu[i].km[1].score+stu[i].km[2].score+stu[i].km[3].score;
stu[i].ave=stu[i].sum/3;
fprintf(p,"%s %s %2.1f %2.1f %2.1f %2.1f %2.1f \n",stu[i].no,stu[i].std_name,stu[i].km[0].score,stu[i].km[1].score,stu[i].km[2].score,stu[i].ave,stu[i].sum);
}
fclose(p);
}
void Save()
{
FILE * p;
int i;
p= fopen("c:\\cheji.txt","w");
if (p == NULL)
{
printf("文件不存在!!\n");
exit(0);
}
save_nu();
for (i = 0;i<nu;i++)
if(stu[i].save==1)
{
av();
fprintf(p,"%s %s %2.1f %2.1f %2.1f %2.1f %2.1f \n",stu[i].no,stu[i].std_name,stu[i].km[0].score,stu[i].km[1].score,stu[i].km[2].score,stu[i].ave,stu[i].sum);
}
fclose(p);
}
int read_nu()
{
FILE *p;
char ch,s[10]={'\0'};
int i=0;
p=fopen("c:\\renshu.txt","r");
if(p==NULL)
{
save_nu();
return 0;
}
ch=fgetc(p);
while(ch!='\n')
{
s[i]=ch;
ch=fgetc(p);
i++;
}
nu=atoi(s);
fclose(p);
return 0;
}
int read_km()
{
FILE *p;
int i,j=0;
char s[20]={'\0'};
chushi();
p=fopen("c:\\kemu.txt","r");
if(p==NULL)
{
printf("ERROR read_km");
return 0;
}
fgets(s,20,p);
while(strlen(s)!=0)
{
for(i=0;i<strlen(s);i++)
if(s[i]==10)
{
s[i]='\0';
break;
}
for(i=0;i<=nu;i++)
strcpy(stu[i].km[j].name,s);
for(i=0;i<20;i++)
s[i]='\0';
j++;
fgets(s,20,p);
}
}
void read()
{
FILE *p;
int i,j,n,k,z=0;
char s[50]={'\0'};
char o[10]={'\0'};
p=fopen("c:\\cheji.txt","r");
if(p==NULL)
printf("ERROR_read");
chushi();
read_km();
fgets(s,50,p);
while(strlen(s)!=0)
{
j=0;
for(i=0;i<50;i++)
{
if(s[i]!='\n')
{
n=0;
while(j==0)
{
if(s[i]!=' ')
{
stu[z].no[n]=s[i];
n++;i++;
}
else
break;
}
while(j==1)
{
if(s[i]!=' ')
{
stu[z].std_name[n]=s[i];
n++;i++;
}
else
break;
}
while(j==2)
{
if(s[i]!=' ')
{
o[n]=s[i];
n++;i++;
}
else
{
stu[z].km[0].score=atoi(o);
break;
}
}
while(j==3)
{
if(s[i]!=' ')
{
o[n]=s[i];
n++;i++;
}
else
{
stu[z].km[1].score=atoi(o);
break;
}
}
while(j==4)
{
if(s[i]!=' ')
{
o[n]=s[i];
n++;i++;
}
else
{
stu[z].km[2].score=atoi(o);
break;
}
}
while(j==5)
{
if(s[i]!=' ')
{
o[n]=s[i];
n++;i++;
}
else
{
stu[z].ave=atoi(o);
break;
}
}
while(j==6)
{
if(s[i]!=' ')
{
o[n]=s[i];
n++;i++;
}
else
{
stu[z].sum=atoi(o);
break;
}
}
for(k=0;k<10;k++)
o[k]='\0';
}
else
break;
j++;
}
for(i=0;i<50;i++)
s[i]='\0';
fgets(s,50,p);
z++;
}
}
void putin()
{
int n,i=0;
char ch;
read_km();
do
{
printf("\t\t\t\t錄入學員信息\n輸入第%d個學員的信息\n",i+1);
printf("\n輸入學生編號:");
scanf("%s",stu[i].no);
printf("\n輸入學員姓名:");
scanf("%s",stu[i].std_name);
printf("\n輸入課程%s的分數:",stu[0].km[0].name);
scanf("%f",&stu[i].km[0].score);
printf("\n輸入課程%s的分數:",stu[0].km[1].name);
scanf("%f",&stu[i].km[1].score);
printf("\n輸入課程%s的分數:",stu[0].km[2].name);
scanf("%f",&stu[i].km[2].score);
stu[i].save=1;
printf("\n\n");
i++;
n=i;
printf("是否繼續輸入?(Y/N)");
fflush(stdin);
ch=getch();
system("cls");
}
while(ch!='n'&&ch!='N');
system("cls");
if(nu==0)
{
nu=n;
Save();
}
else
{
nu=n+nu;
Save_add(n);
}
}
int putout()
{
int i;char s;
if(nu==0)
{
printf("學生信息為零!請錄入...");
return 0;
}
read();
do
{
printf("學生成績信息:\n\n");
for(i=0;i<nu;i++)
printf("學號:%s 姓名:%s\n%s分數:%2.1f\t%s分數:%2.1f\t%s分數:%2.1f\n平均分數:%2.1f\t總成績:%2.1f\n\n",stu[i].no,stu[i].std_name,stu[i].km[0].name,stu[i].km[0].score,stu[i].km[1].name,stu[i].km[1].score,stu[i].km[2].name,stu[i].km[2].score,stu[i].ave,stu[i].sum);
printf("\t\t按任意鍵返回主菜單");
fflush(stdin);
s=getch();
}
while(!s);
system("cls");
}
int sort()/*排序數據函數*/
{
struct student temp;
int i,j;
char s;
if(nu==0)
{
printf("學生信息為零!請錄入...");
return 0;
}
chushi();
read();
for(i=1;i<nu;i++)
{
for(j=1;j<=nu-i;j++)
{
if(stu[j-1].ave<stu[j].ave)
{
temp=stu[j];
stu[j]=stu[j-1];
stu[j-1]=temp;
}
}
}
do
{
printf("學生成績信息:\n\n");
for(i=0;i<nu;i++)
printf("學號:%s 姓名:%s 平均成績:%2.1f\n\n",stu[i].no,stu[i].std_name,stu[i].ave);
printf("\t\t按任意鍵返回主菜單");
fflush(stdin);
s=getch();
}
while(!s);
system("cls");
}
void find()/*查詢函數*/
{
int j,i=0;
int c=0;
char search[10]={'\0'};
char as;
if(nu==0)
{
printf("學生信息為零!請錄入...");
return 0;
}
chushi();
read();
do
{
printf("輸入要查詢課程名稱:");
scanf("%s",search);
for(j=0;j<max;j++)
if(!strcmp(stu[i].km[j].name,search))
{
c=1;
printf("\n該課程不及格學生姓名:\n");
for(i=0;i<nu;i++)
if(stu[i].km[j].score<60)
printf("%s\n",stu[i].std_name);
}
if(c==0)
printf("無此課程!");
printf("\n\t\t按任意鍵返回主菜單");
fflush(stdin);
as=getch();
}
while(!as);
system("cls");
}
void tongji()
{
int j,m,z,i=0;
char s;
if(nu==0)
{
printf("學生信息為零!請錄入...");
return 0;
}
chushi();
read();
for(z=0;z<max;z++)
{
m=stu[i].km[z].score;j=0;
printf("%s 最高分: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
if(m<stu[i].km[z].score)
{
m=stu[i].km[z].score;
j=i;
}
printf("%s\t",stu[j].std_name);
j=0;i=0;m=stu[i].km[z].score;
printf("%s 最低分: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
if(m>stu[i].km[z].score)
{
m=stu[i].km[z].score;
j=i;
}
printf("%s\t",stu[j].std_name);
m=0;j=0;i=0;
printf("%s 平均分: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
m=m+stu[i].km[z].score;
printf("%d\n",m/nu);
m=0;i=0;
printf("%s 分數低於的60人數: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
if(stu[i].km[z].score<60)
m++;
printf("%d\t",m);
m=0;j=0;i=0;
printf("%s 分數高於60的人數: ",stu[i].km[z].name);
for(i=0;i<nu;i++)
if(stu[i].km[z].score>60)
m++;
printf("%d\n\n",m);
}
do
{
printf("\t\t按任意鍵返回主菜單");
fflush(stdin);
s=getch();
}
while(!s);
system("cls");
}
void main()/*主函數*/
{
int as;
first_check();
start: printf("\n\t\t\t歡迎使用學生成績管理系統\n");
/*一下為功能選擇模塊*/
do
{
printf("\n\t\t\t\t1.錄入學員信息\n\t\t\t\t2.顯示學員信息\n\t\t\t\t3.成績排序信息\n\t\t\t\t4.查詢不及格學生\n\t\t\t\t5.統計信息\n\t\t\t\t6.退出\n");
printf("\t\t\t\t選擇功能選項:");
fflush(stdin);
read_nu();
scanf("%d",&as);
switch(as)
{
case 1:system("cls");putin();break;
case 2:system("cls");putout();break;
case 3:system("cls");sort();break;
case 4:system("cls");find();break;
case 5:system("cls");tongji();break;
case 6:system("exit");exit(0);
default:system("cls");goto start;
}
}
while(1);
/*至此功能選擇結束*/
}