c語言成績查詢系統
⑴ c語言學生成績管理系統代碼
#include<stdio.h>
#include<string.h>
//外部函數聲明
void menu();
void line();
/* 定義全局變數其中n代表學生人數,ave[5]代表每科成績的平均分,high[5]每科成績的最高分,
min[5]代表每科成績的最低分,student_ave[100]代表每個學生五門成績的平均分*/
int n,i,j;
float ave[5]={0},high[5]={0},min[5]={0},student_ave[100];
//定義全局結構體
struct student
{
long int num; //學生學號
char name[20]; //學生姓名
float score[5]; //學生成績
}stu[100];
//主函數開始
int main()
{
void enter(); //enter:輸入學生成績函數(這是函數聲明)
void export(); //export:輸出學生成績函數(這是函數聲明)
void stat(); //stat:學生成績統計函數(這是函數聲明)
void rank(); //rank:學生成績排名函數(這是函數聲明)
void query(); //query:學生成績查詢函數(這是函數聲明)
//定義內部變數
//界面框架
menu();
printf(" 學生成績管理信息系統\n");
printf(">>請根據以下提示命令字元進行操作!\n");
printf("q:退出 a:成績輸入 p:成績輸出 s:成績統計 w:成績排名 t:成績查詢\n");
menu();
//函數調用,選擇成績管理方式
printf("請選擇成績管理方式>>");
while(1)
{
char c;
printf(">>\n");
scanf("%c",&c);
if (c=='q') printf("這是退出學生成績管理信息系統函數\n>>\n");break;
switch(c)
{
case'a':enter();break;
case'p':export(); break;
case's':stat();break;
case'v':rank();break;
case't':query();break;
default:("命令無效,請重新輸入!\n");
}
}
return 0;
}
//主函數部分結束
//定義函數
void menu()
{
printf("*******************************************************************************\n");
}
//定義下劃線函數
void line()
{
printf("--------------------------------------------------------------------------------\n");
}
//定義學生成績輸入函數開始
void enter()
{
menu();
printf("學生成績輸入\n請按以下格式進行數據輸入\n");
printf("請輸入學生學號姓名>>");
printf(" 學號 學生姓名\n");
printf("請輸入學生成績 >> ");
printf(" A成績 B成績 C成績 D成績 E成績\n");
printf("例如\n請輸入學生學號姓名>>");
printf("2012060402,張三\n");
printf("請輸入學生成績 >> ");
printf("95.5,97.0,89.0,92.0,85.0\n");
menu();
//輸入學生成績格式備注
printf("\n請輸入學生人數 >> ");
scanf("%d",&n);
//用for循環輸入學生成績
for(i=0;i<n;i++)
{
printf("請輸入學生學號姓名>>");
scanf("%ld,%s",&stu[i].num,stu[i].name);
printf("請輸入學生成績 >> ");
scanf("%f",&stu[i].score[0]);
scanf("%f",&stu[i].score[1]);
scanf("%f",&stu[i].score[2]);
scanf("%f",&stu[i].score[3]);
scanf("%f\n",&stu[i].score[4]);
getchar();
student_ave[i]=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2]+stu[i].score[3]+stu[i].score[4])/5;
//用for循環計算每科成績z總分
for(j=0;j<5;j++)
{
ave[j]=ave[j]+stu[i].score[j];
}
//用for循環得出每科成績最高分
for(j=0;j<5;j++)
{
if(high[j]<=stu[i].score[j])
{
high[j]=stu[i].score[j];
}
}
//用for循環得出每科成績最低分
for(j=0;j<5;j++)
{
if(i==0)
{
min[j]=stu[i].score[j];
}
if(min[j]>=stu[i].score[j])
{
min[j]=stu[i].score[j];
}
}
}
//學生成績輸入完成
//用for循環計算每科成績平均分
for(j=0;j<5;j++)
{
ave[j]=ave[j]/n;
}
getchar();
menu();
printf("\n");
}
//定義學生成績輸入函數結束
//定義學生成績輸出函數開始
void export()
{
int i;
printf(" 學號 姓名 成績A 成績B 成績C 成績D 成績E\n");
for(i=0;i<n;i++)
{
printf("%9ld %15s %7.1f %7.1f %7.1f %7.1f %7.1f\n",stu[i].num,stu[i].name,
stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4]);
}
menu();
}
//定義學生成績輸出函數結束
//定義學生成績統計函數開始
void stat()
{
printf("各科平均成績如下!\n");
line();
printf("\n");
printf(" 成績A 成績B 成績C 成績D 成績E\n");
//這是每科成績平均分
for(i=0;i<5;i++)
{
printf(" %6.1f ",ave[i]);
}
printf("\n");
printf("\n");
//只是每科成績的最高分
printf("各科最高分如下!\n");
line();
printf("\n");
printf(" 成績A 成績B 成績C 成績D 成績E\n");
for(j=0;j<5;j++)
{
printf(" %6.1f ",high[j]);
}
printf("\n");
printf("\n");
//這是每科成績最低分
printf("各科最低分如下!\n");
line();
printf("\n");
printf(" 成績A 成績B 成績C 成績D 成績E\n");
for(i=0;i<5;i++)
{
printf(" %6.1f ",min[i]);
}
printf("\n");
printf("\n");
}
//定義學生成績統計函數結束
//定義學生成績排名函數開始
void rank()
{
int k=1,z;
float t=0;
float student_high[100]={0};
printf("學生成績排名如下:\n\n");
line();
printf("\n");
printf("名次 學號 姓名 成績A 成績B 成績C 成績D 成績E 平均分 \n");
//把每個學生五門課的成績按從大到小的順序排列並存在數組student_high[]中去
for(i=0;i<n;i++)
{
student_high[i]=student_ave[i];
}
for(j=0;j<n;j++)
{
for(i=0;i<n-j;i++)
{
if(student_high[i]<=student_high[i+1])
{
t=student_high[i+1];
student_high[i+1]=student_high[i];
student_high[i]=t;
}
}
}
//按成績排名輸出學生成績信息
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(student_high[i]==student_high[i+1])
{
i++;
}
if(student_high[i]==student_ave[j])
{
printf("%d %ld %15s %7.1f %7.1f %7.1f %7.1f %7.1f %7.1f\n",k,stu[j].num,stu[j].name,
stu[j].score[0],stu[j].score[1],stu[j].score[2],stu[j].score[3],stu[j].score[4],student_ave[j]);
for(z=j+1;z<n;z++)
{
if(student_high[i]==student_ave[z])
{
k++;
}
}
}
}
k++;
}
line();
printf("\n");
}
//定義學生成績排名函數結束
//定義學生成績查詢函數開始
void query()
{
//查詢成績格式
char c2,shu_name[20]; //c2代表查詢成績控制字元。shu_name[]代表輸入查詢姓名,shu_num代表輸入查詢學號
int shu_num;
menu();
printf("學生成績查詢\n請按以下方式查詢\na:按學生姓名查詢 b:按學生學號查詢 q:退出\n");
menu();
printf("\n\n");
//選擇查詢方式
while(c2!='q')
{
printf("請選擇查詢成績方式>>");
scanf("%c",&c2);
getchar();
//按姓名查詢成績
if(c2=='a')
{
line();
printf("請輸入學生姓名>>");
scanf("%s",shu_name);
getchar();
for(i=0;i<n;i++)
{
if(strcmp(shu_name,stu[i].name)==0)
{
printf(" 學號 姓名 成績A 成績B 成績C 成績D 成績E\n");
printf("%ld %15s %7.1f %7.1f %7.1f %7.1f %7.1f\n",stu[i].num,stu[i].name,
stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4]);
}
else if(shu_name!=stu[i].name&&i==(n-1))
{
printf("無此學生成績\n");
}
}
line();
printf("\n");
}
//按學號查詢成績
else if(c2=='b')
{
line();
printf("請輸入學生學號>>");
scanf("%d",&shu_num);
getchar();
for(i=0;i<n;i++)
{
if(shu_num==stu[i].num)
{
printf(" 學號 姓名 成績A 成績B 成績C 成績D 成績E\n");
printf("%ld %15s %7.1f %7.1f %7.1f %7.1f %7.1f\n",stu[i].num,stu[i].name,
stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].score[3],stu[i].score[4]);
}
else if(shu_num!=stu[i].num&&i==(n-1))
{
printf("無此學生成績\n");
}
}
line();
printf("\n");
}
}
line();
printf("\n\n");
}
//定義學生成績查詢函數結束
⑵ 求C語言源代碼 題目 學生成績管理系統
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{ #define UP 72
#define DOWN 80
#define INSERT 82
#define DEL 83
#define ENTER 28
#define KEY 12
#define KEY 23
#define KEY 34
#define KEY 45
#define KEY A 30
#define KEY B 48
#define KEY C 46
#define KEY D 32
#define KEY E 18
#define KEY F 33
#define KEY G 34
#define KEY H 35
#define KEY I 23
#define KEY K 37
#define KEY L 38
#define KEY M 50
#define KEY N 49
#define KEY O 24
#define KEY P 25
#define KEY Q 16
#define KEY R 19
#define KEY S 31
#define KEY T 20
#define KEY U 22
#define KEY V 47
#define KEY W 17
#define KEY X 45
#define KEY Y 21
#define KEY Z 44
#define ALT F2 105
#define ALT F6 109
#define CTRL 4
#define SHIFT 1
#define ESC 1
#define BACKSPACE 14
#define LEN sizeof(struct student)
/*菜單選項。下拉標志*/
int menu x yes=1;
int menu y yes=0;
int menu x=1;
int menu x old=0;
int menu y1=1, menu y3=1;
/*保存文件名*/
char filename[43]="NONAME.dat";
/*開辟保存數據的空間*/
void *buf=0;
int left,top,right,bottom;
/*開辟保存數據的空間*/
struct student
{ long num;
char name[15];
float h maths;
float english;
float c;
float sum;
int s sum;
struct student*next;
};
struct student*head=0,*p1,*p2;
int record n;
char key buf[50];
long student number=0;
char student name[13];
float student score=0;
/*讀鍵掃描碼*/
char get key(void)
{ AH=0; int (0X16); return( AH); }
/*顯示字元*/
void show char(char z)
{ AL=z; AH=0x0e; int (0x10);}
/*測試是否有鍵輸入*/
int key pressed(void)
{ AH=0x0b; int (0x21); if( AL==0) return(0); else return(1);}
/*退出程序*/
voidquit(void)
{ void free data(void);void restore menu(void); free data();
restore menu(); window(1,1,80,25,0x0f);
cur show(); gotoxy(1,1); exit(1);
}
/*回到dos提示符*/
void os shell(void)
{void mainmenu show(void);
window(1,1,80,25,0x0f);
cur show(); gotoxy(1,1); system("");
mainmenu show();
}
/*主窗口文字*/
void main menu 1(void)
{ int i,j; char*p;
char*mainmenu word[]={"File ","Save ","Options ","About me"};
if(menu x!=menu x old||!menu y yes)
{p=mainmenu word[0];
putstr(4,1,0x70,p,35);
for(i=0;i<35;i++) if(*p++<='Z') putchar(i+4,1,*(p-1),0x74);
p=mianmenu word[0];
if(menu x yes)
for(i=0;j=0;i<35;i++)
{it('A'<=*p&&*(p+1)=='')break;
putchar(i+4,1,*p,0x0f); }
p++; }
}
}
void main menu 2(void)
{ int i; int len; char *p;
char*mainmenu word[6]={"F1-Help","F2-Save","F5-OS shell","F10-Menu","Message"};
void main box(void); main box();
p=mainmenu word[0]; putstr(2,25,0x70,p,42);
for(i=0;i<42;i++) {if(*p=='F'||('0'<=*p&&*p<='9'))putchar(i+2,*p,0x74); p++; }
p=mainmenu word[4]; putstr(36,22,0x17,p,9); len=strlen(filename);
putchar(40-len/2-1,2,'',0x17);
for(p=filename,i=0;*p!=0;p++;i++) putchar(40-len/2+i,2,*p,0x17);
putchar(40-len/2+len,2,'',0x17);
}
/*主窗口線框*/
void main box(void)
{ int i;
for(i=1;i<=80;I++) {putchar(i,2,205,0x17); putchar(i,22,196,0x17);putchar(i,24,196,0x17);}
for(i=1;i<=80;i++) {putchar(1,i,179,0x17); putchar(80,i,179,0x17); }
putchar(1,2,213,0x17); putchar(80,2,184,0x17); putchar(1,22,195,0x17);
putchar(80,22,180,0x17); putchar(1,24,192,0x17); putchar(80,24,217,0x17);
}
/*顯示主窗口菜單*/
voidmianmenu show (void)
{ textmode set(); cur hide();
window(1,1,80,25,0x1e);
window(1,1,80,1,0x70);
window(1,25,80,25,0x70);
main menu 10; main menu 20;
}
/*顯示下拉菜單*/
void menu show (void)
{ int i;
char*submenu word[][5]={{"New file F4","Open file F3","OS shell F5","Quit Alt-X"},
p"Input F6","Delete F8","Update F9","query F11","Sort F12"}};
switch(menu x)
{case 1:
if(menu x!=menu x old)
{menu x old=menu x; menu window(3,2,18,8); menu box(3,2,18,8,3,0);}
for(i=0;i<2;i++)
{putstr(4,3+i,0x70,submenu word[0][i],14);
putchar(5,3+i,*(submenu word[0][i]+1),0x74); }
for(i=3;i<5;i++) putstr(4,3+i,0x7-,submenu word[0][i-1],14);
putchar(6,6,*(submenu word[0][2]+2),0x74);
putchar(5,7,*(submenu word[0][3]+1),0x74);
window(4,2+menu y1,17,2+menu y1,0x0f);
if(menu y1<=2)
putstr(4,2+menu y1,0x0f,submenu word[0][menu y1-1],14);
else
putstr(4,2+menu y1,0x0f,submenu word[0][menu y1-2],14); break;
case 2:menu x old=menu x; menu window(19,2,44,8);}
for(i=0;i<5;i++)
{putstr(20,3+i,0x70,submenu word[1][i],24);
putchar(21,3+i,*(submenu word[1][i]+1,0x74); }
window(20,2+menu y3,43,2+menu y3,0x0f);
putstr(20,2+menu y3,0x0f,submenu word[1][menu y3-1],24); break;
case 4:menu x old=menu x; }
}
/*清空鍵盤緩沖*/
void clr buf(void){ key buf[1]=0;}
void free data(void)
{ struct student*pa,*pb;
if(head)
{pb=pa=head;
do{ pb=pa; pa=pb->next; free(pb);}while(pa!=0);head=0; }
}
/*姓名處理*/
int string name(void)
{ int i,j;
if(key buf[1]==0) return(0);
for(i=2,j=0;i<=key buf[1]+1;i++;j++)
student name[j]='\0'; return(1);}
/*輸入數據*/
voidinput(int flag)
{ int i; char*s1="NO. Name H maths English C\\C++ ";
char*s2=" | | | | ";
char*title="INPUT"; menu window(15,10,64,14); window(17,12,62,12,0x17);
putstr(37,10,0x70,title,7); putstr(17,11,0x70,s1,46);
if(head==0)
{ head=p1=p2=(struct student*)malloc(LEN);if(!head)memory error();
p1->next=0;
else{
for(p1=head,record n=0;p1!=0;record n++)
{ p2=p1; p1=p2->next; }
p1=(struct student*)malloc(LEN);
if(!p1)memory error();
p2->next=p1; }
while(1)
{record n++; putstr(17,12,0x07,s2,46);
if(flag==1)
{gotoxy(52,13); printf("Record%d",record n); }
do{ window(17,12,26,12,0x07);
if(!getstring(17,12,10))goto out ;
}while(!getstring number());
p1->num=student number;
do{ if(!getstring(28,12,12)) goto out;
}while(!string name());
strcpy(pi->name,student name);
for(i=1;i<=3;i++)
{ do{ window(41+(i-1)*8,12,0x07);
if(!getstring(41+(i-1)*8,12,5)) gotoout;
}while(!string score());
if(i==1)p1->h maths=student score;
if(i==2)pi->english=student score;
if(i==3)p1->c=student score; }
p1->sum=0.0; p1->s num=0;
if(flag==2){record n--;goto out;}
p2=p1;
p1=(struct student*)malloc(LEN);
if(!p1)memory error();
p1->next=0; p2->next=p1; }
out: cur hide(); window(15,10,65,15,0x1e);
if(flag==1) {if(head==p1)head=0; free(p1); p2->next=0; info(1); record n--; }
menu x yes=1; main menu 1();
}
/*查看是否有該成績*/
struct student* search(int flag)
{ struct student8pa,*pb; if(head==0)return(0); pb=pa=head;
if(flag==1)
{if(head->num==student number) return(head-1);
do{ if(pa->num==student number) return(pb);
pb=pa; pa=pb->next;} while(pa!=0); }
return (0);
}
/*查詢,刪除,修改對話框*/
struct student*msg box(int which)
{ int flag; int key; char*p="<-A B->"; menu window(22,10,60,14); gotoxy(29,11);
printf("Number OR Name"); window(24,12,58,12,0x07); gotoxy(24,12);
printf(" | "); gotoxy(37,10);
switch(which)
{ case 1:printf("Delete");break;
case 2:printf("Update");break;
case 3:printf("Query");break; }
do{ while(!key pressed())
now time();
key=get key(); if(key==KEY A) {flag=1;break;}
if(key==KEY B) {flag=2;break;} printf("\07");
}while(1);
putstr(37,13,0x64,p,7);
if(flag==1)
{ do{
gotoxy(24,12); printf(" | "):
if(!getstring(24,12,10)) goto out;
}while(!string number());
window(22,10,61,15,0x1e); return(search(1)); }
else
{do{ gotoxy(24,12); printf(" | ");
if(!getstring(41,12,12)) goto out;
}while(!string name());
window(22,10,61,15,0x1e); return(0);}
/*刪除記錄*/
void delete(void)
{ struct student*pa,*pb; pb=msg box(1); if(pb==0)info(3);
else
{ if(pb==(head-1))
{ pb=head; if(pb->next==0) head=0;
else head=pb->next; }
else
{ if(pb->next->next==0) {pb->next=pa; } }
record n--; info(2); }}
/*刪除記錄*/
void update(void)
{int i; struct student*p; i=record n; p=msg box(2;
if(p==0)info(3);
else
{ input(2);
if(i==record n)
{if(p==(head-1)){
head->num=p1->num; strcpy(head->name,p1->name);
head->h maths=p1->h maths; head->english=p1->english;
head->c=p1->c; free(p1); p2->next=0; }
else { p->next->num=p1->num; strcpy(p->next->name,p1->name);
p->next->h maths=p1->h maths; p->next->english=p1->english;
p->next->c=p1->c; free(p1); p2->next=0; }
info(4); }
else {record n--;p2->next=0;free(p1);info(5);} }}
/*查詢成績*/
void query(void)
{ struct student*p,*pa,*pb; int key ,flag,i,j;
char*str="NO. Name H matns English C\\C++ Sum S NO.";
char*sm="NO. Name h maths English C\\C++ (who fails)";
menu window(26,10,56,12); gotoxy(28,11); printf("Find Fail");
putchar(33,11,'A',0xe4); putchar(49,11,'B',0xe4);
do{if(!key pressed()) now time();
key=get key();
if(key==KEY A){flag=1;break;}
if(key==KEY B){flag=2;break;}
printf("\07"); }while(1);
window(26,10,57,13,0x1e); if(flag==1)
{ p=msg box(3); if(p==0) info(3);
else{window(6,5,76,21,0x0e); window(5,4,75,20,0x5e); window(6,5,74,19,0x0e);
putstr(13,4,0x5a,str,58); gotoxy(6,6);
if(p!=(head-1)){pa=p->next;p=pa;}
else p=head;
printf("%101d%13s%8.1f%9.1f%9.1f%9.1f%6d\n",\
p->num,p->name,p->h maths,p->english,p->c,p->sum,p->s sum);
}}
if(flag==2)
{ window(6,5,76,21,0x0e);window(5,4,75,20,0x5e); window(6,5,74,19,0x0e);
putchar(13,4,0x5a,sm,59); if(head)
{ pa=head; j=0;
do{ j++; i=0; window(6,5,74,19,0x0e); gotoxy(65,20);
printf("Page%d",j);
do
{ if(pa->c<60||pa->h maths<60||pa->english<60)
{gotoxy(6,6+i); i++;
printf("%101d%13s%8.1f%9.1f%9.1f%9.1f%6d\n",\
p->num,p->name,p->h maths,p->english,p->c,p->sum,p->s sum);}
pb=pa; pa=pb->next; }while(i!=13&&pa!=0);
while(!key pressed()) now time();
get key(); }while(pa!=0);
goto out;}}
while(!key pressed())
now time();get key();
out:window(5,4,76,21,0x1e);}
/*成績排名*/
void sort(void)
{ int i,j,n,flag; struct student*pa=0,*pb=0;
struct student*p[500],*pmin;
char*str="NO. Name H maths English C\\C++ Sum S NO.";
window(6,5,76,21,0x0e); window(5,4,75,20,0x5e); window(6,5,74,19,0x0e);
putstr(13,4,0x5a,str,58); window(60,20,73,20,0x5b);
if(head!=0)
{ i=0; pb=pa=head;
do
{p[i]=pa; i++; pa->sum=pa->h maths+pa->english+pa->c;
pb=pa; pa=pb->next; }while(pa!=0);
for(n=record n-1,i=0;i<n;i++)
{ flag=0;
for(j=0;j<n-i;j++)
if(p[j]->sum<p[j+1]->sum)
{ pmin=p[j]; p[j]=p[j+1]; p[j+1]=pmin; flag=1; }
if(flag==0)break; }
head=pb=pa=p[0]; head->s sum=1;
if(record n>1)
for(i=1;i<record n;i++) { pa->s sum=i; pb=pa; pa=pb->next=p[i];}
p2=p1=p[record n-1]; p1->s sum=record n;
p1->next=0; pb=pa=head;
j=0;
do{
j++;i=0; window(6,5,74,19,0x0e); gotoxy(65,20); printf("Page%d",j);
do
{gotoxy(6,6+i); i++;
printf("%101d%13s%8.1f%9.1f%9.1f%9.1f%6d\n",\
p->num,p->name,p->h maths,p->english,p->c,p->sum,p->s sum);}
pb=pa; pa=pb->next; }while(i!=13&&pa!=0);
while(!key pressed()) now time();
get key(); }while(pa!=0);
goto out;}
while(!key pressed())
now time();get key();
out:window(5,4,76,21,0x1e);}
/*輸入文件名*/
int input filename(int m)
{ char*p; int fp; menu window(19,10,64,12);
window(20,11,63,11,0x07);
gotoxy(35,10); printf("File name");
if(!getstring(20,11,40)) goto no;
if(key buf[1]==0) goto no;
p=key buf+2; key buf[key buf[1]+2]='\0';
if(fp=fopen(p,"rb+"))==0)
{if(m==2) goto no; if(fp=fopen(p,"wb+"))==0 goto no; }
fclose(fp); strcpy(filename,p);
yes: window(19,10,65,13,0x1e);
return(1);
no: window(19,10,65,13,0x1e);
return(0);
}
/*新建文件*/
void new file(void)
{ int fp;
if(input filename(1)==0) info(9;
else
{main menu 2(); free data(); fp=fopen(filename,"wb+"); fclose(fp); info(10); }
}
/*打開文件*/
void open file(void)
{ struct student*pa,*pb; int fp;
if(input filename(2)==0)info(6);
else
{free data(); head=pb=pa=(struct student*)malloc(LEN); fp=fopen(filename,"rb+";
fread(&pa->num,LEN,1,fp);}
info(8); fclose(fp); input(1); }}
/*保存文件*/
void save fiel(void)
{ struct student8pa,*pb; int fp;
if((fp=fopen(filename,"rb+"))==0) fp=fopen(filename,"wb+");
pb=pa=head;
if(fp!=0&&head!=0)
{do{fwrite(&pa->num,LEN,1,fp); pb=pa; pa=pb->next;}while(pa!=0);
fclose(fp); }
info(7);
}
void about me(void)
{ int i; char*title="About Me"; char*str[]={" I'M A BIG.BIG WORLD. "};
menu window(20,5,58,18); putstr(35,5,0x70,title,10);
for(i=0;i<12;i++)putstr(25,6+i,0x75,str[i],29);
while(!key pressed()) now time();
get key(); window(20,5,59,19,0x1e);
}
system("PAUSE");
return EXIT_SUCCESS;
}
⑶ C語言 學生成績管理系統
[cpp]viewplainprint?
<spanstyle="font-size:16px;">#include"stdio.h"
#include"string"
/*定義學生結構體*/
structStudent
{
charID[20];
charName[20];
floatMark1;
floatMark2;
floatMark3;
floatAverage;
};
/*聲明學生數組及學生數量*/
structStudentstudents[1000];
intnum=0;/*求平均值*/
floatAvg(structStudentstu)
{
return(stu.Mark1+stu.Mark2+stu.Mark3)/3;
}/*通過學號返回數組下標*/
intStudent_SearchByIndex(charid[])
{
inti;
for(i=0;i<num;i++)
{
if(strcmp(students[i].ID,id)==0)
{
returni;
}
}
return-1;
}/*通過姓名返回數組下標*/
intStudent_SearchByName(charname[])
{
inti;
for(i=0;i<num;i++)
{
if(strcmp(students[i].Name,name)==0)
{
returni;
}
}
return-1;
}/*顯示單條學生記錄*/
voidStudent_DisplaySingle(intindex)
{
printf("%10s%10s%8s%8s%8s%10s ","學號","姓名","成績","成績","成績","平均成績");
printf("------------------------------------------------------------- ");
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f ",students[index].ID,students[index].Name,
students[index].Mark1,students[index].Mark2,students[index].Mark3,students[index].Average);
}/*插入學生信息*/
voidStudent_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;
}
}}/*修改學生信息*/
voidStudent_Modify()
{
//floatmark1,mark2,mark3;
while(1)
{
charid[20];
intindex;
printf("請輸入要修改的學生的學號:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if(index==-1)
{
printf("學生不存在! ");
}
else
{
printf("你要修改的學生信息為: ");
Student_DisplaySingle(index);
printf("--請輸入新值-- ");
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;
}
}
}/*刪除學生信息*/
voidStudent_Delete()
{
inti;
while(1)
{
charid[20];
intindex;
printf("請輸入要刪除的學生的學號:");
scanf("%s",&id);
getchar();
index=Student_SearchByIndex(id);
if(index==-1)
{
printf("學生不存在! ");
}
else
{
printf("你要刪除的學生信息為: ");
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;
}
}
}/*按姓名查詢*/
voidStudent_Select()
{
while(1)
{
charname[20];
intindex;
printf("請輸入要查詢的學生的姓名:");
scanf("%s",&name);
getchar();
index=Student_SearchByName(name);
if(index==-1)
{
printf("學生不存在! ");
}
else
{
printf("你要查詢的學生信息為: ");
Student_DisplaySingle(index);
}
printf("是否繼續?(y/n)");
if(getchar()=='n')
{
break;
}
}
}/*按平均值排序*/
voidStudent_SortByAverage()
{
inti,j;
structStudenttmp;
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;
}
}
}
}/*顯示學生信息*/
voidStudent_Display()
{
inti;
printf("%10s%10s%8s%8s%8s%10s ","學號","姓名","成績","成績","成績","平均成績");
printf("------------------------------------------------------------- ");
for(i=0;i<num;i++)
{
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f ",students[i].ID,students[i].Name,
students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average);
}
}/*將學生信息從文件讀出*/
voidIO_ReadInfo()
{
FILE*fp;
inti;
if((fp=fopen("Database.txt","rb"))==NULL)
{
printf("不能打開文件! ");
return;
}
if(fread(&num,sizeof(int),1,fp)!=1)
{
num=-1;
}
else
{
for(i=0;i<num;i++)
{
fread(&students[i],sizeof(structStudent),1,fp);
}
}
fclose(fp);
}/*將學生信息寫入文件*/
voidIO_WriteInfo()
{
FILE*fp;
inti;
if((fp=fopen("Database.txt","wb"))==NULL)
{
printf("不能打開文件! ");
return;
}
if(fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("寫入文件錯誤! ");
}
for(i=0;i<num;i++)
{
if(fwrite(&students[i],sizeof(structStudent),1,fp)!=1)
{
printf("寫入文件錯誤! ");
}
}
fclose(fp);
}
/*主程序*/
voidmain()
{
intchoice;
IO_ReadInfo();
while(1)
{
/*主菜單*/
printf(" ------學生成績管理系統------ ");
printf("1.增加學生記錄 ");
printf("2.修改學生記錄 ");
printf("3.刪除學生記錄 ");
printf("4.按姓名查詢學生記錄 ");
printf("5.按平均成績排序 ");
printf("6.退出 ");
printf("請選擇(1-6):");
scanf("%d",&choice);
getchar();
switch(choice)
{
case1:
Student_Insert();
break;
case2:
Student_Modify();
break;
case3:
Student_Delete();
break;
case4:
Student_Select();
break;
case5:
Student_SortByAverage();
Student_Display();
break;
case6:
exit(0);
break;
}
IO_WriteInfo();
}
}
</span>
⑷ c語言大作業 學生成績管理系統
給個參考你:
/*編制一個學生成績管理系統,每個學生信息包括:學號、姓名、C語言、高數和英語成績。具體功能:
(1)創建信息鏈表並以磁碟文件保存;
(2)讀取磁碟文件並顯示輸出所有學生的成績;
(3)按學號或姓名查詢成績;
(4)添加成績記錄;
(5)修改指定姓名或學號的學生的成績並可存檔;
(6)顯示輸出60分以下、60~79、80~89、90分以上各分數段的學生信息。以C語言成績為例*/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 20
typedef struct
{
char name[10];
int num;
float c;
float math;
float english;
float aver;
}stu;
//菜單
void menu() /*便於操作員使用*/
{ /*清屏*/
system("cls");
printf(" 學生平時成績管理\n");
printf("=======================\n");
printf(" 1.成績錄入\n");
printf(" 2.計算\n");
printf(" 3.查詢\n");
printf(" 4.修改\n");
printf(" 5.插入\n");
printf(" 6.顯示\n");
printf(" 7.統計\n");
printf(" 8.刪除\n");
printf(" 0.退出\n");
printf("=======================\n");
printf("請選擇相應的功能:");
}
//成績錄入
void input()
{
FILE *fp;
stu xs; /*定義一個結構體變數來裝從文件中讀出來的數據*/
if((fp=fopen("student.dat","ab"))==NULL) {printf("can't open file!\n");exit(0);}
printf("\n錄入格式: 姓名 學號 C語言 高數 英語 當輸入姓名為ps結束錄入\n");
while(1) /*中間加油break,可使循環中斷*/
{
scanf("%s",xs.name);
if(strcmp(xs.name,"ps")==0) break;/*判斷姓名是否為ps,用字元串判斷*/
scanf("%d%f%f%f",&xs.num,&xs.c,&xs.math,&xs.english);
xs.aver=0;/*給平均分變數賦初值*/
fwrite(&xs,sizeof(stu),1,fp); //將成績信息寫入文件
}
fclose(fp);
}
//計算平均分
void sum()
{
int i=0,n;
stu xs[N];
FILE *fp;
if((fp=fopen("student.dat","rb+"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))/*文件讀入內存,讀取指針未到文件尾時返回值為0,讀到尾時返回值為1,加!取反後,結束即為0*/
{
fread(&xs[i],sizeof(stu),1,fp);/*讀入結構體變數*/
if(feof(fp)) break;/*上面while循環那個會多讀一次因為讀到尾時那個0還沒返回,這里判斷如果以讀到文件尾,則直接停止,避免重復輸入*/
xs[i].aver=(xs[i].c+xs[i].math+xs[i].english)/3;
i++;
}
n=i;/*把i的末尾值給n,用於下面循環寫入*/
i=0;
fclose(fp);
if((fp=fopen("student.dat","wb"))==NULL) {printf("can't open file!\n");exit(0);}
while(i<n)
{
fwrite(&xs[i],sizeof(stu),1,fp);
i++;
}
fclose(fp);
}
void xingming()
{
FILE *fp;
stu xs;
char name[10];
printf("\n輸入要查學生的姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*按姓名查詢時判斷輸入的姓名是否存在,會循環從數據中找取*/
{
printf(" 學生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","學號","C語言","高數"," 英語","平均成績");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
break;
}
}
if(feof(fp)) printf("查找失敗!!!"); /*學生不存在*/
fclose(fp);
}
void xuehao()
{
FILE *fp;
stu xs;
int num;
printf("\n輸入要查學生的學號: ");scanf("%d",&num);
if((fp=fopen("student.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(xs.num==num)/*按學號查詢時判斷輸入的學號是否存在,會循環從數據中找取*/
{
printf(" 學生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","學號","C語言","高數"," 英語","平均成績");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
break;
}
}
if(feof(fp)) printf("查找失敗!!!");
fclose(fp);
}
//查詢
void search()
{
char ch1;
system("cls");
printf("請輸入按何種方式查詢:\n");
printf("1-姓名,2-學號:");
ch1=getchar();/*用字元接收*/
switch(ch1)/*判斷*/
{
case '1':xingming();break;
case '2':xuehao();break;
}
getch();/*讓屏幕停留同時按任意鍵返回*/
}
//修改:輸入學生的姓名,查找該學生,若找到則修改該生的成績信息,並顯示修改前後的結果;
void modi()
{
stu xs;
FILE *fp;
char name[10];
system("cls");
printf("\n輸入要查學生的姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs,sizeof(stu),1,fp);
if(strcmp(xs.name,name)==0)/*判斷輸入要修改的姓名是否存在*/
{
printf(" 修改前學生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","學號","C語言","高數"," 英語","平均成績");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
printf("\n請輸入該生的C語言成績:");scanf("%f",&xs.c);
printf("\n高數成績:");scanf("%f",&xs.math);
printf("\n英語成績:");scanf("%f",&xs.english);
xs.aver=(xs.c+xs.math+xs.english)/3;
break;
}
}
if(!feof(fp))
{
printf(" \n 修改後的學生的信息如下:\n");
printf("\n%10s %6s %6s %6s %6s %6s\n","姓名","學號","C語言","高數"," 英語","平均成績");
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",xs.name,xs.num,xs.c,xs.math,xs.english,xs.aver);
fseek(fp,sizeof(-stu),1);/*負號表示後退,1表示文件當前位置*/
fwrite(&xs,sizeof(stu),1,fp);/*再寫入,同時把要修改的那個覆蓋掉*/
}
else
printf("\n學生不存在,修改失敗!!");
fclose(fp);
getch();
}
//插入:輸入學生的平時的各項成績,插入到指定位置;當指定的位置超出范圍時,將其插入到全班的最後,並顯示插入成功後的結果。
void insert()
{
int i=0,j,k,lenth;
FILE *fp;
stu s,xs[N];
system("cls");
printf("\n請輸入插入的學生的姓名:");scanf("%s",&s.name);
printf("\n學生的學號:");scanf("%d",&s.num);
printf("\n學生的C成績:");scanf("%f",&s.c);
printf("\n高數成績:");scanf("%f",&s.math);
printf("\n英語成績:");scanf("%f",&s.english);
s.aver=(s.c+s.math+s.english)/3;
printf("\n插入位置:");scanf("%d",&k);
// i=0;
if((fp=fopen("student.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs[i],sizeof(stu),1,fp);/*把數據讀入到結構體數組中*/
if(feof(fp)) break;
i++;
}
fclose(fp);
lenth=i;
if(k<lenth && k>=0)/*k的位置要位於數組范圍之內*/
{//插入
for(j=lenth-1;j>=k;j--)
xs[j+1]=xs[j];/*一開始j是最大的,往後移一個這樣移動避免數據被覆蓋*/
/*循環是只循環這一句的*/
xs[k]=s;/*將輸入的學生信息加入這個k位置*/
lenth++;/*長度+1*/
//寫回
if((fp=fopen("student.dat","wb"))==NULL) {printf("不能建立文件!!\n");exit(0);}
for(i=0;i<lenth;i++)
fwrite(&xs[i],sizeof(stu),1,fp);
}
else/*不再數組范圍之內*/
{
if((fp=fopen("student.dat","ab"))==NULL) {printf("不能建立文件!!\n");exit(0);}
fwrite(&s,sizeof(stu),1,fp);
}
fclose(fp);
}
//顯示
void print()
{
FILE *fp;
stu s;
system("cls");
if((fp=fopen("student.dat","rb"))==NULL) {printf("can't open file!\n");exit(0);}
printf("\n%10s %s %6s %6s %6s %6s\n","姓名","學號","C語言","高數"," 英語","平均成績");
while(!feof(fp))
{
fread(&s,sizeof(stu),1,fp);//從文件中讀取成績信息
if(feof(fp)) break;//判斷是否文件尾
printf("%10s %6d %6.2f %6.2f %6.2f %6.2f\n",s.name,s.num,s.c,s.math,s.english,s.aver);
}
fclose(fp);
getch();
}
//統計
void tongji()
{
int i=0,j=0,k=0,l=0,m=0,n,p,q,r,t,u;
FILE *fp;
stu s[N], *p1[N],*p2[N],*p3[N],*p4[N];/*用指針數組*/
system("cls");
if((fp=fopen("student.dat","rb"))==NULL) {printf("cant't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&s[i++],sizeof(stu),1,fp);/*讀入數據*/
if(feof(fp)) break;
}
t=i;i=0;
for(u=0;u<t;u++)/*以下每個指針數組用於指向各分數段的學生信息*/
{
if(s[i].c<60) {p1[j++]=&s[i++];continue;}/*每個學生信息只能位於一個分數段*/
if(s[i].c>=60&&s[i].c<80) {p2[k++]=&s[i++];continue;}
if(s[i].c>=80&&s[i].c<90) {p3[l++]=&s[i++];continue;}
if(s[i].c>=90) {p4[m++]=&s[i++];continue;}
}
printf("不及格:姓名 學號 C語言\n");
for(n=0;n<j-1;n++)
{
printf("%10s %6d %6.2f\n",p1[n]->name,p1[n]->num,p1[n]->c);
}
printf("60-79:姓名 學號 C語言\n");
for(p=0;p<k;p++)
{
printf("%10s %6d %6.2f\n",p2[p]->name,p2[p]->num,p2[p]->c);
}
printf("80-89:姓名 學號 C語言\n");
for(q=0;q<l;q++)
{
printf("%10s %6d %6.2f\n",p3[q]->name,p3[q]->num,p3[q]->c);
}
printf("90以上:姓名 學號 C語言\n");
for(r=0;r<m;r++)
{
printf("%10s %6d %6.2f\n",p4[r]->name,p4[r]->num,p4[r]->c);
}
fclose(fp);
getch();
}
//刪除:輸入學生姓名,若該學生存在,則刪除,並顯示刪除後餘下的學生成績信息
void dele()
{
stu xs[N];
FILE *fp;
char name[10];
int i=0,len,k=-1/*k<0是為後面if判斷用的*/;
system("cls");
printf("\n輸入要刪除的學生姓名: ");scanf("%s",name);
if((fp=fopen("student.dat","rb+"))==NULL) {printf("can't open file!\n");exit(0);}
while(!feof(fp))
{
fread(&xs[i],sizeof(stu),1,fp);
if(feof(fp)) break;
if(strcmp(xs[i].name,name)==0) k=i;
i++;
}
fclose(fp);
//以下是刪除後重新寫文件
len=i;/*結構體數組上限*/
if(k>=0)/*k>0說明找到刪除學生位置*/
{
if((fp=fopen("student.dat","wb+"))==NULL) {printf("can't open file!\n");exit(0);}
for(i=0;i<len;i++)
{
if(i==k) continue;/*從這個位置開始寫入*/
fwrite(&xs[i],sizeof(stu),1,fp);
}
fclose(fp);
}
else {printf("刪除失敗!!!\n");getch();} /*失敗後重新返回菜單*/
print();
}
//菜單選擇
void main()
{
char ch;
while(1)
{
menu();// 顯示菜單
ch=getch();//選擇菜單
if(ch=='0') break;
switch(ch)//判斷功能項
{
case '1':input();break;
case '2':sum();break;
case '3':search();break;
case '4':modi();break;
case '5':insert();break;
case '6':print( );break;
case '7':tongji();break;
case '8':dele();break;
}
}
printf("\n歡迎使用!!!\n");
}
⑸ 用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標准新增)
⑹ 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
#include
#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);
}