今天继续学习了 循环结构

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,其中的所需要验证的密码是由源代码书写人定的,以后或许能设计出更完善的登录端口