【C语言】拓展、二分查找、辗转相除法

一、拓展

1、getchar
getchar---获取(输入)一个字符
putchar---输出一个字符

getchar-----输出

putchar-----输出
在这里插入图片描述

输入输出一个字符:

#include <stdio.h>

int mian()
{
    //scanf
    int ch = getchar();//'a'--97
    printf("%c\n",ch); 
    //putchar()
    return 0;
}
  • getchar读取一个字符,ch为什么定义为整型:
  1. 字符存储用ASCII码值表示
  2. getchar获取失败时返回EOF

EOF—> -1 ,整型
在这里插入图片描述

输入输出多个字符:

#include <stdio.h>

int main()
{
    int ch = 0;
    while((ch = getchar()) != EOF)
    {
        putchar(ch);            
    }
    return 0;
}
2、scanf
#include <stdio.h>

int main()
{
	char input[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", input);
	printf("请确认密码(Y/N):");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

	return 0;
}

注:enter相当于\n
//解释缓冲区

#include <stdio.h>

int main()
{
	char input[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", input);
        getchar();//拿走\n         
	printf("请确认密码(Y/N):");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

	return 0;
}


注:scanf读取字符串时遇到空格就结束

#include <stdio.h>

int main()
{
	char input[20] = { 0 };
	printf("请输入密码:");
	scanf("%s", input);
    //清理缓冲区         
	int tmp = 0;
    while((tmp = getchar()) != '\n')
    {
        ;         
    }
	printf("请确认密码(Y/N):");
	int ch = getchar();
	if (ch == 'Y')
	{
		printf("确认成功\n");
	}
	else
	{
		printf("确认失败\n");
	}

	return 0;
}

3、小数、除法
#include <stdio.h>

int main()
{
    float a = 5 / 2;
    printf("%.f\n",a);
    
    return 0;
}

输出:2.000000

#include <stdio.h>

int main()
{
    float a = 5 / 2.0;//a = 5.0 / 2;
    printf("%.f\n",a);
    
    return 0;
}

输出:2.500000
注:%.f默认保留6位小数,%.1f保存一位小数,%.2f保存两位小数等。

二、辗转相除法

求最大公约数:

#include <stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	//求最大公约数
	int ret = 0;
	//求m和n中较小值,假设就是最大公约数
	if (m > n)
		ret = n;
	else
		ret = m;

	while (1)
	{
		if ((m % ret == 0) || (n % ret == 0))
		{
			break;
		}
		ret--;
	}
	printf("%d\n", ret);


	return 0;
}

辗转相除法:

#include <stdio.h>

int main()
{
	int m = 0;
	int n = 0;
	int ret = 0;
	scanf("%d %d", &m, &n);
	while (ret = m % n)
	{
		m = n;
		n = ret;
	}
	printf("%d\n", n);

	return 0;
}

最小公倍数:
m*n/最大公约数=最小公倍数

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

在一个有序数组中查找具体的某个数字k:

#include <stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int k = 7;
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		if (arr[i] == k)
		{
			printf("找到了,下标是%d\n", i);
			break;
		}
		if (i == 10)
		{
			printf("找不到\n");
		}
	}

	return 0;
}

折半查找(二分查找):
//分析:

#include <stdio.h>

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);

	int k = 7;
	int left = 0;
	int right = sz - 1;

	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < k)
		{
			left = mid + 1;
		}
		else if (arr[mid] > k)
		{
			right = mid - 1;
		}
		else
		{
			printf("找到了,下标是%d\n", mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到\n");
	}

	return 0;
}

四、编写代码,演示多个字符从两端移动,向中间汇聚。

//录屏

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

int main()
{
	char arr1[] = "frost_cold!!!!";
	char arr2[] = "##############";
	int left = 0;
	int right = strlen(arr1) - 1;
	while (left <= right)
	{
		arr2[left] = arr1[left];
		arr2[right] = arr1[right];
		printf("%s\n", arr2);
		Sleep(1000);//睡眠函数--单位是毫秒
		system("cls");//执行系统命令,cls是清空屏幕
		right--;
		left++;
	}
	printf("%s\n", arr2);

	return 0;
}

1

五、实现登录系统–strcmp函数

编写代码实现,模拟用户登录情景,并且只能登录三次。(只允许输入三次密码,如果密码吗正确则提示登录成功,如果三次均输入错误,则退出程序。)

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

int main()
{
	char password[20] = "";
	int i = 0;
	
	for (i = 0; i < 3; i++)
	{
		printf("请输入密码:");
		scanf("%s", password);
		if ((strcmp(password, "123456")) == 0)
		//比较两个字符串是否相等,不能使用==,而应该使用strcmp函数
		{
			printf("登录成功\n");
			break;
		}
		else
		{
			printf("密码错误\n");
		}
	}
	if (i == 3)
	{
		printf("三次密码均错误,退出程序\m");
	}

	return 0;
}

六、实现猜数字游戏

电脑随机生成数字1-100,猜大猜小了电脑均会告知,若猜对了,则提示猜对了。

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

void menu()
{
	printf("**********************\n");
	printf("*****  1 . play  *****\n");
	printf("*****  0 . exit  *****\n");
	printf("**********************\n");
}

void game()
{
	//生成随机数
	int r = rand() % 100 + 1;//1-100
	int guess = 0;
	//猜数字
	while (1)
	{
		printf("猜数字:");
		scanf("%d", &guess);
		if (guess > r)
		{
			printf("猜大了\n");
		}
		else if (guess < r)
		{
			printf("猜小了\n");
		}
		else
		{
			printf("恭喜你,猜对了\n");
			break;
		}
	}
}

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));//时间-设置随机数的生成器

	do
	{
		//打印菜单
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch(input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("输入错误\n");
			break;
		}
	} while (input);

	return 0;
}

C语言中生成的随机数的方式是rand函数
0~RAND_MAX 0x7fff
0~32767

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

frost_cold

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

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

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

打赏作者

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

抵扣说明:

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

余额充值