目录
1 在一个有序数组中查找每个具体的某个数字n(二分查找)
2 编写代码,演示多个代码从两端移动,向中间汇聚
3 编写代码实现,模拟用户登录情景,并且只能登陆三次(只允许输入三次密码,如果密码正确则提示登陆成功,如果三次均输入错误,则退出程序)
4 猜数字游戏
常规方法:(缺点:如果要找的数字在最后一位,则需要遍历整个数组,浪费时间)
#include
int main()
{
int i = 0;
int k = 7;
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i < 10; i++)
{
if (arr[i] == k)
{
printf("找到了,下表为%d", i);
break;
}
}
if (i == 10)
{
printf("没有");
}
return 0;
}
二分查找法(折半查找法):(比较,缩小范围)
arr[]={1,2,3,4,5,6,7,8,9,10},在这里还是找数字k=7,
首先用1的下标0(left1),和10的下标9(right1),相加除于2等于4(mid1)余1,用下标为4(mid1)的数字5和7比较,7显然在5的右边;
然后用下标5(mid1+1)(left2)和10的下标9(right2)相加除于2等于7(mid2),用下标为7的数字8和7比较,7在8的右边;
然后用下标6(mid2-1)(right3)和left2(left3)相加除于2等于5(mid3),用下标为5的数字6和7比较,7在6的右边
最后用下标6(mid3+1)和结尾3相加除于2等于6,刚好等于7。
代码展示:
#include
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int a = sizeof(arr) / sizeof(arr[0]);
int left = 0;
int right = a - 1;
while (left <= right)
{
int mid = (right + left) / 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;
}
举例说明: “#######” “a#####g” “ab###fg” “abc#efg” “abcdefg” ,就这样一步一步展示出来的就是多个代码从两端移动,向中间汇聚。
代码展示:
#include
#include
int main()
{
char arr1[] = "abcdefg";
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");
left++;
right--;
}
printf("%s", arr2);
return 0;
}
代码理解
代码1展示:
#include
#include
int main()
{
char arr1[] = "abcdefg";
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);
left++;
right--;
}
return 0;
}
新知识:Sleep()函数,括号内放置数字,单位为毫秒(一秒=1000毫秒=1000 000微秒=1000 000 000纳秒),需要时调用的头文件是#include
例如:
Sleep(1000),若是上面的代码块中printf()的后面一行插入(代码2展示),编码时,结果会每隔一秒出现一行。就是第一次出现a#####g,一秒后出现a#####g,又一秒后出现a#####g,一秒后出现a#####g
ab###fg ab###fg ab###fg
abc#efg abc#efg
abcdefg
代码2展示:
#include
#include
int main()
{
char arr1[] = "abcdefg";
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);
left++;
right--;
}
return 0;
}
system("cls")清除调试台的内容。
代码3展示:
#include
#include
int main()
{
char arr1[] = "abcdefg";
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");
left++;
right--;
}
printf("%s", arr2);
return 0;
}
复习知识点:打印字符串用%s,打印字符用%c.
知识点总结:(1)整数类型数组,求最大下标是多少:a=sizeof(arr[])/sizeof(arrr[0])-1
(2)字符类型:strlen(arr)-1 sizeof(arr[])-2(因为/0也算一个字节)
代码展示:
#include
#include
int main()
{
int i = 0;
char password[20] = "";
for (i = 0; i < 3; i++)
{
printf("请输入密码");
scanf("%s", password);
if ((strcmp(password, "123456")) == 0)
{
printf("登陆成功\n");
break;
}
else
{
printf("密码错误\n");
}
}
if (i == 3)
{
printf("密码三次均输入错误,退出程序");
}
return 0;
}
知识点:
(1)scanf("%d",password) 为什么不是 scanf("%d",&password) 因为password是数组名,数组名本来就是地址,所以不需要取地址符号。
(2)strcmp()函数是string compare(字符串比较)的缩写,比较字符串返回整数。(头文件是string.h)
strcmp(str1,str2),str1=str2,返回0:;str1
电脑随机产生一个数字,玩家猜。
代码展示:
#include
#include
#include
void menu()
{
printf("**************************\n");
printf("**** 1.play *********\n");
printf("**** 0.exit *********\n");
printf("**************************\n");
}
void game()
{
int guess = 0;
int r = rand()%100 + 1;
while (1)
{
printf("请输入猜测的数字:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("猜测正确");
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("退出游戏");
break;
default:
printf("请重新输入");
break;
}
} while(input);
return 0;
}
代码新知识:
该代码中,#include
%100 产生的是(0-99)
C语言中随机产生数字的是rand函数(产生的都是整数)(0-32767), 库文件是