鹏哥C语言36-37---循环/分支语句练习(折半查找算法)
#define _CRT_SECURE_NO_WARNINGS
//----------------------------------------------------------------------------------------------------3.4 分支,循环练习
//用代码解决问题=先想办法(编程思维)+再写代码(按照语法形式)
//----------------------------------------------------------------------------------------------------3.4.1. 练习参考代码
#include <stdio.h>
//-----------------------------------------------------------------------------------------1.计算n的阶乘
//---------------------------------------------------while
//int main()
//{
// int n = 0;
// int i = 1;
// int ret = 1;
// scanf("%d", &n);
//
// while (i <= n)
// {
// ret = ret * i;
// i++;
// }
// printf("%d", ret);
//
// return 0;
//}
//---------------------------------------------------for
//int main()
//{
// int n = 0;
// int i = 1;
// int ret = 1;
// scanf("%d", &n);
//
// for (i = 1; i <= n; i++) 不考虑溢出问题
// {
// ret = ret * i;
// }
// printf("%d", ret);
//
// return 0;
//}
//-----------------------------------------------------------------------------------------2.计算1!+2!+3!+......+10!
// --------------------------------两个 for 循环嵌套效果较差,每次内部循环都重复
//int main()
//{
// int n = 0;
// int i = 1;
// int ret = 1;
// int ADD = 0;
//
// for(n=1;n<=3;n++)
// {
// ret = 1; // 每次内部循环的时候,必须给 ret 初始化
// for (i = 1; i <= n; i++)
// {
// ret = ret * i;
// }
// ADD = ADD + ret;// 自己老是忘记这个迭代的格式!!!!!!!
// }
// printf("%d", ADD);
//
// return 0;
//}
// ---------------------------------------------优化
//int main()
//{
// int n = 0;
// int ret = 1;
// int ADD = 0;
//
// for (n = 1; n <= 3; n++)
// {
// ret = ret * n;
// ADD = ADD + ret;
// }
// printf("%d", ADD);
//
// return 0;
//}
//--------------------------------------------------------------------------------3.从数组中查找数(折半查找算法)
//在一个有序的数组中查找具体的数字
//--------------------------------------------------一个一个找,效率慢
//int main()
//{
// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
// int k = 0;
// scanf("%d", &k);
// int i = 0;
// int size = sizeof(arr) / sizeof(arr[0]); // 求数组内元素个数,用了好几遍了
// for(i=0;i<=size;i++)
// {
// if (arr[i] == k)
// {
// printf("找到了,下标是:%d", i);
// break;
// }
// }
// if (i >= size)
// printf("找不到");
//
// return 0;
//}
//---------------------------------------------------折半查找算法(二分查找)
//代码麻烦,但是效率高,速度快,限制是只能应用于有序数组
/*
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 0;
scanf("%d", &k);
int i = 0;
int size = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = size - 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", mid);
break;
}
}
if (left > right)
{
printf("找不到");
}
return 0;
}
*/
//---------------------------------------------------------------------------3.4.2 从数组中查找数(折半查找算法)
//在一个 有序 的数组中查找具体的数字
//-----------------------------------------------------------------------------折半查找算法(二分查找)
// 每次查找缩小一半范围
//代码麻烦,但是效率高,速度快,限制是只能应用于有序数组
//int main()
//{
// int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
// int k = 0;
// scanf("%d", &k);
// int i = 0;
// int size = sizeof(arr) / sizeof(arr[0]);//求元素个数
// int left = 0;
// int right = size - 1;
//
// while (left <= right) // 关键二:一定是 <=
// {
// int mid = (left + right) / 2; // 关键一: 中间值mid 计算 一定要在循环里边
// //如果 left + right 的值超出了 int 整型所能表达的最大值,会产生位溢出,求得的平均值会不准确
// // int mid=left+(left+right)/2; //就避免溢出的问题
// if (arr[mid] < k)
// {
// left = mid + 1;
// }
// else if (arr[mid] > k)
// {
// right = mid - 1;
// }
// else
// {
// printf("找到了,下标是:%d", mid);
// break;
// }
// }
// if (left > right)
// {
// printf("找不到");
//
// }
// return 0;
//}
//-----------------------------------------------------------------------------------------4.从两端移动,向中间汇聚
//编写代码,演示多个字符从两端移动,向中间汇聚
//welcome to bit!!!
//###############
//w#############!
//we###########!!
//......
//welcome to bit!!!
#include<windows.h>
#include<stdlib.h>
//
//int main()
//{
// // int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; //整型数组
// char arr1[] = "welcome to bit!!!"; //字符数组
// char arr2[] = "#################";
//
// int left = 0;
// int right = strlen(arr1); //strlen 求字符串长度,求的是\0之前的元素个数,
// //int right = sizeof(arr1) / sizeof(arr1[0])-2; //先减去 \0, 再减去一个下标数
//
// while(left<=right)
// {
// arr2[left] = arr1[left];
// arr2[right] = arr1[right];
// printf("%s\n", arr2);//
// Sleep(1000);// 1000单位是毫秒,需要引用头文件,#include<windows.h>
// //清空屏幕
// system("cls");// system是一个库函数,可以执行系统命令, 需要引用头文件,#include<stdlib.h>
// left++;
// right--;
// }
// printf("%s\n", arr2);
//
// return 0;
//}
//-----------------------------------------------------------------------------------------------5.模拟用户登录密码
// 编写代码实现,模拟用户登录情景,并且只能登陆三次
//只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序
//比较两个字符串是否相等,不能使用等号,应该使用库函数: strcmp\
//需要引用头文件
#include <string.h>
//如果返回值是 0,表示两个字符串相等
int main()
{
int i = 0;
int password[6] = { 0 };
//假设密码是字符 abcdef
for (i = 0; i < 3; i++)
{
printf("请输入密码:>");
scanf("%s", password); //数组不需要取地址
// if (password == "abcdef")
if (strcmp(password, "abcdef") == 0) //比较两个字符串是否相等,使用库函数 strcmp
{
printf("登录成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if (i == 3)
{
printf("三次密码均输入错误,退出程序");
}
return 0;
}
//今天共接触了三个新的头文件
/*
#include<windows.h>
Sleep(1000);// 1000单位是毫秒,需要引用头文件,#include<windows.h>
#include<stdlib.h>
system("cls");// system是一个库函数,可以执行系统命令, 需要引用头文件,#include<stdlib.h>
cls 清屏
#include <string.h>
if (strcmp(password ,"abcdef")==0) //比较两个字符串是否相等,使用库函数 strcmp
*/