黑马程序员———C语言———【strlen()和sizeof()的区别、排序、算法】

------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);
        }
   }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值