网站首页 > java教程 正文
在许多程序中,数组很重要。数组可以作为一种存储多个相关项的便利方式。
数组(array)是按顺序存储的一系列类型相同的值,如10个char类型的字符或15个int类型的值。整个数组有一个数组名,通过整数下标访问数组中单独的项或元素(element)。例如,以下声明:
float debs[20];
声明debts是一个内含20个元素的数组,每个元素都可以存储float类型的值。数组的第1个元素是debts[0],第2个元素是debts[1],以此类推,直到debts[19]。注意,数组元素的编号从0开始,不是从1开始。可以给每个元素赋float类型的值。例如,可以这样写:
debts[5] = 32.54;
debts[6] = 1.2e+21
实际上,使用数组元素和使用同类型的变量一样。例如,可以这样把值读入指定的元素中:
scanf("%f", &debts[4]); //
这里要注意一个潜在的陷阱:考虑到影响执行的速度,C编译器不会检查数组的下标是否正确。下面的代码,都不正确:
debts[20] = 88.32; // no such array element
debts[33] = 828.12; // no such array element
编译器不会查找这样的错误。当运行程序时,这会导致数据被放置在已被其他数据占用的地方,可能会破坏程序的结果甚至导致程序异常中断。
数组的类型可以是任意数据类型。
int nannies[22]; /* an array to hold 22 integers */
char actors[26]; /* an array to hold 26 characters */
long big[500]; /* an array to hold 500 long integers */
字符串
字符串,可以把字符串存储在char类型的数组中(一般而言,char类型数组的所有元素都存储char类型的值)。如果char类型的数组末尾包含一个表示字符串末尾的空字符\0,则该数组中的内容就构成了一个字符串。
用于识别数组元素的数字被称为下标(subscript)、索引(indice)或偏移量(offset)。下标必须是整数,而且要从0开始计数。数组的元素被依次存储在内存中相邻的位置,如图6.7所示。
在for循环中使用数组
程序中有许多地方要用到数组,程序清单6.19是一个较为简单的例子。该程序读取10个高尔夫分数,稍后进行处理。使用数组,就不用创建10个不同的变量来存储10个高尔夫分数。而且,还可以用for循环来读取数据。程序打印总分、平均分、差点(handicap,它是平均分与标准分的差值)。
// scores_in.c -- uses loops for array processing
#include <stdio.h>
#define SIZE 10
#define PAR 72
int main(void)
{
int index, score[SIZE];
int sum = 0;
float average;
printf("Enter %d golf scores:\n", SIZE);
for (index = 0; index < SIZE; index++)
scanf("%d", &score[index]); // read in the ten scores
printf("The scores read in are as follows:\n");
for (index = 0; index < SIZE; index++)
printf("%5d", score[index]); // verify input
printf("\n");
for (index = 0; index < SIZE; index++)
sum += score[index]; // add them up
average = (float) sum / SIZE; // time-honored method
printf("Sum of scores = %d, average = %.2f\n", sum, average);
printf("That's a handicap of %.0f.\n", average - PAR);
return 0;
}
先看看程序清单6.19是否能正常工作,接下来再做一些解释。下面是程序的输出:
Enter 10 golf scores:
99 95 109 105 100
96 98 93 99 97 98
The scores read in are as follows:
99 95 109 105 100 96 98 93 99 97
Sum of scores = 991, average = 99.10
That's a handicap of 27.
程序运行没问题,我们来仔细分析一下。首先,注意程序示例虽然输入了11个数字,但是只读入了10个数字,因为循环只读了10个值。由于scanf()会跳过空白字符,所以可以在一行输入10个数字,也可以每行只输入一个数字,或者像本例这样混合使用空格和换行符隔开每个数字(因为输入是缓冲的,只有当用户键入Enter键后数字才会被发送给程序)。
然后,程序使用数组和循环处理数据,这比使用10个单独的scanf()语句和10个单独的printf()语句读取10个分数方便得多。for循环提供了一个简单直接的方法来使用数组下标。注意,int类型数组元素的用法与int类型变量的用法类似。要读取int类型变量fue,应这样写:scanf("%d", &fue)。要读取int类型的元素score[index],所以这样写scanf("%d", &score[index])。
编程风格
该程序示例演示了一些较好的编程风格。
第一,用#define指令创建的明示常量(SIZE)来指定数组的大小。这样就可以在定义数组和设置循环边界时使用该明示常量。如果以后要扩展程序处理20个分数,只需简单地把SIZE重新定义为20即可,不用逐一修改程序中使用了数组大小的每一处。
第二,下面的代码可以很方便地处理一个大小为SIZE的数组:
for (index = 0; index < SIZE; index++)
第三,程序能重复显示刚读入的数据。这是很好的编程习惯,有助于确保程序处理的数据与期望相符。
最后,注意该程序使用了3个独立的for循环。这是否必要?是否可以将其合并成一个循环?当然可以,读者可以动手试试,合并后的程序显得更加紧凑。但是,调整时要注意遵循模块化(modularity)的原则。
模块化隐含的思想是:应该把程序划分为一些独立的单元,每个单元执行一个任务。这样做提高了程序的可读性。也许更重要的是,模块化使程序的不同部分彼此独立,方便后续更新或修改程序。在掌握如何使用函数后,可以把每个执行任务的单元放进函数中,提高程序的模块化。
猜你喜欢
- 2024-11-21 新手初学Java数组难度大?这篇文章帮你解决
- 2024-11-21 Java-实现动态数组(ArrayList<Integer>集合)
- 2024-11-21 新手初学Java要注意什么 数组要学哪些知识点
- 2024-11-21 Java笔记二数组
- 2024-11-21 郑州Java培训学习之数组知识梳理
- 2024-11-21 从零开始学JAVA-3.超详细-方法和数组的学习
- 2024-11-21 C/C++编程笔记:如何在C++中打印数组参数大小?赶紧补课
- 2024-11-21 如何在 Bash shell 脚本中打印数组
- 2024-11-21 shell中如何逆序打印数组的内容,或者反转一个数组?
- 2024-11-21 JAVA并发编程 | 两个线程交替打印两个数组中的元素
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)