C++实践报告.docx
- 文档编号:15812157
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:15
- 大小:149.23KB
C++实践报告.docx
《C++实践报告.docx》由会员分享,可在线阅读,更多相关《C++实践报告.docx(15页珍藏版)》请在冰点文库上搜索。
C++实践报告
C++实践报告
前言:
C++是一门实践性很强的课程,我们之前学的只是理论上的内容,如何解决实际问题还需要进一步实践才能体会到,而本次C++实践课程正好给了我们这样一个很好的机会。
通过实践可以加深理解和巩固课堂学习的内容,更好的熟悉C++的语法规则,掌握C++的程序设计的方法,培养较强的应用开发能力。
为以后解决生活生产中的问题打下一定的基础。
1.任意输入一个正整数,要求:
(1)求它是几位数;
(2)按逆序输出各位数字;(3)求奇数位数字之和。
算法分析:
用do…while语句,要输出逆序的数,需要进行取余运算,以10为除数,将余数依次输出结果就是改正整数的逆序,同时以10为除数,每次对正整数除10,直到正整数为零为止,运算的次数就是该数的位数,这需要用一个变量标记,初值为0,每运算一次,该变量自增,最后输出该变量,即正整数的位数;求奇数位之和就需要知道奇数位的数,第一步计算位数的变量如果是奇数,将输出的余数相加,就会得到奇数位之和。
程序:
#include
#include
usingnamespacestd;
intmain()
{
unsignedlongintN,m,s=0;//N为正整数,m为每
//上的数,s为奇数位之和
intn=0;//n用来标记正整数的位数
cout<<"请输入一个自然数:
";
cin>>N;
cout<<"倒置结果:
"< do { m=N%10;//对正整数取余,求出它的个位数 cout< n=n+1;//输出一个数,n加一,n的结 //就是正整数的位数 if(n%2==1)//n%2==1表示奇数位 { s=s+m;//s表示奇数位之和 } N/=10;//每次对N除10,直到N为0 }while(N>0); cout<<"这是一个"< cout<<"奇数位之和: "< return0; } 问题与解决方法: 运行时求奇数位之和总是不对,原因是我没有用前面的结果直接用n来判断奇数位,而是重新写了个语句求奇数位,使得程序复杂,错误也就出现了,后来问了一下舍友,发现n可以直接求奇数位,而且简单,经过修改,程序运行也就正确了。 2、输入阶数n(1≤n≤10),输出对应的n阶旋转矩阵。 所谓旋转矩阵,就是在n阶矩阵中,起始数1置于方阵的左上角,然后从起始数开始依次递增,按顺时针方向从外向里旋转填数而成。 如: 输入n=5,输出: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 算法分析: 先定义一个二维数组,螺旋方阵第一个数为1,其次依次增加一,只是不是顺序着增加,而是旋转着,这就需要两个控制变量,分别控制行和列,通过循环,改变行和列,最后输出二维数组。 程序: #include #include usingnamespacestd; voidmain() { inta[10][10],i,j,k=1,m,n;//定义一个二维数组,用k为数组赋//值 cout<<"请输入n(1-10): "; cin>>n; if(n%2==0) m=n/2; else m=n/2+1; for(i=0;i<(n+1)/2;i++)//i控制生成方阵的圈数 {//j控制生成一条边的数据 for(j=i;j a[i][j]=k++;//k从1递增到n*n for(j=i+1;j a[j][n-i-1]=k++; for(j=n-i-2;j>=i;j--)//底边,从右到左,行不变列变 a[n-i-1][j]=k++; for(j=n-i-2;j>=i+1;j--)//左边,从下到上,行变列不//变 a[j][i]=k++; } cout<<"结果为: "< for(i=0;i { for(j=0;j cout< cout< } } 问题与解决方法: 开始时不懂怎么循环,找不到行和列与数值之间的关系,后来在书上找了一个类似的例题,看了几遍,了解了循环的具体过程,通过几次尝试,和同学一起商量了,最后终于解决了问题。 3.将一个5×5矩阵中的最小元素放在中心,四个角分别放四个最大的元素(从左到右、从上到下的顺序为从大到小存放),要求: (1)输出变换后的矩阵; (2)任意输入一个数,如果该数在矩阵中,确定该数的位置。 算法分析: 找出元素中最大的元素,采用逐一比较的方法,在数组中可以用双循环,分别进行行和列的循环,依次找出最大的第二大第三大第四大和最小的元素,将它们放在指定的位置,按照数组输出的方式输出。 程序: #include usingnamespacestd; intmain() { inth; cout<<"任意输入一个整数: "< cin>>h; intx[5][5]={12,2,3,23,43,22,32,14,88,8,0,18,21,19,10,4,6,33,30,11,44,7,20,24,1}; inti,j,max1,max2,max3,max4,m,n,t,min;//I,j分别为行列循环控制变量,//max1,max2,max3,max4分别为//第一二三四大的元素,m,n用//来存储元素的行和列,min为//最小元素 max1=x[0][0];//给最大元素赋初值 for(i=0;i<=4;i++) { for(j=0;j<=4;j++) { if(x[i][j]>max1) { max1=x[i][j];//将比max1大的元素的值赋给max1,并保存下标 m=i;n=j; } } } x[m][n]=x[0][0];//交换找到的最大元素和x[0][0]的值 x[0][0]=max1; max2=x[0][1];//给第二大元素赋初值 for(i=0;i<=4;i++) { for(j=0;j<=4;j++) { if(i! =0||j! =0)//保证不能和第一大元素交换数值 { if(x[i][j]>max2) { max2=x[i][j];//将比max2大的元素的值赋给max2,并保存下标 m=i;n=j; } } } } x[m][n]=x[0][4];//交换找到的第二大元素和x[0][4]的值 x[0][4]=max2; max3=x[0][1]; for(i=0;i<=4;i++) { for(j=0;j<=4;j++) { if((i! =0||j! =0)&&(i! =0||j! =4))//保证不和第一二大元素交换数值 { if(x[i][j]>max3) { max3=x[i][j];//将找到的第三大元素的值赋给max3,并保存下标 m=i;n=j; } } } } x[m][n]=x[4][0];//交换找到的第三大元素和x[4][0]的值 x[4][0]=max3; max4=x[0][1]; for(i=0;i<=4;i++) { for(j=0;j<=4;j++) { if((i! =0||j! =4)&&(i! =0||j! =0)&&(i! =4||j! =0))//保证不//和前三大元素交换数值 { if(x[i][j]>max4) { max4=x[i][j];//将找到的第四大元素的值赋给//max4,并标记下标 m=i;n=j; } } } } x[m][n]=x[4][4];//交换找到的第四大元素和x[4][4]的值 x[4][4]=max4; min=x[0][1];//给min赋初值 for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(x[i][j] { min=x[i][j];//找到比它小的元素,将值赋给它,并标记下标 m=i; n=j; } } } x[m][n]=x[2][2]; x[2][2]=min;//将最小的元素放在中间 for(i=0;i<=4;i++) { for(j=0;j<=4;j++) { if(h==x[i][j])//输入的元素是否在该矩阵中 {m=i; n=j; cout<<"该元素在第"< } } } cout<<"改变后的矩阵为: "< for(i=0;i<=4;i++)//输出矩阵 { for(j=0;j<=4;j++) { cout<<""< } cout<<'\n'; } return0; } 问题与解决方法: 在二维数组中找出最大的元素不怎么难,但是当要找出前四大元素时,发现总是排除不了最大元素的干扰,在循环比较过程中,无法把前面找出来的又不能交换数值的元素排除掉,因此输出结果中四个角的元素总是一样的,后来用了条件语句,在不找出来的大元素比较的前提下交换数值,这样一来结果就正确了。 4、有数列1/1+2/1+3/2+5/3+8/5+13/8+21/13+……。 请观察其规律,求出该数列的前n项之和,结果要求保留四位小数。 算法分析: 上式的规律是后一个数的分子是前一个数的分子分母之和,分母是前一个数的分子。 要求前n项之和,需要用循环语句。 程序: #include #include usingnamespacestd; floatmain() { intt,i,N;//t作为交换数值的中间变量,i为循环变量,N为前N项 floats,f,n=1.0,m=1.0;//s为前N项和,m为分母,n为分子 cout<<"请输入一个N: "< cin>>N; for(i=1;i<=N;i++) { if(N==1) s=1;//给第一项赋值1 else { f=m/n; t=m; m=m+n;//把前一项的分子分母之和赋给后一项的分母 n=t;//把前一项的分母赋给后一项的分子 s=s+f;}//求和 } cout< cout<<"结果为"< return0; } 问题与解决方法: 程序的前面都没什么问题,只是开始不知道怎么保留四位小数,后来在书上找了找,发现有相关的语句,模仿了一下,发现运行结果正确,这样问题就解决了。 5、采用二分法求解方程f(x)=x3-x-1=0在区间[1.0,1.5]内的一个实根。 要求精确到小数点后的第2位。 二分法的基本思想,就是将方程根所在的区间平分为两个小区间,再判断根属于哪个小区间;把有根的小区间再平分为二,再判断根所在的更小的区间,对分;重复这一过程,最后求出所要的近似值。 算法分析: 端点的函数值一个大于零,一个小于零,先判断中点的函数值,如果大于零,将这个点作为端点,取它和第一个点的中点继续判断,直到某一点的函数值小于零,结果就是这个点和和前一个大于零的点的中点;如果小于零,将这个点作为端点,取它和第二个点的中点继续判断,直到某一点的函数值大于零,结果就是这个点和前一个小于零的点的中点。 这个循环过程需要用到do…while语句。 程序: #include #include usingnamespacestd; floatmain() { floatf,x,t,x1=1.0,x2=1.5; x=(x1+x2)/2;//取中点 f=x*x*x-x-1;//计算函数值 if(f>0)//判断函数值 { do { x2=x;//将中点值赋给x2 x=(x1+x2)/2;//再取中点 f=x*x*x-x-1;//计算函数值 t=x; }while(f>0); x=(t+x2)/2;//最后的值 } else { do { x1=x; x=(x1+x2)/2; f=x*x*x-x-1; t=x; }while(f<0); x=(t+x1)/2; } cout< cout< return0; } 收获与体会: 通过这次课程设计的实训,增加了我学习软件技术的兴趣,从C++语言这门课程开始,已发现程序设计的乐趣,在学习C++语言的过程中也学到了许多计算机应用基础知识,对计算机的机体也有了一个大体的了解。 在实际操作过程中犯的一些错误还会有意外的收获,感觉实践很有意思。 在具体操作中对这学期所学的C++语言的理论知识得到巩固,达到实训的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时体会到C++语言具有的语句简洁,使用灵活,执行效率高等特点。 发现上机实训的重要作用,特别是对数组和循环有了深刻的理解。 通过实际操作,学会C++语言程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。 深刻体会到“实践是检验真理的标准”的寓意。 希望以后应多进行这样的实训,培养学生独立思考问题的能力,提高实际操作水平。 虽然都说“程序=数据结构+算法”,但我在学习运用数据结构编程之前,并没能深刻体会到这一点,直到这次课设实践。 我感受最深的一点是: 以前用C++编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。 但现在编程感觉完全不同了。 在编写一个程序之前,自己能够综合考虑各种因素。 在编写每一个函数之前,可以仔细斟酌比对,挑选出最适合当前状况的算法。 这样,即使在完整的程序还没有写出来之前,自己心中已经有了明确的原图了。 这样无形中就提高了自己编写的程序的质量。 我以前对数组一直很害怕,总是看不明白究竟这数组和循环结合时是怎么进行的。 在这次实验中我终于克服了这一障碍,真的是功夫不负有心人啊! 真是受益良多啊! 这次实验中我也出现过一些比较严重的错误。 后来在同学的指点下我意识到自己的错误,不过收获也很不少。 总之,我会继续我的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步不断提高的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 实践 报告