嵌入式开发学习日记——第六天(c语言)

目录

数组

一、数组的相关概念

二、数组操作

1.数组的定义

2.访问数组元素

3.遍历数组

 4.数组应用案例

三、字符数组

1.字符数组(字符串)的定义

 2.字符数组(字符串)的访问和遍历

三、多维数组

1.二维数组的定义

 2.二维数组的访问和遍历

二维数组应用案例


数组

一、数组的相关概念

  1. 数组名:本质上是一个标识符常量,命名需要符合标识符规范。
  2. 元素:同一个数组中的元素必须是相同的数据类型。
  3. 下标(索引、角标):从0开始的连续数字。
  4. 数组的长度:表示元素的个数。

二、数组操作

1.数组的定义

  • 方式一:先指定元素的个数和类型,再进行初始化
// 定义一个数组,数组名字是arr1,元素类型是int,元素个数是3个
  int arr1[3];
  // 定义完后为每个元素赋值
  arr1[0] = 10;
  arr1[1] = 20;
  arr1[2] = 30;
  • 方式二:指定元素的类型和个数并同时进行初始化
      // 定义一个int类型的数组,数组名是arr2,元素个数是3,并且进行初始化
      int arr2[3] = {100, 200, 300};
    
  • 方式三:指定元素的类型,不指定元素个数,同时进行初始化
 // 没有指定元素个数,系统会自动计算
  int arr3[] = {1, 2, 3, 4, 5};

2.访问数组元素

通过“数组名[下标]”可以访问数组中的元素,案例如下

#include <stdio.h>
int main()
{
  // 定义一个int类型的数组,有3个数元素,并且进行初始化
  int arr1[3] = {10, 20, 30};
  // 通过索引(下标)修改第二个位置的数据
  arr1[1] += 100;
  printf("第一个元素值为:%d \n", arr1[0]);
  printf("第二个元素值为:%d \n", arr1[1]);
  printf("第三个元素值为:%d \n", arr1[2]);
  return 0;
}

3.遍历数组

        遍历数组是指按顺序访问数组中的每个元素,以便读取或修改它们,编程中一般使用循环结构对数组进行遍历。

#include <stdio.h>
int main()
{
  // 遍历数组
  int arr[5] = {100, 200, 300, 400, 500};
  // 先计算数组的元素个数
  int arr_len = (sizeof arr) / (sizeof arr[0]);
  for (int i = 0; i < arr_len; i++)
  {
    printf("数组下标为:%d,元素值为:%d \n", i, arr[i]);
  }
  return 0;
}

        我们还可以通过数组遍历完成数组的初始化赋值,看下面案例。

        创建长度为10的数组,元素依次赋值为0,1,2,3,4,5,6,7,8,9,并按逆序输出每个元素,代码如下:

#include <stdio.h>
int main()
{
  // 动态为数组赋值,并且倒序输出
  int arr[10];
  int arr_len = sizeof arr / sizeof arr[0];
  for (int i = 0; i < arr_len; i++)
  {
    arr[i] = i; // 为数组元素赋值
  }
  for (int i = arr_len - 1; i >= 0; i--)
  { // 倒序输出
    printf("值为:%d ", arr[i]);
  }
  return 0;
}

 4.数组应用案例

        取出数组中之值最大的元素。

#include <stdio.h>
int main()
{
  // 求数组中最大值,最小值
  int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  int arr_len = sizeof arr / sizeof arr[0];
  // 假设第一元素为最大值
  int max = arr[0];
  // 假设第一元素为最小值
  int min = arr[0];
  for (int i = 0; i < arr_len; i++)
  {
    if (max < arr[i])
    { // 如果最大值比数组的每个元素还大,就存储起来
      max = arr[i];
    }
    if (min > arr[i])
    { // 如果最小值比数组的每个元素还小,就存储起来
      min = arr[i];
    }
  }
  printf("最大值为:%d,最小值为:%d \n", max, min);

  return 0;
}

三、字符数组

1.字符数组(字符串)的定义

  • 方式一:最后一个元素设置成 \0

        在给某个字符数组赋值时,赋值的元素个数小于字符数组的长度,则会自动在后面加 '\0', 表示字符串结束; 赋值的元素的个数等于该数组的长度(或不指定数组长度),则不会自动添加 '\0'。

#include <stdio.h>
int main()
{
  // 定义字符数组(也可以叫字符串) \0----结束标识
  // 定义char类型的数组,设置5个元素数,并显示设置\0
  char chs1[5] = {'a','b','c','d','\0'};
  // 指定长度,没有显示设置\0,默认会自动加上
  char chs2[4] = {'t','o','m'};
  // 没有指定数组元素个数,也没有显示指定\0
  char chs3[] = {'j', 'a', 'c', 'k'};
  // 输出这些字符串
  printf("%s \n",chs1);
  printf("%s \n",chs2);
  // 由于没有显示设置结束标识,那么默认会把相邻内存中的数据读取出来,直到找到\0结束标识位置
  printf("%s \n",chs3);
  // 总结:字符数组指定了元素个数后,需要在结尾指定结束标识\0,
  // 如果字符数组指定了元素个数,元素数据中没有指定结尾标识,系统会自动加上结束标识\0
  // 如果字符数组指定了元素个数,但是元素个数和指定长度相同,那么结尾处也没有结束标识\0
  // 系统没有自动添加结束标识\0,也没有显示指定,输出的时候会把相邻的内存中的字符全部读取出来,直到遇到结束标识为止
  return 0;
}
  • 方式二:简化写法
#include <stdio.h>
int main()
{
  // 简化字符数组写法
  // 默认会自动添加结束标识\0
  char chs1[] = {"what are you no sha lei"};
  printf("%s \n", chs1);
  // 省略大括号,默认也会自动加\0
  char chs2[] = "no sha lei ni shuo ne";
  printf("%s \n", chs2);
  return 0;
}

 2.字符数组(字符串)的访问和遍历

字符数组(字符串)的访问和遍历,按照一般数组的方式访问和遍历即可。

#include <stdio.h>
int main()
{
  // 字符串数组的遍历
  char chs[] = "love";
  // 计算字符数组的字节长度
  int chs_len = sizeof chs;
  printf("数组长度:%d \n", chs_len); // 字节个数:4
  printf("%s \n", chs);              // 输出字符串
  printf("第三个元素:%c \n", chs[2]);
  // 遍历字符数组
  for (int i = 0; i < chs_len; i++)
  {
    printf("%c ", chs[i]);
  }
  return 0;
}

三、多维数组

        如果数组的元素还是数组,这样的数组就称为多维数组。这种多层次的结构允许我们以表格或矩阵的方式组织数据,其中每个维度都对应于不同的行、列或更多的维度,使数据更加结构化和有组织

1.二维数组的定义

  • 方式1: 先定义再初始化
#include <stdio.h>
int main()
{
  int arr[2][3]; // 定义一个2行3列的二维数组
  // 为数组元素赋值
  arr[0][0] = 10;
  arr[0][1] = 20;
  arr[0][2] = 30;
  arr[1][0] = 40;
  arr[1][1] = 50;
  arr[1][2] = 60;
  return 0;
}
  • 方式2: 直接定义并初始化​​​​​​​
#include <stdio.h>
int main()
{
  // 直接定义并以矩阵的方式初始化二维数组
  int arr1[3][4] = {
      {10, 20, 30, 40},
      {50, 60, 70, 80},
      {90, 100, 110, 120}};
  // 定义三行四列的二维数组(自动匹配隔行割裂)
  int arr2[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
  // 定义三行三列的二维数组,只设置列,也会自动匹配(一维可以不进行预设)
  int arr3[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
  return 0;
}

 ​​​​​​​2.二维数组的访问和遍历

        访问二维数组的元素,需要使用两个下标(索引),一个用于访问行(第一维),另一个用于访问列(第二维),我们通常称为行下标(行索引)或列下标(列索引)。

        遍历二维数组,需要使用双层循环结构。

#include <stdio.h>
int main()
{
  // 定义一个2行3列的二维数组,并初始化,使用for遍历,同时求和
  int sum = 0;
  int arr[2][3] = {
      {10, 20, 30},
      {40, 50, 60}};
  // 计算出数组的行数
  int rows = sizeof arr / sizeof arr[0];
  // 计算出数组的列数
  int cols = sizeof arr[0] / sizeof(int);
  // printf("%d \n",rows);
  // printf("%d \n",cols);
  for (int i = 0; i < rows; i++)
  {
    for (int j = 0; j < cols; j++)
    {
      printf("%d \t", arr[i][j]);
      sum += arr[i][j];
    }
    printf("\n");
  }
  printf("二维数组中数据之和为:%d \n", sum);
  return 0;
}
二维数组应用案例

        现在有三个班,每个班五名同学,用二维数组保存他们的成绩,并求出每个班级平均分、以及所有班级平均分,数据要求从控制台输入。

#include <stdio.h>
int main()
{
  // 案例现在有三个班,每个班五名同学,用二维数组保存他们的成绩,并求出每个班级平均分、以及所有班级平均分,数据要求从控制台输入。
  int rows = 3; // 行数
  int cols = 5; // 列列数
  // 先定义一个3行5列的二维数组
  double scores[rows][cols];
  // 循环录入每个班每个学生的成绩
  for (int i = 0; i < rows; i++)
  {
    for (int j = 0; j < cols; j++)
    {
      printf("请输入第%d个班中第%d个学生的成绩: \n", i + 1, j + 1);
      scanf("%lf", &scores[i][j]);
    }
  }
  // 定义每个班的总成绩和所有班的总成绩
  double class_sum = 0;
  double all_class_sum = 0;
  // 遍历所有的班级学员成绩
  for (int i = 0; i < rows; i++)
  {
    class_sum = 0; // 每次重置该成绩数据
    for (int j = 0; j < cols; j++)
    {
      // 计算每个班的总成绩
      class_sum += scores[i][j];
    }
    printf("\n");
    // 求每个班的平均成绩
    printf("第%d班的总成绩为:%.2f,每个的平均分为:%.2f \n", i + 1, class_sum, class_sum / cols);
    // 计算所有班的总成绩
    all_class_sum += class_sum;
  }
  // 所有班的平均成绩为
  printf("所有班的总成绩:%.2f,平均成绩为:%.2f \n", all_class_sum, all_class_sum / (rows * cols));

  return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值