挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串 ...

铁佛  论坛元老 | 2024-12-23 06:15:51 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1814|帖子 1814|积分 5442

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一 C++函数

函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,全部简单的程序都可以界说其他额外的函数。
您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来举行的。
函数声明告诉编译器函数的名称、返回范例和参数。函数界说提供了函数的现实主体。
C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来毗连两个字符串,函数 memcpy() 用来复制内存到另一个位置。
函数还有很多叫法,好比方法、子例程或程序,等等。
1.1 界说函数

C++ 中的函数界说的一样寻常形式如下:
  1. return_type function_name( parameter list )
  2. {
  3.    body of the function
  4. }
复制代码
在 C++ 中,函数由一个函数头和一个函数主体组成。下面列出一个函数的全部组成部门:


  • 返回范例:一个函数可以返回一个值。return_type 是函数返回的值的数据范例。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void
  • 函数名称:这是函数的现实名称。函数名和参数列表一起构成了函数签名。
  • 参数:参数就像是占位符。当函数被调用时,您向参数通报一个值,这个值被称为现实参数。参数列表包括函数参数的范例、序次、数目。参数是可选的,也就是说,函数可能不包含参数。
  • 函数主体:函数主体包含一组界说函数执行任务的语句。
实例,以下是 max() 函数的源代码。该函数有两个参数 num1 和 num2,会返回这两个数中较大的那个数:
  1. // 函数返回两个数中较大的那个数
  2. int max(int num1, int num2)
  3. {
  4.    // 局部变量声明
  5.    int result;
  6.    if (num1 > num2)
  7.       result = num1;
  8.    else
  9.       result = num2;
  10.    return result;
  11. }
复制代码
1.3 函数声明

函数声明会告诉编译器函数名称及如何调用函数。函数的现实主体可以单独界说。
函数声明包括以下几个部门:
  1. return_type function_name( parameter list );
复制代码
针对上面界说的函数 max(),以下是函数声明:
  1. int max(int num1, int num2);
复制代码
在函数声明中,参数的名称并不重要,只有参数的范例是必需的,因此下面也是有效的声明:
  1. int max(int, int);
复制代码
当在一个源文件中界说函数且在另一个文件中调用函数时,函数声明是必需的。在这种情况下,应该在调用函数的文件顶部声明函数。
1.4 调用函数

创建 C++ 函数时,会界说函数做什么,然后通过调用函数来完成已界说的任务。
当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已界说的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。
调用函数时,通报所需参数,如果函数返回一个值,则可以存储返回值。例如:
  1. #include <iostream>using namespace std; // 函数声明int max(int num1, int num2);
  2. int main (){   // 局部变量声明   int a = 100;   int b = 200;   int ret;    // 调用函数来获取最大值   ret = max(a, b);    cout << "Max value is : " << ret << endl;    return 0;} // 函数返回两个数中较大的那个数int max(int num1, int num2) {   // 局部变量声明   int result;    if (num1 > num2)      result = num1;   else      result = num2;    return result; }
复制代码
把 max() 函数和 main() 函数放一块,编译源代码。当运行末了的可执行文件时,会产生下列结果:
  1. Max value is : 200
复制代码
1.5 函数参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有三种向函数通报参数的方式:
调用范例形貌传值调用该方法把参数的现实值赋值给函数的形式参数。在这种情况下,修改函数内的形式参数对现实参数没有影响。指针调用该方法把参数的地点赋值给形式参数。在函数内,该地点用于访问调用中要用到的现实参数。这意味着,修改形式参数会影响现实参数。引用调用该方法把参数的引用赋值给形式参数。在函数内,该引用用于访问调用中要用到的现实参数。这意味着,修改形式参数会影响现实参数。 默认情况下,C++ 使用传值调用来通报参数。一样寻常来说,这意味着函数内的代码不能改变用于调用函数的参数。之条件到的实例,调用 max() 函数时,使用了类似的方法。
1.5 参数的默认值

当您界说一个函数,您可以为参数列表中后边的每一个参数指定默认值。当调用函数时,如果现实参数的值留空,则使用这个默认值。
这是通过在函数界说中使用赋值运算符来为参数赋值的。调用函数时,如果未通报参数的值,则会使用默认值,如果指定了值,则会忽略默认值,使用通报的值。请看下面的实例:
  1. #include <iostream>
  2. using namespace std;
  3. int sum(int a, int b=20)
  4. {
  5.   int result;
  6.   result = a + b;
  7.   
  8.   return (result);
  9. }
  10. int main ()
  11. {
  12.    // 局部变量声明
  13.    int a = 100;
  14.    int b = 200;
  15.    int result;
  16.    // 调用函数来添加值
  17.    result = sum(a, b);
  18.    cout << "Total value is :" << result << endl;
  19.    // 再次调用函数
  20.    result = sum(a);
  21.    cout << "Total value is :" << result << endl;
  22.    return 0;
  23. }
复制代码
输出:
  1. Total value is :300
  2. Total value is :120
复制代码
1.6 Lambda 函数与表达式

C++11 提供了对匿名函数的支持,称为 Lambda 函数(也叫 Lambda 表达式)。
Lambda 表达式把函数看尴尬刁难象。Lambda 表达式可以像对象一样使用,好比可以将它们赋给变量和作为参数通报,还可以像函数一样对其求值。
Lambda 表达式本质上与函数声明非常类似。Lambda 表达式具体形式如下:
  1. [capture](parameters)->return-type{body}
复制代码
实例:
  1. [](int x, int y){ return x < y ; }
复制代码
如果没有返回值可以表示为:
  1. [capture](parameters){body}
复制代码
实例:
  1. []{ ++global_x; }
复制代码
在一个更为复杂的例子中,返回范例可以被明确的指定如下:
  1. [](int x, int y) -> int { int z = x + y; return z + x; }
复制代码
本例中,一个临时的参数 z 被创建用来存储中间结果。如同一样寻常的函数,z 的值不会保存到下一次该不具名函数再次被调用时。
如果 lambda 函数没有传回值(例如 void),其返回范例可被完全忽略。
在Lambda表达式内可以访问当前作用域的变量,这是Lambda表达式的闭包(Closure)行为。 与JavaScript闭包不同,C++变量通报有传值和传引用的区别。可以通过前面的[]来指定:
  1. []      // 沒有定义任何变量。使用未定义变量会引发错误。
  2. [x, &y] // x以传值方式传入(默认),y以引用方式传入。
  3. [&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
  4. [=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
  5. [&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
  6. [=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
复制代码
留意,对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入:
  1. [this]() { this->someFunc(); }();
复制代码
二 C++ 数字

通常,当我们必要用到数字时,我们会使用原始的数据范例,如 int、short、long、float 和 double 等等。这些用于数字的数据范例,其可能的值和数值范围,我们已经在 C++ 数据范例一章中讨论过。
2.1 C++ 界说数字

我们已经在之前章节的各种实例中界说过数字。下面是一个 C++ 中界说各种范例数字的综合实例:
  1. #include <iostream>
  2. using namespace std;
  3. int main ()
  4. {
  5.    // 数字定义
  6.    short  s;
  7.    int    i;
  8.    long   l;
  9.    float  f;
  10.    double d;
  11.    
  12.    // 数字赋值
  13.    s = 10;      
  14.    i = 1000;   
  15.    l = 1000000;
  16.    f = 230.47;  
  17.    d = 30949.374;
  18.    
  19.    // 数字输出
  20.    cout << "short  s :" << s << endl;
  21.    cout << "int    i :" << i << endl;
  22.    cout << "long   l :" << l << endl;
  23.    cout << "float  f :" << f << endl;
  24.    cout << "double d :" << d << endl;
  25.    return 0;
  26. }
复制代码
当上面的代码被编译和执行时,它会产生下列结果:
  1. short  s :10
  2. int    i :1000
  3. long   l :1000000
  4. float  f :230.47
  5. double d :30949.4
复制代码
2.2 C++ 数学运算

在 C++ 中,除了可以创建各种函数,还包含了各种有用的函数供您使用。这些函数写在标准 C 和 C++ 库中,叫做内置函数。您可以在程序中引用这些函数。
C++ 内置了丰富的数学函数,可对各种数字举行运算。下表列出了 C++ 中一些有用的内置的数学函数。
为了利用这些函数,您必要引用数学头文件 <cmath>
序号函数 & 形貌1double cos(double);
该函数返回弧度角(double 型)的余弦。2double sin(double);
该函数返回弧度角(double 型)的正弦。3double tan(double);
该函数返回弧度角(double 型)的正切。4double log(double);
该函数返回参数的自然对数。5double pow(double, double);
假设第一个参数为 x,第二个参数为 y,则该函数返回 x 的 y 次方。6double hypot(double, double);
该函数返回两个参数的平方总和的平方根,也就是说,参数为一个直角三角形的两个直角边,函数会返回斜边的长度。7double sqrt(double);
该函数返回参数的平方根。8int abs(int);
该函数返回整数的绝对值。9double fabs(double);
该函数返回任意一个浮点数的绝对值。10double floor(double);
该函数返回一个小于或即是传入参数的最大整数。 实例:
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. int main ()
  5. {
  6.    // 数字定义
  7.    short  s = 10;
  8.    int    i = -1000;
  9.    long   l = 100000;
  10.    float  f = 230.47;
  11.    double d = 200.374;
  12.    // 数学运算
  13.    cout << "sin(d) :" << sin(d) << endl;
  14.    cout << "abs(i)  :" << abs(i) << endl;
  15.    cout << "floor(d) :" << floor(d) << endl;
  16.    cout << "sqrt(f) :" << sqrt(f) << endl;
  17.    cout << "pow( d, 2) :" << pow(d, 2) << endl;
  18.    return 0;
  19. }
复制代码
输出:
  1. sin(d) :-0.634939
  2. abs(i)  :1000
  3. floor(d) :200
  4. sqrt(f) :15.1812
  5. pow( d, 2 ) :40149.7
复制代码
2.3 C++随机数

在许多情况下,必要生成随机数。关于随机数生成器,有两个相关的函数。一个是 rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用 srand() 函数。
下面是一个关于生成随机数的简单实例。实例中使用了 time() 函数来获取系统时间的秒数,通过调用 rand() 函数来生成随机数:
  1. #include <iostream>
  2. #include <ctime>
  3. #include <cstdlib>
  4. using namespace std;
  5. int main ()
  6. {
  7.    int i,j;
  8.    // 设置种子
  9.    srand( (unsigned)time( NULL ) );
  10.    /* 生成 10 个随机数 */
  11.    for( i = 0; i < 10; i++ )
  12.    {
  13.       // 生成实际的随机数
  14.       j= rand();
  15.       cout <<"随机数: " << j << endl;
  16.    }
  17.    return 0;
  18. }
复制代码
输出:
  1. 随机数: 1748144778
  2. 随机数: 630873888
  3. 随机数: 2134540646
  4. 随机数: 219404170
  5. 随机数: 902129458
  6. 随机数: 920445370
  7. 随机数: 1319072661
  8. 随机数: 257938873
  9. 随机数: 1256201101
  10. 随机数: 580322989
复制代码
三 数组

C++ 支持数组数据结构,它可以存储一个固定巨细的类似范例元素的序次集合。数组是用来存储一系列数据,但它往往被认为是一系列类似范例的变量。
数组的声明并不是声明一个个单独的变量,好比 number0、number1、...、number99,而是声明一个数组变量,好比 numbers,然后使用 numbers[0]、numbers[1]、...、numbers[99] 来代表一个个单独的变量。数组中的特定元素可以通过索引访问。
全部的数组都是由连续的内存位置组成。最低的地点对应第一个元素,最高的地点对应末了一个元素。
3.1 声明数组

在 C++ 中要声明一个数组,必要指定元素的范例和元素的数目,如下所示:
  1. type arrayName [ arraySize ];
复制代码
这叫做一维数组。arraySize 必须是一个大于零的整数常量,type 可以是任意有效的 C++ 数据范例。例如,要声明一个范例为 double 的包含 10 个元素的数组 balance,声明语句如下:
  1. double balance[10];
复制代码
现在 balance 是一个可用的数组,可以容纳 10 个范例为 double 的数字。
3.2 初始化数组

在 C++ 中,您可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
  1. double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
复制代码
大括号 { } 之间的值的数目不能大于我们在数组声明时在方括号 [ ] 中指定的元素数目。
如果您省略掉了数组的巨细,数组的巨细则为初始化时元素的个数。因此,如果:
  1. double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
复制代码
您将创建一个数组,它与前一个实例中所创建的数组是完全类似的。下面是一个为数组中某个元素赋值的实例:
  1. balance[4] = 50.0;
复制代码
上述的语句把数组中第五个元素的值赋为 50.0。全部的数组都是以 0 作为它们第一个元素的索引,也被称为基索引,数组的末了一个索引是数组的总巨细减去 1。以下是上面所讨论的数组的的图形表示:

 3.3 访问数组元素

数组元素可以通过数组名称加索引举行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:
  1. double salary = balance[9];
复制代码
上面的语句将把数组中第 10 个元素的值赋给 salary 变量。下面的实例使用了上述的三个概念,即,声明数组、数组赋值、访问数组:
  1. #include <iostream>
  2. using namespace std;
  3. #include <iomanip>
  4. using std::setw;
  5. int main ()
  6. {
  7.    int n[ 10 ]; // n 是一个包含 10 个整数的数组
  8.    // 初始化数组元素         
  9.    for ( int i = 0; i < 10; i++ )
  10.    {
  11.       n[ i ] = i + 100; // 设置元素 i 为 i + 100
  12.    }
  13.    cout << "Element" << setw( 13 ) << "Value" << endl;
  14.    // 输出数组中每个元素的值                     
  15.    for ( int j = 0; j < 10; j++ )
  16.    {
  17.       cout << setw( 7 )<< j << setw( 13 ) << n[ j ] << endl;
  18.    }
  19.    return 0;
  20. }
复制代码
上面的程序使用了  setw() 来格式化输出。当上面的代码被编译和执行时,它会产生下列结果:
  1. Element        Value
  2.       0          100
  3.       1          101
  4.       2          102
  5.       3          103
  6.       4          104
  7.       5          105
  8.       6          106
  9.       7          107
  10.       8          108
  11.       9          109
复制代码
3.4 C++中数组详解

在 C++ 中,数组是非常重要的,我们必要了解更多有关数组的细节。下面列出了 C++ 程序员必须清晰的一些与数组相关的重要概念:
概念形貌多维数组C++ 支持多维数组。多维数组最简单的形式是二维数组。指向数组的指针您可以通过指定不带索引的数组名称来生成一个指向数组中第一个元素的指针。通报数组给函数您可以通过指定不带索引的数组名称来给函数通报一个指向数组的指针。从函数返回数组C++ 答应从函数返回数组。 四 字符串

C++ 提供了以下两种范例的字符串表示形式:


  • C 风格字符串
  • C++ 引入的 string 类范例
4.1 C风格字符串

C 风格的字符串起源于 C 语言,并在 C++ 中继承得到支持。字符串现实上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 末端的字符串,包含了组成字符串的字符。
下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末了存储了空字符,以是字符数组的巨细比单词 RUNOOB 的字符数多一个。
  1. char site[7] = {'p', 'h', 'O', 'n', 'e', '\0'};
复制代码
依据数组初始化规则,可以把上面的语句写成以下语句:
  1. char site[] = "phone";
复制代码
C++ 中有大量的函数用来操作以 null 末端的字符串:
序号函数 & 目的1strcpy(s1, s2);
复制字符串 s2 到字符串 s1。2strcat(s1, s2);
毗连字符串 s2 到字符串 s1 的末了。毗连字符串也可以用 + 号,例如:
  1. string str1 = "CSDN";
  2. string str2 = "google";
  3. string str = str1 + str2;
复制代码
3strlen(s1);
返回字符串 s1 的长度。4strcmp(s1, s2);
如果 s1 和 s2 是类似的,则返回 0;如果 s1<s2 则返回值小于 0;如果 s1>s2 则返回值大于 0。5strchr(s1, ch);
返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。6strstr(s1, s2);
返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。 下面的实例使用了上述的一些函数:
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. int main ()
  5. {
  6.    char str1[13] = "csdn";
  7.    char str2[13] = "google";
  8.    char str3[13];
  9.    int  len ;
  10.    // 复制 str1 到 str3
  11.    strcpy( str3, str1);
  12.    cout << "strcpy( str3, str1) : " << str3 << endl;
  13.    // 连接 str1 和 str2
  14.    strcat( str1, str2);
  15.    cout << "strcat( str1, str2): " << str1 << endl;
  16.    // 连接后,str1 的总长度
  17.    len = strlen(str1);
  18.    cout << "strlen(str1) : " << len << endl;
  19.    return 0;
  20. }
复制代码
输出:
  1. strcpy( str3, str1) : csdn
  2. strcat( str1, str2): csdngoogle
  3. strlen(str1) : 12
复制代码
4.2 C++ 中的String类

C++ 标准库提供了 string 类范例,支持上述全部的操作,另外还增长了其他更多的功能。我们将学习 C++ 标准库中的这个类,现在让我们先来看看下面这个实例:
现在您可能还无法透彻地理解这个实例,因为到目前为止我们还没有讨论类和对象。以是现在您可以只是大略地看下这个实例,等理解了面向对象的概念之后再转头来理解这个实例。
  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. int main ()
  5. {
  6.    string str1 = "csdn";
  7.    string str2 = "google";
  8.    string str3;
  9.    int  len ;
  10.    // 复制 str1 到 str3
  11.    str3 = str1;
  12.    cout << "str3 : " << str3 << endl;
  13.    // 连接 str1 和 str2
  14.    str3 = str1 + str2;
  15.    cout << "str1 + str2 : " << str3 << endl;
  16.    // 连接后,str3 的总长度
  17.    len = str3.size();
  18.    cout << "str3.size() :  " << len << endl;
  19.    return 0;
  20. }
复制代码
输出:
  1. str3 : csdn
  2. str1 + str2 : csdngoogle
  3. str3.size() :  12
复制代码
内容参考摘录于:C++ 字符串 | 菜鸟教程

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

铁佛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表