第六章课后习题
(使用指针或引用)
1、3个整数按从小到大输出
//课本P184~P187
#include<iostream>
using namespace std;
void sort(int &a,int &b,int &c){
//引用,实际上是传址
if(a>b){
int t=a; a=b; b=t;
}
if(a>c){
int t=a; a=c; c=t;
}
if(b>c){
int t=b; b=c; c=t;
}
}
int main(){
int a,b,c;
cin>>a>>b>>c;
sort(a,b,c);
cout<<a<<" "<<b<<" "<<c<<endl;
return 0;
}
#include<iostream>
using namespace std;
void sort(int *a,int *b,int *c){
//指针,实际上仍是传值
if(a>b){
int t=*a; *a=*b; *b=t;
}
if(a>c){
int t=*a; *a=*c; *c=t;
}
if(b>c){
int t=*b; *b=*c; *c=t;
}
}
int main(){
int a,b,c;
cin>>a>>b>>c;
sort(&a,&b,&c);
cout<<a<<" "<<b<<" "<<c<<endl;
return 0;
}
2、3个字符串按从小到大输出
#include<iostream>
#include<string>
using namespace std;
void swap(string &a,string &b){
if(a>b){
string t=a; a=b; b=t;
}
}
int main(){
string a,b,c;
cin>>a>>b>>c;
swap(a,b);
swap(a,c);
swap(b,c);
cout<<a<<" "<<b<<" "<<c<<endl;
return 0;
}
3、函数完成相应处理
#include<iostream>
using namespace std;
void input(int *p){
for(int i=0;i<10;i++){
cin>>*(p+i);
}
}
void output(int *p){
for(int i=0;i<10;i++){
cout<<*(p+i)<<" ";
}
}
void swap(int *p){
int k1=0,k2=0;
for(int i=0;i<10;i++){
if(*(p+i)<*(p+k1)) k1=i;
if(*(p+i)>*(p+k2)) k2=i;
}
int t=*(p+0);//最小值和第一个数交换
*(p+0)=*(p+k1);
*(p+k1)=t;
int t1=*(p+9);//最大值和最后一个数交换
*(p+9)=*(p+k2);
*(p+k2)=t1;
}
int main(){
int a[10];
input(a);
swap(a);
output(a);
return 0;
}
4、后面的m个数变成最前面的,前面的n-m个数移动到后面
#include<iostream>
using namespace std;
void trans(int *p,int n,int m){
/*思路,首先对要移动的第一个数,先把该数保存,然后把前n-m个数都后移一位,然后将这个数放在第一位; 以此类推,每次把后面要移动的一个保存,将前面的数后移一位,循环m次即可*/
for(int i=0;i<m;i++){
int f=*(p+n-m+i);
for(int j=n-m+i-1;j>=i;j--){
*(p+j+1)=*(p+j);
}
*(p+i)=f;
}
}
int main(){
int a[1000];
int n,m;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>m;
trans(a,n,m);
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
return 0;
}
5、报数1,2,3,报到3去除,问最后一个留下的人是几号
#include<iostream>
using namespace std;
int main(){
int n;
int a[100];
int *p=a;
cin>>n;
for(int i=0;i<n;i++){
*(p+i)=1;//初始所以人都是1,所有人都在
}
int k=0;//淘汰的人数
int count=0;//报数
while(k<n-1){
//淘汰人数小于n-1进入循环,否则代表已经结束
for(int i=0;i<n;i++){
//循环n圈以内应该可以找出,虽然简单的验证结果似乎正确,但不能确定是否完全正确⭐⭐⭐
if(*(p+i)==1){
if(count==2){
count=0; *(p+i)=0; k++;//报数到3,报数重置为0,该人淘汰,淘汰人数计数加1
}
else count++;//否则遇到还没被淘汰的人,只需要报数即可
}
}
}
/*int k=0;
int flag=0;
int i=0;//经典算法的方法
while(k<n-1){
if(*(p+i)==1){
if(flag==2){
flag=0; *(p+i)=0; k++;
}
else flag++;
}
i++;
if(i==n) i=0;
}*/
for(int i=0;i<n;i++){
if(*(p