二分法
int main(void)
{
int a[] = {1,-2,3,-4,5,-6,7,8,-9,0};
int n;
scanf("%d",&n);
int len = sizeof(a) / sizeof(a[0]);
#先进行排序
int i, j;
for(j = len - 1;j > 0;--j)
{
for(i = 0;i < j;++i)
{
if(a[i] > a[i + 1])
{
int t;
t = a[i];
a[i] = a[i + 1];
a[i + 1] = t;
}
}
}
for(i = 0;i < len;++i)
{
printf("%d,",a[i]);
}
printf("\b \n");
#取中指和所找的数进行比较
int begin,end,mid;
begin = 0;
end = len - 1;
while(begin <= end)
{
mid = (begin + end)/2;
if(a[mid] > n)
{
end = mid - 1;
}
else if(a[mid] < n)
{
begin = mid + 1;
}
else
{
break;
}
}
if(begin <= end)
{
printf("found index%d = %d\n", mid,a[mid]);
}
else
{
printf("not found\n");
}
return 0;
}
字符数组
用来存放字符数据的数组是字符数组。
C语言用字符数组存放字符串,字符数组中的各元素依次存放字符串的各字符
存放一个字符串(每个数组元素存放一个字符)
定义格式: char 数组名[常量表达式];
例如:char s[6]; //s数组具有6个元素,可以存放长度小于或等于5的字符串。
字符数组的初始化
如果在定义字符数组时不进行初始化,则数组中各元素的值是不可预料的
如果花括号中提供的初值个数(即字符个数)大于数组长度,则出现越界访问
如果提供的初值个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度
如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符(即'\0')
用字符串常量对字符数组初始化
例如:(1)char str[6]={"CHINA"};
(2)char str[6]="CHINA"; //省略{}
(3)char str[ ]="CHINA"; // 省略长度值
(4)char c[12]={"HOW ARE YOU"};
(5) char c[ ]={'H','O','W',' ','A','R','E',' ','Y','O','U','\0'};
输入与输出
输入:
scans",s);输入不能带空格,回车,TAB;
gets(s);char *gets(char *s);有越界访问的问题;
fgets(s) char *fgets(char *s, int size, FILE *stream);
例:fgets(s,sizeof(s) / sizeof(s[0]),stdin);
输出:
puts(字符数组)
向显示器输出一个字符串(输出完,换行)
字符数组的基本操作:
1.有效字符:
int main(void)
{
char s[100] = "Hello World!";
int i = 0;
while(s[i] != '\0')
{
++i;
}
printf("%d\n",i);
return 0;
}
可使用strlen(s),使用时调用#include<string.h>
2.拷贝:
int main(void)
{
char s1[100] = "Hello World!";
char s2[100];
int i = 0;
while(s1[i] !='\0')
{
s2[i] = s1[i];
++i;
}
s2[i] = '\0';
puts(s2);
return 0;
}
可使用strcpy(s2,s1); s2为目标,s1为源;字符串的拷贝不能用 赋值运算符
3.连接
int main(void)
{
char s1[100] = "Hello";
char s2[100] = "World";
int i = 0;
while(s1[i] !='\0')
{
++i;
}
int j = 0;
while(s2[j] != '\0')
{
s1[i] = s2[j];
++i;
++j;
}
s1[i] = '\0';
puts(s1);
return 0;
}
可使用strcat(s1,s2); 把s2 加到s1里面
- 符数组1必须足够大
- 连接前,两串均以'\0'结束;连接后,串1的'\0'取消,新串最后加'\0'。
4.比较
int main(void)
{
char s1[100] = "Hello!";
char s2[100] = "Hello";
int i = 0;
while(s1[i] == s2[i] && s1[i] !='\0'&& s2[i] !='\0')
{
++i;
}
printf("%d\n",s1[i] - s2[i]);
return 0;
}
可使用strcmp(s1,s2);
s1>s2 返回结果大于0
s1=s2 返回结果等于0
s1<s2 返回结果小于0