c++实验3程序结构和数组.docx
《c++实验3程序结构和数组.docx》由会员分享,可在线阅读,更多相关《c++实验3程序结构和数组.docx(19页珍藏版)》请在冰豆网上搜索。
c++实验3程序结构和数组
实验3:
C++语言程序结构、数组
说明:
所有的程序和文档都建立在学生学号_名字_第三次实验文件夹内,最终以压缩文件的形式提交到指定邮箱。
第一部分基础练习
1.用牛顿迭代法求方程:
3x3+2x2-8x-5=0,在x=1.5附近的根。
◆要求:
前后两次求出的x的差的绝对值小于10-6,则为结果。
◆思路:
如图所示,设xn为一个接近xa的近似根,过(xn,f(xn))点做切线,其切线方程为:
式中只有xn+1为未知量,将它放在等号的左边,即:
上式就为牛顿迭代公式。
源代码:
#include
#include
usingnamespacestd;
intmain()
{
floatx1,x0,f,f1;
x1=1.5;
do
{x0=x1;
f=3*x0*x0*x0+3*x0*x0-8*x0-5;
f1=9*x0*x0+4*x0-8;
x1=x0-f/f1;
}while(fabs(x1-x0)>1e-6);
cout<<"该方程的根为:
"<return0;
}
截图:
◆ 思考题及问题
1更改初值,观察程序的运行结果。
当x1=0时,运算截图为
②如果程序总是无法结束,又不是死循环,程序应该如何修改?
程序无法结束,可能因为迭代所求根总在不断地振荡,无法得到精度内的结果,可以适当的降低精度,使振荡值落在精度范围内。
2.编程序,输出以下图形
①
*********
*******
*****
***
*
②
*****
****
***
**
*
③
1
13
135
1357
13579
④
A
BBB
CCCCC
DDDDDDD
CCCCC
BBB
A
◆要求
应该使用双重循环。
外循环体中包含两个并列的for循环语句,分别控制每行输出的空格符和非空格字符(如:
星号);用cout<<“\n”;语句控制输出一行字符之后回车换行。
源程序:
#include
usingnamespacestd;
intmain()
{inti,j;
for(i=1;i<=5;i++)
{for(j=1;j<=i;j++)
cout<<"";
for(j=11-2*i;j>0;j--)
cout<<"*";
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=5;i++)
{for(j=1;j<=i;j++)
cout<<"";
for(j=6-i;j>0;j--)
cout<<"*";
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=5;i++)
{for(j=6-i;j>0;j--)
cout<<"";
for(j=1;j<=i;j++)
cout<<2*j-1;
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=4;i++)
{for(j=5-i;j>0;j--)
cout<<"";
for(j=1;j<=2*i-1;j++)
cout<<(char)('A'+i-1);
cout<<"\n";
}
for(i=1;i<=3;i++)
{for(j=1;j<=i+1;j++)
cout<<"";
for(j=7-2*i;j>0;j--)
cout<<(char)('D'-i);
cout<<"\n";
}
return0;
}
截图:
◆思考题
1如果输出10行的图形,应如何修改程序?
#include
#include
usingnamespacestd;
intmain()
{inti,j;
for(i=1;i<=10;i++)
{for(j=1;j<=i;j++)
cout<<"";
for(j=21-2*i;j>0;j--)
cout<<"*";
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=10;i++)
{for(j=1;j<=i;j++)
cout<<"";
for(j=11-i;j>0;j--)
cout<<"*";
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=10;i++)
{for(j=11-i;j>0;j--)
cout<<"";
for(j=1;j<=i;j++)
cout<(2)<<2*j-1;
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=10;i++)
{for(j=11-i;j>0;j--)
cout<<"";
for(j=1;j<=2*i-1;j++)
cout<<(char)('A'+i-1);
cout<<"\n";
}
for(i=1;i<=9;i++)
{for(j=1;j<=i+1;j++)
cout<<"";
for(j=19-2*i;j>0;j--)
cout<<(char)('J'-i);
cout<<"\n";
}
return0;
}
②如果输出图形向右平移25个字符位置,程序应该如何修改?
源程序:
#include
usingnamespacestd;
intmain()
{inti,j;
for(i=1;i<=5;i++)
{for(j=1;j<=i+25;j++)
cout<<"";
for(j=11-2*i;j>0;j--)
cout<<"*";
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=5;i++)
{for(j=1;j<=i+25;j++)
cout<<"";
for(j=6-i;j>0;j--)
cout<<"*";
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=5;i++)
{for(j=31-i;j>0;j--)
cout<<"";
for(j=1;j<=i;j++)
cout<<2*j-1;
cout<<"\n";
}
cout<<"\n";
for(i=1;i<=4;i++)
{for(j=30-i;j>0;j--)
cout<<"";
for(j=1;j<=2*i-1;j++)
cout<<(char)('A'+i-1);
cout<<"\n";
}
for(i=1;i<=3;i++)
{for(j=1;j<=i+26;j++)
cout<<"";
for(j=7-2*i;j>0;j--)
cout<<(char)('D'-i);
cout<<"\n";
}
return0;
}
截图:
3.若干个数据首尾相连,构成一个圆环,找到连续的4个数之和最大的一段。
◆要求:
从键盘输入数据,当输入-1时结束输入,输出其中连续的4个数之和最大的一段的起始数据的位置及这4个数的和。
源程序:
#include
usingnamespacestd;
intmain()
{
inti,j,m,n=0,max=0,sum=0;
inta[20];
cout<<"请输入圆环数据:
";
cin>>i;
while(i!
=-1)
{
a[n]=i;
n++;
cin>>i;
}
for(j=0;j{
sum=a[j]+a[(j+1)%n]+a[(j+2)%n]+a[(j+3)%n];
if(sum>max)
{max=sum;
m=j;
}
}
cout<<"输出圆环数据:
";
for(j=0;j{
cout<}
cout<<"\n从第"<"<return0;
}
截图:
第二部分自测练习
1.猜数游戏
编程先由计算机“想”一个1~100之间的数请人猜,如果人猜对了,则结束游戏,并在屏幕上输出人猜了多少次才猜对此数,以此来反映猜数者“猜”的水平;否则计算机给出提示,告诉人所猜的数是太大还是太小,最多可以猜10次,如果猜了10次仍未猜中的话,结束游戏并输出该数。
思路-函数说明:
intrand(); :
返回从[0,MAX)之间的随机整数,这里的MAX与你所定义的数据类型而定;需#include
voidsrand(unsignedseed); :
设置随机数种子,#include
time_ttime(time_t*time); :
返回当前时间,#include
应用举例:
srand(time(0)); //根据系统时间设置随机数种子
inti=rand()%N; //取得区间[0,N)的整数
如要产生1~10之间随机数,则代码如下:
#include
usingnamespacestd;
#include
#include
intmain()
{
intt;
srand(time(0)); //seed
t=rand()%10+1; //randomnumber1-10
cout< return0;
}
源程序:
#include"stdio.h"
#include"stdlib.h"
voidmain()
{
intnum=rand()%100;
intguess;
inti=0;
printf("Guessanumber(1-100):
");
while
(1)
{
scanf("%d",&guess);
i++;
if(i>=10)
{printf("Sorry,gameover!
\n");
break;
}
if(guess==num)
{
printf("Youareright,guess%dtimes.\n",i);
break;
}
elseif(guess>num)
printf("Guesstoobig,tryagain:
");
else
printf("Guesstoosmall,tryagain:
");
}
}截图:
2.排序
编程实现将10个整数升序排列。
要求:
冒泡法排序。
冒泡排序(BubbleSort)的基本概念是:
依次比较相邻的两个数,将小数放在前面,大数放在后面。
●即在第一趟:
首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
至此第一趟结束,将最大的数放到了最后。
●在第二趟:
仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
●如此下去,重复以上过程,直至最终完成排序
源程序:
#include
usingnamespacestd;
intmain()
{inti,j,t,a[10],k;
cout<<"输入10个整数:
";
for(i=0;i<10;i++)
cin>>a[i];
for(i=0;i<10;i++)
for(j=i+1;j<10;j++)
if(a[i]>a[j])
swap(a[i],a[j]);
cout<<"输出升序排列的结果:
";
for(i=0;i<10;i++)
cout<cout<return0;
}
截图:
3.检验并打印魔方矩阵
在下面的5×5阶魔方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将这些魔方矩阵中的元素读到一个二维整型数组中,然后检验其是否为魔方矩阵,并将其按如下格式显示到屏幕上。
17
24
1
8
15
23
5
7
14
16
4
6
13
20
22
10
12
19
21
3
11
18
25
2
9
源程序:
#include
usingnamespacestd;
intmain()
{
inta[5][5],i,j,k,x,z=0;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
cin>>a[i][j];
}
intp=0,s=0,q=0;
for(k=0,x=0;k<5,x<5;k++,x++)
{
s+=a[0][k];
q+=a[x][0];
p+=a[k][x];
}
if(s==q&&q==p)
{
inty=s;
for(i=1,j=1;i<5,j<5;i++,j++)
{
inth=0,d=0,f=0;
for(k=0,x=0;k<5,x<5;k++,x++)
{
h+=a[i][k];
d+=a[x][j];
f+=a[k][x];
}
if(y!
=h&&y!
=d&&y!
=f)
z++;
}
if(z==0)
{
cout<<"是"<for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
cout<}
cout<}
}
else
cout<<"否"<}
else
cout<<"否"<return0;
}
截图: