一、数组
(一)问题的引入
数据组织:基本数据类型,整型、浮点型、字符型等。
解决方法:程序开始变量定义,运行过程中引用。
例:统计成绩
给定N个学生某门课的成绩,统计高于平均分的学生人数。
问题1:给定N个学生成绩,求其平均分,需多少变量存储学生成绩?
问题2:给定N个学生成绩,求高于平均分的学生的人数,又需多少变量存储学生成绩。
分析:问题1中每个学生的成绩只需累加到总分里即可;
问题2中每个学生的成绩需保留到平均分求出之后,故N个成绩需独立保存。
如何保存和处理?
设N个简单变量存放成绩计算平均值,可以逐一处理。
(二)数据的概念和特点
【解决方案】新的数据组织形式批量处理成绩
上述包含多个分量的新的数据类型被称为数组,它可以对一组数据的重复操作进行批量处理。
定义:float s[N];n是常量
使用:sum=sum+s[i];//求和
数组概念和特点
·是同类型同性质的一组元素顺序存放构成的数据集合
·所有数据共用一个名字,通过下标区分不同的数据。
·处理时可通过循环控制变量控制下标的变化来批量处理数组中的数据。
·数组按照存储的数据类型来讲有数值型数组、字符型数组、指针型数组等。
·数组按照下标个数来分,可以分为一维数组和多维数组。
二、一维数组
(一)数组的定义与访问
1.数组的定义
数据类型 数组名[整型常量表达式];
数组名命名规则和变量一样,代表数组在内存中的首地址,该地址由系统自动分配,是一个地址常量;
整型变量表达式代表数组的长度,即数组中包含的元素个数。不可使用变量说明长度;
数组中包含的分量(元素)用下标区分,下标范围0~长度-1;
要避免以下错误:
2.数组的访问
数组名[下标]
·数组元素相当于一个该类型的普通变量1,可参与该类型变量允许的一切操作。
·对于数值型数组,程序只能操作数组元素而不能一次整体调用整个数组全部元素的值,并且不能操作数组名。
例:对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。
解题思路:定义一个长度为10的数组,数组定义为整型要赋的值是从0到9,可以用循环来赋值,用循环按下标从大到小输出这10个元素。
(二)一维数组的初始化
例:用数组处理求Fibonacci数列问题
解题思路:
·用简单变量处理,缺点不能在内存中保存这些书。假如想输出数列中第25个数,是很困难的。
·如果用数组处理,每一个数组元素代表数列中的一个数,依次求出各数并放在相应的数组元素中。
三、一维数组应用
(一)数组元素排序
例:有10个地区的面积,要求对它们按由小到大的顺序排列。
解题思路:
·排序的规律有两种:一种是“升序”,从小到大;另一种是“降序”,从大到小;
·把题目抽象为:“对n个数按升序排列”;
·采用冒泡法排序
(源代码)
(运行结果截图)
(二)数组元素插入
元素的插入是数组的常见操作。由于数组在内存中连续顺序存储,所以增加元素时需要移动部分元素。
例:在递增排列的成绩数组score中插入一个新成绩x,使得插入后数组仍保持有序。
(源代码)
(三)数组元素删除
元素的删除是数组的常见操作。由于数组在内存中连续顺序存储,所以删除元素时需要移动部分元素。
例:查找某成绩x是否存在于成绩表score中,若存在,删除第一次出现的该成绩;否则提示“未找到”
(四)数组元素查找
在数组中搜索某字段的值与给定值相同的数据元素的过程便是查找。
例:在长度为N按递增顺序排列的成绩数组score中用二分法查找成绩x,找到输出该成绩所在的一个位置;否则输出“未找到”。
(源代码)
四、二维数组
(一)二维数组定义和存储
定义
存储
(二)二维数组初始化
(1)按存放顺序对所有元素赋初值
(2)按行给所有元素赋初值,每行数据组织在一对花括号内
(3)按行给部分元素赋初值,未被赋值的元素自动为0
(4)按行赋初值也可省略第一维的长度
(三)二维数组基本操作
·对与数值型数组,程序只能使用其元素
·输入、输出、批量处理时需要使用双重循环,通常外循环控制行的变化,内循环控制列的变化。
如m行n列数组可以这样进行处理:
例:打印n行杨辉三角形
问题分析:
程序设计:
(源代码)
(运行结果截图)
五、二维数组应用
例:将一个二维数组行和列的元素互换,存到另一个二维数组中
解题思路:
(源代码)
(运行结果截图)
例:对3*3方阵转置
程序设计:
例:有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
解题思路:采用“打擂台算法”
程序设计:
(运行结果截图)
六、字符数组和字符串处理
(一)字符数组定义和存储
定义
(二)字符数组初始化
(1)按存放顺序对所有元素赋初值
(2)字符串方式对所有元素赋初值
(3)按行给部分或所有元素赋初值
(4)按行赋初值也可省略第一维的长度
(三)字符数组基本操作
输入
输出
例:凯撒密码加密解密
问题分析:
程序设计:
七、字符数组应用
(一)字符数组应用案例
例:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开
解题思路:
程序设计:
(源代码)
(运行结果截图)
例:凯撒密码的加密规律?
问题分析:
问题:输出密码出现乱码
(源代码)
(二)字符串处理函数使用
系统提供了字符串连接、复制、比较等功能的字符串处理函数。
(1)strlen(str)
(2)strlwr(str)
(3)strupr(str)
(4)strcpy(str1,str2)
注意
(5)strcat(str1,str2)
注意:
(6)strcmp(str1,str2)
注意:字符串比较不能用“==”,必须用strcmp函数
上述几个函数的原型说明在头文件string.h中
除了strcpy和strcat两个函数中的第一个参数不能取字符串常量外,其它的参数都可以为字符数组、字符指针变量和字符串常量。
八、一维数组指针初步
(一)一维数组的指针
存储变量地址的变量是指针变量通过指针变量可以实现数据的间接访问,可以通过*p来间接访问变量a的值。int a=10, *p=&a;
通过本章的学习我们又知道数组在内存占有一片连续的存储区域,数组名就是这块存储区域的首地址。
即,假设有定义:int s[10]; 则s其实等价于&s[10]
(二)一维数组指针的操作
1.自增自减运算(p++ 、++p 、p-- 、--p)
2.p+n和p-n运算(p为指针变量,n为整数)
3.指针变量相减
p与数组a的关系
(三)一维数组指针应用
例:用指针变量引用法实现数组的逆序存放
(源代码)
例:利用指针运算求字符串的实际长度
(源代码)
知识点小结
该文章属于个人课后学习笔记,内容来源于知到智慧树共享课-C语言程序设计(上海电力大学)。