C++100-C++拓展001-异常平方根计时功能

news2024/11/16 0:52:15

文章目录

  • C++100-C++拓展-异常平方根计时功能
    • 摘要
    • C++异常实现
      • C++异常简介
      • C++异常捕获
        • 捕获异常
        • 捕获指定异常 std::out_of_range e
        • 捕获throw的异常
        • 抛出int异常并捕获
        • 除数为0的异常捕获
    • C++实现求平方和平方根
        • 利用math.h的pow求平方和平方根
      • 利用math.h求开根号
      • 自定义pow函数实现求平方
    • 完成循环计时功能
    • 在线练习:
    • 总结

C++100-C++拓展-异常平方根计时功能

在这里插入图片描述

摘要

本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为C++拓展内容,包括i异常处理,平方计算和计时功能,并提供相关案例练习。

在线练习:
http://noi.openjudge.cn/ch0104/

C++异常实现

参考:http://c.biancheng.net/view/2330.html

C++异常简介

C++程序的错误大致可以分为三种,分别是语法错误、逻辑错误和运行时错误:

  1. 语法错误在编译和链接阶段就能发现,只有 符合语法规则的代码才能生成可执行程序。
  2. 逻辑错误是说我们编写的代码思路有问题,不能够达到最终的目标,这种错误可以通过调试来解决。
  3. 运行时错误是指程序在运行期间发生的错误,例如除数为 0、内存分配失败、数组越界、文件不存在等。C++ 异常(Exception)机制就是为解决运行时错误而引入的。

遇到运行时错误,系统终止程序运行(程序崩溃Crash)。对此C++ 提供了异常(Exception)机制。

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

int main(){
    string str = "abcdefghijklmn";
    char ch1 = str[27];  //下标越界,ch1为垃圾值
    cout<<ch1<<endl;
    char ch2 = str.at(27);  //下标越界,抛出异常
    cout<<ch2<<endl;
    return 0;
}

输出:

terminate called after throwing an instance of ‘std::out_of_range’
what(): basic_string::at: __n (which is 27) >= this->size() (which is 14)

at() 是 string 类的一个成员函数,它会根据下标来返回字符串的一个字符。与[ ]不同,at() 会检查下标是否越界,如果越界就抛出一个异常;而[ ]不做检查,不管下标是多少都会照常访问。

常见的异常:
在这里插入图片描述

C++异常捕获

异常捕获语句:

try{
    // 可能抛出异常的语句
}catch(exceptionType variable){
    // 处理异常的语句
}

捕获异常

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

int main()
{
    string str = "abcdefghijklmn";
    try
    {
        char ch1 = str[27];  //下标越界,ch1为垃圾值
        cout<<ch1<<endl;
        cout<<"1 的内部"<<endl;
    }
    catch(exception e)
    {
        cout<<"1  out of bound "<<endl;
        cout<<"1  数组下标越界"<<endl;
    }

    try
    {
        char ch2 = str.at(27);  //下标越界,抛出异常
        cout<<ch2<<endl;
        cout<<"2 的内部"<<endl;
    }
    catch(exception e)
    {
        cout<<"2  out of bound"<<endl;
        cout<<"2  数组下标越界"<<endl;

    }
    return 0;
}

输出为:
在这里插入图片描述

捕获指定异常 std::out_of_range e

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

int main()
{
    string str = "abcdefghijklmn";
    try
    {
        char ch1 = str[27];  //下标越界,ch1为垃圾值
        cout<<ch1<<endl;
        cout<<"1 的内部"<<endl;
    }
    catch(exception e)
    {
        cout<<"1  out of bound "<<endl;
        cout<<"1  数组下标越界"<<endl;
        cout<<e.what()<<endl;
        cout<<"$$$$$$$$$$"<<endl;
    }

    try
    {
        char ch2 = str.at(27);  //下标越界,抛出异常
        cout<<ch2<<endl;
        cout<<"2 的内部"<<endl;
    }
    //catch(std::bad_alloc e) //这个无法捕获
    catch(std::out_of_range e)
    {
        cout<<"2  out of bound"<<endl;
        cout<<"2  数组下标越界"<<endl;
        cout<<e.what()<<endl;
        cout<<"$$$$$$$$$$"<<endl;

    }


    return 0;
}

输出为:
在这里插入图片描述

捕获throw的异常

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

int main()
{
    string str = "abcdefghijklmn";

    try
    {
        throw "Unknown define Exception";  //抛出异常
        cout<<"throw后的语句是否会输出."<<endl;
    }
    catch(exception e)
    {
        cout<<"$$$$$$$$$$"<<endl;
        cout<<e.what()<<endl;
        cout<<"$$$$$$$$$$"<<endl;

    }
    catch(const char* &e)
    {
        cout<<"@@@@@@@@@"<<endl;
        cout<<e<<endl;
        cout<<"@@@@@@@@@"<<endl;
    }


    return 0;
}

输出为:

在这里插入图片描述

抛出int异常并捕获

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

int main()
{
    string str = "abcdefghijklmn";

    try
    {
        int a = 6;
        throw a;
        //throw "Unknown define Exception";  //抛出异常
        cout<<"throw后的语句是否会输出."<<endl;
    }
    catch(exception e)
    {
        cout<<"$$$$$$$$$$"<<endl;
        cout<<e.what()<<endl;
        cout<<"$$$$$$$$$$"<<endl;

    }
    catch(const char* &e)
    {
        cout<<"@@@@@@@@@"<<endl;
        cout<<e<<endl;
        cout<<"@@@@@@@@@"<<endl;
    }
    catch(const int  &e)
    {
        cout<<"@@@@@@@@@"<<endl;
        cout<<e<<endl;
        cout<<"@@@@@@@@@"<<endl;
    }

    return 0;
}

输出为:

在这里插入图片描述

除数为0的异常捕获

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

int main()
{
    string str = "abcdefghijklmn";

    try
    {
        int a = 6;
        int b = 0;
        int c;
        if(b==0)
        {
            throw "除数为0啦";
        }
        c = a/b;

        cout<<"throw后的语句是否会输出."<<endl;
    }
    catch(exception e)
    {
        cout<<"$$$$$$$$$$"<<endl;
        cout<<e.what()<<endl;
        cout<<"$$$$$$$$$$"<<endl;

    }
    catch(const char* &e)
    {
        cout<<"@@@@@@@@@"<<endl;
        cout<<e<<endl;
        cout<<"@@@@@@@@@"<<endl;
    }
    cout<<"程序继续执行"<<endl;

    return 0;
}

输出为:
在这里插入图片描述

C++实现求平方和平方根

利用math.h的pow求平方和平方根

#include<iostream>
#include <math.h>

using namespace std;

int main()
{
    //平方 pow()
    int a = pow(4,2);// 4的平方=16

    cout<<"4的平方为:"<<a<<endl;
    //开方
    int b = pow(4,0.5);// 4的平方根=2
    cout<<"4的平方根为:"<<b<<endl;
    int c = sqrt(4);// 4的平方根=2
    cout<<"4的平方根为:"<<c<<endl;


//整数绝对值
    int d = abs(a-c);
    cout<<"a-c的绝对值为:"<<d<<endl;
//浮点数绝对值
    double e = fabs(a-c);

    cout<<"a-c的浮点绝对值为:"<<e<<endl;

    return 0;

}

输出为:
在这里插入图片描述

利用math.h求开根号

#include<iostream>
#include <math.h>

using namespace std;

int main()
{
     double x=4.0,result;
     result=sqrt(x);
     cout<<"4的平方根是"<<result<<endl;
     return 0;
}

输出:
在这里插入图片描述

自定义pow函数实现求平方

#include<iostream>
using namespace std;
int i,n,m;
int pow(int x,int y){
	int z=x;
	for(i=0;i<y-1;i++){
	z*=x;
	}
	return z;
}
int main(){
	cin>>n>>m;
	cout<<pow(n,m);
return 0;
}

输出为:
在这里插入图片描述

完成循环计时功能

参考:https://blog.csdn.net/csdner250/article/details/127912578

#include<iostream>
#include<stdio.h> //scanf,printf
#include<ctime> //time()
#include<windows.h>//Sleep(),system()
using namespace std;

int main()
{
    //srand(time(NULL)); //srand(seed),seed是种子,此处为time(NULL)
    //for(int i = 0; i < 5; i++)
    //printf("%d\n",rand()%100);//头文件都是stdlib.h
    //获得1-100随机数,只用rand每次出现"随机数"一样

    while(1)
    {
        time_t now = time(NULL);//这个语句放循环里,保证每次输出变化
        //用time_t声明变量,获取当前秒数,即距离1970 01.01 00:00:00的秒数
        //此处now是1970距离现在的秒数
        tm time = *localtime(&now);//tm是结构体名,time是变量名,tm_year等是成员名
        //localtime()函数返回指向tm结构的指针,本地时间
        //返回的是距离1970/01/01 00:00:00的秒数
        int year = time.tm_year + 1900; //变量名.成员名访问成员
        int month = time.tm_mon + 1;
        int day = time.tm_mday;
        int hour = time.tm_hour;
        int min = time.tm_min;
        int sec = time.tm_sec;
        int week = time.tm_wday;

        printf("%3d:%02d:%02d\n",hour,min,sec);
        printf("%4d/%02d/%02d\n",year,month,day);
        printf("  星期%d\n",week);//这里不能少%2d,否则会报错invalid conversion from int to const char*
        Sleep(1000);//每1000毫秒显示一次
        system("cls");//用来清屏,防止无限输出三行,当然也可一行输出,最后加个\r(只回车不换行)
    }
    return 0;
}

参考:https://blog.csdn.net/weixin_46098577/article/details/119615384

#include<iostream>
#include<Windows.h>		//Sleep()所需头文件
#include <iomanip>		//setw()等控制符所需头文件

using namespace std;

int main()
{
	int i = 0;
	cout << "\n当前进度:";
	while(i<=1000)
	{
		cout << "\r";//回到行首位置

		//输出宽度 6,保留两位小数
		cout << setw(6) << fixed << setprecision(2) << (float)i / 10 << "% ";
		Sleep(5);
		i++;
	}

	cout << endl << endl;
	system("pause");

	return 0;
}

在线练习:

http://noi.openjudge.cn

总结

本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为C++拓展内容,包括i异常处理,平方计算和计时功能,并提供相关案例练习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NSSCTF Round#8 web专项赛

文章目录MyPage方法一&#xff1a; pearcmd.php方法二&#xff1a;多级连接绕过方法三&#xff1a; PHP Base64 Filter 宽松解析MyDoorUpload_gogoggoez_nodeMyPage Where is my page&#xff1f; 拿到题目就是这个样子 感觉就是文件包含 可以读取&#xff0c;可以用filter协议…

AXI-Stream 学习笔记

参考 https://wuzhikai.blog.csdn.net/article/details/121326701 https://zhuanlan.zhihu.com/p/152283168 AXI4 介绍 AXI4 是ARM公司提出的一种片内总线&#xff0c;描述了主从设备之间的数据传输方式。主要有AXI4_LITE、AXI4_FULL、AXI4_STREAM三种。 AXI4_LITE&#xff1…

Vue3.0文档整理:一、简介

1.1:什么是vue&#xff1f; Vue是一款用于构建用户界面的javascript框架&#xff1b;它基于标准HTML、CSS和Javascript构建&#xff0c;并提供了一套声明式、组件化的编程模型&#xff0c;帮助你高效的开发用户界面。 1.2&#xff1a;MVVM工作原理 MVVM指的是model、view和vie…

TCP协议原理一

文章目录一、TCP协议二、TCP工作机制1.确认应答2.超时重传3.连接管理三次握手四次挥手一、TCP协议 我们的TCP协议相比于UDP协议复杂不少&#xff0c;今天我们就来一起学习一下TCP协议报文和原理 首先我们报头第一行里的端口号和UDP的端口号是一致的&#xff0c;都是用两个字节…

进大厂必备的Java面试八股文大全(2023最新精简易懂版,八股文中的八股文)

为什么同样是跳槽&#xff0c;有些人薪资能翻三倍&#xff1f;” 最近一个粉丝发出了灵魂拷问&#xff0c;类似的问题我收到过很多次&#xff0c;身边也确实有认识的同事、朋友们有非常成功的跳槽经历和收益&#xff0c;先说一个典型例子&#xff1a; 学弟小 A 工作一年半&am…

智云通CRM:买对了吗——大客户采购的方案实施

一旦采购合同签署后&#xff0c;供应商就要履行合同&#xff0c;按时交付产品进场使用&#xff0c;或实施服务方案。不过&#xff0c;无论对供应商还是客户来说&#xff0c;双方的合作并没有就此结束。 在这个阶段&#xff0c;客户会评估此次合作的供应商做事是否靠谱&#x…

Spring面试重点(四)——Spring事务

Spring事务 事务的方式 spring中使用事务有两种方式&#xff0c;一种是编程式事务&#xff0c;一种是声明式事务。编程式事务推荐使用TransactionTemplate&#xff0c;实现TransactionCallback接口&#xff0c;需要编码实现&#xff1b;声明式事务只需要在函数增加注解Transa…

【项目设计】—— 基于Boost库的搜索引擎

目录 前言 一、项目的相关背景 1. 什么是Boost库 2. 什么是搜索引擎 3. 为什么要做Boost搜索引擎 二、搜索引擎的宏观原理 三、搜索引擎技术栈和项目环境 四、正排索引 VS 倒排索引 —— 搜索引擎的具体原理 1. 正排索引&#xff08;forword index&#xff09; 2. 倒…

Linux tcpdump

tcpdump - 转储网络上的数据流 是不是感觉很懵&#xff1f;全方位描述tcpdump: 通俗&#xff1a;tcpdump是一个抓包工具&#xff0c;用于抓取网络中传输的数据包形象&#xff1a;tcpdump如同国家海关&#xff0c;凡是入境和出境的货物&#xff0c;海关都要抽样检查&#xff0…

新瑞鹏“狂飙”,宠物医疗是门好生意吗?

宠物看病比人还贵&#xff0c;正在让不少年轻一族陷入尴尬境地。在知乎上&#xff0c;有个高赞提问叫“你愿意花光积蓄&#xff0c;给宠物治病吗”&#xff0c;这个在老一辈人看来不可思议的魔幻选择&#xff0c;真实地发生在当下的年轻人身上。提问底下&#xff0c;有人表示自…

虹科分享 | 流浪地球背后:运载火箭行业的高性能计算!

当长征系列运载火箭直冲云霄时&#xff0c;你想到的是什么&#xff1f; 是嫦娥奔月&#xff0c;是技术革新&#xff0c;是一望无际的星空&#xff0c;是伟大的航天员 还是流浪地球中用火箭推进太空天梯的科幻场景 我 想到的是运载火箭行业背后的高性能计算 …… 是无数次的计算…

从写下第1个脚本到年薪30W,我的自动化测试心路历程

我希望我的故事能够激励现在的软件测试人&#xff0c;尤其是还坚持在做“点点点”的测试人。 你可能会有疑问&#xff1a;“我也能做到这一点的可能性有多大&#xff1f;”因此&#xff0c;我会尽量把自己做决定和思考的过程讲得更具体一些&#xff0c;并尽量体现更多细节。 …

vue3.0 响应式数据

目录1.什么是响应式2. 选项式 API 的响应式数据3.组合式 API 的响应式数据3.1 reactive() 函数3.2 toref() 函数3.3 toRefs() 函数3.4ref() 函数总结1.什么是响应式 这个术语在今天的各种编程讨论中经常出现&#xff0c;但人们说它的时候究竟是想表达什么意思呢&#xff1f;本质…

spark03-读取文件数据分区数量个数原理

代码val conf: SparkConf new SparkConf().setMaster("local").setAppName("wordcount")val sc: SparkContext new SparkContext(conf)val rdd: RDD[String] sc.textFile("datas/1.txt",2)rdd.saveAsTextFile("output")数据格式 &a…

Docker 部署微服务项目

目录 一、前言 二、环境准备 1、安装 Docker 2、Docker 安装 MySQL 3、Docker 安装 Redis 4、Docker 安装 Nacos 5、Docker 安装 Nginx 三、部署后端服务 四、部署前端服务 感谢观看&#xff01;&#xff01; 一、前言 以谷粒学苑为例&#xff0c;使用 Docker 部署后…

【SpringBoot3.0源码】启动流程源码解析 • 上

文章目录初始化SpringBoot启动类&#xff1a; SpringBootApplication public class AppRun {public static void main(String[] args) {SpringApplication.run(AppRun.class, args);} }步入SpringApplication.run(AppRun.class, args)方法&#xff1a; 这里分为两步&#xff1…

【暴力量化】查找最优均线

搜索逻辑 代码主要以支撑概率和压力概率来判断均线的优劣 判断为压力&#xff1a; 当日线与测试均线发生金叉或即将发生金叉后继续下行 判断为支撑&#xff1a; 当日线与测试均线发生死叉或即将发生死叉后继续上行 判断结果的天数&#xff1a; 小于6日均线&#xff0c;用金叉或…

Tensorflow中的多层感知器学习

Tensorflow中的多层感知器学习 在这篇文章中&#xff0c;我们将了解多层感知器的概念和它在Python中使用TensorFlow库的实现。 多层感知 多层感知也被称为MLP。它是完全连接的密集层&#xff0c;可以将任何输入维度转化为所需维度。多层感知是一个具有多层的神经网络。为了创…

【黑马SpringCloud(6)】Sentinel解决雪崩问题

微服务保护雪崩问题服务保护技术Sentinel微服务整合Sentinel流量控制簇点链路入门练习流控模式关联链路流控效果Warm Up排队等待热点参数限流隔离和降级FeignClient整合Sentinel线程隔离(舱壁模式)实现线程隔离熔断降级慢调用异常比例/异常数授权规则获取origin给网关添加请求头…

ROS2+nav2+激光雷达导航实践(上)

目录写在前面安装nav2nav2介绍nav2实践map地图保存地图读取状态估计(TF变换)所需TF坐标base_link -> sensor framesodom -> base_linkLaser Scan Matcher for ROS2map -> odomAMCL使用AMCL参数配置文件amcl_config.yaml效果过程中的知识点一、launch文件编写格式及方法…