c语言课程设计报告.docx
《c语言课程设计报告.docx》由会员分享,可在线阅读,更多相关《c语言课程设计报告.docx(41页珍藏版)》请在冰点文库上搜索。
c语言课程设计报告
C程序课程设计报告
一课程设计目的与任务
根据高教委的要求,高校学生必须具备扎实的计算机基础知识,具有较强的程序设计和软件开放能力,特别对计算机专业及相关专业的学生要求尤高。
安排此课程设计的目的,就是通过一次集中强化训练,使学生及时巩固已学的知识,补充未学的但又是必需的内容,进一步提高程序设计能力。
二课程设计内容
1-运行环境windows2000/xpVC++6.0
2-上机练习本人共调试运行了12道课后练习题,其中包括5.1节——5.4节各两道,5.5节一道,5.7节综合练习3道。
现将题目、设计思路、C原程序、注释、输入及运行输出结果的截屏整理成如下文档。
5.1循环及分支
5.13练习
(1)用递推法计算当x=0.5时下述级数的近似值,使其误差小于某一指定的值epsilon(例如:
epsilon=0.000001),即:
【设计思路】
由题意知表达式中的相邻两项存在下述数学关系
后项=前项
【程序】
#include"stdafx.h"
#include"stdio.h"
#include
voidmain()
{
floata,b,x=0.5;
inti;
a=x;b=x;
printf("\n当x=0.5时\n",b);
for(i=1;fabs(a)>1e-6;i++)/*当表达式中的某一项a的绝对值小于0.000001时进行循环*/
{
a=a*(-1)*x*x*(2*(i-1)+1)/((2*i+1)*i);/*找出级数中相邻两项之间的关系以便递推*/
b=b+a;/*将级数的每一项累加起来*/
}
printf("\n所求级数b=%f\n",b);
}
【输出结果截屏】
(4)用测试法求三色球问题。
若一个口袋中方有12个球,其中有3个红的,3个白的和6个黑的,从中任取8个球,问共有多少中不同的颜色搭配?
【设计思路】
红球的个数为x(0≤x≤3),白球的个数为y(0≤x≤3),黑球个数z=8-x-y,采用两个for语句并嵌套,测试出所有组合方式。
【程序】
#include"stdafx.h"
#include"stdio.h"
main()
{
intx,y,z,count=0;
printf("组合方式为:
");
for(x=0;x<=3;x++)
for(y=0;y<=3;y++)
{
z=8-x-y;
if(z<=6)
{
printf("\n红球%d个,白球%d个,黑球%d个",x,y,z);
count++;
}
}
printf("\n共有%d种组合\n",count);
}
【输出结果截屏】
5.2数组及函数
5.23练习
(1)编写函数,分别计算N*N方阵的主对角线元素之和及次对角线元素之和。
【设计思路】
1.由于N的大小未知,因此定义一个b[50][50]用来存放行列数在50之内的方阵,
输入行列数n,从而确定要使用b[50][50]的范围的大小。
2.创建以本人姓名命名的函数zhangbuyang()用于:
将满足“行数”=“列数”的数加起来,从而求得主对角线之和,将满足“行数”+“列数”=n-1的数加起来,从而求得次对角线之和。
【程序】
#include"stdafx.h"
#include"stdio.h"
voidzhangbuyang(inta[][50],intn)/*以本人姓名命名的函数用来分别求两对角线之和*/
{
inti,j,s=0,sum=0;
for(i=0;ifor(j=0;j{
if(i==j)s=s+a[i][j];/*求主对角线之和*/
if(i+j==n-1)sum=sum+a[i][j];/*求次对角线之和*/
}
printf("\n所求方阵主对角线之和%d",s);
printf("\n所求方阵次对角线之和%d\n",sum);
}
voidmain()
{
inti,j,b[50][50],n;/*定义b[50][50]用于存放要输入的数据*/
printf("请输入整数方阵的行列数\n");
scanf("%d",&n);
printf("请输入一个%dX%d的整数方阵\n",n,n);
for(i=0;i{
printf("请输入第%d行\n",i+1);/*输入完一行后出现输入下一行的提示*/for(j=0;j<4;j++)scanf("%d",&b[i][j]);
}
zhangbuyang(b,n);/*调用zhangbuyang函数求解*/
}
【输出结果截屏】
(2)编写函数,将一整数数列按奇数在前,偶数在后的顺序重新排放,并要求奇偶两部分分别有序。
【设计思路】
1.宏定义数组长度确定要输入的整数个数
2.创建以本人姓名命名的函数zhangbuyang()用于排序:
首先将a[10]的数据从头到尾判断是否为奇数,若为奇数则放入b[10]中,并记录下奇数的个数n,再次将a[10]从头到尾进行判断是否为偶数,若是偶数则放入b[10]的后面项。
然后用选择法分别对b[10]的前n-1(b[10]的第一项为b[0],所以不是n)项和剩下的项分别进行排序。
【程序】
#include"stdafx.h"
#include"stdio.h"
#defineN10/*宏定义确定数组长度*/
voidzhangbuyang(inta[])/*以本人姓名命名的函数用来分离奇数和偶数项,并分别排序*/
{
inti,j=0,k,m,n,t,b[10];
for(i=0;i=0)b[j++]=a[i];n=j-1;}/*分离出奇数项*/
for(i=0;ifor(i=0;ifor(k=i+1;kif(b[i]>b[k])
{
t=b[i];
b[i]=b[k];
b[k]=t;
}
for(i=k+1;ifor(j=i+1;jif(b[i]>b[j])
{
t=b[i];
b[i]=b[j];
b[j]=t;
}
printf("\n整理后的数组为\n");
for(i=0;i<10;i++)
printf("%d",b[i]);
printf("\n");
}
voidmain()
{
inta,i,c[N];
a=N;
printf("请输入%d个整数\n",a);
for(i=0;izhangbuyang(c);/*调用zhangbuyang函数排序*/
}
【输出结果截屏】
5.3指针
5.3.3练习
(1)编写函数,该函数同时求出一元二次方程的两个实根和虚跟,然后编写主函数输入方程的系数a,b,c的值,并调用该函数求根,最后在主函数中输出结果。
【设计思路】
对于求根函数zhangbuyang():
用3个不同指针指向一元二次方程的系数,用两个指针指向两个实根,用1个指针指向虚根的实部,用两个指针指向两个虚根的虚部。
由数学知识知Δ=
首先对Δ进行判断,若Δ
0则
并return1,若Δ<0则
并return0。
在主函数中对返回值进行判断若是1则输出实根,若是0则输出虚根。
【程序】
#include"stdafx.h"
#include"stdio.h"
#include"math.h"
floatzhangbuyang(float*d,float*e,float*f,float*x1,float*x2,float*x3,float*x4,float*x5)
{/*以上指针分别用来指向一元二次方程的三个系数,两个实根及虚根的实部和两个虚部*/
floatg;
g=(*e)*(*e)-4*(*d)*(*f);/*求Δ*/
if(g>=0)/*当Δ
0时求得两实根,并返回1*/
{
*x1=(-*e+sqrt(g))/(2*(*d));
*x2=(-*e-sqrt(g))/(2*(*d));
return
(1);
}
else/*当Δ
0时求得两虚根,并返回0*/
{
*x3=-*e/(2*(*d));
*x4=sqrt(-g)/(2*(*d));
*x5=-sqrt(-g)/(2*(*d));
return(0);
}
}
voidmain()
{
floata,b,c,x1,x2,x3,x4,x5;
printf("一元二次方程的标准式为ax^2+bx+c=0");
printf("\n请输入系数a\n");
scanf("%f",&a);
printf("\n请输入系数b\n");
scanf("%f",&b);
printf("\n请输入系数c\n");
scanf("%f",&c);
if(zhangbuyang(&a,&b,&c,&x1,&x2,&x3,&x4,&x5))
{/*对返回值进行判断,若为1输出实根,否则输出虚根*/
printf("该方程有实根x1和x2");
printf("\nx1=%f",x1);
printf("\nx2=%f\n",x2);
}
else
{
printf("该方程有虚根x1和x2");
printf("\nx1=%f+(%f)i",x3,x4);
printf("\nx2=%f+(%f)i\n",x3,x5);
}
}
【输出结果截屏】
(2)编写一个函数,这个函数同时求出n个学生成绩的最高分、最低分、平均分以及超过平均分的人数,并编写主函数完成:
①输入n个学生的成绩;
②调用此函数进行统计;
③输出统计结果。
(要求使用动态分配)
【设计思路】
首先输入学生的人数,然后根据学生人数开辟出动态分配空间。
然后调用求解函数zhangbuyang(),将学生分数、人数、最大值、最小值,平均值及超过平均分的人数的地址传输给上述函数。
【程序】
#include"stdafx.h"
#include"malloc.h"
#include"stdio.h"
voidzhangbuyang(int*score,intn,int*max,int*min,float*aver,int*num)
{/*将分数、人数、最大值、最小值、平均值、超过平均分的人数的地址传递给函数中相应指针*/
inti;
*aver=0;
*max=score[0];
*min=score[0];
for(i=0;i{
if(score[i]>*max)
*max=score[i];/*求最大值*/
if(score[i]<*min)
*min=score[i];/*求最大值*/
*aver=*aver+score[i];/*求分数的总和*/
}
*aver=*aver/n;/*求平均值*/
for(i=0;iif(score[i]>*aver)
*num=*num+1;
}
main()
{
inti,n,m,ma,mi,nu,*score,*max,*min,*num;
floatav,*aver;
av=0;
nu=0;
max=&ma;
min=&mi;
aver=&av;
num=ν
printf("\n请输入考生人数\n");
scanf("%d",&n);
score=(int*)malloc(n*sizeof(int));/*开辟动态分配空间*/
if(!
score)
return1;
printf("请输入考生成绩");
for(i=0;izhangbuyang(score,n,max,min,aver,num);/*调用函数求解*/
printf("\n学生成绩的最高分%d",ma);
printf("\n学生成绩的最低分%d",mi);
printf("\n学生成绩的平均分%f",av);
printf("\n超过平均分的人数%d\n",nu);
}
【输出结果截屏】
5.4结构体
5.4.3练习
(1)输入20个学生的学号、姓名、性别及年龄,分别输出男学生中最大年龄的学生信息及女学生中最大年龄的学生信息,并输出男学生人数(要求统计部分用函数实现)。
【设计思路】
定义一个结构体数组用来存放20个学生的信息,对男女生分别进行判断,找出男女生中年龄最大的学生的信息,分别由指针stmmax和指针stfmax指向他们。
最后在主函数中输出。
【程序】
#include"stdafx.h"
#include"stdio.h"
#defineSTUstructstudent
#defineN20
STU/*定义结构体用来存放学生的信息*/
{
intnumber;
charname[20];
charsex;
intage;
};
voidzhangbuyang(STUst[],intn,STU*stmmax,STU*stfmax,int*no)
{
inti;
(*stmmax).age=0;/*使男生和女生的最大值为0*/
(*stfmax).age=0;
for(i=0;i{
if(st[i].sex=='m')/*判断是否为男生并找出年龄最大的学生的信息*/
{
*no=*no+1;/*求男生的人数*/
if(st[i].age>stmmax->age)
*stmmax=st[i];
}
Else/*找出女生年龄最大的学生的信息*/
{
if(st[i].age>stfmax->age)
*stfmax=st[i];
}
}
}
voidmain()
{
inti,no=0;
STUst[N],t,stmmax,stfmax;
for(i=0;i{
printf("\n请输入学生学号");
scanf("%d",&st[i].number);
printf("请输入学生姓名");
scanf("%s",st[i].name);
printf("请输入学生性别:
男m女f");
scanf("\n%c",&st[i].sex);
printf("请输入学生年龄");
scanf("%d",&st[i].age);
}
zhangbuyang(st,N,&stmmax,&stfmax,&no);/*调用函数求解*/
printf("\n男生中年龄最大的信息为\n");
printf("\n学号%d\n",stmmax.number);
printf("\n姓名%s\n",stmmax.name);
printf("\n性别%c\n",stmmax.sex);
printf("\n年龄%d\n",stmmax.age);
printf("\n男生总人数%d\n",no);
printf("\n女生中年龄最大的信息为\n");
printf("\n学号%d\n",stfmax.number);
printf("\n姓名%s\n",stfmax.name);
printf("\n性别%c\n",stfmax.sex);
printf("\n年龄%d\n",stfmax.age);
}
【输出结果截屏】
(3)输入n个学生的姓名、性别及成绩,并分别找出男学生的前三名及女学生的前三名。
要求程序至少由三个函数组成:
①主函数,输入学生个数n,开辟内存空间,组织调用其它函数,输出统计结果。
②输入函数,输入n个学生的数据。
③统计函数,统计男女前三名。
【设计思路】
对于统计函数建立三个指向结构体的指针,分别指向所有学生数组,男生数组及女生数组,
判断出所有学生中哪些是男生,哪些是女生,并将筛选出来的信息分别赋给男女生数组。
分别对男女生数组按成绩进行排序,最后在主函数中输出男女生中的前三名的信息。
【程序】
#include"stdafx.h"
#include"malloc.h"
#include"stdio.h"
#defineN3
#defineSTUstructstudent
STU
{/*定义关于学生信息的结构体数组*/
charname[20];
charsex;
intscore;
};
voidinput(intn,STU*st)/*输入函数用来输入学生的信息*/
{
inti;
for(i=0;i{
printf("\n请输入学生姓名\n");
scanf("%s",st[i].name);
printf("请输入学生性别:
男m女f\n");
scanf("\n%c",&st[i].sex);
printf("请输入学生成绩\n");
scanf("%d",&st[i].score);
}
}
voidzhangbuyang(intn,STU*st,STU*stf,STU*stm)
{/*统计函数用来分离出男女生信息,并对男女生信息按成绩排序*/
inti,j=0,k=0,m,p;
STUt,u;
for(i=0;i{
if(st[i].sex=='m')stm[j++]=st[i];
elsestf[k++]=st[i];
}
m=j;/*记录男女生的人数*/
p=k;
for(i=0;ifor(j=0;jif(stm[j].score{
t=stm[j];
stm[j]=stm[j+1];
stm[j+1]=t;
}
for(i=0;ifor(j=0;jif(stf[j].score{
u=stf[j];
stf[j]=stf[j+1];
stf[j+1]=u;
}
}
intmain()
{
inti,j,n;
STU*st,*stf,*stm;
printf("\n请输入学生人数\n");
scanf("%d",&n);
st=(structstudent*)malloc(n*sizeof(STU));/*为全体学生和男女生指针开辟动态分配空间*/
stf=(structstudent*)malloc(n*sizeof(STU));
stm=(structstudent*)malloc(n*sizeof(STU));
if(!
st||!
stf||!
stm)return
(1);
input(n,st);/*调用函数输入学生的信息*/
zhangbuyang(n,st,stf,stm);/*调用统计函数*/
printf("男生前三名的信息为");
for(i=0;i{
printf("\n姓名");
printf("%s",stm[i].name);
printf("性别");
printf("%c",stm[i].sex);
printf("成绩");
printf("%d",stm[i].score);
}
printf("\n女生前三名的信息为");/*输出女生前三名*/
for(i=0;i{
printf("\n姓名");
printf("%s",stf[i].name);
printf("性别");
printf("%c",stf[i].sex);
printf("成绩");
printf("%d",stf[i].score);
}
printf("\n");
}
【输出结果截屏】
5.5文件输入输出
5.5.3练习
(1)用文本编辑器建立一个文本文件,存放n个学生的学号和单科成绩(数据格式自行设计),并编程序读入这些数据,求出最高分、最低分及平均分。
【设计思路】
从文件中读入数据,并调用函数对数据进行排序
【程序】
#include"stdafx.h"
#include"malloc.h"
#include"stdio.h"
#defineSTUstructstudent
STU/*定义有关学生信息的结构体*/
{
intnum;
intscore;
};
voidzhangbuyang(STU*st,STU*stmax,STU*stmin,float*ave,intn)
{
inti;
STUt;
*ave=0;
(*stmax).score=0;
(*stmin).score=100;
for(i=0;i{*ave=*ave+st[i].score;
if(st[i].score>(*stmax).score)*stmax=st[i];
if(st[i].score<(*stmin).score)*stmin=st[i];
}
*ave=*ave/n;/*求学生的成绩的平均值*/
}
main()
{
inti,j,n;
STU*st,stmax,stmin;
floatave;
F