【C++ 程序设计入门基础】- 第4节-函数

news2025/5/25 23:13:18

1、函数

函数是对实现某一功能的代码的模块化封装。

 函数的定义:

标准函数:

输入 n 对整数的 a、b ,输出它们的和。

#include <iostream>
#include <windows.h>
using namespace std;

int add(int a,int b);//函数原型声明

int main()
{
	int n,a,b;
	cin>>n;
	int *c=new int[n];//动态数组
	for(int i=0;i<n;i++){
		cin>>a>>b;
		c[i]=add(a,b);//调用函数
	}
	for(int i=0;i<n;i++){
		cout<<c[i]<<endl;
	}
	return 0;
}

int add(int a,int b){//函数定义
	return a+b;
}

运行结果如下:

 无返回值:

输入n,输出1~n之间所有整数。

#include <iostream>
#include <windows.h>
using namespace std;

void print(int n);//函数原型声明

int main()
{
	int n;
	cin>>n;
	print(n);
	return 0;
}

void print(int n){//函数定义
	for(int i=1;i<=n;i++){
		cout<<i<<endl;
	}
}

运行结果:

 无参数:

输入n,如果n为10的倍数,输出3个“very good!”。

#include <iostream>
#include <windows.h>
using namespace std;

void print();//函数原型声明

int main()
{
	int n;
	cin>>n;
	if(n%10==0){
		print();
	}
	return 0;
}

void print(){//函数定义
	for(int i=1;i<=3;i++){
		cout<<"very good!"<<endl;
	}
}

 运行结果如下:

 传值参数:

输入两个整数a,b,交换后输出。

#include <iostream>
#include <windows.h>
using namespace std;

void swap(int x,int y);//函数原型声明

int main()
{
	SetConsoleOutputCP(CP_UTF8);
	int a,b;
	cin>>a>>b;
	swap(a,b);
	cout<<"a和b交换后"<<a<<"\t"<<b<<endl;
	return 0;
}

void swap(int x,int y){//传值参数定义
	int temp;
	temp=x;
	x=y;
	y=temp;
}

 发现传值参数调用,只在函数内有效,离开函数,参数并未交换值。

引用参数:

比如:int &b = a; 在定义b的时候前面的符号& 就表示b是a的一个引用,对引用变量的赋值等操作相当于对变量本身的操作。所以你对b赋值 b=a+14其实相当于a=a+14操作,引用又称为别名,相当于一个人两个名字。所以b是15。

 接下来我们在参数前面加个&号,代表引用参数,改变参数值,跳出函数依然生效。

 数组参数:

输入n个数存入数组a[]中,求和后输出和值。

#include <iostream>
#include <windows.h>
using namespace std;
//int a[100];//定长数组

long long sum(int s[],int n){//参数数组
	long long count=0;
	for(int i=0;i<n;i++){
		count+=s[i];
	}
	return count;
}
int main()
{
	SetConsoleOutputCP(CP_UTF8);
	int n;
	cin>>n;
    int *a = new int[n];//动态数组
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	cout<<"sum 计算结果"<<sum(a,n)<<endl;
	return 0;
}

 运行结果(这里我输入10个数):

 字符串参数:

输入n个字母,如果是小写字母将其转换为大写字母,输出转换后的字符串。

#include <iostream>
#include <windows.h>
#include <cstring>
using namespace std;

string covert(string &s)
{
	for(int i=0;i<s.length();i++){
		if(s[i]>='a'&&s[i]<='z'){
			s[i]-=32;//将小写字符转为大写
		}
	}
	return s;
}
int main()
{
	SetConsoleOutputCP(CP_UTF8);
	string s;
	cin>>s;
	covert(s);
	cout<<s<<endl;
	return 0;
}

 运行结果:

 函数嵌套:

#include <iostream>
#include <windows.h>
#include <cstring>
using namespace std;

int gcd(int x,int y)//最大公约数
{
	int t;
	t=x%y;//求余数 
	while(t!=0)
	{
		x=y;//y做被除数 
		y=t;//余数做除数 
		t=x%y;//求余数 
	}
	return y;
}
int lcm(int x,int y){//最小公倍数
	return x*y/gcd(x,y);
}
int main()
{
	SetConsoleOutputCP(CP_UTF8);
	int a,b;
	cin>>a>>b;
	cout<<"最大公约数:"<<gcd(a,b)<<endl;
	cout<<"最小公倍数:"<<lcm(a,b)<<endl;
	return 0;
}

运行结果如下:

 函数重载(多态):

多个同名函数(参数数目、类型、顺序不同)

写一个函数,对于字符串类型数据取其长度的一半,对于浮点数类型,求其值的二分之一。

 

#include <iostream>
#include <windows.h>
#include <cstring>
using namespace std;

float half(float a){
	return a/2;
}
string half(string s){
	int n=s.length()/2;
	char *str=new char[n];
	for(int i=0;i<n;i++){
		str[i]=s[i];
	}
	return str;
}
int main()
{
	SetConsoleOutputCP(CP_UTF8);
	float a;
	string b;
	cin>>a>>b;
	cout<<"float 的一半值:"<<half(a)<<endl;
	cout<<"string 的一半值:"<<half(b)<<endl;	
	return 0;
}

 运行结果:

 函数模版:

  • C++另一种编程思想称为 泛型编程 ,主要利用的技术就是模板

  • C++提供两种模板机制:函数模板类模板

函数模板作用:

建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。

函数模版语法:
template<typename T>
T add(T x,T y)
{
	return x+y;
 } 
解释:

template --- 声明创建模板

typename --- 表面其后面的符号是一种数据类型,可以用class代替

T --- 通用的数据类型,名称可以替换,通常为大写字母

函数模版使用示例:
//交换整型函数
void swapInt(int& a, int& b) {
	int temp = a;
	a = b;
	b = temp;
}

//交换浮点型函数
void swapDouble(double& a, double& b) {
	double temp = a;
	a = b;
	b = temp;
}

//利用模板提供通用的交换函数
template<typename T>
void mySwap(T& a, T& b)
{
	T temp = a;
	a = b;
	b = temp;
}

void test01()
{
	int a = 10;
	int b = 20;
	
	//swapInt(a, b);

	//利用模板实现交换
	//1、自动类型推导
	mySwap(a, b);

	//2、显示指定类型
	mySwap<int>(a, b);

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

}

int main() {

	test01();

	system("pause");

	return 0;
}
总结:
  • 函数模板利用关键字 template
  • 使用函数模板有两种方式:自动类型推导、显示指定类型
  • 模板的目的是为了提高复用性,将类型参数化

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

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

相关文章

PyCharm连接服务器 - 2

文章目录 PyCharm连接服务器-21.如何连接服务器&#xff1f;2.如何在终端窗口打开SSH连接&#xff1f;3.Terminal终端出现中文乱码的解决办法&#xff1f;4.如何查看远程服务器的树目录结构&#xff1f;5.如何配置代码同步&#xff1f;6.如何为项目配置远程服务器中的python解释…

C#进阶学习

目录 简单数据结构类ArrayList声明增删查改遍历装箱拆箱 Stack声明增取查改遍历装箱拆箱 Queue声明增取查改遍历 Hashtable声明增删查改遍历装箱拆箱 泛型泛型分类泛型的作用泛型约束 常用泛型数据结构类List声明增删查改遍历 Dictionary声明增删查改遍历 LinkedList声明增删查…

05.neuvector网络学习与管控实现

原文链接&#xff0c;欢迎大家关注我的github 一、网络的策略学习 1.1.非主机模式的网络连接学习 agent进程侧&#xff1a; 调用taskAddContainer->taskInterceptContainer->programDP->DPCtrlAddTapPort为所有非host模式的容器向dp传送 DPAddTapPortReq对象数据.&…

OpenGL 网格拾取坐标(Qt)

文章目录 一、简介二、代码实现三、实现效果参考资料一、简介 有时候我们希望通过鼠标来拾取某个网格中的坐标,这就涉及到一个很有趣的场景:光线投射,也就是求取一条射线与网格的交点,这里如果我们采用普通遍历网格中的每个面片的方式,当网格的面片数据量很大时计算效率就…

版本控制神器之Git深入介绍

Git简介 Git&#xff08;全局信息追踪器&#xff09;。 Git是一个分布式版本控制工具&#xff0c;Git的使用中央仓库不是必须的&#xff0c;用户本地就是一个完整的版本仓库&#xff0c;代码的前进、回退、删除等等操作都可以直接在本地进行&#xff0c;不需要中央仓库。但是…

Java多线程:初识多线程!左手画方,右手画圆

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、线程与进程二、创建线程方法1、继承Thread类2、实现Runnable接口3、两者区别4、举个栗子5、简洁写法Ⅰ、Thread匿名内部类写…

vue开发H5 实现滑动图片获取验证码

<template><div><van-button type"primary" click"sendVerification">获取验证码</van-button><van-popupv-model"captchaVisible"closeableposition"bottom"class"login-captcha":close-on-cli…

基于JAVA+SSM框架开发的志愿者服务管理系统设计与实现【附源码】

&#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#x1f4dd; &#x1f680;&#x1f680;&#x1f6…

强化学习(一)简介

强化学习这一概念在历史上来源于行为心理学&#xff0c;来描述生物为了趋利避害而改变自己行为的学习过程。人类学习的过程其实就是为达到某种目的不断地与环境进行互动试错&#xff0c;比如婴儿学习走路。强化学习算法探索了一种从交互中学习的计算方法。 1、强化学习 强化学…

31 树的存储结构一

无法直接用数组表示树的逻辑结构&#xff0c;但是可以设计结构体数组对节点间的关系进行描述&#xff1a;【如表】 这样做的问题&#xff1a; 可以利用 组织链表 parent指针&#xff1a; 注意&#xff1a;树结点在 组织链表 中的位置不代表树的任何逻辑关系 树的架构图&#xf…

DNS 在互联网中的作用是什么?

互联网的运作离不开DNS&#xff0c;那么DNS到底是什么&#xff1f;它在互联网中发挥着怎样的作用呢&#xff1f; DNS&#xff0c;全称为Domain Name System&#xff0c;即域名系统&#xff0c;是互联网的一项基础设施。它负责将人们易于记忆的域名&#xff08;如www.example.…

MySQL 从零开始:06 数据检索

文章目录 1、数据准备2、限制结果3、完全限定名4、排序检索 所谓数据检索&#xff0c;就是前面所讲的”增删改查“的”查“。 注&#xff1a;本文使用的“行”指数据表中的“记录”&#xff0c;“列”指数据表中的“字段”。 在第四节《表的增删改查》中已经介绍了 select 查询…

C# Cad2016二次开发api(三)

直线 Line 属性中文数据类型作用Length长度double直线的长度Angle角度double直线的弧度&#xff0c;0~2πDelta增量Vector3d起点到终点的向量Normal法向向量Vector3d直线所在平面的法向单位向量Thickness厚度doubleEndPoint终点Point3d直线的终点StartPoint起点Point3d直线的起…

Memory Wall in Neural Network Inference

Memory Wall in Neural Network Inference 神经网络推理的瓶颈在于访存带宽&#xff0c;通常无法发挥出加速器的全部算力。本文总结了目前常用的推理加速器及其设计&#xff0c;并分析了常用神经网络的访存瓶颈。文章大部分内容参考自Computer Architecture: A Quantitative A…

JavaScript基础(26)_dom增删改练习

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><title>DOM增删改练习</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>table {borde…

软件测试|Selenium StaleElementException异常的原因与方法

简介 在使用Selenium进行Web自动化测试时&#xff0c;我们可能会遇到StaleElementException异常。这个异常通常在我们操作一个之前已经找到的元素时抛出&#xff0c;但该元素已经不再处于DOM树中&#xff0c;导致元素过时&#xff08;stale&#xff09;。本文将介绍StaleEleme…

C++11 左右值引用、移动语义

右值引用和移动语义 什么是左值&#xff1f;什么是左值引用&#xff1f; 左值是一个表示数据的表达式(如变量名或解引用的指针)&#xff0c;我们可以获取它的地址可以对它赋值&#xff0c;左值可以出现赋值符号的左边&#xff0c;右值不能出现在赋值符号左边。定义时const修饰…

SpringSecurity入门demo(二)表单认证

上一篇博客集成 Spring Security&#xff0c;使用其默认生效的 HTTP 基本认证保护 URL 资源&#xff0c;下面使用表单认证来保护 URL 资源。 一、默认表单认证&#xff1a; 代码改动&#xff1a;自定义WebSecurityConfig配置类 package com.security.demo.config; import or…

基于python的基金分析可视化系统

项目背景&#xff1a; 随着金融市场的发展和人们对财富管理的重视&#xff0c;越来越多的人开始参与基金投资。然而&#xff0c;由于市场上基金产品众多且复杂&#xff0c;投资者往往难以快速准确地获取基金信息和进行分析&#xff0c;从而导致投资决策不够科学和有效。为了解决…

PyCharm安装使用教程2024

简介 PyCharm是一种PythonIDE&#xff08;Integrated Development Environment&#xff0c;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单…