【C】 Declaraciones de rama y bucle

Tabla de contenido

【1】¿Qué es una declaración?

【2】 Declaración de rama (estructura de selección)

【2.1】si declaración

【2.1.1】Estructura gramatical

【2.1.2】Dejar vacío si no

【2.1.3】Comparación de formas de escritura

【2.1.4】Práctica

【2.2】 declaración de cambio

【3.2.1】Estructura gramatical

【3.2.2】 declaración de cambio de interrupción

【3.2.3】cláusula por defecto

【3.2.4】Práctica

【3】 Declaración de bucle

【3.1】bucle while

【3.1.1】Formato gramatical

【3.1.2】entrada mientras declaración

【3.1.3】continuar en declaración while

【3.1.4】Práctica

【3.2】para bucle

【3.2.1】Formato gramatical

【3.2.2】entrada mientras declaración

【3.2.3】continuar en declaración while

【3.2.4】Variables de control de bucle de la declaración for

【3.2.5】Algunas variaciones del bucle for

【3.3】hacer bucle while

【3.3.1】Formato gramatical

【3.3.2】interrumpir la declaración do while

【3.3.3】continuar con la declaración do while

【3.4】Ejercicios integrales

【4】 Algoritmo de búsqueda media

【5】ir a declaración


【1】¿Qué es una declaración?

Las declaraciones C se pueden dividir en las siguientes cinco categorías:

  • declaración de expresión

  • declaración de llamada de función

  • declaración de control

  • declaración compuesta

  • declaración vacía

Este artículo trata sobre declaraciones de control.

        Las declaraciones de control se utilizan para controlar el flujo de ejecución del programa para implementar varios métodos estructurales del programa. Están compuestas por definidores de declaraciones específicas. Hay nueve tipos de declaraciones de control en lenguaje C.

Se puede dividir en las siguientes tres categorías:

  • Las declaraciones de juicio condicional también se denominan declaraciones de rama: declaraciones if y declaraciones de cambio.

  • Declaraciones de ejecución en bucle: declaración do while, declaración while, declaración for.

  • Declaraciones de giro: declaración de interrupción, declaración de ir a, declaración de continuación, declaración de devolución.

【2】 Declaración de rama (estructura de selección)

        Si estudias mucho, obtén una buena oferta durante el reclutamiento escolar y alcanza la cima de tu vida. Si no estudias, graduarte significa desempleo y vender batatas en casa. ¡Esta es la elección!

【2.1】si declaración

【2.1.1】Estructura gramatical

¿Cuál es la estructura gramatical de la declaración if?

// 语法结构:No.1
if(表达式)
	语句;
// 语法结构:No.2
if(表达式)
	语句1;
else
	语句2;

// 语法结构:No.3 多分支
if(表达式1)
语句1;
else if(表达式2)
	语句2;
else
	语句3;

【Código de ejemplo】

// No.1 代码
#include <stdio.h>

int main() {
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
		printf("未成年!\n");

	return 0;
}
// No.2 代码
#include <stdio.h>

int main(int argc, char** argv) {
	int age = 0;
	scanf("%d", &age);

	if (age < 18)
		printf("未成年!\n");
	else {
		printf("成年!\n");
	}
		
	return 0;
}
// No.3 代码
#include <stdio.h>

int main(int argc, char** argv) {
	int age = 0;
	scanf("%d", &age);


	if (age < 18) {
		printf("少年\n");
	}  
	else if (age >= 18 && age < 30) {
		printf("青年\n");
	}  
	else if (age >= 30 && age < 50) {
		printf("中年\n");
	}  
	else if (age >= 50 && age < 80) {
		printf("老年\n");
	}  
	else {
		printf("老寿星\n");
	}

	return 0;
}

Explique: Si el resultado de la expresión es verdadero, se ejecuta la declaración. En lenguaje C, 0 significa falso y distinto de 0 significa verdadero .

¿Cómo deberíamos usar bloques de código si se van a ejecutar varias declaraciones si la condición es verdadera?

#include <stdio.h>
int main()
{
	if (表达式)
	{
		语句列表1;
	}
	else
	{
		语句列表2;
	}
	return 0;
}

El par de {} aquí es un bloque de código.

【2.1.2】Dejar vacío si no

Cuando escribes este código:

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	return 0;
}

Después de la modificación: coincidencia de else: else coincide con el if más cercano.

//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

【2.1.3】Comparación de formas de escritura

Entre los siguientes códigos: El Código 2 y el Código 4 son mejores, con una lógica más clara y menos propensos a errores.

//代码1
if (condition) {
	return x;
}
return y;
//代码2
if (condition)
{
	return x;
}
else
{
	return y;
}

//代码3
int num = 1;
if (num == 5)
{
	printf("hehe\n");
}
//代码4
int num = 1;
if (5 == num)
{
	printf("hehe\n");
}

【2.1.4】Práctica

[Código de ejercicio] Determina si un número es impar.

#include <stdio.h>

// 判断一个数是否为奇数 
int main(int argc, char** argv) {
	int val = 0;
	scanf("%d", &val);

	if (val % 2 == 0)
		printf("偶数!\n");
	else
		printf("奇数!\n");
}

[Código de ejercicio] Genera números impares entre 1 y 100

#include <stdio.h>

int main(int argc, char** argv) {
	int num = 1;

	while (num <= 100) {
		if(num % 2 == 0)
			printf("%d->偶数!\n", num);
		else
			printf("%d->奇数!\n", num);
		num++;
	}
	return 0;
}

【2.2】 declaración de cambio

【3.2.1】Estructura gramatical

La declaración de cambio también es una declaración de rama y se usa a menudo en situaciones de múltiples ramas.

【Por ejemplo】

  • Entrada 1, salida lunes

  • Entrada 2, salida martes

  • Entrada 3, salida miércoles

  • Entrada 4, salida jueves

  • Ingrese 5 y salga el viernes.

  • Entra 6 y sale el sábado.

  • Ingrese 7 y salga el domingo.

Entonces no lo escribí como si...else si...else si. La forma es demasiado complicada, por lo que tenemos que tener una forma gramatical diferente.

Esta es la declaración de cambio.

switch(整型表达式)
{
	语句项(是一些case语句);
}

case 整形常量表达式:
	语句;

【3.2.2】 declaración de cambio de interrupción

En la declaración de cambio, no podemos implementar la rama directamente, solo usando break podemos lograr la rama real.

【Ejemplo de código】

int main(int argc, char** argv) {
	int day = 1;

	switch (day) {
		case 1:
			printf("星期一\n");
			break;
		case 2:
			printf("星期二\n");
			break;
		case 3:
			printf("星期三\n");
			break;
		case 4:
			printf("星期四\n");
			break;
		case 5:
			printf("星期五\n");
			break;
		case 6:
			printf("星期六\n");
			break;
		case 7:
			printf("星期天\n");
			break;
	}
	return 0;
}

A veces nuestras necesidades cambian:

  • Entrada 1-5, la salida es "día laborable";

  • Ingrese 6-7 y genere "fin de semana";

Entonces nuestro código debería implementarse así:

#include <stdio.h>

int main(int argc, char** argv) {
	int day = 0;

	switch (day)
	{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("weekday\n");
			break;
		case 6:
		case 7:
			printf("weekend\n");
			break;
	}
	
	return 0;
}

        El efecto real de la declaración de interrupción  es dividir la lista de declaraciones en diferentes partes de rama.

[Buenos hábitos de programación]

        Agregue una declaración de interrupción después de la última declaración de caso (la razón para escribir esto es para evitar olvidarse de agregar una declaración de interrupción después de la última declaración de caso).

【3.2.3】cláusula por defecto

        ¿Qué pasa si el valor de la expresión no coincide con el valor de ninguna etiqueta de caso? De hecho, no es nada, la estructura es simplemente que se omiten todas las declaraciones. El programa no finalizará y no se informará ningún error, porque esta situación no se considera un error en C. Pero, ¿qué sucede si no desea ignorar los valores de las expresiones que no coinciden con todas las etiquetas? Puede agregar una cláusula predeterminada a la lista de declaraciones y colocar la siguiente etiquetadefault:

        Escríbalo en cualquier lugar donde pueda aparecer una etiqueta de caso. Cuando el valor de la expresión de cambio no coincide con los valores de todas las etiquetas de caso, se ejecutará la declaración que sigue a la cláusula predeterminada. Por lo tanto, sólo puede aparecer una cláusula predeterminada en cada declaración de cambio. Pero puede aparecer en cualquier lugar de la lista de declaraciones y el flujo de declaraciones ejecutará la cláusula predeterminada como una etiqueta de caso.

[Buenos hábitos de programación]

        Es un buen hábito poner una cláusula predeterminada en cada declaración de cambio, tal vez incluso una pausa al final.

#include <stdio.h>

int main(int argc, char** argv) {
	int day = 0;

	switch (day)
	{
		case 1:
		case 2:
		case 3:
		case 4:
		case 5:
			printf("weekday\n");
			break;
		case 6:
		case 7:
			printf("weekend\n");
			break;
		default:
			printf("day的值不在1-7范围内!");
	}
	
	return 0;
}

【3.2.4】Práctica

#include <stdio.h>
int main()
{
	int n = 1;				
	int m = 2;					// n=1, m=2
	switch (n)
	{
	case 1:
		m++;					// n=1, m=3			
	case 2:
		n++;					// n=2, m=3		
	case 3:
		switch (n)				// n=2, m=3		
		{//switch允许嵌套使用
		case 1:
			n++;
		case 2:
			m++;				
			n++;				// n=3, m=4		
			break;
		}
	case 4:
		m++;					// n=3, m=5		
		break;
	default:
		break;
	}
    
	printf("m = %d, n = %d\n", m, n);		// 打印结果m=5, n=3
	return 0;
}

【3】 Declaración de bucle

【3.1】bucle while

【3.1.1】Formato gramatical

        El lenguaje C nos presenta: la declaración while, que puede implementar bucles.

while(表达式)
	循环语句;

El flujo de ejecución de la declaración while:

[Ejemplo de código] Imprima los números del 1 al 10 en la pantalla.

#include <stdio.h>

int main(int argc, char** argv) {
	int iVal = 0;

	while (iVal < 10) {
		printf("%d ", iVal + 1);
		iVal++;
	}

	return 0;
}

// 打印结果:1 2 3 4 5 6 7 8 9 10

El código anterior me ayudó a comprender la sintaxis básica de la declaración while, así que aprendamos más al respecto:

【3.1.2】entrada mientras declaración

#include <stdio.h>

int main(int argc, char** argv) {
	int iVal = 0;

	while (iVal < 10) {
		if (iVal == 5) {
			break;
		}

		printf("%d ", iVal + 1);
		iVal = iVal + 1;
	}
}

// 打印结果:1 2 3 4 5  (后面就结束了)

[Resumen] El papel de la interrupción en el ciclo while : De hecho, siempre que se encuentre una interrupción en el ciclo, todos los ciclos posteriores se detendrán y el ciclo terminará directamente, por lo que se utiliza la interrupción while para finalizar el ciclo. permanentemente .

【3.1.3】continuar en declaración while

#include <stdio.h>

int main(int argc, char** argv) {
	int iVal = 0;

	while (iVal < 10) {
		if (iVal == 5) {
			continue;
		}

		printf("%d ", iVal + 1);
		iVal = iVal + 1;
	}
}

// 打印结果:1 2 3 4 5 (后面就死循环了)

[Resumen] La función de continuar en el ciclo while es : continuar se usa para finalizar este ciclo, es decir, el código después de continuar en este ciclo no se ejecutará nuevamente, sino que saltará directamente a la parte de juicio de la declaración while. Realizar el juicio de entrada para el siguiente ciclo .

【3.1.4】Práctica

[Introducción a la función]

int getchar ( void );
/*
	描述:
		从stdin中获取字符
	返回值:
		如果成功,则返回所读取的字符(提升为int值)。
		返回类型为int,以适应特殊值EOF(-1),它表示失败。
		如果标准输入位于文件末尾,则该函数返回EOF并设置stdin的EOF(-1)指示器(feof)。
*/	
	
int putchar ( int character );
/*
	描述:
		将字符写入标准输出,将字符写入标准输出(stdout)。
	参数:
		要读取的字符变量。
	返回值:
		如果发生写错误,则返回EOF并设置错误指示器(error)。
*/
//代码1
#include <stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)
		putchar(ch);
	return 0;
}
// 这里的代码适当的修改是可以用来清理缓冲区的。

//代码2
#include <stdio.h>
int main()
{
	char ch = '\0';
	while ((ch = getchar()) != EOF)
	{
		if (ch < ‘0’ || ch > ‘9’)
			continue;
		putchar(ch);
	}
	return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的。

【3.2】para bucle

Ya conocemos el bucle while, pero ¿por qué necesitamos un bucle for?

【3.2.1】Formato gramatical

for(表达式1; 表达式2; 表达式3)
	循环语句;

/*
解释:
	表达式1:表达式1为初始化部分,用于初始化循环变量的。
	表达式2:表达式2为条件判断部分,用于判断循环时候终止。
	表达式3:表达式3为调整部分,用于循环条件的调整。
*/

El proceso de ejecución de la declaración for:

[Código de ejemplo] Utilice un bucle for para imprimir los números del 1 al 10 en la pantalla.

int main(int argc, char** argv) {
	for (int i = 0; i < 10; i++) {
		printf("%d ", i + 1);
	}
}

Ahora comparemos el bucle for y el bucle while:

#include <stdio.h>

int main(int argc, char** argv) {
	int i = 0;

	//实现相同的功能,使用while
	i = 1;//初始化部分
	while (i <= 10)//判断部分
	{
		printf("hehe\n");
		i = i + 1;//调整部分
	}
	//实现相同的功能,使用while
	for (i = 1; i <= 10; i++)
	{
		printf("hehe\n");
	}
}

        Se puede encontrar que todavía hay tres condiciones necesarias para el ciclo en el ciclo while, pero debido a problemas de estilo, es probable que las tres partes se desvíen mucho, por lo que no está centralizado ni es lo suficientemente conveniente para encontrar modificaciones. Por lo tanto, el estilo de bucle for es superior; el bucle for también se utiliza con mayor frecuencia.

【3.2.2】entrada mientras declaración

        Descubrimos que interrumpir y continuar también pueden aparecer en el bucle for y su significado es el mismo que en el bucle while.

//代码1
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;
		printf("%d ", i);
	}
	return 0;
}

【3.2.3】continuar en declaración while

        Descubrimos que interrumpir y continuar también pueden aparecer en el bucle for y su significado es el mismo que en el bucle while.

//代码2
#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}

【3.2.4】Variables de control de bucle de la declaración for

【Sugerencias】

  • Las variables del bucle no se pueden modificar dentro del cuerpo del bucle for para evitar que pierda el control.

  • Se recomienda que el valor de la variable de control de bucle de la declaración for se escriba en el formato "frontal cerrado y luego abierto".

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

【3.2.5】Algunas variaciones del bucle for

#include <stdio.h>

int main()
{
	//代码1
	for (;;)
	{
		printf("hehe\n");
	}
	//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
	
	//代码2
	int i = 0;
	int j = 0;
	//这里打印多少个hehe?
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			printf("hehe\n");
		}
	}

	//代码3
	int i = 0;
	int j = 0;
	//如果省略掉初始化部分,这里打印多少个hehe?
	for (; i < 10; i++)
	{
		for (; j < 10; j++)
		{
			printf("hehe\n");
		}
	}

	//代码4-使用多余一个变量控制循环
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n");
	}
	return 0;
}

【3.3】hacer bucle while

【3.3.1】Formato gramatical

do
	循环语句;
while(表达式);

El flujo de ejecución de la declaración do while:

【Ejemplo de código】

#include <stdio.h>

int main(int argc, char** argv) {
	int i = 10;
	do {
	
		printf("%d\n", i);
	
	} while (i < 10);

	return 0;
}

【3.3.2】interrumpir la declaración do while

#include <stdio.h>

int main()
{
	int i = 10;
	do
	{
		if (5 == i)
			break;
		printf("%d\n", i);
	} while (i < 10);
	return 0;
}

【3.3.3】continuar con la declaración do while

#include <stdio.h>

int main()
{
	int i = 10;
	do
	{
		if (5 == i)
			continue;
		printf("%d\n", i);
	} while (i < 10);
	return 0;
}

【3.4】Ejercicios integrales

[Ejercicio 1] Calcula el factorial de n.

#include <stdio.h>

int main(int argc, char** argv) {
	// 接收要计算的乘积.
	int n = 0;
	scanf("%d", &n);

	// 计算
	int result = 1;
	for (int i = 1; i <= n; i++) {
		result *= i;
	}
	// 打印
	printf("%d\n", result);

	return 0;
}

【Ejercicio 2】Calcula 1!+2!+3!+……+10!

int main(int argc, char** argv) {
	// 接收要计算的乘积.
	int n = 0;
	scanf("%d", &n);

	int result = 0;
	int ret = 1;
	for (int i = 1; i <= n; i++) {
		ret = ret * i;

		result = result + ret;
	}
	// 打印
	printf("%d\n", result);
}

[Ejercicio 3] Encuentre un número específico n en una matriz ordenada.

#include <stdio.h>

int main(int argc, char** argv) {
	int buffer[] = { 1,2,3,4,5,6,7,8,9,10 };
	int size = sizeof(buffer) / sizeof(int);

	// 要查找的值
	int k = 4;
	// 暴力循环查找
	int i = 0;
	for (i = 0; i < size; i++) {
		if (k == buffer[i]) {
			printf("找到了->要找的值为%d\n", i);
			break;
		}
	}

	// 没有找到的话,说明遍历的一圈。
	if (i == size) {
		printf("没有找到\n");
	}

	return 0;
}

[Ejercicio 4] Escriba código para demostrar que varios caracteres se mueven desde ambos extremos y convergen hacia el medio.

#include <stdio.h>
#include <windows.h>

int main(int argc, char** argv) {
	char arr1[] = "welcome to lesson!!!!";
	char arr2[] = "#####################";

	int leftSub = 0;
	int rightSub = sizeof(arr1) / sizeof(arr1[0]) - 1;

	printf("%s\n", arr2);
	Sleep(1000);
	while (leftSub <= rightSub) {
		arr2[leftSub] = arr1[leftSub];
		arr2[rightSub] = arr1[rightSub];
		printf("%s\n", arr2);

		Sleep(1000);	// Sleep() 系统休眠, 头文件包含<windows.h>
		leftSub++;
		rightSub--;
	}
	return 0;
}

[Ejercicio 5] Escriba código para simular el escenario de inicio de sesión del usuario y solo puede iniciar sesión tres veces. (Solo puede ingresar la contraseña tres veces. Si la contraseña es correcta, se le pedirá que inicie sesión. Si ingresa la contraseña incorrecta tres veces, saldrá del programa.

#include <stdio.h>
#include <string.h>

int main(int argc, char** argv) {
	char user[] = "shaxiang";
	char password[20] = { 0 };

	int i = 0;
	for (i = 0; i < 3; i++) {
		printf("请输入密码:> ");
		scanf("%s", password);

		if (strcmp(password, "shaxiang") == 0) {
			printf("登陆成功!\n");
			break;
		}
		else
		{
			printf("密码错误!\n");
		}
	}

	if (i >= 3) {
		printf("密码错误3次,没有机会了!\n");
	}

	return 0;
}

[Ejercicio 6] Implementación del juego de adivinar números

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

void Menu() {
	printf("********************************\n");
	printf("*********    1、play    ********\n");
	printf("*********    0、exit    ********\n");
	printf("********************************\n");
}

void Game() {
	// 用户输入猜到的数字
	int num = rand() % 100 + 1;
	printf("随机数生成成功:请输入猜想的数组:> \n");
	
	int in = 0;
	while (1) {
		scanf("%d", &in);

		if (in > num) {
			printf("猜大了!\n");
		}
		else if (in < num) {
			printf("猜小了!\n");
		}
		else
		{
			printf("恭喜你猜对了!\n");
			break;
		}
	}
}

int main(int argc, char** argv) {
	int in = 0;

	do {
		Menu();
		printf("是否继续猜数字>: ");
		scanf("%d", &in);
		switch (in) {
		case 1:
			// 生成随机数种子
			srand((unsigned int)time(NULL));
			Game();
			break;
		case 0:
			printf("已退出!\n");
			break;
		default:
			printf("错误选择,请重新选择!\n");
		}
	} while (in);
}

【4】 Algoritmo de búsqueda media

[Imagen]

#include <stdio.h>

int main(int argc, char** argv) {
	int buffer[] = { 1,2,3,4,5,6,7,8,9,10 };
	// 要查找的值
	int findK = 4;
	
	// 二分查找
	int leftSub = 0;
	int rightSub = sizeof(buffer) / sizeof(int) - 1;
	
	while (leftSub <= rightSub) {
		int mid = (leftSub + rightSub) / 2;
		if (findK < buffer[mid]) {
			rightSub = mid - 1;
		}
		else if (findK > buffer[mid]) {
			leftSub = mid + 1;
		}
		else
		{
			printf("找到了->[%d]下标为[%d]\n", findK, mid);
			break;
		}
	}

	if (leftSub > rightSub) {
		printf("未找到[%d]的下标!", findK);
	}

	return 0;
}

【5】ir a declaración

        El lenguaje C proporciona sentencias goto de las que se puede abusar a voluntad y etiquetas para marcar saltos. En teoría, las sentencias goto no son necesarias. En la práctica, es fácil escribir código sin sentencias goto. Sin embargo, en algunos casos, las sentencias goto siguen siendo necesarias. El uso más común es finalizar el procesamiento de algunas estructuras profundamente anidadas.

Por ejemplo: saltar de dos o más capas de bucles a la vez. Usar break en este caso de bucles de varias capas no logrará el propósito. Solo puede salir del bucle más interno al bucle del nivel anterior.

Los escenarios para los que el lenguaje goto es realmente adecuado son los siguientes:

for (...)
{
	for (...)
	{
		if (disaster)
			goto error;
	}
}
…
error :
if (disaster)
// 处理错误情况

El siguiente es un ejemplo del uso de una declaración goto y luego reemplazar la declaración goto con una implementación de bucle:

#include <stdio.h>
#include <windows.h>
int main()
{
	system("shutdown -s -t 60");
	char input[10] = { 0 };
	
again:
	printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
	scanf("%s", input);

	if (0 == strcmp(input, "我是猪")) {
		system("shutdown -a");
	}
	else {
		goto again;
	}

	return 0;
}

Y si las declaraciones goto no son aplicables, puedes usar bucles:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main_24()
{
	char input[10] = { 0 };
	system("shutdown -s -t 60");
	while (1)
	{
		printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
		scanf("%s", input);
		if (0 == strcmp(input, "我是猪"))
		{
			system("shutdown -a");
			break;
		}
	}
	return 0;
}

Shutdown_Enciclopedia Baidu (baidu.com)

Supongo que te gusta

Origin blog.csdn.net/lx473774000/article/details/131524663
Recomendado
Clasificación