码迷,mamicode.com
首页 > 移动开发 > 详细

黑马程序员--IOS学习笔记--数组及排序

时间:2015-06-17 09:39:59      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:数组   找最大值   冒泡排序   数组下标越界问题   

IOS学习笔记

概述:

    8_2、改变整型变量的符号
    8_2、改变整型变量所占存储空间
    8_3、char类型数据存储
    8_4、数组的基本概念及分类
    8_5、数组元素作为函数参数
    8_5、一维数组定义及注意事项
    8_6、一维数组初始化
    8_7、一维数组一个让人疑惑的问题
    8_8、一维数组的引用
    8_9、应用:数组遍历
    8_10、一维数组的存储方式
    8_11、一维数组的地址
    8_12、一维数组长度计算方法
    8_13、一维数组的越界问题
    8_14、应用:找最大值
    8_15、数组元素作为函数参数
    8_16、数组名作为函数参数
    8_17、数组名作为函数参数的注意点
    8_17、数组名作为函数参数的注意点-补充
    8_18、冒泡排序的思想
    8_18、冒泡排序的思想-补充
    8_19、冒泡排序代码实现


整形变量修饰符介绍(修饰符包括:int  short  long  【long long】  signed  unsigned)


1、改变整形变量所占存储空间
    short      2个字节   输出用%hd    short int a=4;-->占有两个字节     printf("%hd\n",变量名);
    例如:short int a=1;
          short int a1=a<<15;    //让a左移15位,最小的负数
          a1=(a<<15)-1;          //左移15位,最大的正数    
          printf("d%\n",a1);
    short 修饰的int占两个字节,共占16位
    表示的范围是:
        10000000 00000000  -->最小的负数   -32768
        01111111 11111111  -->最大的正数    32767


    int        4个字节   输出用%d 或者 %i           -->占有四个字节
    例如:int b=1;
          int b1=b<<31;
          b1=(b<<31)-1;    //左移31位
          printf("d%\n",b1);
    表示的范围是:
        10000000 00000000 00000000 00000000 -->最小的负数   -2147483648
        01111111 11111111 11111111 11111111 -->最大的正数    2147483647


    long       8个字节   输出用%ld    -->占有八个字节
    例如:long int c=1;
          long int c1=c<<63;    //左移63位
          c1=(c<<63)-1;
          printf("c1 = ld%\n",c1);
    表示的范围是:
        10000000 00000000 00000000 00000000 ... 00000000 (共64位)  -->最小的负数   -9223372036854775808
        01111111 11111111 11111111 11111111 ... 11111111 (共64位)  -->最大的正数    9223372036854775807


    long long  8个字节   输出用lld%(主要是为了解决32位机器问题)-->占有八个字节
    注意:所有修饰符都是用来修饰整形变量的。
    * long long类型
    在32位系统下:
      long       占4个字节(改变整形变量的存储空间)
      long long  占8个字节
    在64位系统下:
      long       占8个字节
      long long  占8个字节


2、改变整形变量的符号
    signed       表示是有符号的(计算机默认是有符号的)
    unsigned     表示是一个无符号的数(改变整形变量的符号,正数的取值范围会扩大一倍。) 输出用u%      printf("u%\n",变量名);






3、char类型数据存储
  1)char 型常量的存储问题
     sizeof(‘a‘) 
        -->先找到‘a‘的ASCII码值   -->97  
        -->把 97 按照int类型进行  -->00000000 00000000 00000000 01100001
     char ch=‘a‘
        -->97   
        -->把97转换为 2 进制      01100001    一个字节
        -->把一个字节存储到内存中
      总结:char类型的常量和变量的存储方式是不一样的。(注:在Xcode环境下。如果在其他环境下可能一样)
    一个字节的范围:0--127  用做常见的字符的ASCII码




4、数组的基本概念以及分类
  1)基本概念:
     在程序设计中,为了数据处理方便,我们把具有相同类型的若干变量按照有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。
     在 C 语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本类型或者是构造类型。
  2)数组的几个名词:
     什么是数组:一组具有相同数据类型的数据的有序集合。
     数组元素:构成数组的数据。数组中的每一个数组元素具有相同的名称,不同的下标,可以作为单个变量使用,所以也称为下标变量。
     数组的下标:就是数组元素的位置的一个索引或指示。
     数组的维数:就是数组下标的个数。数据数组的维数可以将数组分为一维数组、二维数组、三维数组、多维数组。


     按存储的内容分类:按数组元素的类型不同,数组又分为:
         数值数组:用来存储数组
         字符数组:用来存储字符
         指针数组:用来存放指针(地址)
         结构数组:用来存放一个结构体类型的数据
     按照维度分类:
         一维数组:
         二维数组:
         三维数组:
         多维数组:


5、数组元素作为函数参数
  1)数组可以作为函数的参数使用,进行数据的传递。
       a、一种是把数组元素(下标变量)作为实参使用;
          数组元素就是下标变量,它与普通变量并没有区别。因此它作为函数实参使用与普通变量时完全相同的,在发生函数调用时,把作为实参的数组元素的值传递给形参,实现单向的值传递。 
       b、一种是把数组名作为函数的形参和实参使用。


6、一维数组的定义以及注意事项
  1)一维数组的介绍:
      如果一个数组的所有元素都是基本数据类型,那么该数组称为一维数组
  2)一维数组的定义
      在C语言中使用数组必须先进行定义。一维数组的定义方式:
     类型说明符  数组名[常量表达式]
 a、类型说明符:是任一种基本数据类型或构造数据类型。
 b、数组名:用户定义的数组标示符。
 c、方括号中的常量表达式:表示数据元素的个数,也称为数组的长度。
 例如:int a[10];          //定义整形数组a,有10个元素
       float b[10],c[20];  //定义实型数组b,有10个元素,定义实型数组c,有20个元素。

    注意:a、数组的长度可以是一个常量,也可以是常量表达式。
          b、数组的命名规则:严格按照标示符的命名规范。
 c、数组名称不能和其他变量同名。
 d、数组的长度不可以为一个变量(C99标准要求的)
 e、数组的长度可以使用 宏定义(#define M 5        int a[M]   -->此时M是一个宏定义)
 f、定义数组的时候,还可以定义普通变量。(如:int x,y,z[9];)
  3)一维数组的初始化:
     数组初始化赋值是指在数组定义时给数组赋予初值。数组初始化是在编译阶段进行的。这将减少运行时间,提高效率。
     初始化方式有两种:
    a、定义的同时初始化
    例如:
    类型说明符 数组名[常量表达式]={值1,值2,值3...值n};
    实例:int a[3]={1,4,2};     //长度由[]中的值决定的
      int b[]={2,5,7,6};    //长度是由{}中的值的个数决定的
          int c[10]={[3]=23,[8]=34};//定义长度为10的数组,下标为3的元素的值为23,下标为8的数组元素为34
b、先定义、后初始化
        类型说明符 数组名[常量表达式];
数组名[0]=值;
数组名[1]=值;
数组名[2]=值;
实例:int d[10];
                   d[0]=1;//为下标为0的数组元素赋值为1;即数组的第一个元素值为1;
                   d[1]=2;//为下标为1的数组元素赋值为2;即数组的第二个元素值为2;
  d[2]=3;//为下标为2的数组元素赋值为3;即数组的第三个元素值为3;
  ...
  d[9]=100;//为下标为9的数组元素赋值为100;即数组的第十个元素值为100;
  4)一维数组中让人疑惑的问题:
     数组如果没有初始化,数组中到底有没有值?如果有,值是多少?如果数组部分进行了初始化,那么没有初始化的那些元素有没有值,如果有,值是多少?
    a、数组如果没有初始化,数组中的元素是有值的。值是垃圾值。
b、如果数组部分进行了初始化,那么没有初始化的那些元素有值,如果有,值是0。
    c、如果是字符数组进行了部分初始化,那么没有初始化的部分也有值,值为ASCII码对应的默认值。
 
  5)一维数组的引用方式
     数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方式是数组名后跟一个下标。下标表示了元素在数组中的顺序号。
特别强调:使用先定义后初始化的方式,如果部分数组元素被初始化了,系统不会对没有初始化的那部分元素进行赋值0的操作。
 
  6)一维数组的存储方式
     存储方式:
    a、计算机会给数组分配一块连续的存储空间;
b、数组名代表数组的首地址,从首地址位置,依次存入数组的第一个、第二个、...、第n个元素;
c、每个元素占用相同的字节数(取决于数据类型)
d、并且元素之间的地址是连续的。
 
  7)一维数组的地址
     一维数组的地址:
    a、数组内部的元素地址是连续的;
b、数组名存放的是数组的首地址-->数组的首地址:数组的第一个元素首地址(第一个元素的第一个字节的地址)
c、补充:数组名==&数组名[0];   数组名是一个常量  存储的就是数组的首地址
d、数组的每个元素的地址
     
  8)一维数组长度计算方法
     a、因为数组在内存中占用的字符数取决于其存储的数据类型和数据个数
b、数组在内存中占用的总字节数:sizeof(数组名);
c、计算数组长度的方法:
   数组的长度=数组占用的总字节数/数组元素占用的字节数
例如:int a[]={1,5,3,2,7,4,9,23,46,47,36};
     int a_len=sizeof(a)/sizeof(int);


  9)一维数组的越界问题
     数组下标越界是不安全的,因为这个空间不属于你。可能会有数据丢失现象发生。
 
  10)应用:找最大值
     //通过for循环,从键盘获取10个数,存放到数组中。找出10个数中的最大值
void main(){
int a[10];
//循环接收用户输入
for(int i=0;i<10;i++){
printf("请输入第%d个数\n",i+1);
//接收数据,保存到数组中
scanf("%d",&a[i]]);
}
//遍历数组,输出看看输入的10个值
for(int i=0;i<10;i++){
printf("%d\t",a[i]);
}

//找出最大值
int max=a[0];
for(int i=0;i<10;i++){
if(max<a[i]){
max=a[i];
}
}
printf("输入的最大值为:%d\n",max);
}


  11)数组名作为函数参数
     a、用数组元素作为函数参数不要求形参也必须是数组元素,但是用数组名作为函数参数时,则要求形参和相对应的实参都必须是类型相同的数组。
b、在C语言中,数组名除作为变量的标示符之外,数组名还代表了该数组在内存中的起始地址,因此,当数组名作为函数参数时,实参与形参之间不是“值传递”,而是“地址传递”,实参数组名将该数组的起始地址传递给形参数组,两个数组共享一段内存单元,编译系统不再为形参数组分配存储单元。
c、在变量作为函数参数时,所进行的值传递是单向的。即只能从实参传向形参,不能从形参传回实参。形参的初值和实参相同,而形参的值发生改变后,实参并不变化,两者的终值是不同的。
     
  12)数组名作为函数参数的注意点
     a、形参数组和实参数组的类型必须一致,否则将引起错误;
b、形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。当形参数组的长度与实参数组不一致时,虽然不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应该注意的。
c、在函数形参表中,允许不给出形参的长度,或用一个变量来表示数组元素的个数。例如,可以写为:
    void nzp(int a[])   或者写为:  void nzp(int a[],int n)
其中行参数组a没有给出长度,而由n值动态地表示数组的长度。n的值由主调函数的实参进行传递。
d、多维数组也可以作为函数的参数。在函数定义时对行参数组可以指定每一维的长度,也可以省去第一维的长度。因此,下面写法都是合法的:
    int MA(int a[3][10])      或者:  int MA(int a[][10])
 
  13)数组名作为函数参数的注意点
     a、C语言中规定,不管是什么类型的数据,数据的内存地址在内存中占用8个字节


  14)冒泡排序思想
     冒泡排序(Bubble sort)是一种简单的排序算法。
冒泡排序分为:
    a、大数下沉
b、小数上浮
冒泡排序步骤:
         a、比较相邻的元素。如果第一个比第二个大,就交换他们的位置。
b、对每一对相邻的元素做同样的工作,从开始第一对到结尾最后一对。在这一点,最后的元素应该会是最大的数。
c、针对所有的元素重复以上的步骤,除了最后一个。
d、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数组需要比较。
     代码实现:
void maoPao(int nums[],int len){
int temp;
for(int i=0;i<len-1;i++){
for(int j=0;j<len-1-i;j++){
if(nums[j]<nums[j+1]){
temp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=temp;
}
}
}
}

void main(){
int nums[10]={1,5,2,7,6,9,3,4,15,74};
printf("排序前:");
for(int i=0;i<10;i++){
printf("%d\t",nums[i]);
}
maoPao(nums,10);
printf("排序后:");
for(int i=0;i<10;i++){
printf("%d\t",nums[i]);
}
}



黑马程序员--IOS学习笔记--数组及排序

标签:数组   找最大值   冒泡排序   数组下标越界问题   

原文地址:http://blog.csdn.net/itclody/article/details/46526533

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!