1.折半查找
前提:数据有序;
优点:查找速度快;
代码
//折半查找
//在长度为len的数组arr中,查找关键字key,成功返回下标,失败返回-1
int BinSearch(int *arr,int len,int key)
{
int low=0;
int high=len-1;
int mid;
while(low <= high)
{
mid = (low + high)/2;
if(arr[mid] == key)//找到
{
return mid;
}
else if(arr[mid] < key)//在后半部分找
{
low = mid +1;
}
else//在后半部分找
{
high = mid - 1;
}
}
return -1;
}
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
for(int i=-1;i<=13;i++)
{
printf("%d\n",BinSearch(arr,sizeof(arr)/sizeof(arr[0]),i));
}
return 0;
}
结果:
2.调试
下断点:F9(在左侧边栏单机鼠标左键)
3.字符数组定义
一天的生活、工作都在进行文字处理,数字处理较少;
0的形式:0,0.0,false,NULL,‘\0’
字符数组:非常重要,用的多,考的多;
字符:用单引号 ‘’ 包括起来的一个字符,例如’a’,‘1’,‘0’;
字符串:用双引号 “” 包括起来的一个字符串,由0个或者多个字符串组成,例如"“,“123d”,“ad dd”;
--------字符串一定有个隐藏的 ‘\0’ 表示结尾,‘\0’ 是字符串的结尾标志;
--------是否为字符串:1、有没有”";
-----------------------------2、有木有’\0’;
int main()
{
//和int数组类似的定义
char arr[5] = {'a','b','c','d','e'};//不是字符串
char brr[10] = {'a','b','c','d','e'};//剩余的为'\0',是字符串
char crr[]={'a','b','c','d','e'};//不是字符串
char drr[10];//为随机值,不是字符串
//字符数组特有的定义
char err[]="abcd";//是字符串
//char frr[4] = "abcd";//error
char grr[10] = "abcd";//是字符串
char *hrr = "abcd";//字符串常量,内容不能被修改,是字符串
printf("%s\n",arr);//%s输出字符串
printf("%s\n",brr);
printf("%s\n",crr);
printf("%s\n",drr);
printf("%s\n",err);
printf("%s\n",grr);
printf("%s\n",hrr);
return 0;
}
结果:
烫烫烫烫… 0xcccc… 局部变量没有初始话
屯屯屯屯… 0xcdcd… 动态内存没有初始化
4.字符数组使用
(1)复制
str2=str1;//error,不能整体赋值
//将字符串src拷贝到des中
void Mystrcpy(char *des,char *src)//只满足需求,练习用,细节未处理
{
int i;
for(i=0;src[i] != '\0';++i)
{
des[i] = src[i];
}
des[i] = '\0';
}
int main()
{
char str1[10]="abcde";
char str2[10]="xyz";
char str3[10];
//复制str2--str1
//str2 = str1;//error
//不能整体赋值
printf("%s\n",str3);
int i;
for(i=0;str1[i] != '\0';++i)//利用字符串'\0'结尾标记
{
str3[i] = str1[i];
}
str3[i]='\0';
printf("%s\n",str3);
return 0;
}
(2)统计长度
库函数有:
#include <string.h>
//求字符串str的长度.不包含'\0',返回字符串的有效长度,"abcd"-->4
int Mystrlen(char *str)//只满足需求,练习用,细节未处理
{
int i;
for(i=0;str[i] != '\0';++i)
{
}
return i;
}
int main()
{
char str1[10]="abcde";
printf("%d\n",strlen(str1));
printf("%d\n",Mystrlen(str1));
return 0;
}
(3)字符串连接
代码实现:
void Mystrcat(char *des,const char *src)//仅练习,没有优化
{
assert(des !=NULL && src != NULL);
if(des ==NULL || src == NULL)
{
return ;
}
//找尾巴
while(*des != '\0')
{
des++;
}
//复制
while(*des++ = *src++);
}
int main()
{
char str1[10]="abc";
char str2[10]="xyz";
printf("%s\n",str1);
Mystrcat(str1,str2);
printf("%s\n",str1);
return 0;
}
结果:
注意:
(4)比较大小
if(str1 > str2)–不报错,但错误
错误示例:
int main()
{
char str4[]="abcde";
char str5[]="xyz";
char str6[]="abcde";
if(str4 > str5)
{
printf("%s > %s\n",str4,str5);
}
else
{
printf("%s < %s\n",str4,str5);
}
if(str6 > str5)
{
printf("%s > %s\n",str6,str5);
}
else
{
printf("%s < %s\n",str6,str5);
}
return 0;
}
错误结果:
代码:
//比较字符串大小
//"abc"<"x";"abc" == "abc";"abc" >"abb" ;
//逐个比较,按照字典序,只要分出大小,就结束;
//大于返回大于0的数字,相等返回0,小于返回小于0的数字;
int Mystrcmp(const char *str1,const char *str2)
{
assert(str1 !=NULL && str2 != NULL);
if(str1 ==NULL || str2 == NULL)
{
return 0;
}
int tmp;//保存两个字符相减的差值
while((tmp = *str1-*str2) == 0 && *str1 != '\0')
{
str1++;
str2++;
}
return tmp;
}
int main()
{
printf("%d\n",Mystrcmp("abc","x"));
printf("%d\n",Mystrcmp("abc","abb"));
printf("%d\n",Mystrcmp("abc","abc"));
printf("%d\n",Mystrcmp("abc","abcc"));
return 0;
}
结果:
(5)数组和指针:
数组和指针有如下等式:
**p[i] == (p + i);
arr[i] == (arr + i);
int main()
{
char arr[10] = "abcde";
char *p;
p = arr;
p = &arr[2];
printf("%c\n",p[-1]);
//char *p = arr;//数组名表示数组首元素的地址
//char *p = &arr[0];//arr[0] -> char &arr[0] -> char*
return 0;
}
例如:
1.字符串拷贝
void Mystrcpy(char *des,char *src)
{
int i;
for(i=0;src[i] != '\0';++i)
{
des[i] = src[i];
}
des[i] = '\0';
}
void Mystrcpy2(char *des,char *src)
{
int i;
for(i=0;*(src+i) != '\0';++i)
{
*(des + i) = *(src + i);
}
*(des+i) = '\0';
}
void Mystrcpy3(char *des,char *src)
{
while(*src != '\0')
{
*des = *src;
des++;
src++;
}
*des = '\0';
}
//一句实现字符串拷贝,平时不建议使用,可读性不好
void Mystrcpy4(char *des,char *src)
{
while(*des++ = *src++);//很重要,记得
}
对于 while(des++ = src++); 的理解
由于 和 ++的优先级一样,结合性未自右向左;
所以先结合des++和src++,再执行,赋值循环可以实现
由于 = 与 == 不同
所以当循环到 ‘\0’ 时,先执行赋值,再结束循环。
2.输出
int main()
{
char str1[10]="abcde";
for(char *p=str1;*p != '\0';++p)
{
printf("%c",*p);
}
printf("\n");
return 0;
}
结果:
3.复制
5.左++和右++
int main()
{
int i = 10;
int j = i++;
printf("%d\n%d\n\n",i,j);
i = 10;
int z = ++i;
printf("%d\n%d\n\n",i,z);
i = 10;
j = i++;
z = ++i;
printf("%d\n%d\n%d\n\n",i,j,z);
i = 10;
j = ++i;
z = i++;
printf("%d\n%d\n%d\n",i,j,z);
return 0;
}