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);
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源是压缩包形式的, 里面包含 本书,里面是pdf格式的, 带书签目录,本书是完整的。 资源都是我自己用过的,不骗大家。 本书作者: 肖俊宇 吴为胜; 出社: 电子工业出社 内容简介: 《由浅入深学C++:基础、进阶与必做300题(含DVD光盘1张)》是C++语言的入门教程,较为系统地介绍了C++语言的基础内容。本书共分为3篇22章,详细介绍了C++语言的基础知识、面向对象、标准模块、底层开发和综合案例。本书循序渐进地讲述了C++的基础知识、C++程序的组成及其开发过程、C++程序中的数据、表达式和语句、控制程序流程、数组与字符串、指针与引用、使用函数、函数模板、错误和异常处理、宏和预编译、面向对象的开发、封装、继承、多态、类模板、文件流、标准模板库STL和编程实践等内容。 《由浅入深学C++:基础、进阶与必做300题(含DVD光盘1张)》涉及面广,从基本知识到高级内容和核心概念,再到综合案例,几乎涉及C++开发的所有重要知识。本书适合所有想全面学习C++开发技术的人员阅读,尤其适合没有编程基础的C++语言初学者作为入门教程,也可作为大、中院校师生和培训班的教材,对于C++语言开发爱好者,本书也有较大的参考价值。 章节目录: 第1篇 C++基础篇 第1章 C++概述 1 1.1 引言 1 1.1.1 C++的历史沿革 1 1.1.2 入门C++ 2 1.1.3 编程思想的转变 3 1.2 C++概述 4 1.2.1 C++的特征 5 1.2.2 C与C++的比较 5 1.2.3 C++的应用领域 6 1.3 C++源程序的组成 6 1.3.1 基本组成元素 7 1.3.2 标识符 8 1.3.3 保留字 8 1.3.4 符号 8 1.4 C++集成开发环境——DEV-C++ 9 1.4.1 选择C++编译器 9 1.4.2 安装DEV-C++ 10 1.4.3 DEV-C++ IDE简介 11 1.5 第一个C++程序——Hello World 11 1.5.1 创建源程序 11 1.5.2 编译运行 13 1.6 小结 14 1.7 习题 14 第2章 变量与数据类型 18 2.1 常量和变量 18 2.1.1 常量 18 2.1.2 变量 21 2.1.3 变量的定义及赋值 22 2.1.4 变量的应用示例 24 2.2 基本数据类型 25 2.2.1 基本数据类型概述 25 2.2.2 整型数据类型 26 2.2.3 浮点型数据类型 27 2.2.4 字符型数据类型 29 2.2.5 布尔型数据类型 30 2.3 变量的作用域 31 2.4 类型转换 32 2.4.1 隐式转换 32 2.4.2 显式转换 33 2.5 小结 34 2.6 习题 34 第3章 表达式与语句 39 3.1 运算符 39 3.1.1 运算符概述 39 3.1.2 算术运算符 40 3.1.3 自增和自减运算符 42 3.1.4 赋值运算符 43 3.1.5 关系运算符 44 3.1.6 逻辑运算符 45 3.1.7 条件运算符 46 3.1.8 逗号运算符 47 3.1.9 位运算符 48 3.1.10 sizeof运算符 49 3.2 运算符的优先级和结合性 50 3.3 表达式 51 3.4 语句 53 3.4.1 空格的作用 53 3.4.2 语句块 54 3.4.3 赋值语句 55 3.4.4 空语句 56 3.5 小结 57 3.6 习题 57 第4章 流程控制结构之顺序结构 63 4.1 程序流程图 63 4.2 表达式语句 64 4.3 格式化输入/输出 65 4.3.1 标准输入流cin 65 4.3.2 标准输出流cout 66 4.3.3 输出流cerr和clog 68 4.4 格式控制函数 69 4.5 格式控制符 71 4.5.1 控制不同进制的输出 72 4.5.2 控制输出宽度 72 4.5.3 控制输出精度 73 4.6 顺序结构综合应用 74 4.7 小结 75 4.8 习题 75

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值