前言:
c语言为b站鹏哥,嗯对应视频37集
昨天做的c语言,今天在来做一遍,发现做错了
今天改了平均值的计算,
就是说最大值加上最小值,如果说这个数值非常大的话,两个值加上会超过int类型的最大值,从而导致数值的重新计算,导致结果不稳定,所以换一种计算方法
第二题,折半查找法
环境介绍,就是dev c++软件运行编译
就是说最大值减去最小值,然后中间有个差值,将他分成一半给最小值,那两个就都是平均值了
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left =0;
int pj = sizeof(arr)/sizeof(arr[0]); //就是那个sizeof计算字符串整型都可以用,全部元素都计算了
//定义一个输入
int k =6;
int right=pj-1;
for(left=0; left<=right; left++)
{
int mid =left + (right-left)/2;
if(arr[mid]<k)
{
left = mid +1;
}
if(arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标为:%d\n", mid);
}
}
return 0;
}
嗯,就是正确的下标应该是5,但是打印的下标为4,。。。
我知道了
我用的for循环,而且我每次循环,都将left加1了,导致就是计算结果不准,至于为什么等于4我就没有深究了,
所以这个还是用for循环比较好,当然我把第三个表达式删掉了,也可以得到正确的值,就这样
for(left=0; left<=right; )
这里也是会造成死循环,因为把left++去掉了,left和right不变了
修改的代码
#include <stdio.h>
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int left =0;
int pj = sizeof(arr)/sizeof(arr[0]); //就是那个sizeof计算字符串整型都可以用,全部元素都计算了
//定义一个输入
int k =6;
int right=pj-1;
while(left <= right)
{
int mid =left + (right-left)/2;
if(arr[mid]<k)
{
left = mid +1;
}
if(arr[mid] > k)
{
right = mid - 1;
}
else
{
printf("找到了,下标为:%d\n", mid);
break;
}
}
return 0;
}
为啥这个要加break,不然会造成死循环,因为这个while循环,找到了之后并不会变化里面的right和left值,所以while循环的表达式永远为真,就造成循环
第三题:编写代码,演示多个字符从两端移动,向中间汇聚
strlen函数,这个是统计 \0 之前的元素,适合用于计算字符串的长度
sizeof函数,统计所有元素,包括\0
strlen,如果需要使用这个函数,需要加上头文件,就是这个,#include <string.h>
sleep函数,需要使用#include <windows.h>,这个是头文件
systemctl函数,包含 #include <stdlib.h>,执行系统命令(dev c++好像不用包含额外头文件)
源代码
//编写代码,演示多个字符从两端移动,向中间汇聚
//welcome to bit!!!!
//##################
//we##############!!
//...........
//welcome to bit!!!!
int main()
{
char arr1[] = "welcome to bit!!!!";
char arr2[] = "##################";
int right = strlen(arr2) - 1; //strlen比较好算字符串的长度,因为不计算/0在里面,字符串数组里默认有\0.
int left =0;
while(left < right)
{
arr2[left] = arr1[left];
arr2[right] = arr1[right];
left ++;
right --;
Sleep(1000);
system("cls");
printf("%s\n", arr2);
}
}
编写代码实现,模拟用户登录情景,并且只能登录三次。
如果密码正确则提示登录成功,(只允许输入三次密码如果三次均输入错误,则退出程序。)
字符串比较不能直接这样写
if(password == "abcdef")
嗯.....别问,问就是会报错,然后就是要利用函数
strcmp函数,用于对比字符串是否一致,一致返回0
代码
int main()
{
int i = 0;
char password[100] = {0}; //这里需要指派空间大一点
while(i < 3)
{
printf("请输入密码:");
scanf("%s", password);
if (strcmp(password, "abcdef") == 0)
{
printf("登录成功\n");
break;
}
else
{
printf("登录失败,请重试\n");
}
i++;
}
return 0;
}
数组那里的空间需要给大一点,嗯,不指名空间大小的话,就只能存一次
然后我有问题的是
为啥需要将输入函数放到循环里面,放到循环外面就不起作用了,也就是程序不能正常运行