C++夯实基础

C++在线学习笔记

第一阶段:基础

一、环境配置

1.1.第一个程序(基本格式)

#include <iosteam>
using namespace std;int main(){cout<<"hello world"<<endl;system("pause");
}

​ 模板

#include <iosteam>
using namespace std;
#include <string.h>
int main(){//主要功能代码区system("pause");
}
1.2注释

image-20240312180130454

1.3变量

​ 意义:方便管理内存空间

​ 方法:数据类型 变量名 = 数字;

#include <iosteam>
using namespace std;int main(){int a = 10; cout<<"a = "<<a<<endl;system("pause");
}
1.4常量

image-20240312180534938

#include <iosteam>
using namespace std;
#def Day 7
int main(){cout<<"一周一共有"<<Day<<endl;system("pause");}
1.5关键字

image-20240312180905002

1.6变量命名规则

image-20240312181052920

二、数据类型

​ 目的:给数据存分配合适的空间大小;避免资源浪费

2.1整形

image-20240312181159521

2.2 sizeof

image-20240312182020423

int main(){cout<<"short类型内存为:"<<sizeof(short)<<endl;
}

image-20240312182218512

2.3浮点型

image-20240312182322358

image-20240312182606364

​ float占用四个字节

​ double占用八个字节

​ 科学计数法

image-20240312182812067

2.4字符型

​ 注意事项:单引号;单引号里面只能放一个;ASCII值;int(char);A65;a97.

image-20240312182913797

2.5转义字符

image-20240313080814589

2.6字符串型

​ #include string

​ string a = “你好世界” //C++中的变量

​ char str[] =“Hello world” //C中的

image-20240313081406116

2.7布尔数据类型

image-20240313081756468

2.8数据的输入

image-20240313081956558

#include <iosteam>
using namespace std;
#include <string>int main(){int a =0;cout<<"请给a赋值 = "<<endl;cin>>a;把输入的值赋值给acout<<"a = "<<a<<endl;char b ='a';cout<<"请给b赋值 = "<<endl;cin>>a;把输入的值赋值给acout<<"b = "<<a<<endl;system("pause");}

三、运算符

image-20240313082511741

3.1 算术运算符号

image-20240313082546265

#include <iostream>
using namespace std;int main() {int num1, num2;cout << "请输入两个整数:" << endl;cin >> num1 >> num2;// 加法int sum = num1 + num2;cout << "加法结果:" << sum << endl;// 减法int difference = num1 - num2;cout << "减法结果:" << difference << endl;// 乘法int product = num1 * num2;cout << "乘法结果:" << product << endl;// 除法if (num2 != 0) {double quotient = static_cast<double>(num1) / static_cast<double>(num2);cout << "除法结果:" << quotient << endl;} else {cout << "除数不能为0" << endl;}return 0;
}

image-20240313083645770

image-20240313084009944

3.2赋值运算符

image-20240313084101731

#include <iostream>
using namespace std;int main() {int a = 10; // 直接赋值cout << "a = " << a << endl;a += 5; // 加法赋值cout << "a = " << a << endl;a -= 3; // 减法赋值cout << "a = " << a << endl;a *= 2; // 乘法赋值cout << "a = " << a << endl;a /= 4; // 除法赋值cout << "a = " << a << endl;a %= 6; // 取模赋值cout << "a = " << a << endl;int v = 10;++v ;cout<<"v = "<<v<<endl;return 0;
}
3.3比较运算符

image-20240313084313494

#include <iostream>
using namespace std;int main() {int a = 10, b = 20;// 等于运算符if (a == b) {cout << "a等于b" << endl;} else {cout << "a不等于b" << endl;}// 不等于运算符if (a != b) {cout << "a不等于b" << endl;} else {cout << "a等于b" << endl;}// 大于运算符if (a > b) {cout << "a大于b" << endl;} else {cout << "a不大于b" << endl;}// 小于运算符if (a < b) {cout << "a小于b" << endl;} else {cout << "a不小于b" << endl;}// 大于等于运算符if (a >= b) {cout << "a大于等于b" << endl;} else {cout << "a小于b" << endl;}// 小于等于运算符if (a <= b) {cout << "a小于等于b" << endl;} else {cout << "a大于b" << endl;}system("pause");return 0;
}
3.4逻辑运算

image-20240313084600685

#include <iostream>
using namespace std;int main() {bool a = true, b = false;// 与运算符if (a && b) {cout << "a和b都为真" << endl;} else {cout << "a和b不都为真" << endl;}// 或运算符if (a || b) {cout << "a和b至少有一个为真" << endl;} else {cout << "a和b都不为真" << endl;}// 非运算符if (!a) {cout << "a为假" << endl;} else {cout << "a为真" << endl;}system("pause");return 0;
}

四、 程序流程结构

image-20240313085000656

4.1顺序结构
#include <iostream>
using namespace std;int main() {int num = 0;// if语句if (num > 0) {cout << "num大于0" << endl;} else if (num < 0) {cout << "num小于0" << endl;} else {cout << "num等于0" << endl;}return 0;
}if (条件表达式) {// 当条件表达式为真时执行的代码块
} else if (条件表达式) {// 当第一个条件表达式为假,且当前条件表达式为真时执行的代码块
} else {// 当所有条件表达式都为假时执行的代码块
}别加分号

4.2选择顺序结构

#include <iostream>
using namespace std;
int main() {int score = 0;cout << "输入分数" << endl;cin >> score;cout << "您的分数为:" << score << endl;if (score > 600) {cout << "恭喜你考上了一本大学" << endl;}else if (500 < score < 600) {cout << "恭喜你考上了二本大学" << endl;}else if (400 < score < 500) {cout << "恭喜你考上了二本大学" << endl;}system("pause");return 0;}
4.2嵌套语句

​ 案例一需求

image-20240317185320906

​ 代码实现

#include <iostream>
using namespace std;int main() {int score;cout << "请输入高考考试分数: ";cin >> score;if (score > 600) {cout << "考上一本" << endl;if (score > 700) {cout << "考入北大" << endl;} else if (score > 650) {cout << "考入清华" << endl;} else if (score > 600) {cout << "考入人大" << endl;}} else if (score > 500) {cout << "考上二本" << endl;} else if (score > 400) {cout << "考上三本" << endl;} else {cout << "未考上本科" << endl;}return 0;
}

​ 案例二需求----三只小猪称体重
image-20240317185659667

​ 代码实现:

#include <iostream>
using namespace std;int main() {int weightA, weightB, weightC;cout << "请输入小猪A的体重:";cin >> weightA;cout << "请输入小猪B的体重:";cin >> weightB;cout << "请输入小猪C的体重:";cin >> weightC;if (weightA >= weightB && weightA >= weightC) {cout << "小猪A最重" << endl;} else if (weightB >= weightA && weightB >= weightC) {cout << "小猪B最重" << endl;} else {cout << "小猪C最重" << endl;}return 0;
}
4.3 三目运算符:

​ 要求

image-20240317191530535

​ 代码实现:

#include <iostream>
using namespace std;int main() {int weightA, weightB, weightC;cout << "请输入小猪A的体重:";cin >> weightA;cout << "请输入小猪B的体重:";cin >> weightB;cout << "请输入小猪C的体重:";cin >> weightC;string heaviest = (weightA >= weightB && weightA >= weightC) ? "小猪A" : (weightB >= weightA && weightB >= weightC) ? "小猪B" : "小猪C";cout << heaviest << "最重" << endl;return 0;
}

​ 注意:?是判断的意思

​ 就是":"就是否则就的意思
image-20240317192158943

4.4 switch语句
#include <iostream>
using namespace std;int main() {int weightA, weightB, weightC;cout << "请输入小猪A的体重:";cin >> weightA;cout << "请输入小猪B的体重:";cin >> weightB;cout << "请输入小猪C的体重:";cin >> weightC;string heaviest;if (weightA >= weightB && weightA >= weightC) {heaviest = "小猪A";} else if (weightB >= weightA && weightB >= weightC) {heaviest = "小猪B";} else {heaviest = "小猪C";}switch (heaviest[0]) {case '小':cout << "最重的小猪是" << heaviest << endl;break;default:cout << "没有找到最重的小猪" << endl;break;}return 0;
}
4.5循环结构

​ 4.5.1结构浏览
image-20240317192547410

​ 4.5.2打印数字

int main(){int num = 0;cout<<num<<endl;while(num<10){cout<<num<<endl;num++;}system("puase");
}

​ 4.5.3猜数字案例
image-20240317193127126

#include <iostream>
#include <ctime>
#include <cstdlib>int main() {srand(time(0));int random_num = rand() % 100 + 1;//rand() % 100生成一个0--99的树int guess;std::cout << "欢迎来到猜数字游戏!系统已生成一个1到100之间的随机数,请开始猜测:" << std::endl;while (true) {std::cin >> guess;if (guess > random_num) {std::cout << "猜大了,请重新输入:" << std::endl;} else if (guess < random_num) {std::cout << "猜小了,请重新输入:" << std::endl;} else {std::cout << "恭喜你猜对了!游戏结束。" << std::endl;break;}}return 0;
}

​ 4.5.4 do while 实现

#include <iostream>
#include <ctime>
#include <cstdlib>int main() {srand(time(0));int random_num = rand() % 100 + 1;int guess;bool isCorrect = false;std::cout << "欢迎来到猜数字游戏!系统已生成一个1到100之间的随机数,请开始猜测:" << std::endl;do {std::cin >> guess;if (guess > random_num) {std::cout << "猜大了,请重新输入:" << std::endl;} else if (guess < random_num) {std::cout << "猜小了,请重新输入:" << std::endl;} else {std::cout << "恭喜你猜对了!游戏结束。" << std::endl;isCorrect = true;}} while (!isCorrect);return 0;
}

​ 4.5.5水仙花数的实现
image-20240317201245061

解决办法:
image-20240317201326550

image-20240317201728843

#include <iostream>
#include <cmath>bool is_narcissistic_number(int num) {int sum = 0;int temp = num;int n = std::to_string(num).length();while (temp > 0) {int digit = temp % 10;sum += std::pow(digit, n);temp /= 10;}return sum == num;
}int main() {for (int i = 100; i <= 999; ++i) {if (is_narcissistic_number(i)) {std::cout << i << " 是水仙花数" << std::endl;}}return 0;
}
4.6 for循环

image-20240317202042282

int main(){for(int i = 0;i<10;i++){cout<<"i = "<<i<<endl;}system("pause");
}

​ 案例:敲桌子
image-20240317202327882

​ 思路:

image-20240317202439721

image-20240317202548012

​ 代码

#include <iostream>
using namespace std;bool contains_seven(int num) {while (num > 0) {if (num % 10 == 7) {return true;}num /= 10;}return false;
}bool is_multiple_of_seven(int num) {return num % 7 == 0;
}int main() {int num;cout << "请输入一个数字: ";cin >> num;if (contains_seven(num) || is_multiple_of_seven(num)) {cout << "敲桌子" << endl;} else {cout << "不敲桌子" << endl;}return   0;
}

​ 嵌套循环
image-20240317202814435

​ 代码实现:
image-20240317203003897

​ 乘法口诀表
image-20240317203042916

​ 代码实现:

#include <iostream>
using namespace std;int main() {for (int i = 1; i <= 9; ++i) {for (int j = 1; j <= i; ++j) {cout << j << " * " << i << " = " << i * j << "\t";}cout << endl;}return 0;
}

​ 结果:
image-20240317203649985

4.7跳转语句

break
image-20240317203740707

#include <iostream>
using namespace std;int main() {for (int i = 0; i < 10; ++i) {if (i == 5) {break; // 当i等于5时跳出循环}cout << i << " ";}cout << endl;for (int i = 0; i < 10; ++i) {if (i % 2 == 0) {continue; // 当i是偶数时跳过本次循环}cout << i << " ";}cout << endl;return 0;
}

​ continue代码

#include <iostream>
using namespace std;int main() {for (int i = 0; i < 10; ++i) {if (i % 2 == 0) {continue; // 当i是偶数时跳过本次循环}cout << i << " ";}cout << endl;return 0;
}
break和continue的区别:**break用于结束整个循环,而continue用于跳过当前迭代继续执行后续迭代**。

在编程中,breakcontinue都是控制流程的关键字,它们影响循环结构的行为。以下是两者的具体区别:

  • 作用范围:当在循环内部遇到break时,会立即退出最内层的循环,并开始执行循环之后的代码。而continue仅跳过当前的迭代,即本次循环剩余未执行的部分,然后继续进行下一次迭代。
  • 使用场景break通常用于在满足某个条件时要完全终止循环的情况。例如,你可能在一个搜索算法中找到目标值后使用break来停止搜索。continue则用于当某次迭代不满足特定条件时,希望略过此次迭代,直接进入下一次迭代的情况。比如,在遍历一个数组时,可能需要忽略某些特定的值。

总结来说,breakcontinue虽然都可以用来控制循环结构,但它们的主要区别在于break用于结束整个循环,而continue用于结束当前迭代并继续执行后续的迭代。

4.8 goto语句

C++中的goto语句是一种跳转语句,用于将程序的执行流程跳转到指定的标签位置。它的语法格式如下:

goto label;
...
label: statement;

其中,label是一个用户自定义的标签,可以是一个标识符或者一个数字。当程序执行到goto语句时,它会跳转到与该标签对应的位置,并从该位置开始执行后面的语句。需要注意的是,使用goto语句可能会导致代码结构混乱,不易于维护和调试,因此在实际编程中应尽量避免使用。

#include <iostream>
using namespace std;int main() {int num = 0;start: // 标签num++;cout << "num: " << num << endl;if (num < 5) {goto start; // 跳转到start标签}return 0;
}

五、 数组

image-20240317204658499

5.1 数组的定义

数组是一组具有相同数据类型的元素的集合,这些元素在内存中连续存放,并且每个元素都可以通过下标来访问

数组的定义通常包括以下几个要素:

  1. 数据类型:数组中每个元素的类型,如int、float、char等。
  2. 数组名:用于标识数组的变量名。
  3. 数组大小:可以是声明时指定的常量表达式,也可以是后续动态分配的大小。
  4. 初始化:可以在声明时对数组进行初始化,也可以在声明后对数组的元素逐一赋值。
  5. 访问:通过数组名和下标来访问或修改数组中的元素。

此外,在C语言中,数组的下标是从0开始的,所以如果有一个数组a,那么a[0]表示第一个元素,a[n-1]表示最后一个元素,其中n是数组的大小。

总的来说,数组是编程中非常基础且重要的概念,它不仅用于存储数据,还常常用于处理大量数据的情况,如数值计算、数据处理等场景。

5.2数组的操作

数组的操作主要包括以下几个方面:

  1. 访问数组元素:通过下标来访问数组中的元素,例如a[0]表示第一个元素,a[n-1]表示最后一个元素。
  2. 修改数组元素:通过下标来修改数组中的元素,例如a[0] = 10将第一个元素的值改为10。
  3. 遍历数组元素:使用循环结构来遍历数组中的所有元素,例如使用for循环或while循环。
  4. 数组排序:对数组进行排序,可以使用内置的排序函数或者自定义的排序算法。
  5. 查找数组元素:在数组中查找指定的元素,可以使用线性查找、二分查找等方法。
  6. 动态数组:根据需要动态地增加或减少数组的大小,可以使用C语言中的realloc函数或者C++中的vector容器。
5.3代码的实现

以下是使用C语言实现数组操作的示例代码:

#include <stdio.h>int main() {// 定义一个整型数组,大小为5int a[5] = {1, 2, 3, 4, 5};// 访问数组元素printf("a[0] = %d", a[0]); // 输出第一个元素printf("a[4] = %d", a[4]); // 输出最后一个元素// 修改数组元素a[0] = 10;printf("a[0] = %d", a[0]); // 输出修改后的第一个元素// 遍历数组元素for (int i = 0; i < 5; i++) {printf("a[%d] = %d", i, a[i]);}// 动态增加数组大小int *b = (int *)realloc(a, 10 * sizeof(int));if (b != NULL) {a = b;for (int i = 5; i < 10; i++) {a[i] = i + 1;}printf("New array: ");for (int i = 0; i < 10; i++) {printf("%d ", a[i]);}printf("");} else {printf("Failed to resize the array.");}return 0;
}

以上代码演示了如何定义、访问、修改、遍历和动态调整数组的大小。其中,realloc函数用于重新分配内存空间,如果分配成功则返回指向新内存空间的指针,否则返回NULL。

5.4 一维数组的作用

image-20240317205341713

一维数组是编程中非常基础且重要的概念,它的作用主要有以下几个方面:

  1. 存储数据:一维数组可以用于存储一组相同类型的数据,例如整数、浮点数、字符等。通过下标访问和修改数组元素,可以实现对数据的快速存取和修改。

  2. 处理大量数据:在处理大量数据时,使用一维数组可以有效地减少内存占用和提高程序运行效率。例如,在数值计算、数据处理、图像处理等领域,一维数组被广泛应用。

  3. 实现算法:许多算法需要使用到数组,例如排序算法、查找算法、动态规划等。一维数组作为这些算法的基础数据结构,能够方便地实现各种算法。

  4. 简化代码:使用一维数组可以将复杂的数据结构和操作抽象化,从而简化代码的编写和维护。例如,在字符串处理、矩阵运算等领域,一维数组可以大大简化代码的复杂度。

  5. 统计数组的大小

    以下是使用C语言实现统计数组大小的示例代码:

    #include <stdio.h>int main() {// 定义一个整型数组,大小为5int a[5] = {1, 2, 3, 4, 5};// 计算数组的大小int size = sizeof(a) / sizeof(a[0]);printf("The size of the array is %d
    ", size); // 输出数组的大小return 0;
    }
    

    以上代码中,sizeof(a)可以获取整个数组的字节数,而sizeof(a[0])可以获取数组中每个元素的字节数。将两者相除即可得到数组的大小。需要注意的是,这种方法只适用于在定义数组时已知数组大小的情况,如果数组是通过动态分配内存得到的,则需要使用其他方法来获取数组的大小。

  6. 案例一:

    1. image-20240317205936051

    2. 解析:首先需要遍历数组,找到最大值,然后打印出来。

      代码如下:

      #include <iostream>
      using namespace std;int main() {int arr[5] = {300, 350, 200, 400, 250};int max_weight = arr[0];for (int i = 1; i < 5; i++) {if (arr[i] > max_weight) {max_weight = arr[i];}}cout << "最重的小猪体重为:" << max_weight << endl;return 0;
      }

案例二:

image-20240317210309164

代码实现:

​ 解析:首先需要声明一个5个元素的数组,然后通过循环将数组元素逆置。

代码如下:

#include <iostream>
using namespace std;int main() {int arr[5] = {1, 3, 2, 5, 4};for (int i = 0; i < 5 / 2; i++) {int temp = arr[i];arr[i] = arr[4 - i];arr[4 - i] = temp;}for (int i = 0; i < 5; i++) {cout << arr[i] << " ";}cout << endl;return 0;
}

image-20240317235042872

案例三:冒泡排序

冒泡排序是一种简单直观的交换排序算法

冒泡排序的基本思想是通过重复遍历要排序的数列,比较相邻两个元素的大小,如果顺序错误(例如,第一个元素比第二个大),则交换它们的位置。这个过程会不断重复,直到整个数列被排序完成。具体步骤如下:

  1. 比较相邻元素:从数列的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换这两个元素的位置。
  2. 重复遍历:完成一轮遍历后,最大的元素会被移动到数列的末尾。然后再次从头开始遍历,重复上述比较和交换的过程。
  3. 确定元素归位:每完成一趟遍历,就能确定一个元素归位,即该元素移动到了它最终应该在的位置上。
  4. 判断排序完成:当进行一轮遍历后没有任何元素需要交换,说明数列已经完全有序,排序过程结束。

总的来说,冒泡排序的名称来源于较小的元素会逐渐“冒泡”到数列的顶端,就像水中的气泡一样向上浮动。尽管冒泡排序在最坏情况下的时间复杂度较高(O(n^2)),但由于其算法简单且易于实现,它仍然在某些教学场合和特定应用场景中得到使用。

image-20240317235430567

图示

image-20240317235918108

image-20240318000231710

代码部分

#include <stdio.h>
#include <stdlib.h> // rand() srand()
#include <time.h>   // time()void display(int* array, int size); // 打印函数
int  check(int* array, int size);   // 检查函数
void swap(int* a, int* b);          // 交换函数/*** @brief 冒泡排序:重的往下沉,从小到大** @param array        数组首地址* @param size         数组大小*/
void bubble_sort(int* array, int size)
{// 外循环为排序趟数,size 个数进行 size-1 趟// 内循环为每趟比较的次数,第 i 趟比较 size-1-i 次for (int i = 0; i < size - 1; i++) {for (int j = 0; j < size - 1 - i; j++) {if (array[j] > array[j + 1]) {swap(&array[j], &array[j + 1]);}}}
}void bubble_sort_better(int* array, int size)
{for (int i = 0; i < size - 1; i++) {// 以 flag 作为标志,如果遍历完没有改变说明有序不再遍历排序int flag = 1;for (int j = 0; j < size - 1 - i; j++) {if (array[j] > array[j + 1]) {swap(&array[j], &array[j + 1]);flag = 0;}}if (flag) {break;}}
}int main()
{// 测试用例// int array[]    = {49, 38, 65, 97, 76, 13, 27, 49, 10};// int array_size = sizeof(array) / sizeof(array[0]);// printf("%d \n", array_size);// printf("排序前数组:");// display(array, array_size);// bubble_sort(array, array_size);// printf("排序后数组:");// display(array, array_size);// 随机测试int array_num  = 20;             // 数组数量int array_size = 20;             // 数组大小int array[array_size];           // 数组初始化srand((unsigned int)time(NULL)); // 随机数种子,保证每次不一样for (int i = 0; i < array_num; i++) {for (int j = 0; j < array_size; j++) {array[j] = rand() % 1000; // 随机生成数大小 0~999}printf("原来的数组:");display(array, array_size);bubble_sort(array, array_size);printf("排序后数组:");display(array, array_size);// 检测排序结果if (check(array, array_size) != 0) {exit(-1);}printf("\n");}return 0;
}/*** @brief 打印函数** @param array        数组首指针* @param size         数组大小*/
void display(int* array, int size)
{for (int i = 0; i < size; i++) {printf("%d ", array[i]);}printf("\n");
}/*** @brief 检查函数,从小到大** @param array        数组首指针* @param size         数组大小*/
int check(int* array, int size)
{for (int i = 0; i < size - 1; i++) {if (array[i] > array[i + 1]) {printf("sort array fail...\n");return -1;}}printf("sort array success...\n");return 0;
}/*** @brief 交换函数** @param a            第一个交换地址* @param b            第二个交换地址*/
void swap(int* a, int* b)
{int temp = *b;*b       = *a;*a       = temp;
}

总之,一维数组是编程中非常重要的数据结构之一,它不仅能够存储和处理大量数据,还能够实现各种算法和简化代码。

5.5 二维数组

5.5.1 数组的定义

image-20240318000720469

在程序员的术语中,二维数组可以被理解为一个数据结构,它以行和列的形式组织数据,形成一个类似于表格或矩阵的结构。它是一维数组的一个扩展,而一维数组可以被视为一个线性序列。

具体来说,二维数组可以想象为一个由多个一维数组构成的数组,其中每个一维数组代表二维数组的一行。这些一维数组(行)具有相同的长度,这个长度定义了二维数组的列数。因此,二维数组通常通过其行数和列数来描述其大小。

在内存中,二维数组通常是连续存储的,即第一行的所有元素紧跟着第二行的元素,依此类推。这允许通过索引公式直接访问任何特定元素。例如,如果我们有一个名为array的二维数组,要访问位于第i行第j列的元素,我们通常使用array[i][j]的形式(在大多数编程语言中)。

在不同的编程语言中,二维数组的声明和初始化方式可能会有所不同。以下是几种不同语言中声明二维数组的例子:

  • C/C++:

    int array[3][4]; // 一个有3行4列的整型二维数组
    
  • Java:

    int[][] array = new int[3][4]; // 一个有3行4列的整型二维数组
    
  • Python (在Python中称为列表的列表):

    array = [[0 for _ in range(4)] for _ in range(3)] # 一个有3行4列的整型二维数组
    

二维数组在各种编程任务中都非常有用,包括图像处理、地图表示、游戏开发中的网格系统等。通过它们,开发者能够方便地处理有着行列逻辑关系的数据集。

5.5.2 数组名的作用

  1. 查询数组的占内存的大小

  2. 查看二维数组的首地址

  3. 代码实现:

    #include<stdio.h>
    using namespace std;int main(){int arr[2][3] ={{1,2,3},{4,5,6}
    }cout<<"二维数组占用内存空间为:"<<sizeof(arr)<<endl;cout<<"二维数组第一行占用内存空间为:"<<sizeof(arr[0])<<endl;cout<<"二维数组第一个元素占用内存空间为:"<<sizeof(arr[0][0])<<endl;}
    

image-20240318145114550

#include <iostream>int main() {int arr[] = {1, 2, 3, 4, 5};int *p = arr;std::cout << "数组首地址: " << &arr[0] << std::endl;std::cout << "指针指向的首地址: " << p << std::endl;return 0;
}

image-20240318145420794

5.5.3二维数组的案例

image-20240318145524516

方法和思想

  1. 创建二维数组

  2. 统计考试成绩,让每行数据相加,统计出总和

  3. 代码实现

    #include <stdio.h>
    using namespce std;
    #include <string.h>int main(){int scores =[3][3] = {{100,100,100},{90,55,100},{60,70,80}}//统计求和for(int i = 0;i<3;i++){sum = 0;for(int j = 0;j<3;j++){sum = sum +score[i][j];}cout<<"第"<<i+1<<"个人的成绩总和为"<<sum<<endl;}
    }
    
5.6函数

image-20240318151222840

为了实现算术运算,我们可以创建一个C++函数,该函数接受两个参数(操作数)和一个字符(运算符),然后根据运算符执行相应的算术运算。以下是一个示例:

#include <iostream>
using namespace std;double arithmeticOperation(double num1, double num2, char operation) {double result;switch (operation) {case '+':result = num1 + num2;break;case '-':result = num1 - num2;break;case '*':result = num1 * num2;break;case '/':if (num2 != 0) {result = num1 / num2;} else {cout << "除数不能为0" << endl;exit(0);}break;default:cout << "无效的运算符" << endl;exit(0);}return result;
}int main() {double num1, num2;char operation;cout << "请输入第一个操作数: ";cin >> num1;cout << "请输入第二个操作数: ";cin >> num2;cout << "请输入运算符(+, -, *, /): ";cin >> operation;double result = arithmeticOperation(num1, num2, operation);cout << "结果: " << result << endl;system("pause");return 0;
}

这个程序首先定义了一个名为arithmeticOperation的函数,该函数接受两个double类型的参数(操作数)和一个char类型的参数(运算符)。然后,它使用switch语句根据运算符执行相应的算术运算,并返回结果。在main函数中,我们从用户那里获取操作数和运算符,然后调用arithmeticOperation函数并输出结果。

image-20240318151656530

运行结果:

image-20240318151404046

值传递

#include <iostream>
using namespace std;//形参传递
void swap(int num1, int num2) {int temp = num1;num1 = num2;num2 = temp;cout << "swap中 num1 =" << num1 << "swap中 num2 =" << num2 << endl;
}//值传递void swap1(int &num1, int &num2) {int temp = num1;num1 = num2;num2 = temp;cout << "swap1中 num1 =" << num1 << "swap1中 num2 =" << num2 << endl;
}int main() {int a = 10;int b = 20;swap(a, b);cout << "main中 num1 =" << a << "main中 num2 =" << b << endl;swap1(a, b);cout << "二次调用main中 num1 =" << a << "main中 num2 =" << b << endl;system("pause");return 0;}

函数的常见样式

image-20240318153355144

C++中函数的常见样式有以下几种:

  1. 无参数,无返回值的函数:
void functionName() {// 函数体
}
  1. 有参数,无返回值的函数:
void functionName(parameterType parameterName) {// 函数体
}
  1. 无参数,有返回值的函数:
returnType functionName() {// 函数体return returnValue;
}
  1. 有参数,有返回值的函数:
returnType functionName(parameterType parameterName) {// 函数体return returnValue;
}

其中,returnType表示函数的返回值类型,functionName表示函数名,parameterType表示参数类型,parameterName表示参数名。

函数的声明

C++函数的声明、定义和作用:

  1. 声明:函数声明是告诉编译器函数的名称、返回类型和参数列表。函数声明通常放在头文件中,以便在多个源文件中使用同一个函数时,编译器可以知道函数的存在。

  2. 定义:函数定义是实现函数的具体功能。函数定义包括函数体,即实现函数功能的代码块。

  3. 作用:函数的作用是将一段具有特定功能的代码封装起来,以便在程序中多次调用。通过使用函数,可以提高代码的复用性和可维护性。

相关案例实现:

#include <iostream>
using namespace std;// 函数声明 不用具体的函数的实现 只是声明 int add(int a,int b);
int add(int a, int b);int main() {int num1, num2, sum;cout << "请输入两个整数:" << endl;cin >> num1 >> num2;// 调用函数sum = add(num1, num2);cout << "两数之和为:" << sum << endl;return 0;
}// 函数定义
//pass 复习一下:a>b?a:b
int add(int a, int b) {return a + b;
}

在这个案例中,我们定义了一个名为add的函数,用于计算两个整数的和。首先,我们在main函数中获取用户输入的两个整数,然后调用add函数计算它们的和,并将结果输出到屏幕上。

函数的分文件编写

image-20240318154402943

在C++中,实现函数的分文件编写通常需要将函数声明放在头文件中,而将函数定义放在源文件中。以下是一个简单的示例:

  1. 创建一个头文件(例如:functions.h):
    image-20240318155005452
#ifndef FUNCTIONS_H
#define FUNCTIONS_H// 函数声明
int add(int a, int b);#endif // FUNCTIONS_H
  1. 创建一个源文件(例如:functions.cpp):
    image-20240318155140612
#include "functions.h"// 函数定义
int add(int a, int b) {return a + b;
}
  1. 在头文件中剪切源文件中函数的声明
    void swap(int num1, int num2);

    image-20240318155512776

  2. 在源文件中声明函数的定义,并且引用头文件
    image-20240318160217684

  3. 在头文件导入标准的输入输出文件 标准的命名空间std和函数声明
    image-20240318160332909

  4. 在主程序中使用这些函数:

#include <iostream>
#include "functions.h"int main() {int num1, num2, sum;std::cout << "请输入两个整数:" << std::endl;std::cin >> num1 >> num2;sum = add(num1, num2);std::cout << "两数之和为:" << sum << std::endl;return 0;
}

在这个示例中,我们将函数声明放在了头文件中,而将函数定义放在了源文件中。这样,我们可以在多个源文件中使用这个函数,而不需要重复编写函数的定义。

5.7指针

在C++中,指针是一种特殊的变量,它存储着另一个变量的内存地址。指针的基本概念、作用和使用方式具体如下:

  • 基本概念:指针是一种变量,它存储的是另一变量的地址。这个地址是内存中的一个位置,而这个位置上存储的就是数据。通过指针,可以间接访问和修改这个地址上的数据。

  • 作用:指针在C++编程中扮演着重要角色,它们允许程序员直接操作内存,这为程序的灵活性和效率带来了提升。指针的使用可以帮助实现动态内存分配、函数参数的传递、构建复杂的数据结构如链表和树等,以及支持多维数组和其他高级功能。

  • 使用方式

  • 声明:使用星号(*)来声明一个指针变量。例如,int *ptr; 声明了一个指向整型的指针变量ptr

  • 初始化:指针可以通过获取变量的地址(&)来初始化,如int val = 10; int *ptr = &val;,此时ptr指向val的地址。

  • 解引用:可以使用星号(*)来访问指针指向地址上的值,如int value = *ptr;,这样就将ptr指向地址上的值赋给了value

  • 指针运算:指针可以进行加减运算,以移动到连续内存块中的其他元素,也可以进行比较运算来确定两个指针的相对位置。

总的来说,掌握指针的使用对于编写高效和灵活的C++代码至关重要。通过深入理解指针的原理和常见操作,程序员能够更加熟练地使用指针来访问和操作内存中的数据。

第二阶段:核心

第三阶段:提高

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

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

相关文章

eth 交易案例分析9

交易hash: 先用0.26eth买入了多个GPT&#xff0c;然后用这多个GPT 在uniswap3 兑换了1.69 个eth&#xff0c; 疑问点&#xff1a;买入的 DLP 什么意思&#xff1f;

C++第十弹---类与对象(七)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 目录 1、再谈构造函数 1.1、构造函数体赋值 1.2、初始化列表 1.3、explicit关键字 2、static成员 2.1、概念 2.2、特性 2.3、面试题 总结 1、再…

制作nuget包并上传到nuget.org

下面是一个详细的步骤指南&#xff0c;用于创建一个简单的 C# NuGet 包并将其发布到 NuGet.org。我们将创建一个简单的数学库作为示例。 步骤 1: 创建一个新的类库项目 首先&#xff0c;我们需要创建一个新的类库项目。这可以通过 Visual Studio 或者 .NET CLI 完成。 使用 …

[linux][调度] 内核抢占入门 —— 线程调度次数与 CONFIG_PREEMPTION

在工作中&#xff0c;如果你正在做开发的工作&#xff0c;正在在写代码&#xff0c;这个时候测试同事在测试过程中测出了问题&#xff0c;需要你来定位解决&#xff0c;那么你就应该先暂停写代码的工作&#xff0c;转而来定位解决测试的问题&#xff1b;如果你正在定位测试的问…

mysql事务及存储引擎

目录 什么是事务 事务的ACIP特性 事务之间的影响 mysql隔离级别 事务隔离级别的作用范围 事务控制语句 mysql存储引擎 什么是事务 事务是一种机制、一个操作序列&#xff0c;包含了一组数据库操作命令&#xff0c;并且把所有的命令作为一个整体一起向系统提交或撤销操作…

AI预测福彩3D第15弹【2024年3月21日预测--第3套算法重新开始计算第4次测试】

今天咱们继续对第3套算法进行第4次测试&#xff0c;第3套算法加入了012路的权重。废话不多说了&#xff0c;直接上结果吧~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月21日福彩3D的七码预测结果如下&#xff1a; 百位&#xff1a;4 5 7 1 0 6 2 十位&#xff1a;3 1 5 …

QML 布局管理器之GridLayout 项目demo

一.气体控制效果图 二.界面布局代码实现 //DottedLline.qml 虚线绘制 import QtQuick 2.12 import QtQuick.Shapes 1.12Shape {id:canvaswidth: parent.widthheight: parent.heightShapePath{strokeStyle: ShapePath.DashLinestartX: 8startY: 10dashPattern: [1, 3]PathLine{…

在Linux搭建Emlog博客结合内网穿透实现公网访问本地个人网站

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

Flink入门知识点汇总(二)

具体内容请看b站尚硅谷课程&#xff01; 32_Flink运行时架构_提交流程_Yarn应用模式_哔哩哔哩_bilibili 窗口 Flink的窗口并不是静态准备好的&#xff0c;而是动态创建的。数据流到达时不会准备24个或者其他完整数量的桶&#xff0c;而是当下桶接满了&#xff0c;才临时又拿新…

web前端之小功能聚集、简单交互效果

MENU 纯CSS实现可编辑文字霓虹灯闪烁效果css之实现流水文字、闪烁、荧光、炫酷web前端之文本擦除效果与下划线结合css之下划线动画 纯CSS实现可编辑文字霓虹灯闪烁效果 效果图 html <h1 contenteditable"true">Hello World</h1>style * {margin: 0;pa…

C/C++在线参考手册的使用技巧

cppreference.com是一个在线的C/C参考手册&#xff0c;是C/C学习者最常用的网站。 网址&#xff1a;cppreference.com 1&#xff0e;搜索 不知道为什么这个网站总是不能正常搜索&#xff0c;实在是太不方便了。 有两个退而求其次的方法&#xff1a; (1)通过搜索引擎指定域名…

C++常用的区块代码

很多人在刷题时都遇到过不会的情况 这篇文章希望可以帮到你&#xff01; 1.输入n将这个数倒着输出来&#xff1a; while(n!0){tn%10;printf("%d",t);nn/10; }只要会这条代码&#xff0c;很多题目都可以直接秒杀。 如&#xff1a; 输入一个整数n,算出它各个位数的乘积…

程序员想要搞钱不迷茫,这篇文章你可得码好啦!!!

年已经过完了&#xff0c;现在大家都已经返工返校了吧&#xff01;咱又要投入到新一年的战斗了&#xff01;春色恼人不等闲&#xff0c;相信咱都有一个实实在在的愿望和期许&#xff1a;身体健康&#xff0c;财源广进&#xff01;新的一年我们还得继续努力&#xff0c;多多搞钱…

利用IP地址查防止电子招投标串标行为

随着信息技术的快速发展&#xff0c;电子招投标已成为政府和企业采购的主要方式。然而&#xff0c;电子招投标中的串标问题也愈发突出&#xff0c;给公平竞争和资源分配带来了隐患。为了防止串标行为&#xff0c;利用IP地址查已成为一种有效手段。 IP地址查询&#xff1a;IP数…

002_avoid_for_loop_in_Matlab避免使用for循环

避免使用for循环 在程序设计思想中&#xff0c;循环是一个很有力的工具。在循环中&#xff0c;计算机很轻松地重复执行相同的操作。循环是汇编之上的编程中最重要的概念之一。Matlab的循环有两个语言构造&#xff0c;一个是for循环&#xff0c;另一个是while循环。在Matlab中&…

罗德与施瓦茨联合广和通全面验证RedCap模组FG132系列先进性能

近日&#xff0c;罗德与施瓦茨联合广和通完成Redcap(Reduce Capability)功能和性能验证。本次测试使用R&SCMX500 OBT(One Box Tester)无线通信测试仪&#xff0c;主要验证广和通RedCap模组FG132系列射频性能以及IP层吞吐量&#xff0c;包括RedCap上下行吞吐量和射频指标如矢…

【计算机网络篇】数据链路层(2)封装成帧和透明传输

文章目录 &#x1f95a;封装成帧和透明传输&#x1f388;封装成帧&#x1f388;透明传输&#x1f5d2;️面向字节的物理链路使用字节填充的方法实现透明传输。&#x1f5d2;️面向比特的物理链路使用比特填充的方法实现透明传输。 &#x1f6f8;练习 &#x1f95a;封装成帧和透…

Linux systemd详解

1、概念 1.1 systemd systemd 是一个用于管理 Linux 系统启动过程和系统服务的系统和服务管理器。它被设计为取代传统的 System V init 系统&#xff0c;提供了更快的启动时间、并行启动服务、更好的日志记录和更强大的管理功能。 1.2 unit Unit 是 systemd 中所有配置文件…

基于ssm校园美食交流系统论文

目 录 摘 要 1 前 言 3 第1章 概述 4 1.1 研究背景 4 1.2 研究目的 4 1.3 研究内容 4 第二章 开发技术介绍 5 2.1Java技术 6 2.2 Mysql数据库 6 2.3 B/S结构 7 2.4 SSM框架 8 第三章 系统分析 9 3.1 可行性分析 9 3.1.1 技术可行性 9 3.1.2 经济可行性 10 3.1.3 操作可行性 10…

字符函数与字符串函数

目录 一.字符分类函数 二.字符转化函数 三.strlen函数 函数的介绍 strlen函数的模拟实现 1.计算器法 2.递归 三.指针-指针的方式 四.strcpy函数 函数介绍 strcmp的模拟实现 五.strcat函数 函数介绍 strcat的模拟实现 六.strcmp函数 函数介绍 返回值 strcm…