西安科技大学
计算机技能训练报告
学院 电气与控制工程学院
学号 1206080116__
姓名 ___
班级 微电子学1201__
日期 _2013.12.25___
一、设计目的和任务
(1)设计目的
1. 更深入的理解和掌握该课程中的基本概念,程序设计的思想、技术和方法。
2. 训练学生综合运用所学知识独立完成课题以及撰写课程设计报告的能力。
3. 提高查询资料文献,从中获得新知识的能力。
4. 培养 实践动手能力,利用理论去解决实际问题的能力。
(2)设计任务
1本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、M门课程名称。
2本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
1)显示每门课程成绩最高的学生的基本信息
2)显示每门课程的平均成绩
3)显示超过某门课程平均成绩的学生人数
g、退出系统
3执行一个具体的功能之后,程序将重新显示菜单。
4 将学生成绩保存到文件中。
二、总体设计
此程序根据不同的功能设计几个模块,写成相应的函数,然后利用函数的调用来实现。
模块(1):编辑 由老师从键盘输入成绩并存于文件中
模块(2):显示 从文件中删除已存的学生信息
模块(4):查询 可通过三种不同的方式查询成绩
模块(5):统计 对已输入的成绩进行排序
模块(6):文件 从文件中导出已输入的数据
三、详细设计
1)结构体数组:存储学生个人信息
typedef struct
{
char num[10];
char name[10];
int chinese;
int math;
int english;
int dianlu;
double aver;
}Student;
Student stu[99];
(2)int shuliang(统计录入的总人数)rs(统计录入的人数),i,k(循环变量)xx(学号) choice(需要删除的学生的学号)
(3)数组: biaozhi[20](记录用的选择) yy[20](记录学生的姓名)shanchuinfo[10](判定是否删除学生的全部信息还是部分信息)
(4)int shuru(Student stud[],int n)/*输入若干条记录*/
{
int i=0;
char sign,x[10];
double a=0.0;
while(sign!='n'&&sign!='N')
{
printf("输入学生学号:");
scanf("%s",stu[n+i].num);
printf("输入学生姓名:");
scanf("%s",stu[n+i].name);
printf("输入学生的语文、数学、英语、电路分数:");
scanf("%d%d%d%d",&stu[n+i].chinese,&stu[n+i].math,&stu[n+i].english,&stu[n+i].dianlu);
a=1.0*(stu[n+i].chinese+stu[n+i].math+stu[n+i].english+stu[n+i].dianlu)/4;
stu[n+i].aver=a;
gets(x); /*清除多余的输入*/
printf("是否继续输入?(Y/N):\n");
scanf("%c",&sign);
i++;
}
return(n+i);
}
四.调试
在调试程序的过程中出过一些错误,有事吧中英文标点符号弄混了,导致出现错误却很难找出,只得全部替换。当有其他问题是找同学帮自己改。通过上机发现错误称为动态检查。在编译时会给出语法错误的信息,调试时可以根据提示信息具体找出程序中出错之处并改正。应当注意的是有时提示出错的地方并不是真正出错的位置,如果在提示出错的行找不到错误的话应当到上一行再找。有时提示出错的类型并非绝对准确,由于出错的情况繁多且各种错误互有关联,因此要善于分析,找出真正的错误,而不要只从字面意义上找出错信息,钻牛角尖。当系统提示的出错信息很多,应当从上到下逐一改正。有时显示出一大片出错信息往往使人感到问题严重,无从下手。其实可能只有一二个错误。例如,对使用的变量未定义,编译时就会对所有含该变量的语句发出出错信息。这时只要加上一个变量定义,就所有错误都消除了。如果实在找不到错误,可以采用“分段检查”的方法。在程序不同的位置设几个printf函数语句,输出有关变量的值,逐段往下检查。直到找到在某一段中数据不对为止。这时就已经把错误局限在这一段中了。不断减小“查错区”,就能发现错误所在。
五、源程序清单和执行结果
#include"stdio.h"
#include<stdlib.h>
#include<string.h>
#include"process.h"
#include"ctype.h"
typedef struct
{
char num[10];
char name[10];
int chinese;
int math;
int english;
int dianlu;
double aver;
}Student;
Student stu[99];
int shuru(Student stud[],int n)/*输入若干条记录*/
{
int i=0;
char sign,x[10];
double a=0.0;
while(sign!='n'&&sign!='N')
{
printf("输入学生学号:");
scanf("%s",stu[n+i].num);
printf("输入学生姓名:");
scanf("%s",stu[n+i].name);
printf("输入学生的语文、数学、英语、电路分数:");
scanf("%d%d%d%d",&stu[n+i].chinese,&stu[n+i].math,&stu[n+i].english,&stu[n+i].dianlu);
a=1.0*(stu[n+i].chinese+stu[n+i].math+stu[n+i].english+stu[n+i].dianlu)/4;
stu[n+i].aver=a;
gets(x); /*清除多余的输入*/
printf("是否继续输入?(Y/N):\n");
scanf("%c",&sign);
i++;
}
return(n+i);
}
void xianshi(Student stud[],int n) /*显示所有记录*/
{
int i ;
printf("----------------------------------------------------------\n"); /*格式头*/
printf("学号 姓名 语文 数学 英语 电路 平均成绩 \n");
printf("----------------------------------------------------------\n");
for(i=0;i<n;i++)
{
printf("%-10s%-10s%-10d%-10d%-10d%-10d%-10.2lf\n",stu[i].num,stu[i].name,stu[i].chinese,stu[i].math,stu[i].english,stu[i].dianlu,stu[i].aver);
}
}
void xiugai(Student stud[],int n)/*修改*/
{
int i=0,choice=1;
char x[10];
while(choice!=0)
{ printf("请输入您要修改的学生的学号:\n");
scanf("%s",x);
for(i=0;;i++)
{
if(strcmp(stu[i].num,x)==0) break;
}
printf("请选择您要修改的内容:\n");
printf(" ---------------------- \n");
printf("| 姓名 请按 1 |\n");
printf("| 语文 请按 2 |\n");
printf("| 数学分数 请按 3 |\n");
printf("| 英语分数 请按 4 |\n");
printf("| 电路 请按 5 |\n");
printf("| 退出 请按 0|\n");
printf("+----------------------+\n");
printf("请输入您的选择:");
scanf("%d", &choice);
switch(choice)
{
case 0:break;
case 1:
printf("请输入新姓名:");
scanf("%s", stu[i].name);
break;
case 2:
printf("请输入新的语文分数:");
scanf("%d", &stu[i].chinese);
break;
case 3:
printf("请输入新的数学分数:");
scanf("%d",&stu[i].math);
break;
case 4:
printf("请输入新的英语分数:");
scanf("%d", &stu[i].english);
break;
case 5:
printf("请输入新的电路分数:");
scanf("%d", &stu[i].dianlu);
break;
default:
printf("\n无效选项!");
break;
} break;
}
return;
}
int shanchu(Student stud[],int n) /*按姓名查找,删除一条记录*/
{ char s[20];
int i;
int j;
i=0;
printf("输入要删除记录的姓名:");
scanf("%s",s);
while(strcmp(stu[i].name,s)!=0&&i<n) i++;
if(i==n)
{printf("not find!\n");
return(n); }
for(j=i;j<n-1;j++) /*删除操作*/
{
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j].name,stu[j+1].name);
stu[j].chinese=stu[j+1].chinese;
stu[j].math=stu[j+1].math;
stu[j].english=stu[j+1].english;
stu[j].dianlu=stu[j+1].dianlu;
stu[j].aver=stu[j+1].aver;
}
printf("Delete Successed!\n");
return(n-1);
}
void chaxun_xingming(Student stud[],int n) /*按姓名查找并显示一个记录*/
{ char s[20];
int i=0;
printf("输入姓名:");
scanf("%s",s);
while(strcmp(stu[i].name,s)!=0&&i<n) i++; /*查找判断*/
if(i==n)
{printf("not find!\n"); /*输入失败信息*/
return; }
printf("他的姓名、学号是:%s %s\n",stu[i].name,stu[i].num); /*输出该学生信息*/
printf("语文 高数 英语 电路 平均成绩是:%d,%d,%d,%d,%lf\n",stu[i].chinese,stu[i].math,stu[i].english,stu[i].dianlu,stu[i].aver);
}
void chaxun_pingjun(Student stud[],int n) /*按平均成绩查找并显示一个记录*/
{ double s;
int i=0;
printf("输入平均成绩:");
scanf("%lf",&s);
while(stu[i].aver!=s && i<n) i++;
if(i==n)
{ printf("not find!\n"); /*输入失败信息*/
return;
}
printf("他的学号是:%s\n",stu[i].num); /*输出该学生信息*/
printf("他的姓名是:%s\n",stu[i].name);
printf("他的语文、数学、英语、电路分数是:%d %d %d %d \n",stu[i].chinese,stu[i].math,stu[i].english,stu[i].dianlu);
}
void paixu_xuehao(Student stud[],int n) /*按学号排序*/
{ int i,j,p,q,r,w;
double y;
char x[20],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].num);
strcpy(stud[j].num,stud[j+1].num);
strcpy(stud[j+1].num,t);
strcpy(x,stud[j].name);
strcpy(stud[j].name,stud[j+1].name);
strcpy(stud[j+1].name,x);
y=stu[j].aver;stu[j].aver=stu[j+1].aver;stu[j+1].aver=y;
p=stu[j].chinese;stu[j].chinese=stu[j+1].chinese;stu[j+1].chinese=p;
q=stu[j].math;stu[j].math=stu[j+1].math;stu[j+1].math=q;
r=stu[j].english;stu[j].english=stu[j+1].english;stu[j+1].english=r;
w=stu[j].dianlu;stu[j].dianlu=stu[j+1].dianlu;stu[j+1].dianlu=w;
}
return;
}
void paixu_pingjun(Student stud[],int n) /*按平均成绩排序*/
{ int i,j,p,q,r,w;
double y;
char x[20],t[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(stu[j].aver>stu[j+1].aver)
{ y=stu[j].aver;stu[j].aver=stu[j+1].aver;stu[j+1].aver=y;
p=stu[j].chinese;stu[j].chinese=stu[j+1].chinese;stu[j+1].chinese=p;
q=stu[j].math;stu[j].math=stu[j+1].math;stu[j+1].math=q;
r=stu[j].english;stu[j].english=stu[j+1].english;stu[j+1].english=r;
w=stu[j].dianlu;stu[j].dianlu=stu[j+1].dianlu;stu[j+1].dianlu=w;
strcpy(x,stu[j].name);
strcpy(stu[j].name,stu[j+1].name);
strcpy(stu[j+1].name,x);
strcpy(t,stu[j].num);
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j+1].num,t);
}
return;
}
void paixu_chinese(Student stud[],int n) /*按语文成绩排序*/
{ int i,j,p,q,r,w;
double y;
char x[20],t[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(stu[j].chinese>stu[j+1].chinese)
{
y=stu[j].aver;stu[j].aver=stu[j+1].aver;stu[j+1].aver=y;
p=stu[j].chinese;stu[j].chinese=stu[j+1].chinese;stu[j+1].chinese=p;
q=stu[j].math;stu[j].math=stu[j+1].math;stu[j+1].math=q;
r=stu[j].english;stu[j].english=stu[j+1].english;stu[j+1].english=r;
w=stu[j].dianlu;stu[j].dianlu=stu[j+1].dianlu;stu[j+1].dianlu=w;
strcpy(x,stu[j].name);
strcpy(stu[j].name,stu[j+1].name);
strcpy(stu[j+1].name,x);
strcpy(t,stu[j].num);
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j+1].num,t);
}
return;
}
void paixu_english(Student stud[],int n) /*按英语成绩排序*/
{ int i,j,p,q,r,w;
double y;
char x[20],t[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(stu[j].english>stu[j+1].english)
{
y=stu[j].aver;stu[j].aver=stu[j+1].aver;stu[j+1].aver=y;
p=stu[j].chinese;stu[j].chinese=stu[j+1].chinese;stu[j+1].chinese=p;
q=stu[j].math;stu[j].math=stu[j+1].math;stu[j+1].math=q;
r=stu[j].english;stu[j].english=stu[j+1].english;stu[j+1].english=r;
w=stu[j].dianlu;stu[j].dianlu=stu[j+1].dianlu;stu[j+1].dianlu=w;
strcpy(x,stu[j].name);
strcpy(stu[j].name,stu[j+1].name);
strcpy(stu[j+1].name,x);
strcpy(t,stu[j].num);
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j+1].num,t);
}
return;
}
void paixu_math(Student stud[],int n) /*按数学成绩排序*/
{ int i,j,p,q,r,w;
double y;
char x[20],t[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(stu[j].math>stu[j+1].math)
{
y=stu[j].aver;stu[j].aver=stu[j+1].aver;stu[j+1].aver=y;
p=stu[j].chinese;stu[j].chinese=stu[j+1].chinese;stu[j+1].chinese=p;
q=stu[j].math;stu[j].math=stu[j+1].math;stu[j+1].math=q;
r=stu[j].english;stu[j].english=stu[j+1].english;stu[j+1].english=r;
w=stu[j].dianlu;stu[j].dianlu=stu[j+1].dianlu;stu[j+1].dianlu=w;
strcpy(x,stu[j].name);
strcpy(stu[j].name,stu[j+1].name);
strcpy(stu[j+1].name,x);
strcpy(t,stu[j].num);
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j+1].num,t);
}
return;
}
void paixu_dianlu(Student stud[],int n) /*按电路成绩排序*/
{ int i,j,p,q,r,w;
double y;
char x[20],t[10];
for(i=0;i<n-1;i++) /*冒泡法排序*/
for(j=0;j<n-1-i;j++)
if(stu[j].dianlu>stu[j+1].dianlu)
{
y=stu[j].aver;stu[j].aver=stu[j+1].aver;stu[j+1].aver=y;
p=stu[j].chinese;stu[j].chinese=stu[j+1].chinese;stu[j+1].chinese=p;
q=stu[j].math;stu[j].math=stu[j+1].math;stu[j+1].math=q;
r=stu[j].english;stu[j].english=stu[j+1].english;stu[j+1].english=r;
w=stu[j].dianlu;stu[j].dianlu=stu[j+1].dianlu;stu[j+1].dianlu=w;
strcpy(x,stu[j].name);
strcpy(stu[j].name,stu[j+1].name);
strcpy(stu[j+1].name,x);
strcpy(t,stu[j].num);
strcpy(stu[j].num,stu[j+1].num);
strcpy(stu[j+1].num,t);
}
return;
}
void tongji(Student stud[],int n)//按分数段统计人数
{ int i,j,a,max,min,k,l,q,p,w;
k=0,l=0,p=0,q=0,w=0;
printf("你想统计哪科成绩: 1语文 2数学 3英语 4电路 5平均 \n");
scanf("%d",&j);
printf("input 2 score:\n");
scanf("%d%d",&max,&min);
if(max<min)
{
a=max;max=min;min=a;
}
if(j==1)
{
for(i=0;i<99;i++)
{
if(stu[i].chinese>min&&stu[i].chinese<max) k++;
}
printf("分数段的人数为 :%d",k);
}
else if(j==2)
{
for(i=0;i<99;i++)
{
if(stu[i].math>min&&stu[i].math<max) l++;
}
printf("分数段的人数为 :%d",l);
}
else if(j==3)
{
for(i=0;i<99;i++)
{
if(stu[i].english>min&&stu[i].english<max) p++;
}
printf("分数段的人数为 :%d",p);
}
else if(j==4)
{
for(i=0;i<99;i++)
{
if(stu[i].dianlu>min&&stu[i].dianlu<max)
w++;
}
printf("分数段的人数为 :%d",w);
}
else if(j==5)
{
for(i=0;i<99;i++)
{
if(stu[i].aver>min&&stu[i].aver<max) q++;
}
printf("分数段的人数为 :%d",q);
}
return;
}
int wenjian2(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 %d %d %d %lf\n",stu[n+i].num,stu[n+i].name,&stu[n+i].chinese,&stu[n+i].math,&stu[n+i].english,&stu[n+i].dianlu,&stu[n+i].aver);
i++;
}
n+=num;
fclose(fp); /*关闭文件*/
printf("\t\t\tSuccessed!\n");
printf("\t\t\t");
system("pause");
return(n);
}
void wenjian1(Student stud[],int n) /*将所有记录写入文件*/
{
int i=0;
FILE *fp; /*定义文件指针*/
char filename[20]; /*定义文件名*/
printf("Input the filename:");/*输入文件名*/
scanf("%s",filename);
if((fp=fopen(filename,"w"))==NULL) /*打开文件*/
{
printf("cann't open the file\n");
return;
}
fprintf(fp,"%d\n",n); /*循环写入数据*/
while(i<n)
{
fprintf(fp,"%s %s %d %d %d %d %lf\n",stu[i].num,stu[i].name,stu[i].chinese,stu[i].math,stu[i].english,stu[i].dianlu,stu[i].aver);
i++;
}
fclose(fp); /*关闭文件*/
printf("Successed!\n"); /*返回成功信息*/
}
int menu() /*菜单函数*/
{
int c;
do{
printf("\t\t****学生信息管理系统菜单****\n");
printf("\t\t 1. 编辑 \n");
printf("\t\t 2. 显示 \n");
printf("\t\t 3. 查询 \n");
printf("\t\t 4. 排序\n");
printf("\t\t 5. 统计\n");
printf("\t\t 6. 文件 \n");
printf("\t\t 0. 退出 \n");
printf("************************************************************\n");
printf("\t\t\t请选择(0-6):");
scanf("%d",&c);
}while(c<0||c>6);
return(c-0); /*返回选择*/
}
int bianji()
{
printf("\t\t 1. 录入\n");
printf("\t\t 2 .修改\n");
printf("\t\t 3. 删除 \n");
printf("\t\t 按其它数字键退出 \n");
int i;
scanf("%d",&i);
return i;
}
int chaxun()
{
printf("\t\t 1. 按姓名查询\n");
printf("\t\t 2 .按平均成绩查询\n");
printf("\t\t 按其它数字键退出\n");
int i;
scanf("%d",&i);
return i;
}
int paixu()
{
printf("\t\t 1. 按学号\n");
printf("\t\t 2 .按语文成绩\n");
printf("\t\t 3 .按数学成绩\n");
printf("\t\t 4 .按英语成绩\n");
printf("\t\t 5 .按电路成绩\n");
printf("\t\t 6 .按平均成绩\n");
printf("\t\t按其它数字键退出\n");
int i;
scanf("%d",&i);
return i;
}
int wenjian()
{
printf("\t\t 1. 从文件中读入数据\n");
printf("\t\t 2 .将所有记录写入文件\n");
printf("\t\t 按其它数字键退出 \n");
int i;
scanf("%d",&i);
return i;
}
void main() /*主函数*/
{
int n=0;
for(;;)
{
for(;;)
{
switch(menu())
{
case 1: switch(bianji())
{
case 1:n=shuru(stu,n);xianshi(stu,n); break;
case 2:xiugai(stu ,n);xianshi(stu,n); break;
case 3:shanchu(stu ,n);xianshi(stu,n); break;
} break;
case 2:xianshi(stu,n);break;
case 3:
switch(chaxun())
{
case 1:chaxun_xingming(stu,n);break;
case 2:chaxun_pingjun(stu ,n);break;
} break;
case 4: switch(paixu())
{
case 1:paixu_xuehao(stu,n);xianshi(stu,n); break ;
case 2:paixu_chinese(stu ,n);xianshi(stu,n);break;
case 3:paixu_math(stu ,n);xianshi(stu,n); break;
case 4:paixu_english(stu ,n);xianshi(stu,n); break;
case 5:paixu_dianlu(stu ,n);xianshi(stu,n); break;
case 6:paixu_pingjun(stu ,n);xianshi(stu,n); break;
} break;
case 5:tongji(stu,n);break;
case 6:
switch(wenjian())
{
case 1:n=wenjian2(stu,n);break;
case 2:wenjian1(stu ,n);break;
} break;
case 0:
exit(0); /*结束程序*/
}
}
}
}
六、总结
通过这一周的计算机能力训练,我了解到训练计算机能力是从一个有待解决的问题着手,设计一个可行的方案,方便我们更好更快的解决一些繁琐的问题。计算机是一门紧紧与计算机技术联系的课程,是除计算机专业以外其他许多专业学习掌握计算机技术的一种重要语言。科学技术与人类社会日益进步,计算机与技术已渗透到各行各业,其中C语言就是其中应用面最广的语言之一。C语言简洁.高效.紧凑.灵活.实用,其课程设计注重思维方式的培养,在大量阅读程序之后,了解各种函数变量.指针等的用法,把自己的思想用C语言表述出来,解决实际问题。学习C语言同时也锻炼了我们动手能力,扩大了我们的阅读量,使我们有了除课本之外不小的收获。这两周的计算机能力训练虽然没有多少课时,却锻炼了我们的能力,教会我们去寻找解决问题办法,对我们的学习生活具有重要意义。