Apprentissage continu de la structure cyclique

Aujourd'hui, je continue d'apprendre la structure de la boucle

EOF

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

Lorsque le programme est en cours d'exécution, la saisie directe d'EOF ne peut pas terminer le programme. EOF-fin de fichier est la marque de fin de fichier. La saisie de Ctrl + z dans la fenêtre d'exécution du programme affichera le mot ^ Z, qui est la valeur de code saisie de la marque de fin de programme.

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 seule ligne commentée "// getchar (); // Après lecture du mot de passe d'entrée, le retour chariot utilisé pour confirmer la chaîne" est utilisé pour confirmer le dernier chiffre du nombre saisi dans la fonction scanf. Le caractère de retour chariot "\ n" est supprimé et la valeur de retour de "\ n" est 0. Si ce caractère n'est pas supprimé, la phrase conditionnelle suivante ne peut pas être exécutée correctement. Plus tard, considérant qu'il peut y avoir des espaces après l'entrée et que les caractères après les espaces ne peuvent pas être obtenus par scanf, une boucle while est utilisée pour nettoyer les caractères après les caractères qui peuvent être supprimés par scanf, puis l'instruction if suivante peut être exécutée correctement.

Conséquences de l'omission des instructions de valeur initiale dans la fonction 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;
}

À l'origine, je voulais écrire un programme qui peut produire cent "hehe", mais comme la valeur initiale de la boucle interne est omise, seuls dix "hehe" peuvent être finalement écrits.

Aliénation de la boucle for

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

L'utilisation de l'instruction for peut également être composée de plusieurs phrases d'attribution initiale et de jugement

factorielle

Calculez 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;
}

Ce qui précède est problématique, car le direct 10! La factorielle de est relativement grande et difficile à confirmer, les trois premiers chiffres sont donc utilisés pour la confirmation. Le résultat de l'opération de programme ci-dessus est 15, 1! + 2! + 3! = = 9, il y a évidemment un problème. Après le débogage étape par étape, le problème a été détecté. Le code source corrigé est le suivant:

#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;
}

Le problème est également très clair. La valeur factorielle initiale ret = 1 dans le processus, mais elle n'est pas remise à 1 pendant le processus, de sorte que le résultat correct ne peut pas être obtenu. Bien sûr, le code peut encore être amélioré, comme suit:

#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;
}

Dans le code ci-dessus, la modification du processus est également imprimée, ce qui est pratique pour l'observation, et une seule boucle est utilisée

Trouver un certain x dans un tableau séquentiel

Tableau de séquence, fait référence à 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;
}

J'ai d'abord rempli un tableau v [100] avec 100 éléments dans une boucle, puis j'ai utilisé XOR pour juger, en utilisant une instruction if, où la valeur de retour de "k ^ v [i]" est zéro, entrez else et trouvez le correspondant Number, arrêtez la boucle, la valeur de retour de "k ^ v [i]" n'est pas zéro, ignorez cette boucle.

Écrivez une chaîne qui apparaît progressivement des deux côtés vers le milieu

#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;
}

L'effet du code en cours d'exécution est qu'une ligne de caractères est progressivement remplacée par une autre chaîne de caractères, (je transporte des biens privés et j'ai avoué à ma petite amie, [doge]). La fonction de strlen est de trouver la longueur de la chaîne, ce qui nécessite stdlib.h tête de fichier. Sleep est une fonction permettant de mettre le programme en pause. Le nombre entre parenthèses est en millisecondes et le fichier d'en-tête requis est windows.h. system ("cls"); // La fonction d'exécution des commandes système pour effacer l'écran doit appeler le texte d'en-tête stdlib.h. Il est à noter que lorsqu'une chaîne de caractères est remplacée par une autre chaîne de caractères, l'indice, le dernier caractère de la chaîne de caractères est le caractère de fin '\ 0', qui ne sera pas affiché après la chaîne de caractères, mais il occupera également une position. Par conséquent, -1 est requis lors du calcul de la longueur de la chaîne;

Programmes qui se termineront après trois entrées de mot de passe incorrectes

#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;
}

Parmi eux, '\ a' est le son de l'invite. Un point à noter dans ce programme est que le fait que les chaînes soient égales n'écrit pas directement les chaînes des deux côtés de == pour un jugement. Une fonction est nécessaire, la fonction strcmp et le fichier d'en-tête est une chaîne. h. Le mot de passe à vérifier est déterminé par le rédacteur du code source, et un port de connexion plus complet peut être conçu à l'avenir

Je suppose que tu aimes

Origine blog.51cto.com/15078858/2590386
conseillé
Classement