A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© wxh794708907 中级黑马   /  2015-7-21 21:43  /  844 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

3 个回复

倒序浏览
笔记很详细,学习啦
回复 使用道具 举报
记这么多   不错!
回复 使用道具 举报
我的呸 发表于 2015-7-22 08:35
笔记很详细,学习啦

嘿嘿 详细一点好
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马