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

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

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循环的嵌套),二是擂台法,希望大家能够勤加练习,谢谢观看!

目录
相关文章
|
机器学习/深度学习 分布式计算 数据处理
分布式计算框架:并行力量的交响乐章
分布式计算框架如Apache Spark解决单机计算挑战,通过拆分任务到多机并行处理提升效率。Spark以其内存计算加速处理,支持批处理、查询、流处理和机器学习。以下是一个PySpark统计日志中每日UV的示例,展示如何利用SparkContext、map和reduceByKey进行数据聚合分析。这些框架的运用,正改变大数据处理领域,推动数据分析和机器学习的边界。【6月更文挑战第18天】
476 2
|
BI
运营必备 - CPA、CPS、CPC、CPM推广是什么意思?(一)
运营必备 - CPA、CPS、CPC、CPM推广是什么意思?(一)
21537 0
运营必备 - CPA、CPS、CPC、CPM推广是什么意思?(一)
|
11月前
|
数据采集 自然语言处理 开发工具
通义灵码在 PyCharm 中的强大助力(下)
通义灵码在PyCharm中的优势包括提高开发效率、提升代码质量和易用性,并且能够不断学习和改进。然而,它也存在依赖网络、准确性有待提高和局限性等问题。未来,通义灵码有望支持更多编程语言,提高准确性和可靠性,与其他工具集成,并提升智能化程度。总体而言,通义灵码为Python开发者带来了显著的便利和潜力。
通义灵码在 PyCharm 中的强大助力(下)
|
11月前
|
API
车牌号归属地查询免费API接口教程
本接口用于根据车牌号查询社会车辆的归属地,不支持军车、使馆等特殊车牌。请求地址为 `https://cn.apihz.cn/api/other/chepai.php`,支持 POST 和 GET 请求。请求参数包括 `id`、`key` 和 `words`,返回数据包含车牌归属地信息。示例请求:`https://cn.apihz.cn/api/other/chepai.php?id=88888888&key=88888888&words=川B1234`。
422 21
|
JavaScript
成功解决:如何通过this.$router.push(“/Login“)的方式传参,在另外一个页面接收数据的问题
这篇文章介绍了如何在Vue框架中通过路由跳转传递参数,并在另一个页面接收这些参数。具体方法是使用`this.$router.push`方法的`params`属性传递对象,然后在目标页面通过`this.$route.params`接收传递的参数。
成功解决:如何通过this.$router.push(“/Login“)的方式传参,在另外一个页面接收数据的问题
|
存储 数据采集 数据安全/隐私保护
商汤、清华、复旦等开源百亿级多模态数据集,可训练类GPT-4o模型
商汤科技、清华大学和复旦大学等机构联合开源了名为OmniCorpus的多模态数据集,规模达百亿级,旨在支持类似GPT-4级别的大型多模态模型训练。该数据集包含86亿张图像和1696亿个文本标记,远超现有数据集规模并保持高质量,具备广泛来源和灵活性,可轻松转换为纯文本或图像-文本对。经验证,该数据集质量优良,有望促进多模态模型研究,但同时也面临存储管理、数据偏见及隐私保护等挑战。
490 61
|
监控 Linux Shell
|
11月前
|
API
天气预报-腾讯天气-7天-IP查询版免费API接口教程
根据IP地址自动查询该IP归属地7天天气预报的腾讯天气API。请求地址为`https://cn.apihz.cn/api/tianqi/tengxunip.php`,支持GET和POST请求。需提供ID、Key和IP地址作为参数。返回数据包含天气预报信息。
|
机器学习/深度学习 人工智能 算法
Spring Boot + AI:融合创新,开启智能应用新篇章
【8月更文挑战第20天】在当今这个数据驱动的时代,人工智能(AI)与软件开发的深度融合正引领着技术革新的浪潮。而Spring Boot,作为Java领域中最受欢迎的微服务框架之一,以其快速开发、易于部署和丰富的生态支持,成为了连接传统应用与智能服务的桥梁。探讨Spring Boot与AI的结合,不仅是技术趋势的必然,更是推动行业智能化转型的重要路径。
740 3
|
机器学习/深度学习 算法
配电网重构知识及matlab实现(2)
配电网重构知识及matlab实现(2)