C++面向对象程序设计 - 函数库

        C语言程序中各种功能基本上都是由函数来实现的,在C语言的发展过程中建立了功能丰富的函数库,C++从C语言继承了些函数功能。如果要用函数库中的函数,就必须在程序文件中包含文件中有关的头文件,在不同的头文件中,包含了不同的函数的声明。

        在C语言的传统方法中,头文件名包括后缀.h,如stdio.h,math.h等。由于C语言没有命名空间,头文件并不存放在命名空间中,因此在C++程序文件中如果用到带后缀.h的头文件时,不必用命名空间,只需在文件中包含所用的头文件即可。代码示例如下:

#include <math.h>

        在C++的新方法,系统提供的头文件不包括后缀.h,如iostream,string等。为了表示与C语言的头文件有联系又有区别,C++所用的头文件名在C语言的相应的头文件名之前加一个字母c。例如C语言中有关输入输出的头文件名为stdio.h在C++中相应头文件名为cstdio。C语言的头文件string.h在C++的头文件名为cstring。代码示例如下:

#include <cstdio>
#include <cmath>
using namesapce std;

一、cstdio

        在C++中,cstdio是一个标准头文件,它包含了标准库中的I/O(输入/输出)函数。这个头文件实际上是C语言标准库<stdio.h>的C++封装,其中的函数可以直接在C++代码中使用,但为了保持与C的兼容性,并且为了避免在C++的全局命名空间引入名称冲突,C++使用了不带.h后缀的头文件,并且在它们前面添加了c前缀。

        在C++程序开发中,虽然推荐使用C++自己的I/O流库(如iostream),但在某些情况下使用cstdio还是有必要的,诸如printf()、scanf()等函数。

1.1 scanf()函数格式字符串

转换说明符数据类型
%c字符
%d整数
%f浮点数
%lf双精度浮点数
%s字符串,以空格分隔

示例如下:

#include <cstdio>

int main(){
	// 使用printf函数输出控制台
	printf("Hello world!\n");
	
	char input[100];
	// 使用scanf函数从控制台读取一个字符串
	printf("Enter a string:");
	scanf("%s", input);
	// 使用printf函数输出读取的字符串
	printf("You entered: %s\n", input);
	return 0;
}

        运行后结果如下图:

1.2 指定缓冲区长度        

        为了防止缓冲区溢出,该函数还可以指定输入字符的最大长度,代码如下:

#include <cstdio>

int main(){
	char input[100];
	// 使用scanf函数从控制台读取一个字符串
	printf("Enter a string:");
	scanf("%3s", input);
	// 使用printf函数输出读取的字符串
	printf("You entered: %s\n", input);
	return 0;
}

        只要在%号和s字符之间指定缓冲区长度即可,运行后输入Hello只能输出指定长度的字符串,如下图:

1.3 输出字符串包含空格

        在前面的示例中,当遇到空格后就结束了,这是因为scanf函数不会自动处理空格作为字符串一部分,怎么样包含空格连着输出一个完整的字符串信息呢。这时需要作此特殊处理,使用%[^\n]说明符告诉scanf函数读取输入直到遇到换行符为止,这样就能包含空格了。

        %[]格式说明符用于读取指定字符集的字符,&\n表示读取直到遇到换行符为止。示例代码如下:

#include <cstdio>

int main(){
	char input[100];
	// 使用scanf函数从控制台读取一个字符串
	printf("Enter a string:");
	scanf("%[^\n]", input);
	// 使用printf函数输出读取的字符串
	printf("You entered: %s\n", input);
	return 0;
}

        运行后结果如下图:

        当然,这里也可以指定缓冲区大小,代码示例如下:

#include <cstdio>

int main(){
	char input[100];
	// 使用scanf函数从控制台读取一个字符串
	printf("Enter a string:");
	scanf("%8[^\n]", input);
	// 使用printf函数输出读取的字符串
	printf("You entered: %s\n", input);
	return 0;
}

        当指定缓冲区大小为8时,hello有5个字符,空格+wo为3个字符,刚好输出8个字符结束。结果如下图:

二、cmath

        在C++中,<cmath>是一个标准的头文件,它提供了许多用于数学运算的函数和宏。这些函数通常用于处理浮点数和整数型的数学运算,包括三角函数、双曲函数、指数函数、对数函数、幂函数、取整函数等。

        以下为常见的函数:

2.1 三角函数

函数说明
sin(x)正弦函数
cos(x)余弦函数
tan(x)正切函数
asin(x)反正弦函数(返回弧度)
acos(x)反余弦函数(返回弧度)
atan(x)反正切函数(返回弧度)
atan2(y, x)四象限反下切函数(返回弧度)

2.2 双曲函数

函数说明
sinh(x)双曲正弦函数
cosh(x)双曲余弦函数
tanh(x)双曲正切函数

2.3 指数和对数函数

函数说明
exp(x)e的x次幂
log(x)自然对数(以e为底)
log10(x)以10为底的对数
pow(x,y)x的y次幂

2.4 取整函数

函数说明
ceil(x)不小于x的最小整数(向上取整)
floor(x)不大于x的最大整数(向下取整)
round(x)最接近x的整数(四舍五入)
trunc(x)x的整数部分(截断小数部分)

2.5 其他函数

函数说明
sqrt(x)x的平方根
fabs(x)x的绝对值
ldexp(x, exp)计算x*(2^exp)
frexp(x, &exp)将浮点数分解为尾数和指数
fmod(x, y)计算x除以y的余数(浮点数)

注意:<cmath>中的函数通常使用弧度作为角度的单位,而不是度。如果你使用度作为角度单位,需要先将它们转换为弧度,公式为:弧度=度*(\pi/180)。

三、解一元二次方程

       了解头文件cmath中一些常见的函数后,我们用它来解一元二次方程,ax^{2}+bx+c=0的实根,如果方程没有实根,则输出有关警告信息。

解析:求根公式为x=\frac{-b\pm \sqrt{b^{2}-4ac}}{2a},公式中的\pm符号表示解的两种可能性,即方程的两个解是相同的(当判别b^{2}-4ac=0时)或不同的(当判别b^{2}-4ac>0时)。这个公式通过直接应用,可以快速找到一元二次方程的解。

  • 当判别式b^{2}-4ac\geqslant 0时,方程有实数解。
  • 当判别b^{2}-4ac< 0时,方程无实数解,但可能有复数解。

示例代码如下:

#include <iostream>
#include <cmath>		// sqrt函数定义在cmath头文件中
using namespace std;

// 函数用于求解二次方程
void solveQuadraticEquation(double a, double b, double c){
	// 计算判别式
	double dis = b * b - 4 * a * c;
	double r1, r2;
	// 检查判别式的值
	if(dis > 0){
		// 两个不同的实根
		r1 = (-b + sqrt(dis)) / (2*a);
		r2 = (-b - sqrt(dis)) / (2*a);
		cout <<"The equation has two different real roots " <<r1 <<" and " <<r2 <<endl;
	} else if(dis == 0){
		// 两个相同的实根
		r1 = r2 = -b / (2*a);
		cout <<"The equation has two identical real roots of " <<r1 <<endl;
	} else{
		cout <<"The equation has no real roots" <<endl;
	}
	cout <<endl;
}

int main(){
	// 定义变量
	double a, b, c;
	do{
		cout <<"Please output the values of a,b,c and press enter:" <<endl;
		cin >>a >>b >>c;
		solveQuadraticEquation(a, b, c);
	} while(a != 0);
	cout <<"end" <<endl;
	return 0;
}

        运行后结果如下图:

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ实践——交换器(Exchange)绑定交换器

在《RabbitMQ实践——交换器&#xff08;Exchange&#xff09;和绑定&#xff08;Banding&#xff09;》一文中&#xff0c;我们实验了各种交换器。我们可以把交换器看成消息发布的入口&#xff0c;而消息路由规则则是由“绑定关系”&#xff08;Banding&#xff09;来定义&…

GitLab教程(二):快速上手Git

文章目录 1.将远端代码克隆到本地2.修改本地代码并提交到远程仓库3.Git命令总结git clonegit statusgit addgit commitgit pushgit log 首先&#xff0c;我在Gitlab上创建了一个远程仓库&#xff0c;用于演示使用Gitlab进行版本管理的完整流程&#xff1a; 1.将远端代码克隆到本…

快速构建本地RAG聊天机器人:使用LangFlow和Ollama实现无代码开发

基于LangChain的快速RAG应用原型制作方法 还记得构建智能聊天机器人需要数月编码的日子吗&#xff1f; LangChain这样的框架确实简化了开发流程&#xff0c;但对非程序员来说&#xff0c;数百行代码仍然是一道门槛。 有没有更简单的方法呢&#xff1f; 图片由 Ravi Palwe 在…

数字政协:迈向智慧时代,开启政协工作新篇章

在信息化浪潮席卷全球的今天&#xff0c;数字技术不仅改变了我们的生活方式&#xff0c;也深刻影响着政治生态的变革。其中&#xff0c;“数字政协”的崛起&#xff0c;正是新时代政协工作创新发展的重要标志。那么&#xff0c;什么是数字政协&#xff1f;它又将如何助力政协工…

[图解]建模相关的基础知识-09

1 00:00:01,350 --> 00:00:03,780 首先&#xff0c;我们来看一下什么叫关系 2 00:00:05,370 --> 00:00:08,990 这个关系跟下面说的这些关系 3 00:00:09,000 --> 00:00:10,390 它不是一个东西 4 00:00:11,110 --> 00:00:14,950 比如说&#xff0c;我们UML类图上&…

门控循环单元GRU与长短期记忆网络LSTM

门控循环单元与长短期记忆网络 门控隐状态 问题提出&#xff1a;对于一个序列来说不是每个观察值都是同等重要想只记住相关的观察需要&#xff1a; 能关注的机制&#xff08;更新门&#xff09;能遗忘的机制&#xff08;重置门&#xff09; 第一个词元的影响至关重要。 我们…

使用vuejs3时,报错:Uncaught (in promise)

解决&#xff1a; vite.config.js里 import {fileURLToPath, URL} from node:urlimport {defineConfig} from vite import vue from vitejs/plugin-vue// https://vitejs.dev/config/ export default defineConfig({resolve: {alias: {: fileURLToPath(new URL(./src, import…

LeetCode | 520.检测大写字母

这道题直接分3种情况讨论&#xff1a;1、全部都为大写&#xff1b;2、全部都为小写&#xff1b;3、首字母大写其余小写。这里我借用了一个全是大写字母的串和一个全为小写字母的串进行比较 class Solution(object):def detectCapitalUse(self, word):""":type …

通过Vue3+高德地图的JS API实现市区地图渲染

效果图: 核心代码: <script setup>import { onMounted, onUnmounted } from vue;import AMapLoader from @amap/amap-jsapi-loader;import { message } from ant-design-vue;import school from @/assets/icons/school.svg;import enterprise from @/assets/icons/ent…

pytest + yaml 框架 -61.jenkins+allure+钉钉通知添加测试结果

前言 上一篇pytest + yaml 框架 -60.git+jenkins+allure+钉钉通知反馈 已经实现测试结果用钉钉通知。 本篇继续在钉钉通知里添加测试的汇总结果,此功能在pytest-yaml-yoyo v1.5.2版本上实现。 Environment Injector 插件 在运行完用例后会生成一个summary.json 文件,汇总…

JAVA小知识20:万字详解List与ArrayList

一、集合简介 1.1、什么是集合&#xff1f; 可同时存储多个元素的数据结构就是集合。 1.2、为什么要有集合&#xff1f; 我们可以使用数组同时存储多个元素&#xff0c;但是数组有个弊端。数组创建之后长度就会固定&#xff0c;如需扩容则需要手动扩容&#xff0c;我们需要…

【计算机视觉】人脸算法之图像处理基础知识(四)

图像的几何变换 图像的几何变换是指在不改变图像内容的前提下对图像的像素进行空间几何变换。主要包括图像的平移变换、镜像变换、缩放和旋转等。 1.插值算法 插值通常用来放缩图像大小&#xff0c;在图像处理中常见的插值算法有最邻近插值法、双线性插值法、二次立方、三次…

中小制造业工厂要不要上MES系统

MES系统的主要功能包括制造数据管理、计划排产管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等。通过这些模块&#xff0c;MES为企业打造一个…

【网络安全学习】使用Kali做渗透情报收集-01-<域名信息主机信息>

1.收集开源情报 开源情报(Open Source Intelligence&#xff0c;OSINT)是指从各种公开的渠道中寻找和获取有价值的信息 如&#xff1a;互联网、媒体、社交网络、公共数据库等开源情报具有以下特点&#xff1a; - 丰富性&#xff1a;开源情报涵盖了各种类型和领域的信息 - 可…

【学习】什么样的软件测试项目适合做自动化测试

随着科技的发展和社会的进步, 软件行业也在不断地壮大和发展。在这个过程中&#xff0c;软件测试变得越来越重要&#xff0c;并且成为了保证软件质量的关键环节。而自动化测试作为软件测试的一种方法&#xff0c;在提高测试效率、降低人力成本等方面具有显著的优势。那么什么样…

SpringBoot集成mqtt上下线提醒功能设计

目录 1.首先安装emqx&#xff0c;去官网下载emqx压缩包&#xff0c;并且解压。 2.使用emqx start 命令启动emqx后台管理 3.下载mqttx调试工具&#xff0c;使用mqttx调试mqtt连接。下载地址:MQTTX下载-MQTTX官方版下载,下载完成直接打开&#xff0c;便可进行mqtt连接调试 4.…

超详解——Python 字典详解——小白篇

目录 1. 创建字典 示例&#xff1a; 2. 访问字典中的元素 示例&#xff1a; 3. 修改字典元素 示例&#xff1a; 4. 删除字典元素 示例&#xff1a; 5. 查找元素是否是字典的键 示例&#xff1a; 6. 标准类型操作符 获取字典长度 合并两个字典 7. 常用内置函数 k…

el-table表头修改文字或者背景颜色,通过header-row-style设置样式

方式一 <el-table :header-cell-style"{text-align: center}" />方式二 <template><el-table :header-cell-style"tableHeaderColor" /> </template> <script> export default {methods: {tableHeaderColor ({row, column…

socket收发数据的处理

1. TCP 协议是一种基于数据流的协议 Socket的Receive方法只是把接收缓冲区的数据提取出来,当系统的接收缓冲区为空,Receive方法会被阻塞,直到里面有数据。 Socket的Send方法只是把数据写入到发送缓冲区里,具体的发送过程由操作系统负责。当操作系统的发送缓冲区满了,Send方法会…

基于springboot的大学计算机基础网络教学系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的大学计算机基础网络教学…