第7天學C語言--一點練習(分支與循環)

  (2020.9.10)算法

練習3:windows

在一個有序數組中查找某個具體數字n。編寫int binsearch(int x,int v[],int n);數組

功能:在v[0]<=v[1]<=v[2]...<=v[n-1]的數組中查找xide

方法一:函數

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

int k = 7;字符串

int i = 0;it

int sz = sizeof(arr) / sizeof(arr[0]);(計算元素個數)io

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

{

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!!!!!!");