Conceptos básicos de C++_Día02

4. Declaraciones de control de procesos

顺序结构、选择结构、循环结构

4.1 Seleccionar estructura

4.1.1 si declaración

用于执行基于条件的代码块。

Tres formas de declaración if
Formato de una sola línea declaración if
Formato de varias líneas declaración if Declaración
if de múltiples condiciones

(1) Declaración if en formato de una sola línea: if(条件){ 条件满足执行的语句 }
no agregue un punto y coma después de la expresión condicional if
La transferencia de la imagen del enlace externo falló. El sitio de origen puede tener un mecanismo anti-leeching. Se recomienda guardar la imagen y cargarla directamente.

if (sum==100)
	{
    
    
	  cout<<"sum=="<<100<<endl;
	}

(2).Formato de varias líneas si la declaración:

`if(条件){
    
     条件满足执行的语句 }
else{
    
     条件不满足执行的语句 };`

(3).Formato de varias líneas si la declaración:

`if(条件){
    
     条件满足执行的语句 }
else{
    
     条件不满足执行的语句 };`

4.1.2 Operador ternario

gramática:表达式1 ? 表达式2 :表达式3

	int a = 10;
	int b = 20;

	int c = a > b ? a : b;
	cout << "c = " << c << endl;

4.1.3 declaración de cambio

interruptor - caso

Cada etiqueta de caso no se ejecutará automáticamente en la siguiente etiqueta de caso a menos que se utilice una declaración de interrupción para terminar explícitamente el bloque de cambio.

switch(表达式)

{
    
    

	case 结果1:执行语句;break;

	case 结果2:执行语句;break;

	...

	default:执行语句;break;

}

Código de ejemplo:

#include <iostream>

int main() {
    
    
    int choice = 2;

    switch (choice) {
    
    
        case 1:
            std::cout << "选项1" << std::endl;
        case 2:
            std::cout << "选项2" << std::endl;
        case 3:
            std::cout << "选项3" << std::endl;
        default:
            std::cout << "默认选项" << std::endl;
    }

    return 0;
}

Esto se debe a que no existe una declaración de interrupción para terminar la etiqueta del caso, lo que hace que el flujo de control "pase" a las etiquetas de caso posteriores. Si desea evitar este comportamiento, debe usar una declaración de interrupción al final de cada bloque de caso para salir explícitamente del bloque de cambio.

Precauciones

  1. switchEl tipo de expresión en la declaración normalmente solo puede ser un número entero o un carácter. Esto se debe a que caseel valor constante de la etiqueta debe coincidir con el tipo de expresión.

  2. Si caseno breakse utiliza ninguna instrucción en una etiqueta, el programa continúa la ejecución hasta la siguiente caseetiqueta, lo que se denomina comportamiento de "paso a través".

  3. switchLas declaraciones tienen las ventajas de una estructura clara y una alta eficiencia de ejecución al procesar múltiples juicios condicionales. Es adecuado para seleccionar y ejecutar diferentes bloques de código dentro de una serie de valores discretos.

  4. La desventaja de una switchdeclaración es que no puede juzgar directamente el intervalo, sino que solo puede juzgar valores discretos. Para trabajar con intervalos, normalmente es necesario utilizar una serie de ifdeclaraciones u otras estructuras lógicas.

Estas características switchla convierten en una estructura de control eficaz para algunas situaciones, pero pueden requerir el uso de diferentes métodos de control condicional en otras situaciones.

4.1.4 La diferencia entre if y switch [CHAT]

`if`更灵活,适用于各种条件逻辑,
`switch`更适用于多个等值条件的情况下,代码更具可读性。
  1. Uso :

    • ifLas declaraciones son adecuadas para cualquier juicio condicional y pueden manejar varias expresiones condicionales complejas, incluidas comparaciones, operaciones lógicas, etc. Se puede utilizar para lograr un control de condición flexible.
    • switchLas declaraciones se utilizan a menudo para seleccionar diferentes bloques de código para su ejecución en función de diferentes valores de una expresión. Es adecuado para situaciones en las que existen múltiples condiciones equivalentes.
  2. Condiciones :

    • ifLas declaraciones pueden manejar varias condiciones, incluidas expresiones booleanas, expresiones de comparación, expresiones lógicas, etc., lo que permite una lógica condicional más flexible.
    • switchLas declaraciones se utilizan normalmente para procesar expresiones de tipo entero o de carácter, para juicios de valor discretos y no son adecuadas para rangos u otros tipos de condiciones.
  3. Multicondición :

    • ifLas declaraciones pueden manejar fácilmente múltiples condiciones, anidando ifdeclaraciones o usándolas else ifpara implementar múltiples ramas condicionales.
    • switchLas declaraciones casemanejan múltiples condiciones equivalentes a través de múltiples etiquetas y, por lo general, son más adecuadas para manejar situaciones relativamente simples de múltiples condiciones.
  4. Legibilidad :

    • switchLas declaraciones son generalmente más legibles cuando se tratan de múltiples condiciones de igual valor porque todas las condiciones están agrupadas.
    • ifLas declaraciones utilizadas para manejar lógica condicional compleja pueden requerir más anidamiento y pueden ser menos legibles.
  5. Proceso de ejecución :

    • ifLas declaraciones determinan si se ejecuta un bloque de código en función de la condición verdadera o falsa.
    • switchLa declaración selecciona qué casebloque ejecutar en función del valor de la expresión y luego ejecuta el código dentro del bloque. Luego, se breakdebe usar una declaración para terminar switchel bloque; de ​​lo contrario, "pasará" al siguiente case.

En resumen, la elección a utilizar ifdepende switchde sus necesidades.

4.2 Estructura del bucle

4.2.1 declaración de bucle while

gramática: while(循环条件){ 循环语句 }
Insertar descripción de la imagen aquí

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

Al ejecutar una instrucción de bucle, se debe proporcionar una salida del bucle; de ​​lo contrario, puede caer en un bucle infinito, lo que hará que el programa nunca deje de ejecutarse. A continuación se muestran algunas formas comunes de salir de un bucle.

4.2.2 declaración de bucle do... while

Sintaxis: do{ 循环语句 } while(循环条件);
La diferencia con while es que do... while primero ejecutará la instrucción del bucle una vez y luego determinará la condición del bucle.
Insertar descripción de la imagen aquí

4.2.3 declaración de bucle for

Sintaxis: for(起始表达式;条件表达式;末尾循环体) { 循环语句; }
las expresiones en un bucle for deben estar separadas por punto y coma

tabla de multiplicación

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

4.3 Declaración de salto

4.3.1 declaración de ruptura

  1. En switchuna declaración: breakla declaración se utiliza para terminar el casebloque de etiqueta actual y saltar fuera de switchla declaración. Esto evita el "paso" a la siguiente caseetiqueta.

  2. En sentencias de bucle (como for,,, ): la sentencia se utiliza para saltar del bucle actual por adelantado, incluso si aún se cumple la condición del bucle while. Se utiliza para finalizar la ejecución del ciclo y permitir que el flujo del programa ingrese la siguiente declaración después del ciclo.do-whilebreak

  3. En bucles anidados: si hay varios bucles anidados, breakla declaración generalmente salta del bucle interno más cercano, no del bucle externo completo. Esto le permite salir selectivamente de un bucle dentro de un bucle anidado sin tener que salir de todos los niveles de anidamiento.

breakLas declaraciones son una herramienta importante para el flujo de control y se utilizan para cambiar la ruta de ejecución de un programa cuando se cumplen condiciones específicas. Tenga en cuenta que el mal uso breakpuede dificultar la comprensión y el mantenimiento del código, por lo que debe utilizarse con precaución.

4.3.2 continuar declaración

continuar no finaliza todo el bucle, pero break saltará fuera del bucle

4.3.3 declaración goto: - gotopalabra clave.

gramática: goto 标记;

`goto`语句是一种在编程中用来无条件跳转到程序中的标记(label)处的控制语句。
goto 标记;
  • 标记es una etiqueta dentro de un programa, generalmente un identificador seguido de dos puntos, por ejemplo label:.

El uso gotode la declaración permite al programa saltar a la ubicación de la marca especificada y continuar ejecutando el código. Esto se puede utilizar en algunos casos para implementar flujos de control específicos, pero se debe utilizar con precaución, ya que el mal uso gotopuede dar lugar a programas difíciles de entender y mantener, lo que produce un comportamiento impredecible.

La mayoría de los lenguajes de programación modernos fomentan la evasión gotoy proporcionan estructuras de control más estructuradas, como declaraciones condicionales y bucles, para lograr el flujo de control de una manera más clara y fácil de mantener. En la programación real, esto normalmente no es necesario gotoy el mismo objetivo se puede lograr por otros medios.

5. matriz

(1) Mismo tipo de datos : cada elemento de datos de la matriz debe ser del mismo tipo de datos. Esto significa que si crea una matriz de números enteros, cada elemento debe ser un número entero; si crea una matriz de caracteres, cada elemento debe ser un carácter, y así sucesivamente.

(2) Memoria continua : los elementos de la matriz se almacenan continuamente en la memoria, lo que significa que los elementos de la matriz son adyacentes en la memoria y no hay espacio adicional para separarlos. Esta también es una característica importante de las matrices, ya que permite un acceso rápido a los elementos mediante la indexación y el valor del índice se puede utilizar para calcular la dirección de memoria del elemento.

5.1 Matriz unidimensional

Tres formas de definir una matriz unidimensional:

  1. 数据类型 数组名[ 数组长度 ];
  2. 数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
  3. 数据类型 数组名[ ] = { 值1,值2 ...};

(1) Puede contar la longitud de toda la matriz en la memoria sizeof(arr) / sizeof(arr[0])
(2) Puede obtener la primera dirección (int)arr de la matriz en la memoria

Hay un error en CLion: la conversión de 'int*' a 'int' pierde precisión [-fpermissive] resolución de problemas

Esto se debe a que el tipo de puntero ocupa 8 bytes en un sistema de 64 bits basado en el kernel de Linux, mientras que el tipo int ocupa 4 bytes, por lo que se producirán pérdidas de precisión.

Primero puede convertir int* a tipo largo, y el tipo largo se puede convertir implícitamente a tipo int. Solo cámbialo a largo, largo

cout << "数组首地址为:" << (long long)arr << endl;  
cout << "数组第一个元素地址为:" << (long long)&arr[0] << endl;
cout << "数组第二个地址为:" << (long long)&arr[1] << endl;

Ordenamiento de burbuja

int main() {
    
    

	int arr[9] = {
    
     1,7,5,3,4,8,6,2,3};

	for (int i = 0; i < 9 - 1; i++)
	{
    
    
		for (int j = 0; j < 9 - 1 - i; j++)
		{
    
    
			if (arr[j] > arr[j + 1])
			{
    
    
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}

	for (int i = 0; i < 9; i++)
	{
    
    
		cout << arr[i] << endl;
	}
    
	system("pause");

	return 0;
}

Qsort incorporado en lenguaje C

#include <stdio.h>
#include <stdlib.h>

// 比较函数,用于告诉qsort如何比较元素
int compare(const void *a, const void *b) {
    
    
    return (*(int *)a - *(int *)b);
}

int main() {
    
    
    int arr[] = {
    
    5, 2, 9, 1, 5, 6};
    int length = sizeof(arr) / sizeof(arr[0]);

    // 使用qsort对整数数组进行升序排序
    qsort(arr, length, sizeof(int), compare);

    // 打印排序后的数组
    printf("排序后的数组:");
    for (int i = 0; i < length; ++i) {
    
    
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

5.2 Matriz bidimensional

Cuatro formas de definir una matriz bidimensional:

  1. 数据类型 数组名[ 行数 ][ 列数 ];
  2. 数据类型 数组名[ 行数 ][ 列数 ] = { {数据1,数据2 } ,{数据3,数据4 } };
  3. 数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据4};
  4. 数据类型 数组名[ ][ 列数 ] = { 数据1,数据2,数据3,数据4};

6. Función

将一段经常使用的代码封装起来,减少重复代码
返回值类型 函数名 (参数列表)
{
    
    

       函数体语句

       return表达式

}
int add(int num1, int num2)
{
    
    
    //函数体语句
	int sum = num1 + num2;
    //return表达式
	return sum;
}

transferir 函数名(参数)

int add(int num1, int num2) //定义中的num1,num2称为形式参数,简称形参(形参列表)
{
    
    
    int sum = num1 + num2;
    return sum;
}

int add(int num1, int num2, int num3) {
    
    
    int sum = num1 + num2 + num3;
    return sum;
}

int main() {
    
    

    int a = 10;
    int b = 10;
    //调用add函数
    int sum = add(a, b);//调用时的a,b称为实际参数,简称实参
    cout << "sum = " << sum << endl;

    int sum1 = add(a, b, 10);
    cout << "sum1 = " << sum1 << endl;

    a = 100;
    b = 100;

    sum = add(a, b);
    cout << "sum = " << sum << endl;

    system("pause");

    return 0;
}

Pasar por valor

Al pasar por valor, los parámetros formales no pueden modificar los parámetros reales.

No importa qué cambios ocurran en los parámetros formales, no afectarán los parámetros reales.

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 ; 当函数声明时候,不需要返回值,可以不写return
}

int main() {
    
    

	int a = 10;
	int b = 20;

	swap(a, b);

	cout << "mian中的 a = " << a << endl;
	cout << "mian中的 b = " << b << endl;

	system("pause");

	return 0;
}

Insertar descripción de la imagen aquí

Si desea cambiar los parámetros reales, intercambie el contenido de la dirección:

void swap(int num1, int num2)
{
    
    
    cout << "交换前:" << endl;
    cout << "num1 = " << num1 << endl;
    cout << "num2 = " << num2 << endl;
    cout << "&num1="<< &num1<<endl;
    cout << "&num2="<< &num1<<endl;


    int temp = num1;
    num1 = num2;
    num2 = temp;
    cout << "&temp="<<&temp<<endl;

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

    //return ; 当函数声明时候,不需要返回值,可以不写return
}

int main() {
    
    

    int a = 10;
    int b = 20;

    swap(a, b);

    cout << "mian中的 a = " << a << endl;
    cout << "mian中的 b = " << b << endl;
    cout << "&a="<< &a<<endl;
    cout << "&b="<< &b<<endl;
    system("pause");

    return 0;
}

Insertar descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_74154295/article/details/133467360
Recomendado
Clasificación