中南大学C++程序设计报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++程序设计报告
一、前言
我认为安排此次课程设计的目的,是让同学们在独立完成设计、编写、调试应用程序及编写文档的任务的过程中,及时巩固已学的知识,补充未学但是非常重要的知识,提高程序设计的能力。

针对C++语言中的重点和难点内容,如数组和函数等,进行训练,并且能充分发挥独立自主学习的能力,对于在程序设计和调试中遇到的问题,应积极和同学交流,相互学习,共同进步
二、正文
1.
(1)题目:任意输入一个正整数,要求:(1)求它是几位数;(2)按逆序输出各位数字;(3)求奇数位数字之和。

(2)算法分析
分离出每一末位数字,然后输出;
判断是否为奇数位,将奇数位数字相加求和;
利用循环结构进行编程,每位数字逐一进行分离、判断。

(3)程序:程序要有详尽注释,如:各参数的含义、函数的功能等
#include<iostream>
using namespace std;
void main()
{
int n,m,s=0,i=0; //定义变量
cout<<"请输入一个正整数n"<<endl;
cin>>n;
do
{
m=n%10;// n对10取模,得到该数的最后一位数字
cout<<m;//逆序输出每位数字
n/=10;
i++;
if(i%2==1)//判断是否为奇数位
{s+=m;}//各奇数位数字之和
}while(n>0); //循环一次,计算一次,共循环i次
cout<<"共有"<<i<<"位数字"<<endl;
cout<<"奇数位之和是:"<<s<<endl;
}
(4)运行结果
(5)调试过程中出现过的问题和解决的方法
2.
(1)题目:输入阶数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
(2)算法分析
(3)程序:程序要有详尽注释,如:各参数的含义、函数的功能等
#include<iostream>
#include<iomanip>
using namespace std;
void main()
{
int n=0,m=1,l,r,u,d,i=1,j=1,a[10][10];//定义变量和一个二维数组cout<<"input the n:";
cin>>n;
l=1;r=n;u=1;d=n;
while(l<=r&&u<=d)//循环一次输出一圈
{
for(i=l;i<=r;i++)//从左到右对数组赋值
a[j][i]=m++;
u+=1;
i-=1;
for(j=u;j<=d;j++)//从上到下的
a[j][i]=m++;
r-=1;
j-=1;
for(i=r;i>=l;i--)//从右到左的
a[j][i]=m++;
d-=1;
i+=1;
for(j=d;j>=u;j--)//从下到上的
a[j][i]=m++;
l+=1;
j+=1;
}
for(i=1;i<=n;i++)//输出数组
{
for(j=1;j<=n;j++)
{
cout<<setw(3)<<a[i][j];
}
cout<<'\n';
}
}
(4)运行结果
(5)调试过程中出现过的问题和解决的方法
3.
(1)题目:将一个5×5矩阵中的最小元素放在中心,四个角分别放四个最大的元素(从左到右、从上到下的顺序为从大到小存放),要求:(1)输出变换后的矩阵;(2)任意输入一个数,如果该数在矩阵中,确定该数的位置。

(2)算法分析
(3)程序:程序要有详尽注释,如:各参数的含义、函数的功能等
#include <iostream>
#include <iomanip>
using namespace std;
void myswap(int &a, int &b)
{
int x;
x=a; a=b; b=x;
}
const int maxint=1992;
void main()
{
intmat[5][5],max[4]={-1*maxint,-1*maxint,-1*maxint,-1*maxint},maxi[4], maxj[4];
int i,j,k,n,min=maxint,mini,minj; //定义变量和一个二维数组
cout<<"请输入5×5矩阵:\n";
for (i=0;i<5;i++)
{
for (j=0;j<5;j++)
{
cin>>mat[i][j];
if (min>mat[i][j])
{
min=mat[i][j]; mini=i; minj=j;
}
int o,oi,oj;
o=mat[i][j]; oi=i; oj=j;
for (k=0;k<4;k++)
{
if (o>max[k])
{
myswap(o,max[k]);myswap(oi,maxi[k]);myswap(oj,maxj[k]) ;
}
}
}
}
myswap(mat[2][2],mat[mini][minj]);
myswap(mat[0][0],mat[maxi[0]][maxj[0]]);
myswap(mat[4][0],mat[maxi[1]][maxj[1]]);
myswap(mat[0][4],mat[maxi[2]][maxj[2]]);
myswap(mat[4][4],mat[maxi[3]][maxj[3]]);
cout<<"\n调整后的数组为:\n";
for (i=0;i<5;i++)
{
for (j=0;j<5;j++) cout<<setw(4)<<mat[i][j];
cout<<"\n";
}
cout<<"\n请输入要查找的元素:";
cin>>n;
cout<<"\n目标元素的位置是:\n";
for (i=0;i<5;i++)
for (j=0;j<5;j++)
if (mat[i][j]==n) cout<<"第"<<i+1<<"行,第"<<j+1<<"列\n";
}
(4)运行结果
(5)调试过程中出现过的问题和解决的方法
4.
(1)题目: 有数列1/1+2/1+3/2+5/3+8/5+13/8+21/13+……。

请观察其规律,求出该数列的前n项之和,结果要求保留四位小数。

(2)算法分析
A n=a1/b1
b n=a n-1
a n=a n-1+
b n-1
S n=S n-1+A n
(3)程序:程序要有详尽注释,如:各参数的含义、函数的功能等
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a=2,b=1;
int n,t;
double s=1;//定义变量,数列和的初始值为1,即n=1,s=1
cout<<"求前n项的和:";
cin>>n;
for(int i=1;i<=n-1;i++)
{
s=s+a/b;//S n=S n-1+A n
t=a;a=a+b;b=t;//求A n
}//循环n-1次,求和
cout<<setw(5)<<fixed<<setprecision(4);//设输出结果域宽为5个字符,保留4
位小数
cout<<s<<endl;
return 0;
}
(4)运行结果
(5)调试过程中出现过的问题和解决的方法
首先找出数列各项的规律,然后按步骤编写程序,这道题没有遇到难以解决的问题。

5.
(1)题目:采用二分法求解方程f(x)=x3-x-1=0在区间[1.0,1.5]内的一个实根。

要求精确到小数点后的第2位。

二分法的基本思想,就是将方程根所在的区间平分为两个小区间,再判断根属于哪个小区间;把有根的小区间再平分为二,再判断根所在的更小的区间,对分;重复这一过程,最后求出所要的近似值。

(2)算法分析
二分法的基本思路是:任意两个点a和b,判断区间(a,b)内有无一个实根,如果f_a 与f_c符号相反,则说明有一实根。

接着取(a,b)的中点c,检查f_c和f_b是否同号,如果不同号,说明实根在(c,b)之间,如果同号,在比较(a,c),这样就将范围缩小一半,然后按上述方法不断的递归调用,直到区间相当小(找出根为止)。

(3)程序:程序要有详尽注释,如:各参数的含义、函数的功能等
#include<iostream>
#include<iomanip>
using namespace std;
double d(double);
void main()
{
double a=1.0,b=1.5,c;
double f_a,f_b,f_c;
f_a=d(a);
f_b=d(b);
do
{
c=(a+b)/2;//求a,b的中点
f_c=d(c);
if(f_a*f_c<0)//确保输入的a,b使得f_a,f_c符号相反
do
b=c;
else
{
a=c;
f_a=f_c;
}
}
while(f_c>0.01||f_c<-0.01);
cout<<"f(x)=x*x*x-x-1=0"<<endl;
cout<<"x="<<setiosflags(ios::fixed)<<setprecision(2)<<c<<endl;// setprecision(2)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数为2,即保留两位小数
}
double d(double x)
{
double f;
f=x*x*x-x-1;
return f;
}
(4)运行结果
(5)调试过程中出现过的问题和解决的方法
第一次调试程序后,显示结果为x=1.324718,没有保留两位小数,经过检查,确定输出语句cout<<"x="<<setiosflags(ios::fixed)<<setprecision(2)<<c<<endl;是正确的,但是不知道为什么没起作用。

后来和同学讨论后,发现前面没加#include<iomanip>,因此
结果只能输出c++默认的输出流有效位数。

三、收获与体会
程序,最主要的是实践。

通过这一次集中的强化训练,我不仅锻炼了自己的结构化程序设计思想,更提高了逻辑思维能力,理解了如何用c++语言来表达"面向对象",使自己的程序设计能力上一台阶,同时使自己的各种综合能力得到提高。

经过一学期的学习以及两周的程序设计实践,我学习C++最大的感触是,首先要认真对待每个字符,每个命令,因为极其小的一个失误导致的可能是整个程序的崩溃,细心是首要的任务,然后就是毅力,编写一个程序不仅是技术活,而是体力活,最重要的是要有毅力坚持到完。

遇到不会的难点时,意志不坚强就难免半途而废。

而且c++的逻辑性很强,它的语言是英语,且是用数学语言来完成的,所以学习C++需要很强的数学逻辑能力,在这一方面,我觉得自己还有很大的进步空间,在以后的学习中应该多下工夫,从小的程序开始多做练习,调试,逐渐强化逻辑能力,掌握重要的知识点。

相关文档
最新文档