循環構造の継続的な学習

今日もループ構造を学び続けています

EOF

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

プログラム実行中、EOFを直接入力してもプログラムは終了できません。EOF-ファイルの終わりはファイルの終わりマークです。プログラム実行ウィンドウでCtrl + zを入力すると、プログラム終了マークのコード値入力である単語^ Zが表示されます。

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

コメント付きの1行 "// getchar(); //入力パスワードを読み取った後、文字列の確認に使用されるキャリッジリターン"は、scanf関数に入力された番号の最後の桁を確認するために使用されます。キャリッジリターン「\ n」文字が削除され、「\ n」の戻り値は0になります。この文字が削除されない場合、条件文を正しく実行できない場合は以下のようになります。後で、入力後にスペースがあり、スペースの後の文字がscanfで取得できない可能性があることを考慮して、whileループを使用して、scanfで削除できる文字の後の文字をクリーンアップし、次のifステートメントを正しく実行できます。

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

もともと100個の「へへ」を出力できるプログラムを書きたかったのですが、内側のループの初期値が省略されているため、最終的には10個の「へへ」しか書き込めません。

forループの回避

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

forステートメントの使用は、いくつかの最初の割り当てと判断の文で構成することもできます。

要因

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

上記は問題があります。直接10!の因数分解は比較的大きく、確認が難しいため、最初の3桁を確認に使用します。上記のプログラム操作の結果は15、1!+ 2!+ 3!= = 9、明らかに問題があります。ステップバイステップのデバッグの後、問題が見つかりました。修正されたソースコードは次のとおりです。

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

問題も非常に明確です。プロセスの初期因数分解値ret = 1ですが、プロセス中に1にリセットされないため、正しい結果を得ることができません。もちろん、コードには次のように改善の余地があります。

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

上記のコードでは、プロセスの変更も出力されるため、観察に便利であり、単一のループのみが使用されます。

シーケンシャル配列から特定のxを見つける

シーケンス配列は、a [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;
}

最初にループを使用して配列v [100]を100個の要素で埋め、次に排他的ORを使用して、「k ^ v [i]」の戻り値がゼロであるifステートメントを使用して判断し、elseを入力して対応するものを見つけます。番号、ループを停止します。「k ^ v [i]」の戻り値はゼロではありません。このループをスキップしてください。

両側から中央に向かって徐々に現れる文字列を書く

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

実行中のコードの効果は、1行の文字が徐々に別の文字列に置き換えられることです(私は私物を運んでいて、ガールフレンド[doge]に告白します)。strlenの機能は文字列の長さを見つけることです。これにはstdlib.hが必要です。ヘッドファイル。スリープはプログラムを一時停止する機能です。括弧内の数字はミリ秒で、必要なヘッダーファイルはwindows.hです。system( "cls"); //システムコマンドを実行して画面をクリアする機能は、stdlib.hヘッダーテキストを呼び出す必要があります。なお、文字列を別の文字列である添え字に置き換えると、文字列の最後の文字は終了文字「\ 0」となり、文字列の後には表示されませんが、1つの位置を占めることになります。したがって、文字列の長さを計算するときは-1が必要です。

3つの誤ったパスワード入力後に終了するプログラム

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

その中で、「\ a」はプロンプト音です。このプログラムで注目に値する点の1つは、文字列が等しいかどうかは、判断のために==の両側に文字列を直接書き込まないことです。関数、strcmp関数、およびヘッダーファイルは文字列です。 h。検証するパスワードはソースコードの作成者によって決定され、将来、より完全なログインポートが設計される可能性があります。

おすすめ

転載: blog.51cto.com/15078858/2590386