《C语言程序设计 谭浩强 第4版》:利用数组处理批量数据

一、为什么要用数组

具有相同属性的若干个数据组织成一个整体,这组数据就称为一个数组 

数组是有序数据的集合 

数组中每一个元素都属于同一个数据类型 

用一个统一的数组名和下标来唯一的确定数组中的元素 

数组的名字代表数组首元素的地址,而不是代表数组中的全部元素的值 

 

二、怎样定义和引用一个数组 

1、怎样定义一维数组 

在定义数组时需要指定这批变量的类型、数组名称和数组中包含多少个元素 

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

说明:

  • 数组名的命名规则和变量名相同,遵循标识符命名规则
  • 在定义数组时,需要指定数组中元素的个数
    • 下标是从 0 开始的
  • 常量表达式中包括常量和符号常量,不能包含变量,即数组的大小不依赖于程序运行过程中变量的值 

 

2、怎样引用一维数组的元素 

数组名[下标] 

定义数组时用到的“数组名[常量表达式]”和引用数组元素时用到的“数组名[下标]”,在形式上相似,但在含义上和用法上是不同的 

判别方法:看前面是否带有类型名即可区分 

 

3、一维数组的初始化 

对数组元素的赋值可以通过赋值语句来实现,也可以在定义数组时同时给予初值,这就称为数组的初始化 

// 定义数组时对全部数组元素赋初值
int a[3] = {0,1,2};

// 只给一部分元素赋值
int a[3] = {0};

// 在对全部数组元素赋初值时,由于数据的个数是确定的,因此可以在定义数组时不指定数组长度,系统会根据数据的数量确定数组的长度
int a[] = {0,1,2,3,4};

// 如果所定义的数组的长度和初始化的数据的个数相同,则定义数组时可以不写数组长度
// 如果希望数组的长度与提供初值的个数不同,则数组的长度不能省略

 

4、一维数组程序举例 

斐波那契数列问题:数组序号为 i 的元素的值是其前两个元素值之和 

#include <stdio.h>
int main(){
    int i;
    int f[20] = {1,1};
    for(i = 2; i < 20; i++){
        f[i] = f[i - 2] + f[i - 1];
    }
    
    for(i = 0; i < 20; i++){
        if(i % 5 == 0){
            printf("\n");
        }    
        printf("%12d",f[i]);
    }
    printf("\n");
    return 0;
}

 运行结果:
1         1               2             3             5
8         13             21           34           55
89       144           233         377         610
987     1597         2584       4181       6765

 

三、怎样定义和引用二维数组 

1、怎样定义二维数组 

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

用矩阵形式表示二维数组,是逻辑上的概念,形象的表示出行和列的关系 

而在内存中存放数组是物理上的实现,是线性的、连续存放的,而不是二维的 

 

2、怎样引用二维数组的元素 

数组名[下标][下标] 

 

3、二维数组的初始化 

与一维数组类似 

 

四、字符数组 

用来存放字符数据的数组是字符数组 

字符数组中的一个元素存放在一个字符 

字符数组的定义与初始化可以使用一维数组或二维数组,引用方式也是类似 

 

1、字符串和字符串结束标志 

在 C 语言中,是将字符串作为字符数组来处理的 

C 语言规定了以字符 ‘\0’ 作为字符串结束标志 

编译系统在处理字符常量时会自动加一个 ‘\0’ 结束符 

字符串作为一维数组存放在内存中 

可以用字符串常量来使字符数组初始化,也可以省略大括号 

char c[] = {"abc"};
char c[] = "abc"

对数值型数组,未赋值的部分元素值默认为0 

对字符数组,未赋值的部分元素默认值为空字符 

 

2、怎样进行字符数组的输入输出 

逐个字符输入输出(%c) 

将整个字符串一次性输入或输出(%s) 

char c[] = "China";
printf("%s",c);
  • 输出字符不包括结束符
  • 用 “%s” 格式符输出字符串时,printf 函数中的输出项是字符数组名,而不是数组元素名
  • 如果数组长度大于字符串的实际长度,也只输出到遇到 “\0” 结束
  • 如果一个字符数组中包含一个以上 ‘\0’ ,则遇到第一个时输出就结束
  • 可以用 scanf 函数输入一个字符串
  • scanf 函数中的输入项如果是字符数组名,不要再加地址符 &,因为在 C 语言中数组名代表该数组的起始地址
  • 如果想知道数组 str 在内存中的起始地址,可以用以下输出语句:
printf("%d",str); 

 

3、字符串处理函数 

 

如果将两个字符进行比较,所谓大者是指字符的 ASCII 码较大的那个字符 

 

比较三个字符串,输出最大者

#include <stdio.h>
#include <string.h>
int main(){
    char string[20];
    char str[3][20];
    int i;
    for(i = 0;i < 3;i++){
        gets(str[i]);
    }
    if(strcmp(str[0],str[1]) > 0){
        strcpy(string,str[0]);
    }else{
        strcpy(string,str[1]);
    }
    if(strcmp(str[2],string) > 0){
        strcpy(string,str[2]);
    }
    printf("The largest string is:\n%\n",string);
    return 0;
}

运行结果:
CHINA
HLOLLAND
AMERICA
The largest string is:
HOLLAND 

 

一  叶  知  秋,奥  妙  玄  心

  • 12
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QX_Java_Learner

祝老板生意兴隆,财源广进!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值