------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
——————————————————————————————————————————————————————————————————
1、strlen()是函数。
strlen()是以字符为单位计算字符串或字符数组的实际长度(不考虑末尾的\0),如果字符串字符数组中间有\0,则计算\0之前的长度。
如:
char a[]="heima";
char b[]={'h','e','i','m','a'};
printf("a=%d\n",strlen(a)); //a=5
printf("b=%d\n",strlen(b)); //b=5
char a[]="he\0ima";
char b[]={'h','e','\0','i','m','a'};
printf("a=%d\n",strlen(a)); //a=2
printf("b=%d\n",strlen(b)); //b=2
2、sizeof是关键字,后面的()可写可不写
(1)sizeof计算字符串的长度,是字符串实际长度+1。
char a[]="heima";
printf("a=%d\n",sizeof(a)); //a=6
(2)sizeof计算字符串的长度,如果字符串中间有\0,没有影响。
(3)sizeof计算字符数组的长度,就是字符数组实际的长度,中间有\0不影响
char b[]={'h','e','\0','i','m','a'};
printf("b=%d\n",sizeof(b)); //b=6
综上:自定义的字符串系统自动给字符串加上结束符\0,字符数组结束系统不会自动加上结束符\0
3、冒泡排序
void main(char argc,const char * argv[]){
//从键盘获取10个数放入到数组中,然后找出10个数中最大的数
//定义变量,记录10个数字中的最大值
int max=0;
//创建数组
int numbers[10];
//记录数组长度
int length=sizeof(numbers)/sizeof(int);
//使用for循环,循环输入10个数字,并放入到数组
for(int i=0;i<length;i++){
//提示用户输入10个数字
printf("请输入%d个数字:",i+1);
scanf("%d\n",&numbers[i]);
}
//冒泡排序,有n个数,就循环n-1次
//外层为什么要length-1?
//4个数互相比较需要比3次,3个数互相比较需要比2次,所以n个数比较就要比n-1次
for(int i=0;i<length-1;i++){
//内层为什么要length-n?
//外层每循环一次,都会有一个数字下沉,循环两次就有两个数字下沉,n次就会有n个数字下沉
//为了程序更有效率的对数字排序,我们将已经下沉的数字不再参与到下次的比较,也就是让剩下的数进行比较
//length-n就是n次循环后剩下的数字的个数,length-n-1就是剩下的数字需要互相比较的次数
for(int j=0;j<length-1-i;j++){
if(numbers[j]>numbers[j+1]){
//max相当于中转站,让两个数互转位置的同时不至于丢失其中一个数据
max=numbers[j];
numbers[j]=numbers[j+1];
numbers[j+1]=max;
}
}
}
//for循环打印排序后的数组
for(int i=0;i<length;i++){
printf("%d \n",numbers[i]);
}
}
4、选择排序
//选择排序,从小到大排列。
void main(char argc.const char * argv[]){
int number[6]={2,1,3,7,4,9};
int temp=0;
int length=sizeof(number)/sizeof(int);
for(int i=0;i<length-1;i++){
for(int j=i+1;j<length;j++){
if(number[i]>number[j]){
temp=number[i];
number[i]=number[j];
number[j]=temp;
}
}
}
}
5、折半查找
//如果key大于中间值,则让最小值=中间值+1
//如果key小于中间值,则让最大值=中间值-1
//如果最小值大于最大值,则证明要找的数不存在
void main(char argc.const char * argv[]){
int number[]={3,4,12,20,21,23,28,45,67,100};
//查找20
int low=0;
int high=sizeof(number)/sizeof(int)-1;
int mid=0;
//要查找的数
int key=20;
while(min<=max){
mid=(low+high)/2;
if(key>number[mid]){
low=mid+1;
}else if(key<number[mid]){
high=mid-1;
}else{
printf("找到了");
}
}
printf("没找到");
}
6、约瑟夫环
/*耶稣有15个门徒,其中有一个就是出卖耶稣的叛徒,请用排除法找出这位叛徒:15人围坐一圈,从第一个开始报号:1,2,3,1,2,3……,凡是报到“3”就退出圈子,最后留在圈内的人就是出卖耶稣的叛徒,请找出它原来的序号。(C语言)
*/
#include <stdio.h>
#include <stdlib.h>
void main()
{
//先初始化人
int people[100];
int len=sizeof(people)/sizeof(int);
for(int i=0;i<len;i++){
people[i]=i+1;
}
//队列里的人
int left=len;
//当前的人报的数
int counter=0;
//控制while循环
int j=0;
while(1){
//只要这个人的值不为0,就让这个人喊数,函数范围是1 2 3
if(people[j]>0){
counter++;
}
//每当有人喊3的时候,就从队列中走一个人,同时让喊3的这个人变成0
//并且让下一个喊数的人从0开始喊,这样在下一次循环的时候,counter+1,这个人喊的数就变成了1
if(counter==3){
left--;
people[j]=0;
counter=0;
}
//当队列里只剩一个人的时候退出
if(left==1){
break;
}
j++;
//以下是测试
printf("j=%d,people[j]=%d,counter=%d,left=%d\n",j,people[j],counter,left);
//防止数组越界
//if(j==len){
// j=0;
//}
//测试的小技巧,按回车继续
//getchar();
}
for(int i=0;i<len;i++){
if(people[i]>0){
printf("这个数是:%d,索引是:%d",people[i],i);
}
}
}