C++入门编程三(数组、冒泡排序、函数)

发布时间:2023年12月26日


基于b站黑马c++视频做的笔记,仅供参考和复习!!!

数组

数组是一个集合,里面存放了相同类型的数据元素,数组中的元素被存储在一段连续的内存空间中。
特点1:数组中的每个数据元素都是相同的数据类型;特点2:数组是由连续的内存位置组成的。
数组定义的3种形式如下

	//数组定义1
	//数据类型  数组名[ 数组长度 ]; `
	int arr1[10];

	//利用下标赋值
	arr1[0] = 100;
	arr1[1] = 99;
	arr1[2] = 85;
	//通常使用for循环进行输出
	for (int i = 0; i < 3; i++){
		cout << arr1[i] << endl;
	}
	
	//数组定义2
	//数据类型  数组名[ 数组长度 ] = { 值1,值2 ...};
	int arr2[5] = {1,2,3,4,5};
	for (int i = 0; i < 5; i++){
		cout << arr2[i] << endl;
	}
	
	//数组定义3
	//数据类型  数组名[ ] = { 值1,值2 ...};`
	int arr3[] = { 10,20,30,40,50,60,70};
	for (int i = 0; i < 7; i++){
		cout << arr3[i] << endl;
	}

一维数组

	//数组名用途
	//1、可以通过数组名统计整个数组占用的内存大小
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	cout << "整个数组占用内存空间: " << sizeof(arr) << endl;

	cout << "一个数组元素占用内存空间: " << sizeof(arr[0]) << endl;

	cout << "数组中元素的个数为: " << sizeof(arr)/ sizeof(arr[0]) << endl;
	
	//2、可以通过数组名查看数组首地址
	cout << "数组首地址: " << (int)arr << endl;
	cout << "数组中的第一个元素地址为:" << (int)&arr[0] << endl;
	cout << "数组中的第二个元素地址为:" << (int)&arr[1] << endl;

	// 数组名是常量,不可以进行赋值操作 数组名指向一个地址了
	//arr = 100;

在这里插入图片描述

案例:1、五只小猪称体重

在一个数组中记录了五只小猪的体重,如:int arr[5] = {300, 350, 200, 400, 250};找出并打印最重的小猪体重。

	int max = 0;
	int arr[5] = { 300,350,200,400,250 };
	for (int i = 0; i < 5; i++)
	{
		if (arr[i] > max){
			max = arr[i];
		}
	}
	cout<< "最大的小猪体重是:" << max << endl;
案例:2、数组元素逆置

请声明一个5个元素的数组,并且将元素逆置。(如原数组元素为:1, 3, 2, 5, 4;逆置后输出结果为:4,5,2,3,1)。
利用首尾下标作为while循环的判断条件来进行排序。

	int arr[5] = { 1,3,2,5,4 };

	cout << "数组元素逆置前:" << endl;
	for (int i = 0; i < 5; i++){
		cout << arr[i] << " ";
	}
	cout << endl;	//输出换行

	int start = 0;	//起始元素下标
	int end = sizeof(arr) / sizeof(arr[0]) - 1;		//末尾元素下标

	while (start < end)
	{
		//交换两个数的常用三条语句(必须记住)
		int temp = arr[start];
		arr[start] = arr[end];
		arr[end] = temp;
		
		start++;
		end--;
		//单数最后两个参数会相等,刚好剩余一个不交换 
		//双数最后刚好交换后 两参数不相等
	}

	cout << "数组元素逆置后:" << endl;
	for (int i = 0; i < 5; i++){
		cout << arr[i] << " ";
	}
	cout << endl;

冒泡排序

最常用的排序算法,对数组内元素进行排序。
(1)内层循环比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
(3)重复以上的步骤,每次比较次数-1,直到不需要比较

	int arr[] = { 2,4,0,5,7,1,3,8,9 };
	
	//开始冒泡排序
	//总共排序轮数为元素个数 - 1
	for (int i = 0; i < (sizeof(arr) / sizeof(arr[0]) - 1); i++)
	{
		//内层循环对比 次数 = 元素个数 - 当前轮数(第0轮开始算起的) - 1
		for (int j = 0; j < (sizeof(arr) / sizeof(arr[0])) - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j+1];
				arr[j+1] = temp;

			}
		}
	}

二维数组

	//二维数组定义的四种方式:
	/*1.数据类型 数组名[行数][列数]; 
	  2.数据类型 数组名[行数][列数] = { {数据1,数据2 } ,{数据3,数据4 } }; 
	  3.数据类型 数组名[行数][列数] = { 数据1,数据2,数据3,数据4 }; 
	  4.数据类型 数组名[][列数] = { 数据1,数据2,数据3,数据4 }; */

	//2.常用  数据类型 数组名[行数][列数] = { {数据1,数据2 } ,{数据3,数据4 } };
	int arr[2][3] = 
	{ 
	  {1,2,3},
	  {4,5,6} 
	};
	for (int i = 0; i < 2; i++){
		for (int j = 0; j < 3; j++){
			cout << arr[i][j] << " ";
		}
		cout << endl;  
	}                                    //整行注释ctrl+shift+/

	//3.数据类型 数组名[行数][列数] = { 数据1,数据2,数据3,数据4 }; 
	int arr1[2][3] = { 1, 2, 3, 4, 5 };
	for (int i = 0; i < 2; i++){
		for (int j = 0; j < 3; j++){
			cout << arr1[i][j] << " ";
		}
		cout << endl;
	}

二维数组数组名

	/*二维数组名称用途
	1 可以查看内存大小
	2 可以查看二维数组的首地址*/

	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;

	cout << "二维数组行数为:" << sizeof(arr)/sizeof(arr[0]) << endl;
	cout << "二维数组列数为:" << sizeof(arr[0])/ sizeof(arr[0][0]) << endl;

	cout << "二维数组的首地址为:" << (int)arr << endl;
	cout << "二维数组第一行首地址为:" << (int)arr[0] << endl;
	cout << "二维数组第二行首地址为:" << (int)arr[1] << endl;

	cout << "二维数组第一个元素的首地址为:" << (int)&arr[0][0] << endl;
	cout << "二维数组第二个元素的首地址为:" << (int)&arr[0][1] << endl;
案例:1、考试成绩统计

案例描述:有三名同学(张三,李四,王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩

语文数学英语
张三999897
李四905990
王五607580
	int scores[3][3] =
	{
		{99, 98, 97},
		{90, 59, 90},
		{60, 75, 80}
	};

	string names[3] = { "张三","李四","王五" };

	for (int i = 0; i < 3; i++)
	{
		int sum = 0;  //统计每个人的总分数
		for (int j = 0; j < 3; j++){
			sum += scores[i][j];
		}
		cout << names[i] << "的成绩是:" << sum << endl;
	}

函数的定义及调用

作用:将一段经常使用的代码封装起来,减少重复代码一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能
函数定义里小括号内称为形参,函数调用时传入的参数称为实参
函数的定义
返回值类型 函数名 参数列表
{
?函数体语句
?return 表达式
}

int add(int num1, int num2)
{
	//num1 num2并没用真实数据,其为形参
	int sum = num1 + num2;
	return sum;
}

int main()
{
	int a = 10;
	int b = 20;
	
	//a b为实参
	int c = add(a, b); //c接收的是add函数的返回值sunm 即 c = sum;
	cout << "结果是:" << c << endl;
	system("pause");
	return 0;
}

函数的值传递

  • 所谓值传递,就是函数调用时实参将数值传入给形参。
  • 值传递时,如果形参发生,并不会影响实参。
    只是进行简单的值拷贝,函数的地址传递在指针章节进行描述。
void swap(int num1, int num2)
{
	cout << "交换前:" << endl;
	cout << "num1 = " <<  num1 <<endl;
	cout << "num2 = " << num2 << endl;

	int temp = num1;
	num1 = num2;
	num2 = temp;

	cout << "交换后:" << endl;
	cout << "num1 = " << num1 << endl;
	cout << "num2 = " << num2 << endl;

	//return:返回值不需要的时候,可以不用
}
int main()
{
	int a = 10;
	int b = 20;

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	//当我们做值转递的时候,函数的形参发生改变,并不会影响实参
	swap(a, b);

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	system("pause");
	return 0;
}

在这里插入图片描述
系统分别为实参a,b分别开辟空间,而进行函数调用时,也会为形参num1、num2开辟空间并拷贝a,b的值。因此最后输出的a,b并不会由于形参改变而改变。

函数的常见样式

常见的函数样式有4种。
1 无参数无返回值
2 有参数无返回值
3 无参数有返回值
4 有参数有返回值

//1 无参无返
void test01()
{
	cout << "this is test01 " << endl;
}

//2 有参无返
void test02(int a)
{
	cout << "this is test02 a = " << a << endl;
}

//3 无参有返
int test03()
{
	cout << "this is test03 " << endl;
	return 10;
}

//4 有参有返
int test04(int a)
{
	cout << "this is test04 a = " << a << endl;
	return a;
}
int main()
{
	test01();
	test02(10);
	int num1 = test03();
	cout << "num1 = " << num1 << endl;
	int num2 = test04(100);
	cout << "num2 = " << num2 << endl;
	system("pause");

	return 0;
}

在这里插入图片描述

函数的声明

作用:告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。 函数的声明可以多次,但是函数的定义只能有一次

//函数声明可以多次,定义只能一次
//函数声明 后面加逗号
int max(int a, int b);
int max(int a, int b);

//函数定义
int max(int a, int b)
{
	return a > b ? a : b;
}

int main() {
	int a = 100;
	int b = 200;
	
	cout << max(a, b) << endl;
	system("pause");
	return 0;
}

函数的分文件编写

函数分文件编写一般有4个步骤

  1. 创建后缀名为**.h**的头文件
  2. 创建后缀名为**.cpp**的源文件
  3. 文件中写函数的声明
  4. 文件中写函数的定义
//swap.h文件
#include<iostream>
using namespace std;

//实现两个数字交换的函数声明
void swap(int a, int b);
//swap.cpp文件
#include "swap.h"

void swap(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
}
//main函数文件
#include "swap.h"

int main() {

	int a = 100;
	int b = 200;
	swap(a, b);

	system("pause");
	return 0;
}
文章来源:https://blog.csdn.net/qq_45009309/article/details/135210546
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。