Notas del lenguaje C: declaración de bucle

contenido

1. mientras bucle

1.1 Sintaxis

1.2 romper y continuar en la instrucción while

1.2.1 El papel de la interrupción en el bucle while:

1.2.2 El rol de continuar en el ciclo while:

2.para bucle

2.1 Sintaxis

2.1 interrumpir y continuar en bucle for

2.2 La variable de control de bucle de la sentencia for

2.3 Algunas variantes de bucles for

3. bucle do...while

3.1 Sintaxis

3.2 Características de la sentencia do

3.3 interrumpir y continuar en do while bucle

Suplemento: Cómo usar la instrucción goto

Preguntas de ejercicio:

Ejercicio 1: Calcular el factorial de n

Ejercicio 2: Calcula 1!+2!+3!+...+10!

Ejercicio 3: Encuentra un número específico n en una matriz ordenada. (búsqueda binaria)

Ejercicio 4*: escriba código que demuestre que varios caracteres se mueven desde los extremos para converger hacia el centro.

Ejercicio 5: escribir código para simular el escenario de inicio de sesión del usuario y solo puede iniciar sesión tres veces. (Solo se permite ingresar tres contraseñas. Si la contraseña es correcta, se le indicará que el inicio de sesión fue exitoso. Si la contraseña se ingresa incorrectamente tres veces, se saldrá del programa.

Ejercicio 6***: Juego de adivinanzas de números - 1. La computadora genera aleatoriamente un número 2. El jugador adivina el número (el valor devuelto solo puede ser una gran suposición, una pequeña suposición y una suposición correcta) hasta que la suposición sea correcta


1. mientras bucle

1.1 Sintaxis

instrucción de bucle while (expresión);

El flujo de ejecución de la sentencia while:

1.2 romper y continuar en la instrucción while

1.2.1 El papel de la interrupción en el bucle while:

Siempre que se encuentre una interrupción en el ciclo, todos los ciclos subsiguientes se detendrán y el ciclo terminará directamente.

La interrupción while se utiliza para terminar permanentemente el ciclo.

#include <stdio.h>
int main()
{
     int i = 1;
     while(i<=10)
     {
         if(i == 5)
             break;
         printf("%d ", i);
         i = i+1;
     }
     return 0;  //1 2 3 4 当i == 5时循环结束
}

1.2.2 El rol de continuar en el ciclo while:

continue se usa para terminar este ciclo, es decir, el código después de continuar en este ciclo no se ejecutará, sino que saltará directamente a la parte de juicio de la instrucción while. Se realiza el juicio de entrada del siguiente ciclo .

Tal como:

#include <stdio.h>
int main()
{
     int i = 1;
     while(i<=10)
     {
         if(i == 5)
             continue;
         printf("%d ", i);
         i = i+1;
     }
     return 0;  //1 2 3 4 但陷入死循环,因为i始终等于5
}

Ejercicio 1:

//代码什么意思?
//代码1
#include <stdio.h>
int main()
{
    int ch = 0;        //此处用的int需要重视下方的解释
    while ((ch = getchar()) != EOF)  
        putchar(ch);
    return 0;
}//输入字符则打印字符,直到键盘输入 Ctrl Z 结束循环

Notas: getchar( ): Obtener un carácter (valor de código ASCII correspondiente) desde el teclado, int getchar(void);

           Nota: El carácter obtenido por getchar es en realidad el valor del código ASCII obtenido , y EOF es esencialmente -1, donde ch puede ser igual a EOF (-1), y el tipo char no puede almacenar -1, por lo que se define aquí con int ch

           putchar( ): imprime un caracter en la pantalla

           EOF - fin de archivo: el signo del final del archivo (Nota: el código anterior no es para ingresar "EOF" para finalizar el ciclo, sino para ingresar Ctrl Z )

*Ejercicio 2 (atención clave): analice por qué el siguiente código no funciona como se esperaba y aprenda cómo borrar el búfer

#include <stdio.h>
int main()
{
    int ch = 0;
	char password[20] = {0};

	printf("请输入密码:>");
	scanf("%s", password);

	printf("请确认(Y/N):>");
	ch = getchar();

	if('Y' == ch)
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}

	return 0;
}

Los resultados son los siguientes:

Análisis : La función scanf y la función getchar son ambas funciones para obtener datos del teclado (no directamente).De hecho, hay un búfer de entrada entre la función y el teclado . Cuando el programa ejecuta esta función, la función verificará si hay datos en el búfer de entrada. Si los hay, se eliminarán directamente . De lo contrario, se requerirán los datos de entrada del teclado para ingresar al búfer de entrada, y la función sacará los datos.

Cuando el usuario ingresa 123 + Enter (\n) en el teclado, "123\n" ingresa al búfer de entrada, cuando la función scanf toma los datos, solo se quita "123" y '\ n' permanece en la entrada área de búfer , cuando el programa se ejecuta en ch == getchar(), getchar no esperará la entrada del usuario sino que tomará directamente "\n" en el búfer , ¡debido a '\n'! ='Y', por lo que se produce el resultado anterior.

¿Cómo modificar el código?

Método preliminar: antes de que el programa se ejecute en ch == getchar(), use un getchar para eliminar el '\n' en el búfer de entrada

#include <stdio.h>
int main()
{
    int ch = 0;
	char password[20] = {0};

	printf("请输入密码:>");
	scanf("%s", password);
    //处理\n
    getchar();

	printf("请确认(Y/N):>");
	ch = getchar();

	if('Y' == ch)
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}

	return 0;
}

Pero la situación real puede ser mucho más complicada que el ejemplo anterior, por ejemplo, al ingresar "123456 abcdef", se producirá un error.

El motivo del error es: cuando scanf lee la cadena en el espacio, cree que ha terminado, solo se quita 123456 y el "abcdef" restante todavía está en el búfer, ¿cómo lidiar con eso?

La respuesta es la siguiente:

#include <stdio.h>
int main()
{
    int ch = 0;
	char password[20] = {0};

	printf("请输入密码:>");
	scanf("%s", password);

    //处理缓冲区多余的字符
    while(getchar() != '\n')
    {
        ;                     //当getchar()没有读取到'\n'时,该循环会让getchar()不停的读取
    }
	printf("请确认(Y/N):>");
	ch = getchar();

	if('Y' == ch)
	{
		printf("确认成功\n");
	}
	else
	{
		printf("放弃确认\n");
	}

	return 0;
}

*Ejercicio 3:

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

2.para bucle

2.1 Sintaxis

for(expresión1; expresión2; expresión3) declaración de bucle;

Expresión 1 La expresión 1 es la parte de inicialización, que se utiliza para inicializar la variable de bucle.

Expresión 2 La expresión 2 es la parte de juicio condicional, que se usa para juzgar la terminación del bucle.

Expression 3 Expression 3 es una parte de ajuste para el ajuste de las condiciones del bucle.

Ahora comparemos el bucle for y el bucle while:

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

//实现相同的功能,使用for
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 al problema de estilo, es probable que las tres partes se desvíen mucho, por lo que la búsqueda y la modificación no son lo suficientemente concentradas y convenientes.

Por lo tanto, el estilo de for loop es mejor, y la frecuencia de for loop también es la más alta .

2.1 interrumpir y continuar en bucle for

Break y continue también pueden aparecer en los bucles for, y sus significados son los mismos que en los bucles while.

Pero todavía hay algunas diferencias:

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

2.2 La variable de control de bucle de la sentencia for

Buenos hábitos de programación :

1. La variable de bucle no se puede modificar en el cuerpo del bucle for para evitar que pierda el control.

2. Se recomienda que el valor de la variable de control de bucle de la instrucción for se escriba en el método de escritura " intervalo cerrado al frente y luego abierto ".

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

2.3 Algunas variantes de bucles for

#include <stdio.h>
int main()
{
     //代码1
     for(;;)
     {
         printf("hehe\n");
     }
    //for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
题
    
    //代码2
    int i = 0;
    int j = 0;
    //这里打印多少个hehe?                             //100
    for(i=0; i<10; i++)
   {
        for(j=0; j<10; j++)
       {
           printf("hehe\n");
       }
   }
    
    //代码3
    int i = 0;
    int j = 0;
    //如果省略掉初始化部分,这里打印多少个hehe?         //10
    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;
}

 Preguntas de entrevista:

//请问循环要循环多少次?  0次
#include <stdio.h>
int main()
{
 int i = 0;
 int k = 0;
 for(i =0,k=0; k=0; i++,k++)
        k++;
 return 0;
}

Cuando la declaración de juicio es k = 0, se asigna 0 a k, el resultado de la expresión es 0 y 0 es falso, por lo que el ciclo no se ejecuta

3. bucle do...while

3.1 Sintaxis

hacer

        instrucción de bucle;

while(expresión);

3.2 Características de la sentencia do

El bucle se ejecuta al menos una vez y los escenarios de uso son limitados, por lo que no se usa con mucha frecuencia.

3.3 interrumpir y continuar en do while bucle

#include <stdio.h>
int main()
{
     int i = 1;
    
     do
     {
            if(5 == i)
                break;
            printf("%d\n", i);
            i++;
     }while(i <= 10);
    
     return 0;
}                                   // 1 2 3 4 程序结束
#include <stdio.h>
int main()
{
     int i = 1;
    
     do
     {
            if(5 == i)
                continue;
            printf("%d\n", i);
            i++;
     }while(i <= 10);
    
     return 0;                     // 1 2 3 4 程序未结束,陷入死循环
}

Suplemento: Cómo usar la instrucción goto

El lenguaje C proporciona sentencias goto y etiquetas que marcan saltos de los que se puede abusar a voluntad.

Teóricamente, la declaración goto es innecesaria, pero en la práctica, es fácil escribir código sin la declaración goto.

La declaración goto es fácil de estropear la lógica del código

Pero en algunos casos, la declaración goto sigue siendo útil, el uso más común es terminar el procesamiento del programa en algunas estructuras profundamente anidadas.

Por ejemplo: saltar de dos o más capas de bucles a la vez.

El uso de ruptura en este caso de bucle multicapa no logrará el propósito. Solo puede salir del bucle más interno al bucle anterior.

Los escenarios en los que la instrucción goto es realmente adecuada son los siguientes:

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

Tales como: un procedimiento de apagado

Con la instrucción goto:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    char input[10] = {0};
    system("shutdown -s -t 60");
again:
    printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
    scanf("%s", input);
    if(0 == strcmp(input, "我是猪"))
   {
        system("shutdown -a");
   }
    else
   {
        goto again;
   }
    return 0;
}
//shutdown -a 取消关机
//shutdown -s -t 时间(秒) 设置关机倒计时
//system需要<stdlib.h>,strcmp需要头文件<string.h>

Sin la instrucción goto:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    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;
}

Preguntas de ejercicio:

Ejercicio 1: Calcular el factorial de n

#include <stdio.h>
int main()
{
     int n = 0;
	 int i = 1;
	 int ret = 1;
	 
	 scanf("%d", &n);
	 
	 for (i = 1;i <= n; i++)
	 {
		 ret *= i;
	 }
	 printf("%d\n", ret); 
}

Ejercicio 2: Calcula 1!+2!+3!+...+10!

Código uno:

#include <stdio.h>
int main()
{
     int j = 1;
	 int i = 1;
	 int ret = 1;
	 int sum = 0;
	 
	 for (j = 1;j <= 10; j++)
	 {
        ret = 1;    //最关键的一步,每次内层循环结束让ret回到初始值1
		for (i = 1;i <= j; i++)
		{
			 ret *= i;
		}
		sum += ret;
	 }

	 printf("%d\n", sum);
}

* Código optimizado :

#include <stdio.h>
int main()
{
     int j = 1;
	 int ret = 1;
	 int sum = 0;
	 
	 for (j = 1;j <= 10; j++)
	 {
			 ret *= j;
		     sum += ret;
	 }

	 printf("%d\n", sum);
}

Ejercicio 3: Encuentra un número específico n en una matriz ordenada. (búsqueda binaria)

//实现在主函数内:
int main()
{
 int arr[] = {1,2,3,4,5,6,7,8,9,10};
 int left = 0;
 int right = sizeof(arr)/sizeof(arr[0])-1;  //重点
 int key = 7;
 int mid = 0;
 while(left<=right)
 {
     mid = (left+right)/2;
     if(arr[mid]>key)
     {
         right = mid-1;
     }
     else if(arr[mid] < key)
     {
         left = mid+1;
     }
     else
         break;
 }
 if(left <= right)
     printf("找到了,下标是%d\n", mid);
 else
     printf("找不到\n");
}

Ejercicio 4*: escriba código que demuestre que varios caracteres se mueven desde los extremos para converger hacia el centro.

#include <stdio.h>
int main()
{
    char arr1[] = "welcome to bit!!!!!";
    char arr2[] = "###################";
    int left = 0;
    int right = strlen(arr1)-1;   //strlen()用于计算字符串长度
    
    while(left<=right)
    {   
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("%s\n", arr2);
        Sleep(1000);             //停顿1000ms
        system("cls");           //清空屏幕 需要头文件#include <windows.h>
        left++;
        right--;
    }
    printf("%s\n", arr2);
    return 0;
}

Ejercicio 5: escribir código para simular el escenario de inicio de sesión del usuario y solo puede iniciar sesión tres veces. (Solo se permite ingresar tres contraseñas. Si la contraseña es correcta, se le indicará que el inicio de sesión fue exitoso. Si la contraseña se ingresa incorrectamente tres veces, se saldrá del programa.

#include <stdio.h>
#include <string.h>
int main()
{
	int i = 0;
	//假设正确密码是"123456"
	char password[20] = {0};
	for(i = 0; i < 3; i++)
	{
		printf("请输入密码:>");
		scanf("%s", password);
		//判断密码的正确性 - 比较2个字符串的大小关系
		//strcmp - 用于比较字符串的大小关系,库函数,所需要的头文件是:string.h
		if(strcmp(password,"123456")==0)
		{
			printf("密码正确\n");
			break;
		}
		else
		{
			printf("密码错误,请重新输入\n");
		}
	}
    if(3 == i)
    {
        printf("三次密码错误,退出程序\n");
    }
	return 0;
}

Nota : la función strcmp, abreviatura de comparación de cadenas, compara dos cadenas y devuelve un número entero según el resultado de la comparación. La forma básica es strcmp(str1, str2), si str1=str2, devuelve cero; si str1str2, devuelve un número positivo. Para funciones de biblioteca, el archivo de encabezado requerido es: string.h

Ejercicio 6***: Juego de adivinanzas de números - 1. La computadora genera aleatoriamente un número 2. El jugador adivina el número (el valor devuelto solo puede ser una gran suposición, una pequeña suposición y una suposición correcta) hasta que la suposición sea correcta

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

void game()
{
	//1.生成随机数 1-100之间的随机数 所以让rand()对100取模再+1

	//C语言中有一个生成随机数的函数 - rand() (但每一轮生成的随机数是相同的) 
	//需要头文件<stdlib.h>
	//调用rand()前,需要使用srand()设置一个随机的起点
	//()内为时刻发生变化的数字 - 电脑上的时间一直在变化 =》时间戳=》time函数
	//time 获取系统时间,需要头文件<time.h> 此处想使用向time函数中传入一个空指针即可

	int guess = 0;
	int ret = rand()%100+1;
	printf("%d\n", ret);
	    
	//2.猜数字
	while(1)
	{
		printf("请猜数字:>");
		scanf("%d",&guess);
		if (guess > ret)
		{
			printf("猜大了\n");
		}
		else if (guess < ret)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了!\n");
			break;
		}
	}
}

void menu()
{
 printf("**********************************\n");
 printf("*********** 1.play     **********\n");
 printf("*********** 0.exit     **********\n");
 printf("**********************************\n");
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL)); 
	do
	{
		//1.打印一个菜单
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
			case 1:
				//游戏的逻辑
				game(); //猜数字游戏的代码
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择错误,重新选择!\n");
				break;
		}
	}while(input);
	return 0;
}

Notas: 1. Para ejecutar el primer juego, elija do while loop

           2. La función de generar números aleatorios - rand() requiere el archivo de encabezado <stdlib.h> int rand(void) pero los números aleatorios generados en cada ronda son los mismos, así que antes de llamar a rand(), debe usar srand () para establecer un El punto de inicio aleatorio srand() también es la función de biblioteca necesita el archivo de encabezado <stdlib.h>  void srand (semilla int sin firmar)   Quiero poner el número que cambia en este momento entre paréntesis : la hora en la computadora sigue cambiando = "timestamp =" La función de la función time() es obtener la hora del sistema, se requiere el archivo de encabezado <time.h>, y no entraré en detalles. Aquí, quiero pasar un puntero nulo a la función de tiempo.

           3. Ponga srand((unsigned int)time(NULL)); en la función principal

           4. Para generar un número aleatorio entre 1 y 100, deje que rand() tome el módulo de 100 y luego +1
 

Supongo que te gusta

Origin blog.csdn.net/m0_62934529/article/details/123158560
Recomendado
Clasificación