谭浩强 第六章利用数组处理批量数据

简介: 谭浩强 第六章利用数组处理批量数据

1.一维数组

在介绍一维数组之前,先来了解下什么是数组。数组,英文名为array,简写为arr(一般在C语言中用arr来指代数组)可以理解为数学中的集合。是具有相同特征元素的集合。比如,一群打篮球的人,你就可以创建一个数组,数组的元素就是打篮球的人的名字。

  • 一维数组的定义

定义方式:类型    int float double char .......

                  数组名   arr1,arr2,......

                  [常量表达式]   只能为常量不能为变量

int arr[10];定义了10个整型变量,将其存储到arr这个数组中。(相比于一个一个创建,效率提升)

常见错误举例:

//#define _CRT_SECURE_NO_WARNINGS 1
//常见错误
//1.[]中存入变量
//int n;
//scanf("%d", n);
//int arr[n];//[]中只能为常量
//若提前调用函数,则n会根据函数的值来
//void func(int n)
//{
//  int arr[2 * n];//在每次调用func函数时,都会得到不同的数组长度,成这样的数组为可变长数组,但在执行函数后n不变。
//
//}
  • 一维数组的初始化

初始化就是给数组赋值 ,初始化的方式多样,下面介绍常见初始化方式;

1.给所有元素赋值

int arr1[5]={12345};5个元素全部初始化

2.部分元素赋值

若部分元素赋值,则其余部分默认为0(整形数组),若为字符型数组,则默认为\0;若为指针型数组,默认为NULL,即空指针;

int arr2[5]= {1,2,3};则其余两个元素默认为0;

3.若数据个数确定,则可以不用添加长度(常用于字符型数组)

int arr3[]= {1,2,3,4,5};    char ch [] = {"i love c"};char ch [] = "i love c";

  • 一维数组的引用

引用,是通过下标(subscript)完成;C语言中,默认第一个元素的下标为0;即,若一个数组的长度为n,则其下标的最大值为n-1;

注意:引用时下标不要超过最大值,否则有溢出危险

   int arr[5] = { 1,2,3,4,5 };//定义了一个长度为5的数组

   printf("%d\n", arr[0]);//分别打印出数组中的元素

   printf("%d\n", arr[1]);

   printf("%d\n", arr[2]);

   printf("%d\n", arr[3]);

   printf("%d\n", arr[4]);

  printf("%d\n", arr[5]);//这是个错误的代码,数组长度为5,则下标最大值为4;

一维数组程序举

#include <stdio.h>//输出斐波那契数列前25个数字(要求每行输出5个)
int main()
{
  int i;
  int arr[20];//定义一个长度为20的数组,用于存放20个数字;
  arr[0] = 1;
  arr[1] = 1;
  for (i = 2; i < 20; i++)
  {
    arr[i] = arr[i - 1] + arr[i - 2];//根据数列性质,利用for循环实现将前20个数字存储到数组中
  }
  for (i = 0; i < 20; i++)
  {
    if (i % 5 == 0)//实现5个数一换行
      printf("\n");
    printf("%10d", arr[i]);
  }
   return 0;
}

冒泡排序法 (核心:for循环的嵌套)

  1.  
#define _CRT_SECURE_NO_WARNINGS 1
//练习冒泡排序法(输入五个数字,实现升序排列)
//冒泡排序法就是两两比较,将较大的数字通过比较移动到后面,实现升序或降序处理
#include<stdio.h>
int main()
{
  int i,j,t;
  int arr[5];
  printf("请输入五个数字");
  for (i = 0; i<5; i++)
  {
    scanf("%d", &arr[i]);//将5个数字存储到数组中
    }
  printf("\n");
  for (j = 0; j < 4; j++)//冒泡排序法的核心:for循环的嵌套;//一共5个数字,第一趟比较需要4次,第二趟比较需要3次,以此类推;
  {
    for (i = 0; i<4-j; i++)
    {
      if(arr[i]>arr[i+1])//接下来进行比较
      {
        t = arr[i + 1]; arr[i + 1] = arr[i]; arr[i] = t;//交换前后两个数字顺序
      }
    }
  }
  printf("升序处理的数字为:\n");
  for (i = 0; i < 5; i++)
  {
    printf("%d  ", arr[i]);
  }
  return 0;
}

2.二维数组

二维数组通常称为矩阵(matrix),写成row(行)和column(列)的形式。

  • 二维数组的定义:

类型 数组名称 [常量表达式] [常量表达式]

                       行(row)      列(column)

float arr [3][4];相当于创建了一个3*4的矩阵int arr[10][10];

  • 二维数组的初始化

1.各个元素都赋值

#include <stdio.h>
int main()
{
  int arr[2][2] = { {1,2},{3,4} };//全体元素都赋值
  int i, j;
  for (i = 0; i < 2; i++)
  {
    for (j = 0; j < 2; j++)
    {
      if (j% 2 == 0)
        printf("\n");
      printf("%5d", arr[i][j]);
    }
  }
    return 0;
}

2.部分赋值

int arr [3][4]={{1,2},{3,4}}//其余元素为0;

3.在赋值时行数可不做要求,系统会根据列数自动分配;

int arr[][3]={1,2,3,4,5,6};很明显是两行三列(尽量不要这么写,不是好的代码风格)

3.二维数组的引用

同一维数组,注意不要超过下标的最大值即可;

4.二维数组程序练习

//转置数组的练习
int main()
{
  int arr1 [2] [3] = { {1,2,3},{4,5,6} };
  int arr2[3][2];
  int i, j;
  printf("arr1:\n");
  for (i = 0; i < 2; i++)
  {
    for (j = 0; j < 3; j++)
    {
      if (j % 3 == 0)
        printf("\n");
      printf("%7d", arr1[i][j]);
      arr2[j][i] = arr1[i][j];
    }
  }
  printf("\n");
  printf("arr2(转置后):\n");
  for (i = 0; i < 3; i++)
  {
    for (j = 0; j < 2; j++)
    {
      if (j % 2 == 0)
        printf("\n");
      printf("%7d", arr2[i][j]);
    }
  }
  return 0;
}
//利用擂台算法来找出数组中最大值,并给出其row,column;
int main()
{
  int arr[4][5] = { {12,23,31,26,11},{10,11,56,67,79} ,{64,65,98,90,35 },{10,20,30,40,50} };
  int i, j,row,column;
  int max;
  max = arr[0][0];//定义一个最大值,并使数组第一个元素为擂主
  for (i = 0; i < 4; i++)
  {
    for (j = 0; j < 5; j++)
    {
      if (arr[i][j] > max)
      {
        max = arr[i][j];
        row = i;
        column = j;
      }
    }
  }
  printf("max=%d\nrow=%d\ncolumn=%d\n" ,max,row,column);
  return 0;
}

3.字符数组

字符数组,即用来存放字符的的数组。要注意,C语言中并没有字符串类型,字符串类型是以字符数组的形式出现。

1.字符数组的定义                                                                                                                                类似于数值型数组定义方式,类型   数组名称  [常量表达式]      char ch[];  char[][];二维数组                             注意:我们知道,字符型数据的存储是通过ascii值存放的,所以字符型数据可以看作整形数据的一部分,即一下定义方式也合法;

int ch [10];
ch[0]=1;//但是这种定义方式占用空间,因为int类型占4个字节,char类型占一个字节

2.字符数组的初始化

//对每个元素都赋值
char ch [4]={'l','o','v','e'};
//若字符长度确定,可以不指明长度.更加方便便捷
char ch []={'l','o','v','e'};
//若初始值小于指定长度,则系统自动补充\0;即空操作符;
char ch[5]={'l','o','v','e'};
char ch[3][3]={{' ','*',' '},{'*',' ','*'},{' ','*',' '}}
//注意单引号之内不能什么也没有,你可以添加空格
//也可以一次性输入,用''''括起来
char ch ={"i love you"};

3.字符数组的引用

方法和数值型数组相同,通过下标来引用;

4.字符串的结束标志

字符串的结束标志为\0,在ascii码值中对应空操作符;

printf("love\0you");
//字符串的结束标志为\0,这个程序的只会输出love;
//一般情况下,系统会自动在字符串末尾添加\0,作为结束标志;

   5.字符数组的输入与输出

1.逐个字符输出,char ch [4]={'h','e','h','e'};printf("%c",ch[i]);

若想从e输出,则:printf("%s",&a[1]);

2.以字符串输出   char ch ="hehe";printf("%s",ch);注意:输出字符串时类型为string,即%s;同时,输出时要用数组名,因为你要一下子输出所有元素,而不是单个元素输出;逻辑为,先找到数组ch的起始地址,逐个字符输出,直到遇到\0;

3.字符串的输入scanf("%s",ch);注意:这个地方不用&,因为数组一旦创建就有一个起始地址,自动存到内存中了;

补充:

//用for循环实现读取字符串结束标志
for(i=0;arr[i]!=\0;i++);
//实现从字符串中提取数字
if('0'<=arr[i] && '9'>=arr[i]);

4.字符串的处理函数

//以下函数在引用时要添加#include <string.h>
//1.puts函数  字符串输出函数    
puts(str);//注意puts输出的一定是以\0结尾的字符串;若不是,令arr[i]='\0'
//注意和putchar函数的区别,putchar只能输出单个字符;
//2.fgets函数  字符串输入函数
fgets(str,sizeof(str),stdin);输入时不会读取\0;
//函数对str作用后会得到他的初始地址;
//3.strlen函数  字符串长度计算函数
strlen(str);//他计算的是实际长度,且不包括\0;
char arr [10]={"i am you"}
strlen(arr)=6;
//4.strcmp函数  字符串比较函数
strcmp(str1,str2);
//strcmp(str1,str2)>0;str1在str2后面;
//strcmp(str1,str2)<0;str1在str2前面;
//strcmp(str1,str2)=0;str1和str2完全相同;
//后面的单词更大,且小写比大写大;
//5.strcat函数   字符串连接函数
strcat(str1,str2);//把str2连接到str1之后;
//一定要注意str1的长度是否足够大
//6.strcpy函数   字符串复制函数   strncpy函数  可以限制长度复制字符串
strcpy(str1,str2);将str2的字符串赋值给str1;
strcpy(str1,"china");
strncpy(str1,str2,2);//将str2的字符串前两个字符赋给str1;
strncpy(str1,"china",2);//将ch两个字符赋给str1;
//7.strupr函数   字符串变大写函数        strlwr函数   字符串变小写函数;
strupr(str);
strupr("china")=CHINA;

5.总结

数组概念是C语言学习中重要的一个概念,他解释了在C语言中如何表示字符串,即通过字符数组;一维数组,二维数组也很重要,他们为我们提供了一个简单的创建大量变量的方法,要充分理解数组的作用,即定义一个数组后,会自动产生一个初始地址;要理解二维数组的概念,可以用线性代数中的矩阵概念来理解,要认识到二维数组其实可以看为特殊的一维数组(和分块矩阵的概念类似);字符数组也很重要,告诉我们如何实现字符串的输出与输入;在数组中,我们还学习了两个重要的排序方法,一是冒泡排序法(核心为for循环的嵌套),二是擂台法,希望大家能够勤加练习,谢谢观看!

目录
相关文章
|
算法 BI 测试技术
带你读《图解算法小抄》二十六、数据统计(2)
带你读《图解算法小抄》二十六、数据统计(2)
|
1月前
计科一二班数据结构《实验十报告》参考答案
计科一二班数据结构《实验十报告》参考答案
15 0
计科一二班数据结构《实验十报告》参考答案
|
6月前
第六章 利用数组处理批量数据
第六章 利用数组处理批量数据
29 0
|
6月前
|
存储 编译器 C++
第四章:C++中的数组
第四章:C++中的数组
35 1
|
6月前
|
存储 算法 Serverless
第六章:数组
第六章:数组
76 0
|
机器学习/深度学习 存储 负载均衡
带你读《图解算法小抄》二十六、数据统计(1)
带你读《图解算法小抄》二十六、数据统计(1)
|
算法
数据结构上机实践第11周项目1 - 图基本算法库
数据结构上机实践第11周项目1 - 图基本算法库
139 0
数据结构上机实践第11周项目1 - 图基本算法库
|
存储 算法 测试技术
《算法笔记知识点记录》第二章——快速入门4[结构体、输入输出、复杂度和黑盒测试](2)
《算法笔记知识点记录》第二章——快速入门4[结构体、输入输出、复杂度和黑盒测试](2)
《算法笔记知识点记录》第二章——快速入门4[结构体、输入输出、复杂度和黑盒测试](2)
|
索引
第三章--第五节:集合
第三章--第五节:集合
137 0
第三章--第五节:集合
|
存储 算法 测试技术
《算法笔记知识点记录》第二章——快速入门4[结构体、输入输出、复杂度和黑盒测试](1)
《算法笔记知识点记录》第二章——快速入门4[结构体、输入输出、复杂度和黑盒测试](1)