您的位置:首页 > 编程语言 > C语言/C++

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

2020-09-10 23:06 891 查看

  (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<windows.h>)

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

由于system是库函数,需要引用头文件#include<stdlib.h>

left++;

right--;

}

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: