Aprendizaje continuo de estructura cíclica

Hoy sigo aprendiendo la estructura del bucle.

EOF

#include <stdio.h>
int main()
{
    int ch = 0;
    // EOF - end of file 文件结束标志
    while ((ch = getchar()) != EOF)
    {
        putchar(ch);
    }
    return 0;

Cuando el programa se está ejecutando, ingresar directamente EOF no puede finalizar el programa. EOF-end of file es la marca de final de archivo. Ingresando Ctrl + z en la ventana del programa en ejecución mostrará la palabra ^ Z, que es el valor de código ingresado de la marca de final del programa.

getchar

#include <stdio.h>
int main()
{
    int ch = 0;
    int ret = 0;
    char password[16] = { 0 };
    printf("请输入密码:>\n");
    scanf("%s", password);      // 输入了密码 并存放在password数组中
    // 缓冲区还剩余一个 '\n',
    //于是读取一个 '\n';
    while ((ch = getchar()) != '\n')
    {
        ;
    }
    //getchar(); //读取了输入密码之后的用于确认字符串的回车
    //当密码中输入空格的时候 scanf只会读取空格前内容 所以需要用getchar把空格后的字符读完
    //才能在下一步进行确认
    printf("请确认:> Y/N\n");  //此时输入密码后的回车会被getchar获取 字符\n的码值为10 为真
    ret = getchar();            //  
    if (ret == 'Y')
    {
        printf("确认成功\n");
    }
    else
    {
        printf("放弃确认\n");
    }
    return 0;
}

La línea única comentada "// getchar (); // Después de leer la contraseña de entrada, el retorno de carro usado para confirmar la cadena" se usa para confirmar el último dígito del número ingresado en la función scanf. El carácter de retorno de carro "\ n" se quita y el valor de retorno de "\ n" es 0. Si este carácter no se quita, lo siguiente si la oración condicional no se puede ejecutar correctamente. Más tarde, considerando que puede haber espacios después de la entrada, y los caracteres después de los espacios no se pueden obtener mediante scanf, se usa un bucle while para limpiar los caracteres después de los caracteres que se pueden eliminar con scanf, y luego la siguiente instrucción if se puede ejecutar correctamente.

Consecuencias de omitir declaraciones de valor inicial en la función for

#include <stdio.h>
int main()
{
    int i = 0;
    int j = 0;
    for ( ; i < 10 ; i++)
    {
        for (  ; j < 10; j++)
        {
            printf("hehe  ");
        }
        //内部循环省略赋初值之后会导致第一次循环完成之后变量不再进行赋初值
        //下一次进入循环的时候 j==10 无法再次循环

    }

    return 0;
}

Originalmente quería escribir un programa que pudiera generar cien "jeje", pero debido a que se omite el valor inicial en el ciclo interno, finalmente solo se pueden escribir diez "jeje".

Alienación de bucle for

#include <stdio.h>
int main()
{
    int x,y;
    for (x = 0, y = 0; x<2 && y<5; ++x, y++)
    {
        printf ("hehe  ");
    }
    return 0;
}

El uso de la declaración for también puede estar compuesto por varias sentencias de asignación inicial y sentencia

factorial

Calcule 1! + 2! + 3! + ... + 10!

#include <stdio.h>
int main()
{
    int i = 0;
    int n = 0;
    int ret = 1;
    int sum = 0;
    for (n = 1; n <= 3; n++)
    {
        for (i = 1; i <= n; i++)
        {
            ret = ret * i;
        }
        sum = ret + sum;
    }//1 + 2 + 6 == 9  n=3 时打印出结果为15
    printf("%d \n ", sum);
    return 0;
}

Lo anterior es problemático, porque el 10 directo! El factorial de es relativamente grande y difícil de confirmar, por lo que los primeros tres dígitos se utilizan para la confirmación El resultado de la operación del programa anterior es 15, 1! + 2! + 3! = = 9, obviamente hay un problema. Después de la depuración paso a paso, se encontró el problema. El código fuente corregido es el siguiente:

#include <stdio.h>
int main()
{
        int i = 0;
        int n = 0;
        int ret = 1;
        int sum = 0;
        for (n = 1; n <= 10; n++)
        {
            for (i = 1; i <= n; i++)
            {
                ret = ret * i;
            }
            sum = ret + sum;
            ret = 1;  //ret 运算过后保留了值 要重置才能正确加入下一次阶乘运算
        }
        printf("%d \n ", sum);
        return 0;
}

El problema también es muy claro. El valor factorial inicial ret = 1 en el proceso, pero no se restablece a 1 durante el proceso, por lo que no se puede obtener el resultado correcto. Por supuesto, el código aún tiene margen de mejora, de la siguiente manera:

#include <stdio.h>
int main()
{
    int i = 0;
    int n = 0;
    int ret = 1;
    int sum = 0;
    for (n = 1; n <= 10; n++)
    {
        ret = ret * n;
        sum = sum + ret;                // 直接进行累乘 时最简单的算法  只需要进行一次循环
        printf("             ret=%d         sum=%d\n", ret, sum);
    }
    return 0;
}

En el código anterior, también se imprime el cambio del proceso, lo que es conveniente para la observación, y solo se usa un bucle único

Encuentra una determinada x de una matriz secuencial

Matriz de secuencia, se refiere a un [0] <= a [1] <= a [2] ...

#include <stdio.h>
int main()
{
    int i = 0;
    int v[100] = { 0 };
    for (i = 0; i < 100; i++)
    {
        v[i] = 2 * i + 1;
    }
    int k = 0;
    printf("请输入你想要寻找到的数字:\n");
    scanf("%d", &k);
    int sz = sizeof v / sizeof v[0];
    for (i = 0; i < sz; i++)
    {
        if (k ^ v[i])
            continue;
        else
        {
            printf("找到了 v[%d]=%d \n", i, v[i]);
            break;
        }
    }
    if (i == sz)
    {
        printf("找不到!!!");
    }
    return 0;
}

Primero llené una matriz v [100] con 100 elementos en un ciclo, y luego usé XOR para juzgar, usando una declaración if, donde el valor de retorno de "k ^ v [i]" es cero, ingrese else y encuentre el correspondiente Número, detenga el ciclo, el valor de retorno de "k ^ v [i]" no es cero, omita este ciclo.

Escribe una cadena que aparezca gradualmente de ambos lados hacia el medio

#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
int main()
{
    char arr1[] = "Li yan qing LOVE Xie yu qing ";
    char arr2[] = "*****************************";
    int right = strlen(arr1) - 1;
    int left = 0;

    while(right >= left)
    {
        arr2[left] = arr1[left];
        arr2[right] = arr1[right];
        printf("                      %s \n", arr2);
        //休息一秒,需要调用Windows.h头文件
        Sleep(1000);
        system("cls");//执行系统命令的函数 清空屏幕 需要调用stdlib.h头文字
        left++;
        right--;
    }
    printf("                      %s \n", arr2);
    return 0;
}

El efecto de la ejecución del código es que una línea de caracteres se reemplaza gradualmente por otra cadena de caracteres (llevo bienes privados y se lo confesé a mi novia, [doge]). La función de strlen es encontrar la longitud de la cadena, que requiere stdlib.h head File. Sleep es una función para pausar el programa. El número entre paréntesis es milisegundos y el archivo de encabezado requerido es windows.h. system ("cls"); // La función de ejecutar comandos del sistema para borrar la pantalla necesita llamar al texto del encabezado stdlib.h. Cabe señalar que cuando una cadena de caracteres se reemplaza por otra cadena de caracteres, el subíndice, el último carácter de la cadena de caracteres es el carácter final '\ 0', que no se mostrará después de la cadena de caracteres, pero también ocupará una posición. Por lo tanto, se requiere -1 al calcular la longitud de la cadena;

Programas que se cerrarán después de tres entradas de contraseña incorrectas

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

int main()
{
    int i = 0;
    printf("请输入密码:\n");
    char password[20] = { 0 };

    for (i = 0; i < 3; i++)
    {
        scanf("%s", password);
        if (strcmp(password, "100086") == 0)
        {
            printf("登录成功\a\n");
            break;
        }
        printf("输入错误!!!\a\n");
    }
    if (i == 3)
    {
        printf("三次机会已用完,程序退出!!!\a  \n");
    }
    return 0;
}

Entre ellos, '\ a' es el sonido del mensaje. Un punto que vale la pena señalar en este programa es que si las cadenas son iguales no escribe directamente las cadenas en ambos lados de == para juzgar. Se necesita una función, una función strcmp, y el archivo de encabezado es una cadena. h. La contraseña que se va a verificar la determina el escritor del código fuente, y en el futuro se puede diseñar un puerto de inicio de sesión más completo

Supongo que te gusta

Origin blog.51cto.com/15078858/2590386
Recomendado
Clasificación