C及C++语言进阶习题解集

汉诺塔

#include<iostream>
#include<string.h>
using namespace std;
int ci;
void hannuota(int,char,char,char);
int main()
{
    
    int n;
char x='A',y='B',z='C';
cout<<"请输入盘子数";
cin>>n; 
hannuota(n,x,y,z);
cout<<"共移动"<<ci<<"次";
} ;
void hannuota(int n,char x,char y,char z)
{
    
    
if(n==1)
{
    
    cout<<x<<"---->"<<z<<endl;ci++;
}
else
{
    
    
hannuota(n-1,x,z,y);
cout<<x<<"---->"<<z<<endl;ci++;
hannuota(n-1,y,x,z);
}
}

洗牌

据说有一种洗牌机按照如下的要求洗牌:假设有 2n 张牌,在开始时以 1, 2, ……,n, n+1,……,2n 编号的顺序排列。一次洗牌就是将牌原来的次序变为 n+1,1,n+2, 2,……,2n,n,也就是将原来的前 n 张牌放到位置 2, 4,……,2n,并且将余下的 n 张牌按照他们原来的次序放到奇数位置 1,3,……,2n-1。已经证明对于任何一个自然数 n,这 2n 张牌经过一定次数的洗牌就回到原来的次序。你知道对于一个特定的n,需要几次洗牌才能将牌洗回原来的次序吗?

#include<iostream>
#include<string.h>
#include<iomanip>
using namespace std;
int panduan(int a[],int p);
void xipai(int a[],int b[],int n);
int main(){
    
    
	int i,p,t,n;
	int a[100],b[100];
	cout<<"请输入牌数的一半n\n";
	cin>>n;
	p=2*n;
	cout<<"总牌数"<<p<<endl;
	for(i=0;i<p;i++){
    
    
		a[i]=i+1;
		b[i]=a[i];
	}
	cout<<"初始数组:";
	for(i=0;i<p;i++){
    
    
		cout<<setw(3)<<b[i];
	}
	cout<<endl;
		xipai(a,b,n);
	t=1;
while(panduan(a,p)==1){
    
    
  for(i=0;i<p;i++){
    
    
	b[i]=a[i];}
	xipai(a,b,n);
	t++;	
	}
	
cout<<endl<<"次数"<<t;
		
}
int panduan(int a[],int p){
    
    
	int i;
	for(i=0;i<p;i++){
    
    
		if (a[i]==i+1)
		{
    
    return 0;
		}
		return 1;
	}
}
void xipai(int a[],int b[],int n){
    
    
	int i;
	for(i=0;i<n;i++)
	{
    
    a[2*i]=b[n+i];
		a[i*2+1]=b[i];
	}
}


折半查找

#include<iostream>
using namespace std;
int zb_search(int *p,int n,int x);
 int main(){
    
    
	int a[100],n,i,target;
	cout<<"请输入数组长度:";
	cin>>n;
	cout<<"请输入一组有序数据从大到小:";
	for(i=0;i<n;i++){
    
    
		cin>>a[i];
	}
	cout<<"请输入目标:";
	cin>>target;
	if(zb_search(a,n,target)!=-1)
	cout<<"该数在数组中的位置:"<<zb_search(a,n,target);
	else
	cout<<"该数不存在";
	cout<<endl;
	
}
int zb_search(int *p,int n,int x){
    
      //将数组a的首地址传递给*p,下面用指针进行操作 
	int mid,low,high;
	low=0;
	high=n-1;	
	while(low<=high){
    
    
	mid=(low+high)/2;
	if(p[mid]>x)// 往左区间找,左边小 
	low=mid+1;
	else if(p[mid]<x)//往右区间找,右边大 
	high=mid-1;
	else
	return mid+1;//找到了,数组元素下标加一为当前位置	
	}	
 return -1;//没找到 
}

计算若干学生的平均成绩(结构体的运用)

#include<iostream>
using namespace std;
struct student{
    
    
	int sno;
	char name[10];
	float grade[3];
};
void avg(student st[],int n){
    
    
	int i,j,pinj;
	for(i=0;i<n;i++){
    
    
		pinj=0;
		for(j=0;j<3;j++){
    
    
		pinj=pinj+st[i].grade[j];//将每个学生的三项成绩相加 
		}	
	cout<<"第"<<i+1<<"名同学平均成绩为:"<<float(pinj/3);
	cout<<endl;
	}
	
}
int main(){
    
    
	student xues[100];
	int i,j,n;
	cout<<"请输入学生数";
	cin>>n;	
	for(i=0;i<n;i++){
    
    
	cout<<"第"<<i+1<<"学号 姓名 成绩";//给结构成员赋值 
		cin>>xues[i].sno;
		cin>>xues[i].name;
		for(j=0;j<3;j++)
		cin>>xues[i].grade[j];		 
	}
	avg(xues,n);
}


计算候选人得票数(使用结构体,假设一共三名候选人)

#include<iostream>
#include<string.h>
using namespace std;
struct hxren{
    
                  //结构体定义 
	char name[100];
	int depiao;
};
int main(){
    
    
	int i,num;
	char piao[100];
	hxren person[3];
	for(i=0;i<3;i++){
    
    
		cout<<"第"<<i+1<<"候选人:";
		cin>>person[i].name;//给name分量赋值即名字 
		
	}
	cout<<"总票数";
	cin>>num;
	for(i=1;i<=num;i++){
    
    
		cout<<"第"<<i<<"票投给:"; 		
		cin>>piao;
		if(strcmp(piao,person[0].name)==0)//判断具体投票投给了谁 strcmp函数用于判断字符串是否相等,相等为0 
		person[0].depiao++;
		else if(strcmp(piao,person[1].name)==0)
		person[1].depiao++;
		else if(strcmp(piao,person[2].name)==0)
		person[2].depiao++;
		else {
    
    
			cout<<"falut"<<endl; 
			i--;
		}
		
	}
		for(i=0;i<3;i++)
		cout<<person[i].name<<"得票数:"<<person[i].depiao<<endl;
}

指针法

#include<iostream>
#include<string.h>
using namespace std;
struct person{
    
    
	char name[20];
	unsigned int count;
};
void jieguoti ( person *p,int n,int m){
    
    
	int i,j;
	char piao[20];
	for(i=0;i<m;i++){
    
    
		cout<<"请输入第"<<i+1<<"票";
		cin>>piao;
	for(j=0;j<n;j++){
    
    
		if(strcmp(piao,(p+j)->name)==0)//->是结构体指针访问结构元素方法
		(p+j)->count++;
	} 
	}
	for(i=0;i<3;i++)
	cout<<(p+i)->name<<"得票数:"<<(p+i)->count<<endl;	
	
}
int  main(){
    
    
	int i,j;
	person leader[3]={
    
    "li",0,"zhang",0,"fun",0};
	cout<<"请输入选票数";
	cin>>i;
	jieguoti(leader,3,i);
}

利用指针进行字符串复制

#include<iostream>
using namespace std;
void string_copy(char *s1,char *s2);
int main(){
    
    
	char a[20]="abcds";
	char b[20];
	cout<<a<<" ";
	string_copy(b,a);
	cout<<b<<endl;

}
void string_copy(char *s1,char *s2){
    
    
	while(*s1++=*s2++); 
}

利用指针实现字符串排序

#include<iostream>
#include<string.h>
using namespace std;
void sort1(char  const *name[],int n);
int main(){
    
    
char const *name[4]={
    
    "sfsa","fdsa","tyss","dsax"};
  sort1(name,4);
}
void sort1(char  const*name[],int n){
    
    
char const *temp;  int i, j, k;
for (i = 0; i < n-1; i++) 
{
    
     k = i;
    for (j = i + 1; j < n; j++)
    {
    
    if(strcmp(name[k], name[j]) > 0) 
		  k = j;
	}
	 if(k!=i)
	  {
    
     temp = name[i]; 
        name[i] = name[k];        
        name[k] = temp;
     }
	 for(i=0;i<n;i++){
    
    
	 	cout<<name[i]<<" ";
	 } 
}} 

指针统计单词个数(单词间空格隔开)

#include<iostream>
#include<cstring>
using namespace std;
int tongji (char *s);
int main(){
    
    
	char zf[100];
	cout<<"请输入一行连续的单词";
	gets(zf);
	cout<<"单词个数"<<tongji(zf); 
}
int tongji (char *s){
    
    
	int i;
	int flat=1,c=0;
	for(i=0;s[i]!='\0';i++){
    
    
		if(s[i]==' ')
		flat=1;
		else if(flat==1&&s[i]!=' '){
    
    
		flat=0;
	     c++;	
		}
	}
	return c;
}

字符串之无重复字符的最长子串

#include<iostream>
using namespace std;
int lengthOfLongestSubstring(char * s){
    
    
    int max_size = 0;
    int cur_size = 0;   
    if(s == NULL)
        return 0;
    if(s[0] == '\0')
        return 0;

    int l = 0; // 用来存放子串最左边的位置
    int r = 1; // 用来存放子串右边位置,这个值不断右移,移动一次就与前面l位置开始到r-1的位置的值比较。
    while(s[r] != '\0')
    {
    
    
        for(int i=l; i<r; i++)
        {
    
    
            if(s[r] == s[i]) // 找到相同的值
            {
    
    
                cur_size = r - l;
                l = i+1; // 更新l的位置

                if(max_size < cur_size)
                    max_size = cur_size;
            }
        }
        r++;
    }
    cur_size = r-l;
    if(max_size < cur_size)
        max_size = cur_size;
    
    return max_size;
}
int main(){
    
    
char s[100]="abbdecbbcfasknwesjens";
cout<<lengthOfLongestSubstring(s);
}

猜你喜欢

转载自blog.csdn.net/huadong_xiaolin/article/details/116898443