Directorio de artículos
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
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
-
switch
El tipo de expresión en la declaración normalmente solo puede ser un número entero o un carácter. Esto se debe a quecase
el valor constante de la etiqueta debe coincidir con el tipo de expresión. -
Si
case
nobreak
se utiliza ninguna instrucción en una etiqueta, el programa continúa la ejecución hasta la siguientecase
etiqueta, lo que se denomina comportamiento de "paso a través". -
switch
Las 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. -
La desventaja de una
switch
declaració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 deif
declaraciones u otras estructuras lógicas.
Estas características switch
la 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`更适用于多个等值条件的情况下,代码更具可读性。
-
Uso :
if
Las 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.switch
Las 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.
-
Condiciones :
if
Las 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.switch
Las 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.
-
Multicondición :
if
Las declaraciones pueden manejar fácilmente múltiples condiciones, anidandoif
declaraciones o usándolaselse if
para implementar múltiples ramas condicionales.switch
Las declaracionescase
manejan 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.
-
Legibilidad :
switch
Las declaraciones son generalmente más legibles cuando se tratan de múltiples condiciones de igual valor porque todas las condiciones están agrupadas.if
Las declaraciones utilizadas para manejar lógica condicional compleja pueden requerir más anidamiento y pueden ser menos legibles.
-
Proceso de ejecución :
if
Las declaraciones determinan si se ejecuta un bloque de código en función de la condición verdadera o falsa.switch
La declaración selecciona quécase
bloque ejecutar en función del valor de la expresión y luego ejecuta el código dentro del bloque. Luego, sebreak
debe usar una declaración para terminarswitch
el bloque; de lo contrario, "pasará" al siguientecase
.
En resumen, la elección a utilizar if
depende switch
de sus necesidades.
4.2 Estructura del bucle
4.2.1 declaración de bucle while
gramática: while(循环条件){ 循环语句 }
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.
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
4.3 Declaración de salto
4.3.1 declaración de ruptura
-
En
switch
una declaración:break
la declaración se utiliza para terminar elcase
bloque de etiqueta actual y saltar fuera deswitch
la declaración. Esto evita el "paso" a la siguientecase
etiqueta. -
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 buclewhile
. 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-while
break
-
En bucles anidados: si hay varios bucles anidados,
break
la 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.
break
Las 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 break
puede 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: - goto
palabra clave.
gramática: goto 标记;
`goto`语句是一种在编程中用来无条件跳转到程序中的标记(label)处的控制语句。
goto 标记;
标记
es una etiqueta dentro de un programa, generalmente un identificador seguido de dos puntos, por ejemplolabel:
.
El uso goto
de 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 goto
puede 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 goto
y 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 goto
y 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 ...};
(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 } ,{数据3,数据4 } };
数据类型 数组名[ 行数 ][ 列数 ] = { 数据1,数据2,数据3,数据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;
}
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;
}