chapter 6 利用数组批量处理数据

简介: chapter 6 利用数组批量处理数据

6.1绪论


数据太多怎么办,能不能构建一个数组,数据的集合,把数字集合起来处理;

所以咱们就建立一个新的概念。

数组;

就是这一万个数咱们这样编个号 : S0;S1;S2;S3;S4…S9999

数字是下标;下标作用是确定编号的意思;每个数字有且只有一个编号;这儿没法写出;就用这个代替;;注意了数组下标是从0开始的0 1 2 3 4 5 6 7 8 9

整个s1到s9999就组成一个数组;s就是咱们定义的数组名字;


那么咱们再说说数组是什么 :

数组是一群数据的集合;什么样的数据;拥有一个数组名字的同种类型编好号的数据;


6.2 一维数组


6.2.1 如何定义一个数组


数组的基本形式:


定义类型 数组名 [常量] ;

int a[10];
1.首先你得给数组取一个名字;a
2.你要定义这些数据的类型;int 定义一个数据储存2或4个字节;依据补码的形式储存; 
3.你要知道他有多少个;10个这样的数据 大概20到40个字节


6.2.2 如何引用一维数组


怎么调用呢;


数组名[下标]


下标可以是整型常量;也可以是整形表达式;

int f[20]={1,1};
    for(i=0;i<=9;i++)
    f[i]=i;
    for(i=9;i>=0;i--)
  printf("%d\n",f[i]);


6.2.3 一维数组初始化


那我们怎么去给数组赋值,也叫初始化

int a[10]={0,1,8,9,3,7,7,3,4,5};
int a[10]={0,1,8,9,3,7};没赋值的 电脑给你赋值 ;就是0;
int a[10]={}; ;0,0,0,0,0,0,0,0,0,0
int a[10];电脑给你随机赋值


6.3 二维数组


对于如下一组数据:

A: a1 a2 a3 a4 a5 a6;

B: b1 b2 b3 b4 b5 b6 ;

C: c1; c2; c3; c4; c5; c6;

其中一类是A,B,C

还有一类就是:a1,a2,a3,a4…

有两种类型的数据,那么就不能定义一维数组了。

这里引申出了二维数组;


6.3.1 二维数组定义与储存方式


一般形式:


定义类型 数组名 [常量表达式1] [常量表达式2];


这儿储存数量变成了两种种类 首先说明有多少行;然后说明有多少列 即每行有多少个;


int a[3] [6];
也是定义定义三个部分 
1.首先定义名字;
2.数据的数量 ;
3.最后 数据的类型 也就是储存空间储存方式;


这样每个数字就有自己的数组编号了;比如;a [0] [1];

那我们看一个二位数组通常使用矩阵的方式去理解 ;但是把;电脑储存这些数据时是不知道矩阵的;它坑定是一个一个去储存的;那么怎么储存 按照矩阵来说 从第一行第一个到最后一个然后到第二行第一个;到最后一个;在第三行;电脑按照线性的方式储存;


同样的咱们可以推理到三维数组 int a[1] [2] [3];储存方式也是按照线性的方式去储存;我这边简写

001 002 003 004 005 006 007 008 009;

010 020 030 040 050 060 070 080 090;…


6.3.2 引用与初始化


引用:


那我们看看二维数组怎么引用的呢

a[行下标] [列下标];


注意下标从0开始;


01 02 03 04

11 12 13 14

21 22 23 24


int a[3] [4];与a [3] [4]的区别;int a[3] [4] 中 没有a[3] [4]这个数值;

ina[3][4];


初始化:

你知道计算机时怎么读取数值的; 按顺序的线性读取; 如果你没特地去赋初值 电脑会自动定义你的初值时0;所以我只介绍两种赋值的形式;


int a[3][4]={{1,2,3,1},{1,2,3,4},{1,2,3,4}};正常赋值
int a[3][4]={1,2,3,4,5,6,7,8,9,1,2,3};按线性赋值,不够电脑自动赋值0
int a[3][4]={};电脑自动赋值0
int a[3][4];电脑随机分配


6.4 字符数组


前面咱们说过了有一个字符串常量;然后咱们说了定义一个字符变量,但是只能够储存一个字符;

对于字符咱们可以用变量去储存;那字符串呢咱们只能用数组去储存;


6.4.1 定义一个字符数组


怎么定义一个字符数组;

和定义数值数组一样;只不过之前的数据类型 在这儿被改变成


char 数组名[数量]


但是不管是int char float 还是什么,依旧依据各自数据类型的储存方式;只不过数组是按照线性的方式去储存;


定义二维数组与前面基本相同;引用一个数组也是一样;c[0],c[9]…

c[8] [2]…


6.4.2 初始化一个字符数组


怎么初始化一个字符数组;和之前一样

char a[10]={'i','','a','m',' ','s','t','d','e','n','t','.'};和前面一样 按照一个个去输入;
如果你没有定义那么 电脑会自动把没有定义的字符 ,定义为ASCALL表中字符为0的那个字符;
记作 '\0';
char a[]="i am a student."; 
char a[]={"i am a student."};
如果有括号会编译器会对数组进行初始化,否则不会。
char a[10]; 在你没有对数组初始化的情况下;数组初始化是随机的;
并不是你想的那样都会系统把他都当作\0处理;
char a[10] = { }; 数组全部初始化为\0,如果是整型数组初始化为0。
char a[10] = { ‘a’ }; 第一个元素为a,其他元素被初始化为\0


ps:这里说一下当电脑遇到\0时候 这里的\0就是字符串结束标志;也就是说,对于这字符串而言到这就结束了;不要管后面有还是没有了;如果要输出的话就输出到这儿;字符串终止符是一个非常好的字符 是ascall码中排第0位的字符 意思为空操作;不会产生任何新操作和出现任何不必要的字符;所以说\0作为终止字符串再好不过了


6.4.3 字符串的长度和数组的长度的关系


咱们既然用数组去储存字符串,那么字符串的长度和数组的长度有什么关系呢;


一般而言,字符串的长度比数组的长度小;

数组是可以反复储存的;所以数组的长度应该始终大于储存过程中最大的那个数 ;


那我具体举一个例子,比如定义一个char a[20];
第一次char a[10]=“da shuai ge”
第二次char a[10]=“shuai ge”
首先我说过空格也算字符;前面一共有11位被定义了;
然后后面的所有都没有被定义就被电脑自动定义为 \0 了;
第二次一共有8位,由于第一次已经被定义了第9 10 11  , 所以要是你没有字符串终止符你就输出错了,你会输出shuai ge ge;
那么就是说字符串结束标志 是非常重要的 最好自己定义。 不要等着电脑给你定义 ,会很容易出现错误;


1670490140784.jpg

1670490140784.jpg


6.4.4 字符数组的输入输出


输入:

正常而言 scanf(“…",…)前面必须要一一对应才行,后面必须要有地址&;

1.但是对于数组而言 ;地址符号可以不要;应为数组名就代表地址。

2.系统已经把空格规定了,他是字符串之间的间隔符


比如把 how are you?输入到一个数组中去;
用scanf("%s",c1);
实际而言在电脑读取到第一个空格时候就停止了;
为什么 因为系统已经把空格规定了,他是字符串之间的间隔符;
不仅仅再作为一个单独的字符使用;已经有了它特殊的含义;
所以这个scanf只能识别how;
具体这句话的意思是;计算机识别到了how ;按照线性一个个把他放置到名为c1的数组中去;其他没有被放置的位置被系统自动全部放置为\0;
所以理解这个就能理解这个了;
scanf("%s%s%s",c1,c2,c3);
同样输入 how are you? 空格作为分隔开的作用的话;就能一个个放置在how ///are/// you?在里面;


输出:

然后咱们说输出字符

printf("…",…);


可以一个个输出字符;举个例子;
#include <stdio.h>
int main(){
    char c[15]={'i','','a','m','','a','s','t','u','d','e','n','t'};
    int i;
    for(i=0;i<15;i++){
        printf("%c",c[i]);
        printf("\n");
        return 0;
    }
}
从这个代码可以看出 数组是可以一个个输出的;
咱们看看其实还可以一起输出的;怎么输出的?
就是利用%s解决 
比如printf("%s",c1)这样就说他输出的时候输出到有\0的位置就停止输出;
计算机是这样识别的;
首先就是找到地址c1 然后就是按照线性一个个提取出来输出,知道遇到|\0;


6.5 专门处理字符串的函数


但是在如果想要使用这些函数;就必须加上一个头文件;

#include <string.h>


6.5.1 puts()


他是用来输出字符串的;包括可以输出一些转义字符;空格照样输出;

输出截至位置是\0;

使用printf 效果一摸一样;同样可以输出转义字符 也可以输出 空格;

#include <stdio.h>
int main(){
  char a[]="china beijing";
  puts(a);
  return 0;
}

1670490216995.jpg

#include <stdio.h>
int main(){
  char a[]="china\tbeijing";
  puts(a);
  return 0;
}


1670490233844.jpg

1670490233844.jpg


6.5.2 gets()


输入一个字符串给数组, 同时顺便返回一个函数值;而该函数值就是这个数组的地址;

所以说gets是可以输入空格的 此 时空格不应该是起到间隔字符串的作用;

#include <stdio.h>
int main(){
  char a[10];
  gets(a); 
  printf("%s",a);
  return 0;
}

1670490260364.jpg

看看scanf;

#include <stdio.h>
int main(){
  char a[10];
  scanf("%s",a);
  printf("%s",a);
  return 0;
}

1670490286682.jpg

所以说scanf 与gets 是由明显的区别的;

但是scanf printf是可以同时输入和输出多个数组的;但是对于gets puts 一次只能输出一个;不能写成

puts(a,b,c);可以这样写;

puts(a);

puts(b);

puts©;

同理可以得到gets,一样的道理;


6.5.3 strcat()


字符串连接函数

strcat(字符数组1,字符数组2);

这个函数是什么意思;直观来说就是把字符串2和字符串1 连接起来 变成一个字符串;这样输出的结果变成一个字符串;而且函数调用会得到一个返回值 ;而这个返回值就是函数1的地址;

具体计算机内部是怎么处理这个过程;

1670490323744.jpg

就是前面不变;从\0那里接上去;

#include <stdio.h>
#include <string.h>
int main(){
  char s[30]="wumnda";
  char t[]="dedede";
    printf("%s",strcat(s,t));
  return 0;}

1670490341717.jpg


6.5.4 strcpy()


字符串能直接赋值么?

刚刚我在想;字符串可以直接赋值给一个数组的么;就像数值是可以直接赋值给变量的;我想说这是不行的;错误的;

char a[]=“wuminda”;

char b[30];

b=a;

可不可以??

不可以这是错误的;


这需要用到一个特殊的函数叫做strcpy();或者叫做:strncpy();


strcpy(字符数组1,字符串2);


这是什么作用么??这是字符串赋值函数;解决了刚才的问题;就是把字符串2 直接给字符数组1;字符串2那儿是可以写字符串的 也可以写数组的


这里面有一个问题 就是当你发str1 他并没有初始化得时候;就会出现一个bug;
举例子
char str1[10];
char  str2[6]="china";
printf("%s",strcpy(stri,str2));
你会发现str2 只有5为加上一位\0;当给str1 时 你会发现str1;他并没有初始化;他的出现是随机得;这是你只是把前六位复制到str1;后面4位并不是你所想的那样全部转换成\0;就是说吧,他原本随机得是什么数值 ,现在就是什么数值;


6.5.5 strcmp();


字符串不能直接比较 要用函数!叫做函数值比较;


strcmp(字符串1,字符串2);


意思就是让两个字符串进行比较 ;

如果两个比较等价;那么输出得结果就是0;

小于;那么输出的结果就是一个负整数;

大于;输出的结果就是一个正整数;


那么你坑定会问 ;怎么进行比较的呢;
首先自左向右进行比较;通过ascall
1)完全相同; 说明字符串完全相等;
2)有不同 以第一对为准;
3)如果两个字符串都是英语都是英文;大写小于小写;在英文字典在后面得位置为大;

6.5.6 strlen();


测量字符串长度函数;

strlen(字符数组);


测的是字符;\0不测


6.5.7 strlwr();


字符串转换成小写得函数:

strlwr(字符串);


6.5.8 strupr();


字符串转换成大写的函数:

strupr(字符串);


6.6 例题


例题一:冒泡法 :随机输入十个数 从小到大输出


冒泡法/*随机输入十个数 从小到大输出*/
#include <stdio.h>
int main(){
    int i,j,t ;
    int a[10];
    printf("please  ten numbers:要用空格隔开\n");
    for(i=0;i<=9;i++)
    scanf("%d",&a[i]);
    printf("\n");
    for(j=0;j<=9;j++)
    {
  for(i=0;i<=9-j;i++)
    {
  if(a[i]>a[i+1])
    {
  t=a[i];a[i]=a[i+1];a[i+1]=t;
  }
  }
}
printf("输出结果"); 
   for(i=0;i<=9;i++)
    printf("%d\n",a[i]);
   return 0;
  }

1670490458584.jpg

例题二:输入0123456789 输出9876543210


/*输入0123456789 输出9876543210*/ 
#include <stdio.h>
int main(){
  int i;
  int f[20]={1,1};
  for(i=0;i<=9;i++)
    f[i]=i;
  for(i=9;i>=0;i--)
  printf("%d\n",f[i]);
  return 0;      
  }

1670490469738.jpg

例题三:将二维数组行列互换

/*将二维数组行列互换*/ 
#include <stdio.h>
int main(){
  int a[2][3]={1,2,3,4,5,6};
  int b[3][2],i,j;
  printf("原矩阵是:\n");
    for(i=0;i<=1;i++)
    {
  for(j=0;j<=2;j++){
      printf("%5d",a[i][j]);
      b[j][i]=a[i][j];
      }
    printf("\n");
  }
  printf("\n请输出第二种矩阵:\n");
  for(i=0;i<=2;i++)
  {for(j=0;j<=1;j++)
  printf("%5d",b[i][j]);
  printf("\n");
}
return 0;
}

1670489935107.jpg

相关文章
|
1月前
|
分布式计算 并行计算 大数据
Spark学习---day02、Spark核心编程(RDD概述、RDD编程(创建、分区规则、转换算子、Action算子))(一)
Spark学习---day02、Spark核心编程 RDD概述、RDD编程(创建、分区规则、转换算子、Action算子))(一)
67 1
|
1月前
|
分布式计算 Java Scala
Spark学习---day03、Spark核心编程(RDD概述、RDD编程(创建、分区规则、转换算子、Action算子))(二)
Spark学习---day03、Spark核心编程(RDD概述、RDD编程(创建、分区规则、转换算子、Action算子))(二)
38 1
|
3月前
|
分布式计算 算法 数据挖掘
Spark中的图计算库GraphX是什么?请解释其作用和常用操作。
Spark中的图计算库GraphX是什么?请解释其作用和常用操作。
33 1
|
8月前
|
存储 分布式计算 并行计算
Spark学习---2、SparkCore(RDD概述、RDD编程(创建、分区规则、转换算子、Action算子))(一)
Spark学习---2、SparkCore(RDD概述、RDD编程(创建、分区规则、转换算子、Action算子))(一)
|
6月前
|
存储 BI 数据库
使用 FOR ALL ENTRIES 将 ABAP 内表内容作为数据库表的读取条件之一试读版
使用 FOR ALL ENTRIES 将 ABAP 内表内容作为数据库表的读取条件之一试读版
47 0
|
8月前
|
存储 分布式计算 对象存储
Spark学习---2、SparkCore(RDD概述、RDD编程(创建、分区规则、转换算子、Action算子))(二)
Spark学习---2、SparkCore(RDD概述、RDD编程(创建、分区规则、转换算子、Action算子))(二)
|
10月前
|
数据挖掘 数据处理
tidyverse|数据分析常规操作-分组汇总(sumamrise+group_by)
tidyverse|数据分析常规操作-分组汇总(sumamrise+group_by)
|
11月前
|
缓存 自然语言处理 数据挖掘
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
78 0
|
Linux 数据处理 Ruby
cdo (Climate Data Operators ) 常用命令介绍:(查看文件信息、多文件合并、数据裁剪、数据插值、数据计算。。)
cdo (Climate Data Operators ) 常用命令介绍:(查看文件信息、多文件合并、数据裁剪、数据插值、数据计算。。)
cdo (Climate Data Operators ) 常用命令介绍:(查看文件信息、多文件合并、数据裁剪、数据插值、数据计算。。)
|
索引
SAP ABAP——内表(六)【追加内表数据—APPEND】
本文主要介绍一下SAP ABAP中内表的增删查改语句中的追加内表数据的APPEND相关语句,包括使用索引追加数据(APPEND语句不能使用关键字追加数据)以及不同类型内表使用APPEND追加数据的不同效果
1657 2
SAP ABAP——内表(六)【追加内表数据—APPEND】