黑马程序员-----------C语言基础-----------字符串

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一:选择排序
1.选择排序原理:


2.选择排序的代码实现:
#include <stdio.h>
void selectSort(int arr[],int len);
int main(){
int a[10]={23,12,4,67,20,100,21,45,3,28};
selectSort(a,10);
//遍历输出数组
for(int i=0;i<10;i++){
printf("%d,"a[1]);
}
printf("\n");
return 0;
}
//选择排序
void selectSort(int arr[],int len){
int temp;
for(int i=0;i<len-1;i++){


for(int j=i+1;j<len;j++){
//交换依据
if(arr[i]>arr[j])
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}


二:折半查找
1.实现步骤:


2.折半查找的条件:
1)必须是一个有序的数组
2)当L>H时就说明查找失败了。
3.折半查找的代码实现:
#include <stdio.h>
	int searchItem(int arr[],int len,int key);
	int main(){
		int a[]={3,4,12,20,21,23,28,45,67,100};
		//查找key值为20
		
		int loc = searchItem(a,10,45);
		printf("loc=%d\n",loc);
	return 0;
		}
	//使用折半查找查找一个数
	int searchItem(int arr[],int len,int key){
	//先定义变量
	int low =0,high=len-1,mid;
	//循环
	while(low<=high){
	//计算mid的位置
	mid = (low+high)/2;
	//判断key  a[mid]
	if(key>arr[mid]){
	//key>a[mid]    low = mid +1;
	low = mid + 1;
	}else if(key<arr[mid]){
	//key<a[mid]    high = mid -1;	
	high = mid -1;}
	else
	//key==a[mid]    //return mid;
	return mid;
		}
	}
	//查找不到的情况
	return -1;
	}



4.使用折半查找法插入一个数据,返回要插入数据的位置,代码实现如下:
#include <stdio.h>
	int searchItem(int arr[],int len,int key);
	int main(){
		int a[]={3,4,12,20,21,23,28,45,67,100};
		//查找key值为20
		
		int loc = searchItem(a,10,45);
		printf("loc=%d\n",loc);
	return 0;
		}
	//使用折半查找查找一个数
	int searchItem(int arr[],int len,int key){
	//先定义变量
	int low =0,high=len-1,mid;
	//循环
	while(low<=high){
	//计算mid的位置
	mid = (low+high)/2;
	//判断key  a[mid]
	if(key>arr[mid]){
	//key>a[mid]    low = mid +1;
	low = mid + 1;
	}else if(key<arr[mid]){
	//key<a[mid]    high = mid -1;	
	high = mid -1;}
	else
	//key==a[mid]    //return mid=1;
	return mid+1;
		}
	}
	//查找不到的情况
	return low;
	}



三:二维数组的定义
1.二维数组定义的一般形式:
类型输说明符   数组名[常量表达式1][常量表达式2]
2.注意事项:
1)数组名不能和变量名同名
2)数组长度可以是常量表达式
3)Xcode特有的定义数组的方式:int m=3,n=4;  int arr[m][n];
4)宏定义写法:  define M 3
int a[2+M][4];


四:二维数组的初始化
1.定义的同时初始化
1)完全初始化
int a1[2]={1,2};
int a[2][3]={{2,4,6},{22,77,3}};  //1.分段赋值
int a[2][3]={1,2,3,4,5,6}; //2.连续初始化
int a[][3]={{1,2,3},{4,5,6},{7,8,9}};//可以省略第一维
int a[][3]={1,2,3,4,5,6};//等同于a[2][3]
2)部分初始化
int a[3][4]={1}; //只有a[0][0]=1,其他位置为0
1 0 0 0
0 0 0 0
0 0 0 0
int a[3][4]={{1},{2},{3}};
1 0 0 0
2 0 0 0
3 0 0 0
int a[3][4]= {1,2,3,4,5};
1 2 3 4
5 0 0 0
0 0 0 0
2.先定义,后初始化
int a[3][4];
a[0][0] = 1;
...
...
a[2][3] = 12;


五:二维数组的存储细节
1.总字节数的求法:
1)总字节数=行*列*sizeof(数组类型);
2)总字节数=sizeof(数组名);
2.计算数组行的总字节数
第一行总字节数=sizeof(a[0]); //假如已经定义过int a[2][3];
3.每一行多少列
列数= 行总字节数/每个元素的字节
len = sizeof(a[0])/sizeof(int);


六:迷宫游戏
1.伪代码实现
//******定义变量
//1)定义变量,地图,存储用户输入的方向,小人位置


//2)先打印一遍地图

//3)提示用户游戏玩法

//*******要进行循环控制
//4)接收用户输入的方向


//5)判断用户输入了什么方向


//******判断小人能否移动
//6)判断小人是否能否移动
//核心要知道小人的下一个位置是否是路
//是路:
//让小人开始移动,移动核心:小人和路交换
//重新记录小人的当前位置
//不是路:什么也不做

//******判断是否走出来
//判断y的值是否==5
//是:提示已走出迷宫
//break;游戏结束




2.迷宫游戏代码实现
#include <stdio.h>
	#define COL 6
	#define ROW 6
	int main(){
		//定义地图
		char map[ROW][COL]={
		{'#','#','#','#','#','#'},
		{'#','O','#','#',' ',' '},
		{'#',' ','#','#',' ','#'},
		{'#',' ',' ','#',' ','#'},
		{'#','#',' ',' ',' ','#'},
		{'#','#','#','#','#','#'}
		};


		//保存用户输入的方向
		char direction;
		//定义变量定义小人当前位置
		int i,j,currentX=1;
		int currentY=1;
		//定义变量保存路
		char street = ' ';
		char ch;	//吸收换行字符
		//打印一遍地图
		for(i=0;i<ROW;i++){
			for(j=0;j<COL;j++){	
				printf("%c",map[i][j]);
		}
			printf("\n");
		}
	//提示用户玩法
		printf("请控制小人移动:w.上 s.下 a.左 d.右 q.退出 \n");
	//要进行循环控制
	while(1){
		//4)接收用户输入的方向
		scanf("%c",&direction);
		scanf("%c",&ch);
	//5)判断用户输入了什么方向
		switch(direction){
			case 'w':
			case 'W':
			//6)判断小人是否能否移动
			if(map[currentX-1][currentY]==street)
			{
		//核心要知道小人的下一个位置是否是路
		//是路:
			//让小人开始移动,移动核心:小人和路交换
			char temp;	
			temp = map[currentX][currentY];
			map[currentX][currentY] = map[currentX-1][currentY];
			map[currentX-1][currentY] = temp;
			//重新记录小人的当前位置
			currentX--;
		
			}
			 //不是路:什么也不做
			break;


			case 's':
			case 'S':
			//6)判断小人是否能否移动
			if(map[currentX+1][currentY]==street)
			{
		//核心要知道小人的下一个位置是否是路
		//是路:
			//让小人开始移动,移动核心:小人和路交换
			char temp;	
			temp = map[currentX][currentY];
			map[currentX][currentY] = map[currentX+1][currentY];
			map[currentX+1][currentY] = temp;
			//重新记录小人的当前位置
			currentX++;
		
			}
			 //不是路:什么也不做
			break;


			case 'a':
			case 'A':
			//6)判断小人是否能否移动
			if(map[currentX][currentY-1]==street)
			{
		//核心要知道小人的下一个位置是否是路
		//是路:
			//让小人开始移动,移动核心:小人和路交换
			char temp;	
			temp = map[currentX][currentY];
			map[currentX][currentY] = map[currentX][currentY-1];
			map[currentX][currentY-1] = temp;
			//重新记录小人的当前位置
			currentY--;
		
			}
			 //不是路:什么也不做
			break;
	
			case 'd':
			case 'D':
			//6)判断小人是否能否移动
			if(map[currentX][currentY+1]==street)
			{
		//核心要知道小人的下一个位置是否是路
		//是路:
			//让小人开始移动,移动核心:小人和路交换
			char temp;	
			temp = map[currentX][currentY];
			map[currentX][currentY] = map[currentX][currentY+1];
			map[currentX][currentY+1] = temp;
			//重新记录小人的当前位置
			currentY++;
		
			}
			 //不是路:什么也不做
			break;


			case 'q':
			case 'Q':
			return 0;
			break;
			
			default:
				break;
		}
		
		//重绘地图
		
	for(i=0;i<ROW;i++){
			for(j=0;j<COL;j++){	
				printf("%c",map[i][j]);
		}
			printf("\n");
		}
	//******判断是否走出来
	//判断y的值是否==5
	
		if(currentY==5){
			printf("恭喜你,走出了迷宫!\n");
			break;
			}
		//是:提示已走出迷宫
		//break;游戏结束


	}
	return 0;
	}



七:字符串的基本概念
1.字符串是位于双引号中的字符序列
2.在内存中以"\0"结束,所占字节比实际多一个字节
3.可以把一个字符常量赋值给一个字符变量,但是不能把一个字符串常量赋值给字符变量
4.C语言中没有字符串变量,可以用字符数组来存放字符串


八:字符数组
1.定义形式与前面介绍的数值数组相同
char  数组名[常量表达式];
2.字符数组的初始化
1)定义同时进行初始化
char ch[5]={'a','b','c','d','e'};
char ch[]={'a','b','c','d','e'};
char ch1[3]={'a'}; // a \0 \0
char ch2[5]={[3]='b'};
2)先定义后初始化
char ch3[3];
ch[0] = 'a';
ch[1] = 'b';
ch[2] = 'c';

3.引用(遍历)

3.字符数组是用来保存字符串的
字符数组的作用:
1)保存字符
2)保存字符串
//用字符数组保存字符串
第一种方法:char str[15]={"helloworld!"};
第二种方法:char str[15]="helloworld!";
第三种方法:char str[]="helloworld!";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值