关闭

《c语言从入门到精通》看书笔记——第8章 数组

标签: c语言数组用法数组排序获取系统日期和时间字符串处理函数
220人阅读 评论(0) 收藏 举报
分类:
1、一维数组
     一维数组是用于存储一维数列中数据的集合。一般形式为
          类型说明符  数组标识符[常量表达式]  ,例如:int iArray[5];
     一维数组的引用:
          数组标识符[下标]  ;例如:iArray[2];
     一维数组的初始化:
          (1)定义数组时直接对数组元赋初值
          (2)只给一部分元素赋值,为赋值的部分元素值为0
          (3)在对全部数组元素赋初值时可以不指定数组长度
2、二维数组
     一般形式:数据类型 数组名[常量表达式1][常量表达式2]
          常量表达式1为行下标,常量表达式2为列下标
     二维数组元素的引用形式:
          数组名[下标][下标]
      二维数组的初始化
          (1)可以将所有数据写在一个大括号内,按照数组元素排列顺序最元素赋值
          (2)在为所有元素赋值时,可以省略行下标,但是不能省略列下标
          (3)可以分行个数组元素赋值。例如:int a[2][3]={{1,2,3},{4,5,6}}
          (4)二维数组也可以直接对数组元素赋值
3、字符数组
     数组中的元素类型为字符型时称为字符数组。字符数组的定义和使用方法和其他类型的数组类似。
     字符数组的结束标志是“\0”,即,要比数值型数组存储时多用一个字节。
4、多维数组
     多维数组的声明和二维数组相同,只是下标更多。
5、数组的排序算法
     (1)、选择法排序:指每次选择所要排序的数组中的最大值(由大到小排序)的数组元素,将这个数组元素的值与前面没有进行排序的数组元素互换。即:最后一个元素和最前面没有排序的数比较
     /*从小到大排序*/
     for(i=0;i<9;i++)                     /*设置外层循环为下标0~8的元素*/
     {
          iTemp = a[i];                     /*设置当前元素为最小值*/
          iPos = i;                         /*记录元素位置*/
          for(j=i+1;j<10;j++)           /*内层循环i+1到9*/
          {
               if(a[j]<iTemp)                /*如果当前元素比最小值还小*/
               {
                    iTemp = a[j];          /*重新设置最小值*/
                    iPos = j;                /*记录元素位置*/
               }
          }
          /*交换两个元素值*/
          a[iPos] = a[i];
          a[i] = iTemp;
     }
     (2)、冒泡法排序:指在排序时,每次比较数组中相邻的两个数组元素的值,将较小的数(从小到大排序)排在较大的数前面。即:从最后一个元素开始依次和前面的元素比较,小则靠前。
     /*从小到大排序*/
     for(i=1;i<10;i++)                     /*外层循环元素下标为1~9*/
     {
          for(j=9;j>=i;j--)                /*内层循环元素下标为i~9*/
          {
               if(a[j]<a[j-1])           /*如过前一个数比后一个数大*/
               {
                    /*交换两个数组元素的值*/
                    iTemp  = a[j-1];
                    a[j-1] = a[j];
                    a[j]   = iTemp;
               }
          }
     }
     (3)、交换法排序:将每一位数与气候的所有数一一比较,如果发现符合条件的数据则交换数据。即,依次比较,满足条件换,没满足条件就保持那个位子,然后由又用前面的数依次比较。
      /*从小到大排序*/
     for(i=0;i<9;i++)                     /*外层循环元素下标为0~8*/
     {
          for(j=i+1;j<10;j++)                /*内层循环元素下标为i+1到9*/
          {
               if(a[j] < a[i])                /*如果当前值比其他值大*/
               {
                    /*交换两个数值*/
                    iTemp = a[i];
                    a[i]  = a[j];
                    a[j]  = iTemp;
               }
          }
     }   
     (4)、插入法排序:基本工作原理是抽出一个数据,在前面的数据中寻找相应的位置插入,然后继续下一个数据,直到完成排序。即取一个数放一个位置,取后一个数与前面排好了的数比较再放入。
     /*从小到大排序*/
     for(i=1;i<10;i++)                                    /*循环数组中元素*/
     {
          iTemp = a[i];                               /*设置插入值*/
          iPos = i-1;
          while((iPos>=0) && (iTemp<a[iPos]))      /*寻找插入值的位置*/
          {
               a[iPos+1] = a[iPos];                     /*插入数值*/
               iPos--;
          }
          a[iPos+1] = iTemp;
     }
     (5)、折半法排序:又称快速排序,是选择一个中间值middle(在程序中使用数组中间值),然后把比中间值小的数据放在左边,比中间值打的数据放在右边(具体的实现是从两边找,找到一对后进行交换)。然后对两边分别进行递归使用这个过程。即:从两头出发和中间的比较,两边都停止时(左边的比中间的大,右边的比中间的小)然后交换这两个停下的数,下次从xxxx开始
     void CelerityRun(int left, int right, int array[])
{
     int i,j;
     int middle,iTemp;
     i = left;
     j = right;
     middle = array[(left+right)/2];                    /*求中间值*/
     do
     {
          while((array[i]<middle) && (i<right))     /*从左找小于中值的数*/
               i++;     
          while((array[j]>middle) && (j>left))     /*从右找大于中值的数*/
               j--;
          if(i<=j)                                        /*找到了一对值*/
          {
               iTemp = array[i];
               array[i] = array[j];
               array[j] = iTemp;
               i++;
               j--;
          }
     }while(i<=j);                    /*如果两边的下标交错,就停止(完成一次)*/

     /*递归左半边*/
     if(left<j)
          CelerityRun(left,j,array);
     /*递归右半边*/
     if(right>i)
          CelerityRun(i,right,array);
6、排序算法的比较
     插入法、冒泡法、交换法排序的速度比较慢,但参加排序的序列局部或整体有序时,这种排序能达到较快的速度;在这种情况下,折半法排序反而会显得速度慢了。当n较小时,对稳定性不作要求时宜用选择法排序,对稳定性有要求时宜用插入法或冒泡法排序。
7、字符串处理函数:要添加头文件string.h
     (1)字符串复制:strcpy(目的字符串组名,源字符串组名)
     (2)字符串连接:strcat(目的字符数组名,源字符数组名)
     (3)字符串比较:strcmp(字符数组名1,字符数组名2)。按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果(1>2=正;1<2=负;1=2=0;)
     (4)字符串中小写字母变大写:strupr(字符串)
     (5)字符串中大写字母变小写:strlwr(字符串)
     (6)获得字符串长度:strlen(字符数组名)
8、反转输出字符串
     int main()
{
     int i;
     char String[7]  = {"mrsoft"};
     char Reverse[7] = {0};
     int size;
     size = sizeof(String);     /*计算源字符串长度*/

     /*循环读取字符*/
     for(i=0;i<6;i++)     //是6是因为字符串的大小为6,又是从0开始的,
     {
          Reverse[size-i-2] = String[i];     /*向目标字符串中插入字符*///“size-i-2”是因为String末尾一位是"\0",i的排位是从0开始,“size-1”结束。
     }

     /*输出源字符串*/
     printf("输出源字符串:%s\n",String);
     /*输出目标字符串*/
     printf("输出目标字符串:%s\n",Reverse);
     printf("%d\n",size);
     getchar();

     return 0;                              /*程序结束*/

9、获取系统日期和时间(要添加头文件time.h)
   输出系统日期:
               time_t nowTime;
               time(&nowTime);                                   /*获取系统日期*/
               sysTime= localtime(&nowTime);               /*转换为系统日期*/
               printf("系统日期:%d-%d-%d \n",1900 + sysTime->tm_year,sysTime->tm_mon + 1
                         ,sysTime->tm_mday); 
     输出系统时间:
               time_t nowTime;
               time(&nowTime);                                   /*获取系统时间*/
               sysTime = localtime(&nowTime);               /*转换为系统时间*/
               printf("系统时间:%d:%d:%d \n",sysTime->tm_hour ,sysTime->tm_min
                         ,sysTime->tm_sec);                    /*输出信息*/                    /*输出信息*/
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11733次
    • 积分:338
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:8篇
    • 译文:0篇
    • 评论:0条
    文章分类