C++程序设计基础课程设计报告

程序设计基础课程设计报告


摘要
C++ 可以说是 C 语言的继承,20 世纪 70 年代中期,Bjarne Stroustrup 希望有一门语言既要编程简单、正确可靠,又要运行高效、可移植。1979 年,Bjame Sgoustrup 到了 Bell 实验室,开始从事将 C 改良为带类的 C(C with classes)的工作。1983 年该语言被正式命名为 C++。它既可以进行 C 语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
自从 C++ 被发明以来,它经历了 3 次主要的修订,每一次修订都为 C++ 增加了新的特征并作了一些修改。C++ 擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而 C++ 就适应的问题规模而论,大小由之。C++ 不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力

第一章 概述
1.1选题的意义
1.1.1 选题
(1)递推法应用
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
(2)精确计算及迭代
求一个数的开平方 公式为x i+1=(x i+a/x i)/2
(3)数组类问题
用字符数组实现求数组的最值,平均,排序,查找等功能
1.1.2 选题的意义
递推算法是一种用若干步可重复运算来描述复杂问题的方法。递推是序列计算中的一种常用算法。通常是通过计算前面的一些项来得出序列中的指定项的值。递推是按照一定的规律来计算序列中的每个项,通常是通过计算前面的一些项来得出序列中的指定项的值。其思想是把一个复杂的庞大的计算过程转化为简单过程的多次重复,该算法利用了计算机速度快和不知疲倦的机器特点。“迭代法"也称"辗转法”,是一种不断用变量的旧值递推新值的过程。
迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。利用迭代算法解决问题,需要做好以下三个方面的工作:
一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。三、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。不能让迭代过程无休止地重复执行下去。迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。
数组的特点:一个数组只能存储一种数据类型的数据,可以是基本类型,也可以是引用类型的数据。比如定义了int类型的数组,里面就不能存放char类型的数据。数组本身是一种引用类型。这个在数据类型的总结中提到过,引用类型包括类,接口,数组等。例如int是一个基本类型,但是int[]是一种引用类型。

第二章 详细的程序设计报告
2.1 递推法应用
2.1.1 赶鸭子问题
1.题目分析:
将下列题目采用递归和非递归的方式实现
一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?经过每个村子卖出多少只鸭子?
2.算法构造:
(1)递归:由于每个村子卖鸭子的规律是相等的,都是卖去所有鸭子的一半又一只。且经过7次后还剩下俩只。所以根据条件可设计递归模型为。
2 n=0 Fun(n)= 2* (f(n-1)+1) n>0
非递归:采用for循环。由于经过几个村子卖几次。所以循环的次数就为n次。然后设置变量sum用来表示鸭子的总数量,每一次循环sum=(sum+1)2;
(2)递归:输入一个自然数。如果非一时,奇数就乘三加一,偶数就除以二。经过多次后总可以得到1.。根据条件可以设计递归模型为,count为该数经过的次数
count m=1
fun(m)= fun(3(m-1)+1) m%2!=0&&m!=1
fun(m/2) m%2==0
非递归:采用while循环,如果输入的数不等于1,就进入循环。如果他是奇数,就执行m=3*m+1.如果是偶数,就执行m=m/2;
3.算法实现
源代码:
#include < iostream>
using namespace std;
int Duck_number2(int count,int vil_num)
{
int sale = 0;
for (; vil_num > 0; vil_num–)
{
count = (count + 1) * 2;
sale = count / 2 + 1;
cout<<“经过第”<<vil_num<<“个村庄时卖出的鸭子数为”<< vil_num<<sale<<endl;
}
return count;
}
int Duck_number1(int count, int vil_num)
{
int sale = 0;
while (vil_num > 0)
{
count = (count + 1) * 2;
sale = count / 2 + 1;
cout<<“经过第”<<vil_num<<“个村庄时卖出的鸭子数为”<< vil_num<<sale<<endl;
return Duck_number1(count, vil_num-1);
}
return count;
}
int Step_num1(int number,int step)
{
while (number != 1)
{
if (number % 2 == 0)
{
number /= 2;
cout<<number;
return Step_num1(number,step+1);
}
else
{
number = number * 3 + 1;
cout<<number;
return Step_num1(number,step+1);
}
}
cout<<endl;
return step;
}
int Step_num2(int number,int step)
{
for (step; number != 1; step++)
{
if (number % 2 == 0)
{
number /= 2;
cout<<number;
}
else
{
number = number * 3 + 1;
cout<<number;
}
}
cout<<endl;
return step;
}
int main()
{
int remainder = 2;
int village_number = 7;
int count = 0;
count = Duck_number1(remainder, village_number);
cout<<“(递归)出发时的鸭子总数为”<<count<<endl;
count = Duck_number2(remainder, village_number);
cout<<“(递归)出发时的鸭子总数为”<<count;
int number = 0;
int step = 1;
return 0;
}
4.调试、测试及运行结果

5.经验归纳
递归的基本思想是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。
递归算法:
优点:代码简洁、清晰,并且容易验证正确性。
缺点:它的运行需要较多次数的函数调用,如果调用层数比较深,需要增加额外的堆栈处理,比如参数传递需要压栈等操作,会对执行效率有一定影响。但是,对于某些问题,如果不使用递归,那将是极端难看的代码。
循环算法:
优点:速度快,结构简单。
缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。
2.2 精确计算及迭代
2.2.1 求一个数的开平方问题
1.题目分析:
将下列题目采用递归和非递归的方式实现
求一个数的开平方 公式为x i+1=(x i+a/x i)/2
2.算法构造:
用迭代思想去精确计算
首先估计A的平方根大概是多少,即预设X0的值,代入迭代公式中,就可以计算出X1的值,然后再把X1代入迭代公式中,就可以计算出X2的值,重复以上步骤数次,就可以近似求得A的平方根。比如,要计算A=18.56的平方根,首先预估X0=42代入迭代公式中,可计算出0.5*(4.2+1856/4.2) =4.309再次代入计算出0.5*(4.309+1856/4.309)=4.308,即18.56的平方根约为4308。这种方法用干某些开平方开得尽的数十分方便,即使是开平方开不尽的数,只需要用迭代公式两三次,其精确度就比较准确了。比如求322624的平方根首先预估该数的平方根约为530把530代入迭代公式计算出0.5*(530+322624/530)=569 再次代入可计算出数值568.001。由于已知该数为完全平方数所以其平方根应为568。用568*568验证可知结果准确。
3.算法实现
源代码:
#include < iostream>
#include < cmath>
using namespace std;
int main()
{
float a,x0,x1;
cin>>a;
x0=a/2;
x1=(x0+a/x0)/2;
while(fabs(x1-x0)>=0.00001)
{
x0=x1;
x1=(x0+a/x0)/2;
}
cout<<x1<<endl;
return 0;
}

4.调试、测试及运行结果
5.经验归纳
迭代算法不存在绝对的优缺点,迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令或一定步骤进行重复执行,在每次执行这组指令或这些步骤时,都从变量的原值推出它的一个新值。
利用迭代算法解决问题,需要做好以下三个方面的工作:
1、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
2、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式或关系。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
3、对迭代过程进行控制。在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。
2.3 数组类问题
2.3.1 字符组问题
1.题目分析:
用字符数组来完成求数组的最值,平均,排序,查找。利用C++可以实现对数组的各种操作,如输入数组元素,输出数组元素、求数组元素平均值、输出数组元素最大值、输出数组元素最小值、查找某数值元素是否存在、给数组元素排序等功能。
2.算法构造:
最值:运用的是遍历数组的方法,首先将数组的第一个元素视为最大值,并将第一个元素的值存到已经定义的变量“max”中,然后对数组元素进行遍历,每次比较,都将两者中数值较大的元素赋值给变量“max”,这样就能实现最大值寻找的功能了。
平均:实现思路是先对数组元素进行求和,再除以数组元素个数(数组长度)。
排序:数组元素以某种规则进行排序并将排序后的数组送屏幕显示(下列代码采用的排序规则是数组元素由小到大进行排列),采用的排序方法为选择排序法。
查找:引导用户输入其寻找的元素,并查找此数值元素是否存在,若存在,则输出对应元素的下标,否则则提示用户“你所寻找的元素不存在”。
3.算法实现
源代码:
#include < iostream>
using namespace std;
void input(int array[10],int n);
void output(int array[10],int n);
int max(int array[10],int n);
int min(int array[10],int n);
double pjz(int array[10],int n);
int find(int array[10],int n);
void px(int array[10],int n);
int main()
{
int array[10]= {0};
int i,n,h;
do
{
cout<<“请输入数组元素总数n(0<n<=10):”<<endl;
cin>>n;
}
while(n<=0||n>10);
input(array,n);
h=find(array,n);
output(array,n);
px(array,n);
cout<<“数组元素的平均值是:”<<pjz(array,n)<<endl;
cout<<“数组元素最大值为:”<<max(array,n)<<endl;
cout<<“数组元素最小值为:”<<min(array,n)<<endl;
if(h==-1)
cout<<“你所寻找的元素不存在!”<<endl;
else
cout<<“你所寻找的元素的下标为”<<h<<endl;
cout<<“你所输入的元素按从小到大排序为”<<endl;
for(i=0; i<n; i++)
cout<<array[i]<<endl;
return 0;
}
void input(int array[10],int n)/函数功能:输入元素/
{
int i;
cout<<“请输入”<<n<<“个数组元素”;
for (i=0; i<n; i++)
cin>>array[i];
}
void output(int array[10],int n)/函数功能:输出函数/
{
int i;
cout<<“请输入”<<n<<“个数组元素”;
for (i=0; i<n; i++)
cout<<array[i]<<endl;

}
int max(int array[10],int n)/函数功能:求数组元素最大值/
{
int i,max;
max=array[0];
for(i=1; i<n-1; i++)
if(max<array[i])
max=array[i+1];
return max;
}
int min(int array[10],int n)/函数功能:求数组元素的最小值/
{
int i,min;
min=array[0];
for(i=1; i<n-1; i++)
if(min>array[i])
min=array[i];
return min;
}

double pjz(int array[10],int n)/函数功能:求平均值/
{
double sum=0 ,ave;/注意:平均值与元素合应定义为双精度型,防止出现错误/
int i;
for(i=0; i<n; i++)
sum+=array[i];
ave=sum/n;
return ave;
}
int find(int array[10],int n)/函数功能:寻找元素/
{
int a,b,i,flag;
flag=-1;
printf(“请输入你所寻找的元素:\n”);
cin>>a;
for (i=0; i<n; i++)
if(a==array[i])
flag=i+1;
return flag;
}
void px(int array[10],int n)/函数功能:选择排序法/
{
int i,j,temp;
for(i=0; i<n-1; i++)
for(j=n-1; j>i; j–)
if(array[j]<array[j-1])
{
temp=array[j-1];
array[j-1]=array[j];
array[j]=temp;
}
}
4.调试、测试及运行结果

5.经验归纳
字符数组在解决最值,平均,排序,查找功能的优缺点:(一)优点:
1、按照索引查询元素速度快;
2、能存储大量数据;
3、按照索引遍历数组方便:
4、数组定义简单,而且访问很方便:
5、可以随机访问其中的元素。
(二) 缺点:
1、根据内容查找元素速度慢;
2、数组的大小一经确定不能改变,不适合动态存储;
3、数组智能存储一种类型的数据:
4、增加、删除元素效率慢:
5、未封装任何方法,所有操作都需要用户自己定义:
6、数组的空间必须是连续的,这就造成数组在内存中分配空间时必须找到一块连续的内存空间。所以数组不可能定义的太大,因为内存中不可能有那么多大的连续的内存空间,而解决这个问题的方法就是使用链表。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C0ntr01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值