week one (递归算法+复合数据类型)

目标:
1.熟悉面向对象相关知识;
2.熟练运用c++内容编写面向对象程序代码;
3.了解软件开发的基本流程,学会面向对象软件开发方法;
4.能够开发小型软件系统。

一、递归算法
程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。
直接或间接调用自身的函数称为递归函数
特点:
把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题。
基本思想:层层分解

1.1递归

1.1.1关键:递归定义(关系)和递归终止条件
递归定义(关系):使问题向边界条件转化的规则。
如{n!=n*(n-1)!}
递归终止条件:所描述问题的最简单情况,它本身不再使用递归的定义。
如(1!=1)

1.1.2解题步骤
(1)分析问题、寻找递归:找出大规模问题与小规模问题的关系,通过递归使问题的规模逐渐变小。
(2)设置边界、控制递归:找出停止条件
(3)设计函数(名称:可以体现函数功能;返回值…)、确定参数。

1.1.3 EQ
递归函数和其他函数区别先处理结束条件。
计算过程:调用过程使问题简化,回溯过程得到问题的解。

eq1:求前N个数的和,求N!。
代码:
#include< iostream >
using namespace std;
int fn(int n) {
if (n <= 1) return 1;{出口(终止条件)}
else
return n + fn(n - 1);(递归关系)(递归关系的表示一般用这种返回语句的形式表示)}

int fact(int a){
if(a == 0 or a==1) return(1);
else
return a*fact(a-1);
}

int main(){
int n1,n2; cin>>n1,n2;
cout<<fn(n1)<<endl;
cout<<fact(n2);
}

eq2:求最大公约数(欧几里得算法)
递归代码:
int gcd(int m,int n){
if(n==0)return m;
[else] return gcd(n,m%n);(else加括号表示可选项,else可加可不加无影响)
}

eq3:a^b(快速幂)
typedef为C语言的关键字,使用目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
代码:
#include< iostream >
using namespace std;
typedef long long ll;
ll binaryPow(ll a,ll b) { (binaryPow 2分幂)
if(b= =1)return a;
else if(b%2==1)
return a * binaryPow(a,b-1);
else{
ll num=binaryPow(a,b/2);
return num*num;
}}
int main(){
ll a,b;
cin>>a>>b;
cout<<binaryPow(a,b);
}

注意:
(1)在层层分解时,如果有多种情况,要分别考虑
(2) 优化ll num=binaryPow(a,b/2);return num*num; 提高效率。而不是写成return binaryPow(a, b/2, m) * binaryPow(a, b/2, m)。

eq3:集合全排列问题
eq4:半数集——记忆化搜索
定义:在一个数n的前面加(1~n/2),依次加所加数a 的(1 ~a/2)。例:8的半数集={18、28、38、48、128、138、148、248,1248、8}
普通代码:
#include< iostream >
using namespace std;
int comp(int n)
{
int ans=1;(这里赋值为1!!)
if (n>1) for(int i=1;i<=n/2;i++)
ans+=comp(i); return ans;(分解过程中不可以缺少任何一种情况)
}

int main(){
int n;cin>>n;
cout<<comp(n);
}
记忆化搜索:(添加一个数组)
int a[1001];
int comp(int n)
{
int ans=1;
if(a[n]>0)(符合条件则表示,已经计算过)
return a[n];
for(int i=1;i<=n/2;i++)
ans+=comp(i);
a[n]=ans;
return ans;
}

递归总结
在这里插入图片描述
.
.

二、复合数据类型

C++的数据类型:
C
2.1 结构体和枚举

2.1.1 结构体

2.1.1.1结构体定义
C++ 中的结构体是由一系列具有相同类型不同类型的数据构成的数据集合,也叫结构。
声明格式:
(1)struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;

};
(2)struct 类型名{
数据类型1 成员名1;
数据类型2 成员名2;

} 变量名;

2.1.1.2结构体特点
(1)可以对结构体变量的整体进行操作。
(2)可以对结构体变量的成员进行操作。
引用结构体变量中成员的格式为:
结构体变量名. 成员名
(3)结构体变量的初始化方法与数组类似。

2.1.1.3EQ
eq1:学生多项不同类型信息的显示
代码:
#include<bits/stdc++.h>
using namespace std;
struct student{
string name;
char sex;
int age;
double weight;
};

int main(){
student stu;
cin >> stu.name >> stu.sex >> stu.age >> stu.weight;(逐项出入)
cout << stu.name <<" “<< stu.sex <<” “<< stu.age <<” ";
cout << fixed << setprecision(1) << stu.weight << endl;
return 0;
}

注: cout << fixed << setprecision(1) <<
fixed和setprecision()配合使用表示在小数点后保留几位数。

eq2:年龄大小排序
基本思想:定义结构体类型定义结构体数组用于储存学生的所有信息,依次输入同学信息,排序输出。(sort排序的使用)
#include<bits/stdc++.h>
using namespace std;
struct stu{
string name;
string sex;
int year,month;
};
const int MAXN = 110;
stu a[MAXN];//全局数组采用堆存储

int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i].name >> a[i].sex >> a[i].year >> a[i].month;//按成员输入
for(int i = 1; i <= n; i++)
for(int j = i+1; j <= n; j++)
if(a[i].year < a[j].year || a[i].year == a[j].year && a[i].month < a[j].month)
swap(a[i],a[j]);//交换操作可以整体进行
for(int i = 1; i <= n; i++){
cout<< a[i].name <<" “<< a[i].sex <<” “;
cout<< a[i].year <<” "<< a[i].month << endl;
}
return 0;}

2.1.1.4运算符重载 (结构体内有效)
语法格式:
类型名 operator 运算符 (const 类型名 变量)const{

}
EQ
eq1:学生n天作业总时间计算。
由于涉及时分秒的计算,不同于平常的加法运算,于是对加法进行重载。
代码:
#include<bits/stdc++.h>
using namespace std;
struct worktime{// 声明一个结构体类型 worktime 记录学生完成作业的时间
int hr,minut,sec;
worktime operator +(const worktime x)const{ // 对 + 进行重新定义
worktime tmp;
tmp.sec = (sec + x.sec) % 60;
tmp.minut = (minut + x.minut + (sec + x.sec) / 60) % 60;
tmp.hr = hr + x.hr + (minut + x.minut + (sec + x.sec) / 60) / 60;
return tmp;
}
};
int main(){
worktime stu,sum;
int n;
cin >> n;
sum.hr = sum.minut = sum.sec = 0;
for(int i = 1; i <= n; i++){
cin >> stu.hr >> stu.minut >> stu.sec;
sum = sum + stu;// 两个结构体 sum 和 stu 通过重载 + 运算符进行加法运算
}
cout << sum.hr << ” hour ” << sum.minut << ” minute ” << sum.sec << ” second ” ;
return 0;
}

2.1.1.5 成员函数

struct 结构名 {
数据成员
成员函数
};

EQ:输出身高最高学生信息。
组织一结构体存储数据,对结构体数据进行排序。
代码:
#include<bits/stdc++.h>
using namespace std;
struct stu{
string name;
int heigh;
int num;
void input(){
cin >> name >> heigh >> num;(实现一个学生的信息一次输入)(在结构体内部省略了成员函数前的结构体变量名)
}
void output(){
cout << name << “ “ << heigh << “ “ << num << endl;
}
bool operation<(const stu s)const{//根据返回值确定是否调换次序
if heigh>s.heigh return ture
else if(heign==s.heigh)
return num<s.num;
else return false;
}
};
stu a[110];
int main(){
int n;
stu maxn;
maxn.heigh = maxn.num = 0;
cin >> n;
for(int i = 1; i <= n; i++)
a[i].input();
sort(a+1,a+n+1)
a[1].output;
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值