【C语言】利用数组处理批量数据(一维数组和二维数组)

简介: 【C语言】利用数组处理批量数据(一维数组和二维数组)

前言:在前面学习的程序中使用的变量都属于基本类型,例如整型、字符型、浮点型数据,这些都是简单的数据类型。对于简单的问题,使用这些简单的数据类型就可以了。但是对于有些需要处理的数据,只用以上简单的数据类型是不够的,难以反映出数据的特点,也难以有效的进行处理。

6c32770117694306aa4a6761af9b61aa.jpg

怎样定义和引用一维数据

  • 一维数组是数组中最简单的,它的元素只需要用数组名加一个下标,就能唯一的地确定。
  • 数组是一组有序数据的集合
  • 数组中的每一个元素都属于同一个数据类型
  • C语言规定用方括号中的数字表示下标,如S[15]表示第15个元素

怎样定义一维数组

要使用数组,必须在程序中先定义数组,即通知计算机:由哪些数据组成数组,数组中有多少元素,属于哪个数据类型。否则计算机不会自动的把一批数据作为数组处理。例如,下面是对数组的定义:


int a[10] ;

它表示定义了一个整型数组, 数组名是a,此数组包含了 10个元素。

数组的一般形式为:


类型说明符 数组名[常量表达式]

说明:

  1. 数组名的命名规则和变量名相同,遵循标识符命名规则。
  2. 在定义数组时莫须有指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组的长度。
  3. 常量表达式中可以包括常量和符号常量,如 int a[3 + 5]是合法的的。
  4. “int a[10];”定义了数组后a后,在内存中划出了一片存储空间(下图所示),存放了一个有10个整型元素的数组,可以看到,用一个 “int a[10];”就相当于定义了10个简单的整型变量,显然简单方便。


怎样引用一维数组

在定义数组并对其各个元素赋值后,就可以引用数组中的元素。应注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值。

引用数组元素的表示形式为:

数组名[下标]

例题: 对10个数组元素一次赋值为0,1,2,3 … 8,9,要求逆序输出。

int main()
{
  int i = 0;
  int arr[10] = { 0 };
  for (i = 0; i < 10; i++)
  {
    arr[i] = i;//赋值
  }
  for (i = 9; i >= 0; i--)
  {
    printf("%d ", arr[i]);//打印
  }
  printf("\n");
  return 0;
}


运行结果:


一维数组的初始化

  1. 在定义数组时对全部数组元素赋予初值。例如:
int a[10] = {0,1,2,3,4,5,6,7,8,9);
  1. 也可只给数组中的一部分元素赋值。例如:
int a[10] = {0,1,2,3,4};
//定义a数组有10个元素,但花括号内只提供5个元素的初始值,
//系统自动给后面5个元素的初始值赋值为0
  1. 如果想一个数组中全部元素为0,可以写成:
int a[10] = {0};
  1. 在对全部数组元素赋初始值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:
int a[5] = {1,2,3,4,5};
//或者
int a[] = {1,2,3,4,5}; 

一维数组程序举例

例题1:用数组来处理求Fibonacci(斐波那契数列)问题。这个数列有以下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即该数列为1,1,2,3,5,8,13…,求其前20个数。

int main()
{
  int i = 0;
  int arr[20] = {1,1};//前俩项赋值为1
  for (i = 2; i < 20; i++)
  {
    arr[i] = arr[i - 1] + arr[i - 2];
  }
  for (i = 0; i < 20; i++)
  {
    printf("%d ", arr[i]);
  }
  printf("\n");
  return 0;
}

运行结果:


例题2(冒泡排序):有10个地区的面积,要求对它们按由小到大的顺序排序。

int main()
{
  int area[10] = { 0 };
  int i = 0;
  int j = 0;
  int min = 0;
  printf("请分别输入10个田地的面积\n");
  for (i = 0; i < 10; i++)
  {
    scanf("%d", &area[i]);
  }
  for (i = 0; i < 9; i++)//排升序(趟数)
  {
    for (j = 0; j < 9 - i; j++)//两两交换
    {
      if (area[j] > area[j + 1])
      {
        min = area[j + 1];//将较小的放临时变量中
        area[j + 1] = area[j];//将两交换位置
        area[j] = min;//将较小值赋值给较大值
      }
    }
  }
  for (i = 0; i < 10; i++)
  {
    printf("%d ", area[i]);
  }
  printf("\n");
  return 0;
}


运行结果:


怎样定义和引用二维数组

前面已经提到,有的问题需要用二维数组来处理。例如3个小分队,每队有6名队友,需要把这些队友的工资用数组保存起来以备查。这就需要用到二维数组(如下图)。如果建立一个数组Pay,它应当是二维的,第一维用来表示第几个分队,第二维用来表示第几个队员。

二维数组通常称为 矩阵 。把二维数组写成行(row)和列(column)的排列形式,可以有助于形象化的理解二维数组的逻辑结构。


怎样定义二维数组

怎样定义二维数组呢? 其基本概念与方法和一维数组相似。如:

float pay[3][6]

以上定义了一个float类型的二维数组,第1维有3个元素,第2维有6个元素。每一维的长度分别用一对方括号扩起来。 二维数组的一般定义形式如下: 类型说明符 数组名[常量表达式][常量表达式]

例如: float a[3][4],b[5][10];

C语言对二维数组采用这样的定义方式,使得二维数组可以被看作一种特殊的一维数组:它的元素又是一个一维数组。例如可以把a看作一个一维数组,它有3个元素:a[0],a[1],a[2],每个元素又是一个包含4元素的一维数组,如图所示

我们可以把a[0],a[1], a[2]看成三个一维数组的名字。上面定义的二维数组可以理解为定义了3个一维数组,即相当于:

float a[0][4],a[1][4],a[2][4]

此处把a[0],a[1],a[2]看作一维数组名。C语言的这种处理方法在数组初始化和用指针表示时显得很方便,这在以后的使用中各位会经常体会到。

二维数组在内存中存放的顺序

C语言中,二维数组中元素排放的顺序是按行存放的,即在内存中先顺序存放第一行的元素,接着存放第2行的元素。如下图所示:

怎样引用二维数组

二维数组元素的表示形式为:

数组名[下标][下标]例如:a[2][3]表示a数组中序号为2的行中序号为3的列元素。下标应是整型表达式,如 a[2 - 1][2 * 2 - 1]形式。 数组元素可以出现在表示中也可以被赋值。

二维数组的初始化

  1. 分行给二维数组赋初始值。 这种赋初始值的方式比较直观,把第一个花括号内的数据给第1行的元素,第2个花括号内的值给第2行的元素。例如:
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  1. 可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初始值。例如:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12,};
  1. 可以对部分元素赋初始值,例如:
int a[3][4] = {{1},{5},{9}};

二维数组程序举例

例题:有一个3 * 4的矩阵,要求编写程序求出求字最大的那个元素的值,以及其所在的行号和列号。

int main()
{
  int arr[3][4] = { {1,2,3,4},{5,55,7,8},{9,55,11,12} };
  int i = 0;
  int j = 0;
  int max = 0;//最大值
  int col = 0;//列坐标
  int row = 0;//行坐标
  for (i = 0; i < 3; i++)
  {
    for (j = 0; j < 4; j++)
    {
      if (max  < arr[i][j])//将数组中的每一个元素和它进行比较找出最大的
      {
        max = arr[i][j];
        row = i;
        col = j;
      }
    }
  }
  printf("row = %d col = %d max = %d \n", row,col,max);
  return 0;
}

运行结果:


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


相关文章
|
1月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
|
8天前
|
存储 编译器 C语言
【C语言基础考研向】09 一维数组
数组是一种有序集合,用于存储相同类型的数据,便于统一操作与管理。例如,将衣柜底层划分为10个格子存放鞋子,便于快速定位。在C语言中,数组定义格式为 `类型说明符数组名[常量表达式];`,如 `int a[10];` 表示定义了一个包含10个整数的数组。数组初始化时可以直接赋值,也可以部分赋值,且数组长度必须固定。数组在内存中连续存储,访问时需注意下标范围,避免越界导致数据异常。数组作为参数传递时,传递的是首地址,修改会影响原数组。
|
8天前
|
存储 C语言
【C语言基础考研向】10 字符数组初始化及传递和scanf 读取字符串
本文介绍了C语言中字符数组的初始化方法及其在函数间传递的注意事项。字符数组初始化有两种方式:逐个字符赋值或整体初始化字符串。实际工作中常用后者,如`char c[10]=&quot;hello&quot;`。示例代码展示了如何初始化及传递字符数组,并解释了为何未正确添加结束符`\0`会导致乱码。此外,还讨论了`scanf`函数读取字符串时忽略空格和回车的特点。
|
11天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
11天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
11天前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
|
1月前
|
算法 C语言
C语言------数组
这篇文章是关于C语言数组的实训,包括一维数组、二维数组和字符数组的定义、赋值、输入、输出方法,并通过实例代码演示了数组的使用和一些基本算法,如冒泡排序。
C语言------数组
|
29天前
|
存储 编译器 数据处理
【编程秘籍】解锁C语言数组的奥秘:从零开始,深入浅出,带你领略数组的魅力与实战技巧!
【8月更文挑战第22天】数组是C语言中存储同类型元素的基本结构。本文从定义出发,详述数组声明、初始化与访问。示例展示如何声明如`int numbers[5];`的数组,并通过下标访问元素。初始化可在声明时进行,如`int numbers[] = {1,2,3,4,5};`,编译器自动计算大小。初始化时未指定的元素默认为0。通过循环可遍历数组,数组名视为指向首元素的指针,方便传递给函数。多维数组表示矩阵,如`int matrix[3][4];`。动态数组利用`malloc()`分配内存,需用`free()`释放以避免内存泄漏。掌握这些技巧是高效数据处理的基础。
50 2
|
30天前
|
C语言
【C语言】在限制定条件下数据移动
【C语言】在限制定条件下数据移动
26 1
|
28天前
|
存储 算法 搜索推荐
C语言中数组
C语言中数组
32 0