scanf getchar for循环 二分法查找一个有序数组中的数 密码锁 多字符向中间靠拢

输入函数scanf getchar 输入缓冲区

// int ret = 0;

// int ch = 0 ; //这里int是因为那里得到的是ASCII码表

// char password[20] = { 0 };

// printf("请输入密码:>"); //例子1235456 实际123456\n 但是scanf自接收\n前的字符 会剩余\n 遇到空格也停止

// scanf("%s", password);

// printf("请确认y/n");

// while ((ch = getchar())!='\n') //解决办法 不断接收字符直到遇到'\n'

// {

// ; //不做任何操作

// }

if (ch < '0' || ch>'9') //只会接收输出数字字符

for循环

建议不要在for循环内改变循环变量,防止for循环失去控制

建议for语句的循环控制变量取值采取"前闭后开区间"写法for(i=0;i<10;1++)十次循环 十次打印 十个元素

for (;;) //for循环初始化 调整 判断都可以省略 判断部分省略,那判断部分条件就是:恒为真 不是非常熟练不建议使用

两个循环变量

for (x = 0, y = 0;x < 2 && y < 5;++x,y++)

for (i = 0, k = 0;k = 0;i++, k++) //一次都不循环k=0为赋值,0为假

二分法查找法(折半查找法)

log(2)/log(n) 2^32

//#include <stdio.h>

//

找一个数 很简单 但二分思想

//

//int main()

//{

// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };

// int k = 7;

// int sz = sizeof(arr) / sizeof(arr[0]);

// int left = 0; //左下标

// int right = sz - 1; //右下标

// while (left<=right) //防止没有这个数,导致查找到中间时 左下标变为右下标 右下标变为左下标

// {

// int mid = (left + right) / 2;//求中间元素下标

// if (arr[mid] > k)

// {

// right = mid + 1;

// }

// else if (arr[mid]<k)

// {

// left = mid + 1;

// }

// else

// {

// printf("找到了,下标是:%d\n", mid);

// break; //跳出循环

// }

// }

// if (left > right)

// {

// printf("找不到\n");

// }

// return 0;

//}

int right = sizeof(arr1) / sizeof(arr[0])-2;//减二的原因是下标为0 1 2 3...,且字符串末尾是\0;

int right = strlen(arr1)-1;//strlen遇到\0就停止了 计算字符串长度

//#include <stdio.h>

//#include <string.h>

//#include <windows.h>

//#include <stdlib.h>

Sleep(1000);//1000毫秒

system("cls");//执行系统命令的一个函数-cls-清空屏幕

if (strcmp(password, "abc123456") == 0)//等号不能用来比较两个字符串是否相等;应该使用一个库函数-strcmp

#define _CRT_SECURE_NO_WARNINGS
//#include <stdio.h>
//
//int main()
//{
//    //输入函数scanf getchar 输入缓冲区
//    int ret = 0;
//    int ch =  0 ;                        //这里int是因为那里得到的是ASCII码表
//    char password[20] = { 0 };
//    printf("请输入密码:>");                //例子1235456 实际123456\n 但是scanf自接收\n前的字符 会剩余\n 遇到空格也停止
//    scanf("%s", password);
//    printf("请确认y/n");
//    while ((ch = getchar())!='\n')        //解决办法 不断接收字符直到遇到'\n'
//    {
//        ;                                //不做任何操作
//    }
//    ret = getchar();
//    if (ret == 'y')
//    {
//        printf("确认成功\n");
//    }
//    else
//    {
//        printf("确认放弃\n");
//    }
//    return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//    int ch = 0;
//    while ((ch = getchar()) != EOF)
//    {
//        if (ch < '0' || ch>'9')        //只会接收输出数字字符
//            continue;
//        putchar(ch);
//    }
//    return 0;
//}

//for循环
//#include <stdio.h>
//
//int main()
//{
//    int i = 0;            //初始化
//    while (i < 10)        //判断
//    {
//        //.......
//        i++;            //调整
//    }                    //后续调整不便,代码添加后会分得很开
//    return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//    int i = 0;
//    for (i = 1;i <= 10;i++)                //1、先初始化2、判断3、执行4、判断5、执........
//    {
//        if (5 == i)
//            //break;                    //终止循环1 2 3 4
//            continue;                    //1 2 3 4 6 7 8 9 10
//        printf("%d\n", i);
//    }
//    return 0;
//}
//建议不要在for循环内改变循环变量,防止for循环失去控制
//建议for语句的循环控制变量取值采取"前闭后开区间"写法for(i=0;i<10;1++)十次循环 十次打印 十个元素

for变种
//#include <stdio.h>
//
//int main()
//{
//    for (;;)                        //for循环初始化 调整 判断都可以省略  判断部分省略,那判断部分条件就是:恒为真 不是非常熟练不建议使用
//    {
//        printf("fuck\n");            //死循环
//    }
//    return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//    int i = 0;
//    int j = 0;
//    for (i = 0;i < 10;i++)
//    {
//        for (;j < 10;j++)
//        {
//            printf("fuck\n");            //只打印十个,因为j++到10不再符合判断
//        }
//    }
//    return 0;
//}

两个循环变量
//#include <stdio.h>
//
//int main()
//{
//    int x, y;
//    for (x = 0, y = 0;x < 2 && y < 5;++x,y++)
//    {
//        printf("hehe\n");
//    }
//    return 0;
//}


例子 判断有几次循环
//#include <stdio.h>
//
//int main()
//{
//    int i = 0;
//    int k = 0;
//    for (i = 0, k = 0;k = 0;i++, k++)        //一次都不循环k=0为赋值,0为假
//        k++;
//    return 0;
//}


//do.....while循环            先做再,判断
//#include <stdio.h>
//
//int main()
//{
//    int i = 1;
//    do {                        //do后面记得加{}
//        if (5 == i)
//            //break;                //跳出循环
//            continue;                //死循环 跳过本次循环后面的代码
//        printf("%d ", i);        
//        i++;
//    } while (i <= 10);            //分号
//    return 0;
//}

//1、计算n的阶乘
//#include <stdio.h>
//
//int main()
//{
//    int n = 0;
//    int i=1, j=1;
//    scanf("%d", &n);
//    do {
//        j++;
//        i *= (i+1);
//    } while (j<n);
//    printf("%d",i);
//    return 0;
//}
//
//#include <stdio.h>
//
//int main()
//{
//    int i = 0;
//    int n = 0;
//    int ret = 1;
//    scanf("%d", &n);            //n=100这种溢出的不算
//    for (i = 1;i <= n;i++)
//    {
//        ret = ret * i;
//    }
//    printf("ret = % d\n", ret);
//    return 0;
//}


//#include <stdio.h>
//
//int main()
//{
//    int i = 0;
//    int n = 0;
//    int ret = 1;
//    int sum = 0;
//    for (n = 1;n <= 3;n++)
//    {
//        ret = 1;
//        for (i = 1;i <= n;i++)
//        {
//            ret = ret * i;
//        }
//        //n的阶乘
//        sum = sum + ret;
//    }
//    
//    printf("sum = %d\n", sum);
//    return 0;
//}
不过效率不高,可以优化

//#include <stdio.h>
//
//int main()
//{
//    int n = 0;
//    int ret = 1;
//    int sum = 0;
//    for (n = 1;n <= 3;n++)
//    {
//        ret = ret * n;                    //少一个循环
//        //n的阶乘
//        sum = sum + ret;
//    }
//    
//    printf("sum = %d\n", sum);
//    return 0;
//}

//写一个代码,在arr数组(有序的)中找七

//#include <stdio.h>
//
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    int k = 6;
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int i = 0;
//    for (i = 0;i < sz;i++)
//    {
//        if (k == arr[i])
//        {
//            printf("找到了,下标是:%d\n", i);
//            break;
//        }
//    }
//    if (i == sz)
//        printf("找不到\n");
//    return 0;
//}
效率还是太低 可能要找n次
//
二分法查找法(折半查找法)log(2)/log(n)  2^32
//
//#include <stdio.h>
//
找一个数 很简单 但二分思想
//
//int main()
//{
//    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//    int k = 7;
//    int sz = sizeof(arr) / sizeof(arr[0]);
//    int left = 0;            //左下标
//    int right = sz - 1;        //右下标
//    while (left<=right)        //防止没有这个数,导致查找到中间时 左下标变为右下标 右下标变为左下标
//    {
//        int mid = (left + right) / 2;//求中间元素下标
//        if (arr[mid] > k)
//        {
//            right = mid + 1;
//        }
//        else if (arr[mid]<k)
//        {
//            left = mid + 1;
//        }
//        else
//        {
//            printf("找到了,下标是:%d\n", mid);
//            break;            //跳出循环
//        }
//    }
//    if (left > right)
//    {
//        printf("找不到\n");
//    }
//    return 0;
//}

//#include <stdio.h>
//#include <string.h>
//#include <windows.h>
//#include <stdlib.h>
//
多字符向中间靠拢
//
//int main()
//{
//    char arr1[] = "welcome to mingda";
//    char arr2[] = "*****************";
//    int left = 0;
//    //int right = sizeof(arr1) / sizeof(arr[0])-2;//减二的原因是下标为0 1 2 3...,且字符串末尾是\0;
//    int right = strlen(arr1)-1;//strlen遇到\0就停止了 计算字符串长度
//    while (left<=right)
//    {
//        arr2[left] = arr1[left];
//        arr2[right] = arr1[right];
//        printf("%s\n", arr2);
//        //休息一秒
//        Sleep(1000);//1000毫秒
//        system("cls");//执行系统命令的一个函数-cls-清空屏幕
//        left++;
//        right--;
//    }
//    printf("%s\n", arr2);    //使最后一次显示保留
//    return 0;
//}

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

int main()
{
    int i = 0;
    char password[20] = { 0 };
    for (i = 0;i < 3;i++)
    {
        printf("请输入密码:");
        scanf("%s", password);
        if (strcmp(password, "abc123456") == 0)//等号不能用来比较两个字符串是否相等;应该使用一个库函数-strcmp
        {
            printf("登录成功\n");
            break;
        }
        else
        {
            printf("密码错误\n");
        }
    }
    if (3 == i)
        printf("三次密码均错误,退出程序");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

考研人君君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值