循環結構的繼續學習

今天繼續學習了 循環結構

EOF

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

程序運行過程中,直接輸入EOF並不能結束程序,EOF - end of file 爲文件結束標誌,在程序運行窗口輸入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;
}

其中的註釋起來的單獨一行“//getchar(); //讀取了輸入密碼之後的用於確認字符串的回車”是前面爲了把輸入在scanf函數裏的數字最後一位用於確認的回車“\n”字符拿掉,“\n”的返回值部位0,沒有拿掉這個字符,下面的if條件句就不能正確的執行。 後來考慮到輸入後可能會有空格,而空格以後的字符一個 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;
}

本來想寫一個能夠輸出一百個“hehe”的程序,但是由於內層循環裏的賦初值省略了,最終只能十個“hehe”

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!的階乘比較大,難以確認,所以用前三位來進行確認,以上程序運行的結果爲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;
}

我先用循環填充了一個內含100個元素的數組v[100],然後用異或進行判斷,使用 if 語句,其中“ k ^ v[i] ”返回值爲零時,進入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;
}

代碼運行的效果爲,一行字符逐漸被另一串字符替換,(本人夾帶私貨,給女朋友表白了一波,【doge】),strlen函數的作用爲求字符串長度,需要stdlib.h的頭文件。Sleep爲讓程序暫停的函數,後面括號裏的數字單位爲毫秒,所需頭文件爲windows.h。system("cls");//執行系統命令的函數 清空屏幕 需要調用stdlib.h頭文字。需要注意的爲,一個字符串被另一個字符串所代替的過程中,下標,字符串最後一位爲結束字符‘\0’,並不會在字符串後顯示,但也佔一位,所以在計算字符串長度的時候需要 -1;

錯誤輸入三次密碼之後就會退出的程序

#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'爲提示音,此程序中值得注意的一點是,字符串是否相等並不能直接將字符串寫在 == 兩邊進行判斷,需要用到一個函數,strcmp 函數,頭文件爲string.h,其中的所需要驗證的密碼是由源代碼書寫人定的,以後或許能設計出更完善的登錄端口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章