




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章,数 组(一),回顾指针,2.int *p,*a,b=10; p= *p=,思考:用变量存储一系列数据,如学号? 用int i=001,j=002,h=003.w=024? 如何简化解决,开辟一系列空间用变量可以连续存放一系列数据或字符,为什么要使用数组3-3,数组的元素,容器中保 存的物品,日常生活中的容器,程序中的数组,声明一维数组,数据类型 数组名size;,类型说明符 int、char、float ,数组名,常量表达式: 数组大小,int num50; char list 20; double pressure_level6;,# define LIMIT 20 . . . in
2、t emp_codesLIMIT;,int a8;,1.int 是类型名,只能存放整型 2.a是数组名 3.数组a中有8个元素,分别为a0,a1a7.即下标从0开始 4.执行完此语句的结果是:为数组a分配8个连续的单元,每个单元占4个字节 理解:数组a中有8个变量,变量名称依次为a0,a1a7.,9.1.3初始化一维数组,int a5 = 1, 4, 6,8, 9; 相当于: a0 =1; a1=4. 说明: 1.int a5=1 合法,没有初始化的变 量a1-a4自动赋初值为0 2.int a5 = 1, 4, 6,8, 9,3; 不合法 即:数组的大小=元素的个数,a,其他的初始化情况:
3、int arr10 = 10,9,8,7,6,5,4,3,2,1,0; /错误!越界了 int arr10 = 9,8,7,5; /正确,后面的6个元素未初始化 9.1.4 通过赋初值定义数组的大小 int arr = 9,8,7; /正确:元素个数为 3 (思考) int arr=; /错误,到底是几个元素?,为一维数组动态赋值,float price4; printf(“Enter prices of 4 booksn”); for (i = 0;i = 3; i+) scanf(“%f”, ,price,12.34,1002.10,17.5,11.12,问题描述: 求一组数中的最大值和最
4、小值 。,数组应用1,void main() int num5,max,min,i; printf(请输入5个数:n); for(i=0;inumi) min=numi; printf(n最大值为:%d,max); printf(n最小值为:%dn,min); ,读入5个值保存在数组中,求最大值和最小值,演示学生用书示例3,问题描述: 输入10个数,保存在一个数组中,在数组中查找某个数,给出是否找到的信息。如果找到了,要求输出该数在数组中所处的位置;如果找不到,输出“没有找到!”。,数组应用2,#define N 10 for(i=0;iN;i+) scanf(%d, ,读入10个值保存在数组
5、中,在数组中查找,一旦找到,通过break语句跳出循环,演示学生用书示例4,一维数组和指针,回顾指针:存放一个变量地址的变量(指向一个变量),i,p,例如: int * p,i=4,j; p= a=不合法,在数组中给指针赋初值: int* p,a2; p=k+) scanf(“%d”, a相当于是指针变量,是数组元素的首地址。 则: a值相当于 p=s; 总结: 表示数组s中的第i个元素: si,*(p+i),*(s+i),* 数组元素地址的正确表示:(A)int i; for(i=0;i10;i+) scanf(“%d”, ,2)main() int a10;int i; for(i=0;i
6、10;i+) scanf(“%d”, ,3)main() int a10;int *p,i; for(i=0;i10;i+) scanf(“%d”, ,9.3函数之间对一维数组和数组元素的引用 1、数组元素作实参 当调用函数时,数组元素可以作为实参传送给形参,和普通变量一样,即传值调用。形参的改变不会影响实参的值 2、数组名作实参 数组名也可以作为实参传送,数组名本身是一个地址值,因此是地址值的传递。形参的改变会影响实参的值,例题9.2编写程序,通过一个函数给主函数中定义的数组输入若干大约或等于0的整数,用负数作为结束标志;调用另一个函数输出该数组中的数据。 分析: main声明一个数组s;
7、调用一个子函数1给数组赋值; 调用一个子函数2输出数组的值 子函数1 当大于等于0时一直输入; 子函数2 依次输出数组元素的值,值传递?地址传递?,值传递?地址传递?,需要有一个变量,来计算 输入数据的个数,并返回,#include #define M100 void arrout(int *,int) void arrint(int *) main() int sM,k; k=arrin(s);(数组名作为实参) arrout(s,k); ,int arrin(int *a) int i=0,x; scanf(“%d”. ,当数组名作为实参时,对应的形参除了是指针外,还可以用另外两种形式。
8、上例中的函数调用arrin(s);对应的函数首部可以写成以下三种形式: (1)arrin(int *a) (2)arrin(int a ) (3)arrin(int aM),void arrout(int *a,int n) int i; for (i=0;in;i+) printf(”%4d”,*(a+i); printf(“n”); 解释: printf(i+1)%5=0? “%4dn”:“%4d”,*(a+i);使5个一行输出,数组元素地址作为实参 9.3编写函数,对具有10个元素的char类型数组,从下标为4的元素开始,全部设置为*,其余不变 假设已知元素分别为ABCDEFGHIJ 思
9、路:定义一个char类型数组存放元素 定义一个指针变量,指向下标为4的元素的地址; 通过指针变量的变化,来修改元素为* 输出变化后的元素,#include #define M 10 #define B 4 , void setstar(char *,int); void arrout (char *,int); main() char cM=A,B,C, C ,D, E, F, G, H, I, J; setstar( ,传递的是数组元素的地址,应用举例,例题9.4 定义一个含有15个元素的数组,编写函数: 1.调用C库函数中的随机函数给所有元素赋以0-49的随机数(数组x) 2.输出数组元素
10、中的值 3.按顺序对每隔三个数求一个和数,并传回主函数(数组w) 4.最后输出所有求出的和值 附:头文件stklib.h中随机函数 n=rand()%x n可以得到0 x-1的随机数,所以得到0-49的随机数即用rand()%50,#include #include #define SIZE 15 #define N 3 main() int xSIZE ,wSIZE/N=0; getrand(x,SIZE); /产生15个随机数放入x数组中 priarr(x,SIZE); /输出15个随机数 getave(x,w,SIZE); /每3个数求一个和,放入w数组 priarr(w,SIZE/N)
11、; /输出5个和数 ,例题9.5 将数组中的数按倒序重新存放,在操作时,只能借助一个临时存储单元而不能另外开辟数组。 思路:第一个与最后一个借助临时存储单元交换,依次类推,10,20,30,40,50,60,70,80,临时存储单元,计数器i,计数器j,直到i=j停止,程序如下: #include #define NUM 8 void priout (int s,int n) int i; for(i=0;in;i+)printf(%4d”,si); printf(“n”); void invert (int *a,int n)/逆序排列 int i,j,t; i=0;j=n-1; while
12、(ij)/直到i=j时交换结束 t=ai;ai=aj;aj=t;/交换过程 i+;j-;/i向后移动j向前移动 ,main() int aNUM=10,20,.; printf(“输出原始数据:”); priout(a,NUM); invert(a,NUM); printf(“输出逆序后的据:”); priout(a,NUM); ,例题9.6已知整型数组中的值在0-9范围内,统计每个整数的个数。 假设一组数:6 4 7 6 1 4 7 9 2 5 6 1 8 1即统计1的个数,2的个数9个数 思路: 声明数组,输入数组元素(运用随机函数); 对数组进行元素统计,将统计结果存放另一个数组中; 输
13、出统计结果;,假设已经获得M个数据元素存于数组a中 声明一个数组cN,存放统计结果; 即c0里存放0的个数,c1存放1的个数 相当于c0里存放ai=0时的个数; c1存放ai= 1的个数 for(i=0;iN;i+) ci=0; for(i=0;iM;i+)cai+; 6 4 7 6 1 4 7 9 2 5 6 1 8 1 c6=1;c4=1;c7=1;c6=2;c4=2;c7=2.,例题9.7.已知存放在a数组中的数不相重合,在a数组中找出和x值相同的元素的位置,若找到,则输出该值和值在数组a中的位置,没找到输出相应的信息。 思路:1.通过终端设备(键盘)生成数组a 2.输入一个数x 3.查
14、找数组a,是否有与x相等的值,有则输出该值 和值在数组a中的位置,没有输出没找到。,1.通过终端设备(键盘)生成数组a int arrin(int *a) int i; n; do printf(“确定输入数组元素的个数:”) scanf(“%d”, ,下标到n,但是只在n-1之前放置元素, 对于an作为辅助空间,3.查找数组a,是否有与x相等的值,有则输出该值 和值在数组a中的位置,没有输出没找到。 int search(int * a,int x,int n) int i,p; i=0; an=x;/将x放入辅助空间 while(x!=ai)i+; if (i=n)p= -1; else
15、p=I; return p; ,an,a0,an-1,x,i,#defint NUM 30 main() int aNUM,x,n,p; n=arrin(a); printf(“输入要查找的元素x”); scanf(“%d”, else printf(“ 没有找到与x值一样的元素”); ,获得随机数 void getrand( int *a,int n) int i; for(i=0;in;i+)ai=ranf()%50; ,输出15个随机数 void priarr(int *a,int n) inti i; for (i=0;in;i+) printf(“%5d”,ai); if(i+1)%
16、5=0)printf(“n”);/使每5个一行输出 printf(“n”); ,每三个求和,放入数组w中 void getave(int *a,int *b,int n) int i,j,sum; for(sum=0;i=0,j=0;i=n;i+) sum+=ai; if(i+1)%3=0)/每三个一组求和 bj=sum;/将和放入新数组中 sum=0; / 置零,重新累加接下来的三个数 j+; ,9.8怎样删除数组元素?,21,22,23,24,25,26,27,如何删除25?删除实质上是通过移动数组元素中的 值来实现. for(i=k;in-1;i+0) ai=ai+1;,k=5,.,例题
17、9.9用选择法对数组中的数进行排序,选择排序法的思想:从数组0至n-1中扫描一次选出最小的放到首位,再从1至n-1找出最小的放到第二位,依次类推 a0 a1 a2 a3 a4 a5 即5 7 4 2 8 6 变量p记录最小数位置m记录最小值 第一次扫描 1.开始p=0,m=5 2.m与a1比较,54,故m=4,p=2; 4.m与a3比较,42,故m=2,p=3; 5.m与a4比较,28,故m=2,p=3; 6.m与a5比较,26,故m=2,p=3; 此时知最小值为m=2,位置在p=3,再将最小值放到首位即 a0与a3交换,此过程可用如下代码实现:,第一次扫描代码: j=0 ;/j用来控制扫描次数,也代表了每次扫描的初始位置 p=j;/初始化 for (i=j+1;iai) p=i;m=ap; if(apai) p=i; t=aj;aj=ap;ap=t; 知m代表最小元素,p代表最小元素下标,故m=ap;则上述程序可以简化如上。 结果; a0 a1 a2 a3 a4 a5 即2 7 4 5 8 6 第二次扫描代码:即从a1开始,故j=1 j=1 ;/j用来控制扫描次数,也代表了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度办公楼木地板铺设与监理合同范本2
- 二零二五年度高科技办公区厂房租赁服务协议书
- 二零二五年农家乐承包经营合同
- 二零二五年度厂区门卫安全教育与培训服务合同细则
- 二零二五年度安全技术装备订货及采购协议
- 2025版PVC及彩印包装材料绿色环保认证采购合同
- 二零二五年度工业节能EMC合同能源管理执行书
- 2025版长途货运车辆货物运输合同范本
- 二零二五年度SaaS合同范本:电商平台SaaS平台服务协议
- 二零二五年度体育公园场地租赁合作协议
- 文本排版习题
- 窗帘采购投标方案(技术标)
- 车辆保险服务投标方案(完整技术标)
- 天翼云练习试题附答案
- 小区除草杀虫剂管理规定范本
- 学科教学中有效渗透心理健康教育的研究开题报告
- 《旅游学概论》第二章
- 云南省高中毕业生登记表
- GB/T 42748-2023专利评估指引
- 火试金安全操作规程
- 地下水相关知识培训课件
评论
0/150
提交评论