折半查找一个数:
/* 折半查找法 查找需要查找数的下标;
#include <stdio.h>
int serchItem(int arr[],int len,int key){ //定义了一个函数参数分别代表了 数组arr 长度len 要查找的数key
int low =0;
int high = len-1;
int middle; //定义了三个变量表示的是数组的下标;
while(low<=high){
middle=(low+high)/2;
if(key>arr[middle]){ //如果要查找的数和中间这个数相比要大 那么就往右边查找 此时 low=middle-1;
low = middle+1;
}else if(key<arr[middle]){
high = middle -1;
}else {
return middle;
}
} return -1; //如果查找不到我们要查找的数 那么就直接退出了返回值为-1;
}
int main(){
int loc[10]={13,23,33,43,53,65,76,87,97,98};
serchItem(loc,10,53); //返回给函数实参;
printf("%d",serchItem(loc,10,53)); //打印上面函数的值
return 0;
}
*/
如果想要插入一个数到这个有序的数列里面的话 可以将上面的代码稍微修改下就可以达到:
将 return midlle 改为 return middle +1;这是因为两个数大小一样的话 插入的数就在原来的数上后移一位就可以;
还有就是将return - 1 改为return low 这是因为 如果while这个循环不成立 也就是low>high时,插入的位置应该就是low的位置;
二位数组定义的一般形式:
类型说明符 数组名[常量表达式1][常量表达式2]
其中常量表达式1表示第一维下标的长度,常量表达式2表示第二位下标的长度;例如:
int a[3][4] 这里也可以理解为这是一个三行四列的数组,数组名为a,其下标变量的类型为整型。该数组的下标变量共有3x4=12个;
我们也可以将二维数组看作是一个特殊的一维数组,这个一维数组的每个元素又是一个一维数组;
二维数组初始化:
1.完全初始化:
int a[2][3]={{12,23,45},{1,2,3}};表示出来就是:
12 23 45
1 2 3
连续赋值 int a[2][3]={1,2,3,4,5,6};表示第一维是有1,2,3 第二维是4,5,6;
可以省略第一维
int a[][3]={{1,2,3},{3,4,5},{3,4,5}}相当于int a[3][3]
2.部分初始化
int a[3][3]={{1},{2},{3}}
1 0 0
2 0 0
3 0 0
在二维数组中 可以省略第一维 但是不能省略第二维;
二维数组的元素也成为双下标变量 注意 是变量 是可以给它赋值的例如int a[2][3]=100;
二维数组各元素下标表示如下图:
0 1 2 3
0 00 01 02 03
1 10 11 12 13
2 20 21 22 23
二维数组的遍历 通过for的双重循环就可以实现;就像以前我们打印几排星是一个道理 外层for循环是行 内层是列;
int a[3][4]={1,2,3,4,5,6,7,8,9,10};
for (i= 0 ;i<3;i++){
for (j= 0;j<4;j++){
printf(“%d”,a[j]);
}
} printf(“\n“);
二维数组的存储:
数组的首地址 == 数组名;
数组的首地址== 第一行第一个元素的地址;
第二行的首地址 ==第二行第一个元素的地址;
二维数组占用的总字节数 :
1>每一行的字节数如何计算?
int a[2][2]
a[0]表示第一行;
a[1]表示第二行;
用sizeof(a[0])+sizeof(a[1]);就是将每一行的字节数加起来就是总字节数了
2>元素的个数*元素的类型==行*列*sizeof(数据类型);
3>sizeof(数组名);
二维数组行数的计算:
总字节数/每一行占用的字节数;=sizeof(数组名)/sizeof(数组名[0])
列数的计算:
总字节数=行的总字节数/每个元素占用的字节(数据类型)
列数=sizeof(a[0])/sizeof[int];这里的a[0]是一行的字节数;
应用1:求一个二维数组中的最大值;
#include <stdio.h>
int main(int argc, const char * argv[]) {
//定义一个数组
int score[5][3]={
{80,75,92},
{61,65,71},
{59,63,70},
{85,87,90},
{76,77,85}
};
//定义变量,保存最大值及下标
int max=score[0][0];
//定义变量保存下标
int maxRow=-1;
int maxCol=-1;
for(int i=0;i<5;i++){
for (int j=0; j<3; j++) {
//进行判断 max 和 score[j]
//如果 score[j] > max 存在有比我们假定的临时最大值还大得数
//此时让max存储score[j];
//同时存储 下标 i和j的值
if (score[j]>max) {
max = score[j];
//保存最大的数的下标
maxRow = i;
maxCol = j;
}
}
}
printf("最大值是:%d在%d行%d列位置\n",max,maxRow+1,maxCol+1);
return 0;
}
应用2:求一个二位数组中五个人每门课的平均值以及三门课的平均值:
int main(int argc, const char * argv[]) {
//一个学习小组有5个人,每个人有三门课的考试成绩。每门课程的平均分和三门课的平均分。
int score[5][3]={
{80,75,92},
{61,65,71},
{59,63,70},
{85,87,90},
{76,77,85}
};
int sum;
float total=0.0f; //存储总平均分
//遍历
for (int i=0; i<3; i++) {
//每统计一门课的成绩和之后,统计下一门课之前要清0
sum = 0;
for (int j=0; j<5; j++) {
//a[j] 取出每一列的值
sum += score[j];
}
//(sum / 5.0f)每一门课的平均分
printf("第%d门课的平均分:%.2f\n",i+1,sum/5.0f);
total += (sum / 5.0f);
}
//总平均分
printf("总平均分:%.2f\n",total/3);
return 0;
}
二维数组作为函数的参数
1)数组的元素作为函数的参数
sum(score[1][0],score[2][2]);
此处score[1][0]及score[2][2] 都是一个变量
我们之前已经讲过了,变量作为函数的参数是值传递
2)数组名作为函数的参数
print_arr(score);
此处的score 它是一个常量!!!,保存的事数组的首地址
//
void print_arr(int score[5][3]){
//1)sizeof(score) 能计算出数组的总长度码? 不能!!
数组名作为函数参数注意事项
1)类型和长度要一致
2)二维数组作为函数的形参,可以不写第一维的长度
应用:从键盘接收数据构成二维数组
#include <stdio.h>
/**
这是一个二维数组的初始化函数
*/
void initArray(int m,int n,int a[m][n]){
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
//给数组的每个元素都要赋值
a[j] = (i+1) * (j+1);
}
}
}
/**
* 遍历打印数组的元素值
*
* @param m 行
* @param n 列
* @param a 数组名
*/
void printArray(int m,int n,int a[m][n]){
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
printf("%d\t",a[j]);
}
printf("\n");
}
}
int main(int argc, const char * argv[]) {
//定义变量
int m,n;
//提示用户输入两个数
printf("请输入数组的行数和列数,用逗号分隔:\n");
//接收用户输入的值
scanf("%d,%d",&m,&n);
//构建数组
int arr[m][n];
//调用初始化函数
initArray(m,n,arr);
//调用打印数组的函数
printArray(m, n, arr);
return 0;
}
字符串的概念:字符串是位于双引号中的字符序列;
在内存中 以\0结束,所占字节比实际多一个;
我们可以把字符常量赋值给一个字符变量char ch = ‘a’ 但是不能把字符串赋值给字符变量
在C语言中没有字符串变量,可以用字符数组来存储字符串;
字符数组的定义:
1)一维字符数组(用来存储字符的数组)定义
char 数组名[数组长度];
char ch[5];
char ch[5+2];
int len = 4;
char ch[len];
char ch[M+2]; //M是宏定义字符
2)二维字符数组的定义
char arr[4][10];
字符数组初始化和引用
1、初始化
1)定义同时进行初始化
char ch[5]={'a','b','c','e','f'};
char ch[]={'a','b','c','e','f'};
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';
2、引用(遍历)
3、字符数组是用来保存字符串的
字符数组作用:
1)保存字符
2)保存字符串
//用字符数组保存字符串,第一种初始化方法
char str[4]={"abc"};
//str[0] a
//str[1] b
//str[2] c
//str[3] \0
//第二种初始化方法
char str2[4]="abc"; |
|