折半查找一个数: 
/* 折半查找法 查找需要查找数的下标; 
#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"; |   
        
 
    
    
    
     
 
 |