C语言课程设计
发布时间:2018-01-06 16:08:37
发布时间:2018-01-06 16:08:37
分屏处理数据系统
一、设计内容
随机产生1000个数,并分屏显示(每行显示10个数字,每页显示10行),而且在每一屏的下方显示本屏中数据的最大值、最小值和平均值。
提示:循环显示,在分屏点上输出press any key to continue…,通过getchar()函数让用户以按回车键的方式进入下一屏。
二、方案设计与论证
生成一个随机数,放入二维数组,输出。每输出十个一个回车。
调用自定义函数求这个数组的最大最小值,平局值。
摁下回车清屏。
循环十次。
三、程序运行结果(截图)
四、心得体会
运行时数字挤在一起,最后一行输出十个,每输出一行一个回车;
五、参考资料与致谢
查找书本清屏,随机函数的写法。
六、源程序
#include
#include
#include
#define MAX 99
#define MIN 0
int main()
{
int ma(int a[120]);
int mi(int a[120]);
float v(int a[120]);
int i,j,k,max,min,a[120];
float avg;
int x;
srand((unsigned)time(NULL));
for(i=1;i<=10;i++) //显示十页
{
for(j=1,x=1;j<=10;j++) //显示十行
{
for(k=1;k<=10;k++,x++) //显示十个
{
a[x]=rand()%(MAX-MIN+1)+MIN;
printf("%d ",a[x]);
}
printf("\n");
}
max=ma(a);
min=mi(a);
avg=v(a);
printf("最大:%d 最小:%d 平均:%.2f\n",max,min,avg);
printf("请按回车键进入下一屏。");
getchar(); //下一页
system("cls"); //清屏
}
return 0;
}
int ma(int a[120]) //最大
{
int i,z;
for(i=1,z=0;i<=100;i++)
{
if(a[i]>=z)z=a[i];
else if(a[i]
}
return z;
}
int mi(int a[120]) //最小
{
int i,z;
for(i=1,z=999999999;i<=100;i++)
{
if(a[i]>=z)z=z;
else if(a[i]
}
return z;
}
float v(int a[120]) //平均
{
int sum=0,i;
float z;
for(i=1;i<=100;i++)
{
sum=sum+a[i];
}
z=sum*1.0/100;
return z;
}
求积分
一、 设计内容
小明最近在学高等数学,被数学里面的微积分难倒了。但小明编程能力很强,于是他就突发奇想,看能不能用编程的方法来帮助理解数学的学习。以下是他想求解的问题:
请编程求解的值,并分析的值与的关系。(提示:如下图,按照积分的原理,将函数区间切分为非常小的长方形,其中长方形的宽度为切分的间距,长方形的高度为方格所在横坐标对应的函数值 ,则图中第个小长方形(阴影部分)面积为,而最终函数的积分值为所有小方格的面积之和。)0.128
二、
二、方案设计与论证
将不规则图形分割成小矩形,最后求和。
三、 程序运行结果(截图)
四、 心得体会
将不规则图形分的越多,面积越准确。
五、 参考资料与致谢
查找积分的几何意义。
六、源程序
#include
#define N 100000
int main()
{
float x,sum;
int i;
for(i=1,sum=0,x=1;i<=N;i++)
{
sum=sum+(1.0/(x*x+4*x))*(1.0/N);
x=x+1.0/N;
}
printf("%f",sum);
return 0;
}
求离群点
一、 设计内容
随机生成一组位于二维坐标系中的点集(集合大小小于50),点集中每个点的位置由x轴分量和y轴分量组成,且1x80, 1y80。
求这组点集中的离群点。(离群点定义:远离点集一般水平的极端大值和极端小值)。
要求:若有离群点,请输出离群点的坐标;若无离群点,则输出“No outliers!”,将离群点在终端用#输出表示,非离群点用*输出表示,显示方式如下图所示。
提示:离群点判断的方法不止一种,例如,可借助点集所有的数据的平均值为圆心,以所有点集到圆心的平均距离为半径,所构成的圆。在圆中的为正常点,否则为离群点。
二、方案设计与论证
开一个90*90的数组,并随机生成50个点。
再开一个90*90的数组,计算50个点到80*80个点的平均距离,找到最小的(离群点)。
计算所有点到离群点的距离,小于等于就为正常点,否则为离群点。
三、程序运行结果(截图)
四、心得体会
由于行间距不对,所以看起来很怪,本来是正方形的。
没有离群点的概率太小了……..
五、参考资料与致谢
参考题目的提示来写的。
参考随机数生成法。
六、源程序
#include
#include
#include
#define MAX 80
#define MIN 1
int main()
{
int a[90][90],b[170];
float r[90][90],min;
int i,j,k,m,n,q=0,x,y,l;
srand((unsigned)time(NULL));
for(i=1;i<=80;i++) //准备工作,全为0
{
for(j=1;j<=80;j++)
{
a[i][j]=0;
r[i][j]=0.0;
}
}
for(1;1;1)
{
for(i=1;i<=160;i++) //取随机数
{
b[i]=rand()%(MAX-MIN+1)+MIN;
}
for(j=2;j<=160;j=j+2)
{
m=b[j];
n=b[j-1];
if(a[m][n]==1)continue;
else if(a[m][n]!=1){a[m][n]=1;q++;}
if(q==50)break;
}
if(q<50)continue;
else if(q==50)break;
}
for(i=1;i<=80;i++) //计算平均圆心距
{
for(j=1;j<=80;j++)
{
for(m=1;m<=80;m++)
{
for(n=1;n<=80;n++)
{
if(a[m][n]==1)
{
x=m-i;
x=abs(x);
x=x*x;
y=n-j;
y=abs(y);
y=y*y;
r[i][j]=r[i][j]+sqrt(x+y);
}
}
}
r[i][j]=r[i][j]*1.0/50;
}
}
for(i=1,min=r[1][1];i<=80;i++) //找最小
{
for(j=1;j<=80;j++)
{
if(r[i][j]<=min)
{
min=r[i][j];m=i;n=j;
}
else if(r[i][j]>min)
{
min=min;
}
}
}
for(l=0,i=1,k=0;i<=80;i++) //判断该点是什么类型
{
for(j=1;j<=80;j++)
{
if(a[i][j]==1)
{
x=m-i;
x=abs(x);
x=x*x;
y=n-j;
y=abs(y);
y=y*y;
if(sqrt(x+y)<=min)
{
a[i][j]=3;
}
else if(sqrt(x+y)>min)
{
a[i][j]=2;
l++;
}
}
}
}
if(l==0)
printf("No outliers!");
else
{
for(i=1;i<=80;i++) //输出
{
for(j=1;j<=80;j++)
{
if(a[i][j]==0)
printf(" ");
else if(a[i][j]==2)
printf("#");
else if(a[i][j]==3)
printf("*");
}
printf("\n");
}
printf("\n");
n=80-n;
printf("(%d,%d)\n",m,n);
}
return 0;
}2阶曲线绘制
一、 设计内容
2阶曲线公式可描述为
其中,为曲线的参数,由用户手动输入。
请编程绘制出该曲线的图形,坐标原点,y轴正方向,x轴正方向,如下图所示
提示:可利用二维数组预先计算并存储每个点(图中用“*”表示)的坐标,然后利用循环一次性输出图形。
二、方案设计与论证
开一个400*80的二维数组(以中心点做原点)。
再开一个数组,计算-40~40的x代入方程的所得值。
如果这个值大于200或小于-200,就计算下一个。
输出。
三、程序运行结果(截图)
四、心得体会
由于WIN10于VC6.0不兼容,输出图形变形,于是输出一行一个回车。
五、参考资料与致谢
六、源程序
#include
int main()
{
float a0,a1,a2,a[420][90],zhi[90];
float ;
int i,j,k,x,y;
scanf("%f %f %f",&a0,&a1,&a2);
for(i=1;i<=401;i++) //准备
{
for(j=1;j<=85;j++)
{
a[i][j]=0;
}
}
for(i=1;i<=79;i++) //建坐标系
{
a[201][i]=1;
}
for(i=1;i<=401;i++)
{
a[i][40]=2;
}
a[1][40]=6;
a[201][40]=4;
a[201][79]=5;
for(i=-39,j=1;i<=39;i++,j++)//算y值
{
zhi[j]=a0+a1*i+a2*i*i;
}
for(i=1;i<=79;i++) //计算对应坐标
{
y=zhi[i];
if(y>=200||y<=-200)continue;
y=201-y;
a[y][i]=3;
}
for(i=1;i<=401;i++)
{
for(j=1;j<=79;j++)
{
if(a[i][j]==0)
printf(" ");
else if(a[i][j]==1)
printf("-");
else if(a[i][j]==2)
printf("|");
else if(a[i][j]==3)
printf("*");
else if(a[i][j]==4)
printf("+");
else if(a[i][j]==5)
printf(">");
else if(a[i][j]==6)
printf("^");
}
printf("\n");
}
return 0;
}
概率法求圆周率
一、 设计内容
如下图所示,设一直角坐标系中,有一边长为1的正方形,以原点为中心1为半径,在正方形中画一扇形(1/4圆)。概率法求解圆周率的过程为:随机产生n个范围在(0,1)之间的点,若其中有m个点落于扇形中,则
提示:根据圆的特点,判断随机生成的点是否在扇形内。
二、方案设计与论证
随机产生0~1之间的小数,赋值给x,y。
计算x^2+y^2是否<=1。
循环,让数据更准确。
三、程序运行结果(截图)
四、心得体会
随机数并不是真正意义上的随机数。
五、参考资料与致谢
RAND_MAX是rand()随机产生的最大数。
六、源程序
#include
#include
#include
#include
int main()
{
float x,y,pi;
int i,k;
srand((unsigned)time(NULL));
for(k=0,i=1;i<=10000;i++)
{
x=rand()*1.0/RAND_MAX;
y=rand()*1.0/RAND_MAX;
if(sqrt(x*x+y*y)<=1)
k++;
}
pi=4*(k*1.0/10000);
printf("%f",pi);
return 0;
}
推箱子游戏设计
一、 设计内容
功能:实现简易小人推箱子游戏,游戏过程:(1)初始时,小人在窗口的左上角位置,箱子在小人的右侧;(2)在小人前方随机生成若干个阻碍物;(3)在窗口的右侧随机生成一个出口;(4)要求小人能够将箱子推到窗口右侧出口。基本要求:1用键盘上、下、左、右按键控制小人移动。2在小人前方随机生成若干个阻碍物和一个箱子。3小人必须推箱子,而不能拉箱子。4小人必须穿过阻碍物之间的空隙,到达出口。5 小人进入出口时提示游戏成功。6小人无路可走时提示游戏失败。
7 小人每移动一步在窗口的左下角显示当前已经移动的步数。8用户可自行放弃游戏提示:小人可以用“”表示(ASCII码值为12),阻碍物可用“”表示(ASCII码值为5),推箱子可用“”表示(ASCII码值为30)。
二、方案设计与论证
利用整形二维数组,围一个(0~25)*(0~81)的空间。
全部赋值为0。
最边上一圈为墙,用1表示。
随机生成墙,出口。
人用7表示。
方块用4表示。
用Getch读取上下左右,计算人,方块的坐标。
输出,逢0输出空格,逢1输出墙,逢7输出人,逢4输出方块。
三、程序运行结果(截图)
四、心得体会
上下左右的读入有点小困难,在网上找了好久。
控制台行间距太大,看起来很难受。
五、参考资料与致谢
按照网上的方法,getch上下左右,输出前都有“-32”
上72
下80
左75
右77
六、 源程序
#include
#include
#include
int main()
{
int a[40][100];
int i,j,k,m,n,p,q,bu,cheng,zhong;
srand((unsigned)time(NULL));
for(i=1;i<=23;i++) //画空气0
{
for(j=1;j<=80;j++)
{
a[i][j]=0;
}
}
for(i=0;i<=85;i++)
{
a[0][i]=1;
a[24][i]=1;
}
for(i=0;i<=30;i++)
{
a[i][0]=1;
a[i][81]=1;
}
m=rand()%21+2; //画随机墙1
n=rand()%21+2;
p=rand()%21+30;
for(1;1;1)
{
q=rand()%21+30;
if(q>(p+4)||q<(p-4))break;
}
for(i=1;i<=23;i++)
{
if(i==m)continue;
a[i][p]=1;
}
a[m+1][p]=0;
for(i=1;i<=23;i++)
{
if(i==n)continue;
a[i][q]=1;
}
a[n+1][q]=0;
zhong=rand()%21+2; //随机终点
a[zhong-1][80]=1;
a[zhong-1][79]=1;
a[zhong+1][80]=1;
a[zhong+1][79]=1;
a[1][1]=7; //人
a[2][2]=4; //箱子
for(bu=0,cheng=9;1;1)
{
for(i=1;i<=23;i++)
{
for(j=1;j<=80;j++)
{
if(a[i][j]==0)
printf(" ");
else if(a[i][j]==1)
printf("%c",5);
else if(a[i][j]==7)
{
printf("%c",12);
m=i;
n=j;
}
else if(a[i][j]==4)
{
printf("%c",30);
p=i;
q=j;
}
}
printf("\n");
}
printf("总共%d步。(ESC退出)\n",bu);
if(cheng==1)
{
printf("游戏成功!");
break;
}
else if(cheng==0)
{
printf("游戏失败!");
break;
}
k=getch();
if(k==27)break;
if(k==75) //左
{
if(q==(n-1)&&m==p) //箱子在左边
{
if(a[m][q-1]==1); //箱子左边是墙
else if(a[m][q-1]!=1) //箱子左边不是墙
{
a[m][q]=0;
a[m][q-1]=4;
a[m][n]=0;
a[m][n-1]=7;
bu++;
q=q-1;
n=n-1;
}
}
else if((q!=(n-1)&&m==p)||m!=p) //箱子不在
{
if(a[m][n-1]==1); //人左边是墙
else if(a[m][n-1]!=1) //人左边不是墙
{
a[m][n]=0;
a[m][n-1]=7;
bu++;
n=n-1;
}
}
}
else if(k==77)
{
if(q==(n+1)&&m==p) //箱子在右边
{
if(a[m][q+1]==1); //箱子右边是墙
else if(a[m][q+1]!=1) //箱子右边不是墙
{
a[m][q]=0;
a[m][q+1]=4;
a[m][n]=0;
a[m][n+1]=7;
bu++;
q=q+1;
n=n+1;
}
}
else if((q!=(n+1)&&m==p)||m!=p) //箱子不在
{
if(a[m][n+1]==1); //人右边是墙
else if(a[m][n+1]!=1) //人右边不是墙
{
a[m][n]=0;
a[m][n+1]=7;
bu++;
n=n+1;
}
}
}
else if(k==72)
{
if(p==(m-1)&&n==q)
{
if(a[p-1][q]==1);
else if(a[p-1][q]!=1)
{
a[p][q]=0;
a[p-1][q]=4;
a[m][n]=0;
a[m-1][n]=7;
bu++;
p=p-1;
m=m-1;
}
}
else if((p!=(m-1)&&n==q)||n!=q)
{
if(a[m-1][n]==1);
else if(a[m-1][n]!=1)
{
a[m][n]=0;
a[m-1][n]=7;
bu++;
m=m-1;
}
}
}
else if(k==80)
{
if(p==(m+1)&&n==q)
{
if(a[p+1][q]==1);
else if(a[p-1][q]!=1)
{
a[p][q]=0;
a[p+1][q]=4;
a[m][n]=0;
a[m+1][n]=7;
bu++;
p=p+1;
m=m+1;
}
}
else if((p!=(m+1)&&n==q)||n!=q)
{
if(a[m+1][n]==1);
else if(a[m+1][n]!=1)
{
a[m][n]=0;
a[m+1][n]=7;
bu++;
m=m+1;
}
}
}
if(m==zhong&&n==79&&p==zhong&&q==80)cheng=1;
else if((p==1)||(p==23)||(q==1)||(q==80))cheng=0;
system("cls");
}
return 0;
}