七天学会c语言,第7天学C语言--一点练习(分支与循环)

(2020.9.10)

练习3:

在一个有序数组中查找某个具体数字n。编写int binsearch(int x,int v[],int n);

功能:在v[0]<=v[1]<=v[2]...<=v[n-1]的数组中查找x

方法一:

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

int k = 7;

int i = 0;

int sz = sizeof(arr) / sizeof(arr[0]);(计算元素个数)

for (i = 0; i < sz; i++)

{

if (k ==arr[i])(而不是k==sz,因为arr[i]求出来的是下标)

{

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

break;

}

}

if (i == sz)

printf("找不到");

(结果为6,而7的下标确实是6)

1的下标是0

折半查找算法/二分查找算法(方法二)可以提高效率,

最多大概找log以2为底数的n次:

举例子:

2^32次方=42亿多,最多只需查找32次

最右下标即为元素个数-1

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

int left = 0;

int k = 7;

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

int right = sz - 1;(left和right分别代表下标,所以要sz-1)

int mid = (left + right) / 2;

while (left<=right)(只有这样才保证,因为有可能找不到所需元素之后

,左下标跑到右下标的右边)

{

if (arr[mid] > k)

{

right = mid - 1;

}

if (arr[mid < k])

{

left = mid + 1;

}

else

{

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

break;(因为外面加了循环,所以要break才能停下来)

}

}

if (left > right)

{

printf("找不到");(只有当left<=right不满足的情况才会跳到底下,

或者break之后来到这里)

}

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("找不到");

}

(重新打了一遍,这一次没有错,之前一直出错但不知道原因)

这个代码哪些地方值得注意:

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)(只有left<=right时说明中间有元素,此时才能

进行查找)

{

int mid =(left + right) / 2;(每次查找都要通过左右元素来确定

一个中间元素的下标,那这个中间元素与锁定的元素去比较)

if (arr[mid] > k)

{

right = mid - 1;

}

else if (arr[mid] < k)(mid是指的下标,而k指的是元素)

{

left = mid + 1;

}

else

{

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

break;(当找到了这个元素要跳出来)

}

}

if (left > right)

{

printf("找不到");

}

练习4:

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

char arr1[] = "welcom to bit!!!!!!";

char arr2[] = "##################";

int left = 0;

int right = sizeof(arr1) / sizeof(arr1[0]) -2;(是减去2不是1因为数组元素末尾

还包括一个\0,如果只是-1,得到的结果是\0而不是末尾的字符感叹号)

可以把上面那句话改成:

int right=strlen(arr1)-1;(把\0前面的元素个数求出来,由于下标总是

比元素个数少一,所以减去1)

strlen:用来求字符串长度,但个数里面不包括\0,遇到\0就停止

库函数就必须引用头文件

char arr1[] = "welcome to bit!!!!!!";

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);(1秒=1000毫秒,作用:每打印一次后停留1秒,并且S记得

大写,必须引用头文件,#include)

system("cls");system:是用来执行系统命令的一个函数,(cls--清空屏幕),

由于system是库函数,需要引用头文件#include

left++;

right--;

}

printf("welcome to bit!!!!!!");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值