C++语句复习题以及知识讲解

1.1 什么是块,什么时候会使用到块?

块是指用花括号括起来的语句和声明的序列,也称为复合语句。一个块就是一个作用域,其作用域中所定义的变量在其他的定义域中将无法使用。因为在这个作用域结束之际会将所定义的变量自动进行销毁。块不需要以分号结束。

1.2 写一个自己的程序将班级内的成绩转化为字母等级的形式输出。

由上述练习题可知我们可以使用循环以及上一篇vector所学到的内容和if-else语句对其成绩进行相关的处理。

90-100分为A,80-90分为B,70-80分为C,60-70分为D,60分为F。

且个位数字超过7则有一个+号,小于3则有一个-号。

其练习题的代码如下所示:

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	int n;
	cout<<"请输入您班级学生人数->";
	cin>>n; 
	vector<int> garde;
	int g;
	cout << "请输入您班级学生的成绩:"<<endl;
	for(int i=0;i<n;i++)
	{
		cin>>g;
		garde.push_back(g);
	}
	int i=1;
	for(int j=0;j<n;j++)
	{
		if(garde[j]<0 && garde[j]>100)
			cout<<"您输入的成绩有误!"<<endl;
		else if(garde[j] == 100){
			cout<<"第"<<i<<"个人的成绩等级为:"<<"A++"<<endl;
			i++;
			continue;
		}
		else if(garde[j] <60){
			cout<<"第"<<i<<"个人的成绩等级为:"<<"F"<<endl;
			i++;
			continue;
		}
		int iu = garde[j]/10;
		int it = garde[j]%10;
		string score,level,scorelevel;
		if(iu == 9)
			score = "A";
		else if(iu == 8)
			score = "B";
		else if(iu == 7)
			score = "C";
		else 
			score = "D";
		if(it<3)
			level = "-";
		else if(it>7)
			level = "+";
		else 
			level="";
		scorelevel=score+level;
		cout<<"第"<<i<<"个人的成绩等级为:"<<scorelevel<<endl; 
		i++;
	} 
	return 0;
}

由上述代码可知字符串的形式可以进行相加也就是将其链接起来!

运行之后的结果如下图所示:

也可以使用条件运算符对该题进行相关操作只须更改判断除100和60分一下的数据即可,其更改后的代码如下所示:

score = (iu == 9) ? "A" 
        : (iu ==8) ? "B"
        : (iu == 7) ? "C" : "D";
level = (it < 3) ? "-"
        :(it > 7) ? "+" : "";

 1.3 什么是悬垂else?C++语言是如何处理else子句的。

悬垂else是指当前程序中的if分支多余else分支时,如何为else寻找与之匹配的if语句的问题。

C++规定,else与离它最近的尚未匹配的if匹配,从而消除了二义性。

1.4 编写一段程序,从标准输入中读取若干个string字符串对象并查找连续重复出现的单词。所谓连续重复出现的意思是:一个单词后面紧跟着这个单词本身。要记录连续出现的次数和单词是什么。若不存在则说明单词都只出现过一次。

由上述练习题可以看出,这个题目必须使用循环根据我们学习的经验来说使用while循环比使用for循环更加方便。

解题的代码如下所示:

#include<iostream>
#include<string>
using namespace std;

int main()
{
	string	current,pre="",max;
	int curcount=1,maxcount=0;
	cout<<"请输入字符串:"<<endl;
	while(cin>>current)
	{
		if(current == pre)
		{
			++curcount;
			if(curcount > maxcount)
			{
				maxcount = curcount;
				max = current;
			}
		}
		else
		{
			curcount = 1;
		}
		pre = current;
	}
	if(maxcount > 1)	
		cout<<"当前出现最多的字符串为"<<max<<"次数为"<<maxcount; 
	else
		cout<<"每一个单词都只出现了一次"<<endl;
}                  

运行后的结果如下图所示:

 还可以更改程序,让其不用查找连续重复出现的单词,可以直接查找重复出现的无论是否连续,所以要对原有的代码进行更改。更改后的代码如下所示:

 

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
	vector<string> str;
	cout<<"请输入多个字符串随后进行相关判断\n";
	string s,maxstr;
	int cnt;
	while(cin>>s)
		str.push_back(s);
	for(auto c : str)
	{	cnt=0;
		for(auto b : str)
		{
			if(c==b){
				cnt++;	
				maxstr=c;
			}
		} 
	}
	cout<<"出现过最多的单词为"<<maxstr<<"出现了"<<cnt<<"次\n";
} 

更改后的运行结果如下图所示:

1.5 下面显示的每个程序都有一个常见的编译错误,指出错误在哪里,然后修改它。

unsigned evencnt=0,oddcnt=0;
int digit = get_num()%10;
switch(digit)
{
    case 1,3,5,7,9:
        oddcnt++;
        break;
    case 2,4,6,8,10;
        evencnt++;
        break;
}

上述代码错误在一个case只可以对于一个值,不可以一个对应多个值

更改后的代码如下所示:

unsigned evencnt=0,oddcnt=0;
int digit = get_num()%10;
switch(digit)
{
    case 1:
    case 3:
    case 5:
    case 7:
    case 9:
        oddcnt++;
        break;
    case 2:
    case 4:
    case 6:
    case 8:
    case 10:
        evencnt++;
        break;
}
unsigned ival=521, jval=1024,kval=1225;
unsigned bufsize;
unsigned swt = get_bufCnt();
switch(swt)
{
    case ival:
        bufsize = ival*sizeof(int);
        break;
    case jval:
        bufsize = jval*sizeof(int);
        break;
    case kval:
        bufsize = kval*sizeof(int);
        break;
}

上述代码错误在使用变量作为case标签内容,C++规定,case标签的内容只能是整型常量表达式。修改后的程序如下所示:(只需将变量更改为常量即可用const)

const unsigned ival=521, jval=1024,kval=1225;
unsigned bufsize;
unsigned swt = get_bufCnt();
switch(swt)
{
    case ival:
        bufsize = ival*sizeof(int);
        break;
    case jval:
        bufsize = jval*sizeof(int);
        break;
    case kval:
        bufsize = kval*sizeof(int);
        break;
}

1.6 假设有两个包含整数的vector对象,编写一段程序,检验其中一个vector对象是否是另一个的前缀。为实现这一目标,对于两个不等长的vector对象,只需挑出最短的那个,把所有元素和另一个元素进行比较即可。

由上述题目可知我们可以使用while循环对其进行比较,使两个对象一一进行比较。

其实现的代码如下:

#include<iostream>
#include<string>
#include<vector>
using namespace std;

int main()
{
	vector<int> v1;
	vector<int> v2;
	int vc1,vc2,n,m;
	cout<<"请输入v1容器中元素个数:\n";
	cin>>n;
	cout<<"请输入v1容器中的元素:\n";
	for(int i=0;i<n;i++){
		cin>>vc1;
		v1.push_back(vc1);
	}
	cout<<"请输入v2容器中的元素:\n";
	while(cin>>vc2)
		v2.push_back(vc2);
	vector<int>::iterator it1 = v1.begin();
	vector<int>::iterator it2 = v2.begin();
	while(it1 != v1.end()&&it2 != v2.end())
	{
		if(*it1 != *it2)
		{
			cout<<"v1和v2之间不存在前缀关系\n";
			break;
		}
		it1++;
		it2++;
	} 
	if(it1 == v1.end())
		cout<<"v1是v2的前缀\n";
	else if(it2 == v2.end())
		cout<<"v2是v1的前缀\n";
	return 0;
} 

因为一按下ctrl+z该程序就不会继续让你输入v2容器里的值了所以这里给v1的输入值与v2不同就是此原因,一旦退出输入v1则无法再次进入v2容器中输入值。 

运行结果如下图所示:

 1.7 说明下列循环的含义并修改其中的错误。

do{
    //......
}while(int val = get_response());

含义是当get_response()的返回值不为0时执行循环体的内容。因为do-while语句不允许下循环条件内定义变量所以此程序是错误的

更改后的代码如下所示:

int val;
do{
       //.......
}while(val = get_response());
do{
    int val = get_response();
}while(val);

上述代码含义是当get_response()返回值不是0时执行循环体内容。因为出现do-while语句条件部分的变量必须定义在循环体之外,所以上述程序是错误的。

更改后如下所示:

int val;
do{
    val = get_response();
}while(val);

1.8 break、continue与goto语句

break是一个跳转语句,负责终止离它最近的while、do-while、for和switch语句,并把程序的控制权交给这些语句之后的第一条语句。

continue语句是一种跳转语句,负责终止最近的循环中当前迭代并立即开始下一个迭代。与break的区别是,continue虽然终止了当前迭代,但是并不终止循环;而break语句直接终止循环。

goto语句的作用是从goto语句无条件跳转到同一函数的另一条语句。但是一般情况下不建议使用goto语句,因为它使得程序即难理解又难修改。

1.9 编写一段程序,从标准输入读取两个数,输入第一个数除以第二个数的结果。

#include<iostream>
#include<iomanip>
#include<vector>
using namespace std;

int main()
{
	float a,b;
	cout<<"请输入两个数:\n";
	cin>>a>>b;
	if(b==0)
	{
		cout<<"除数不能为0\n";
		return -1;
	}
	else
		cout<<"两数相除的结果是:"<<fixed<<setprecision(2)<<a/b<<endl;
}

 有上述代码可知C++在保留小数时可以使用c语言的相关用法,也可以使用自己的一个函数来保留小数部分的位数,首先要添加头文件#include<iomanip>,使用cout<<fixed<<setprecision(位数)<<输出变量名即可完成此操作。

运行后如下所示:

 还可以使用try语句块捕获异常。catch子句应该为用户输出一句提示信息,询问其是否要继续执行内容。

代码如下所示:

#include<iostream>
#include<iomanip>
#include<stdexcept>
#include<vector>
using namespace std;

int main()
{
	float a,b;
	cout<<"请输入两个数:\n";
	while(cin>>a>>b){
	try{
		if(b==0)
			throw runtime_error("除数不可以为0");
		cout<<"两数相除的结果是:"<<fixed<<setprecision(2)<<a/b<<endl;
	}catch(runtime_error err)
	{
		cout<<err.what()<<endl;
		cout<<"是否要继续\n";
		char ch;
		cin>>ch;
		if(ch!='y'&&ch!='Y')
			break;
	}
  }
	return 0;
}

 捕获异常和执行时需要加入头文件#include<stdexpect>加入头文件之后才可以抛出异常和接受异常信号。

执行程序后的结果如图所示:

 该篇博客讲述了C++语句部分的内容,大致与上述的题目一致,希望大家可以举一反三进行相关性的练习提升自己的编码水平。抛出异常和接收异常不需要在此就看懂以后会出一篇专门的文章来讲述如何抛出异常和如何接收。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小侯不躺平.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值