c语言第07章数组
合集下载
C语言程序设计(李圣良)章 (7)

一般形式如下:
struct
{
成员列表;
}变量名列表;
例如,可以直接定义结构体变量st1、st2:
struct
{
char id[9];
/* 学号 */
char name[10];
/* 姓名 */
char sex;
/* 性别 */
int age;
/* 年龄 */
float score;
/* 成绩 */
}st1,st2;
型变量x和y表示点的x坐标和y坐标。
# include <stdio.h>
# include <math.h>
struct point
/* 点 */
{ float x;
/* x坐标 */
float y; /* y坐标 */
};
main()
第7nt p1;
float l;
采用定义变量的方式来定义数据成员。
第7单元 结构体和共用体 (4) 结构体类型定义必须以分号结束。 例如,根据图7-1的分析可以设计结构体类型如下:
struct student
{
char id[9];
char name[10];
char sex;
int age;
float score;
};
/* 学号 */ /* 姓名 */
\n",tomor.year,tomor.month,tomor.day); }
第7单元 结构体和共用体 图7-3 例7-1程序运行结果
第7单元 结构体和共用体 3. 结构体变量的初始化 在结构体变量定义的同时可以为其整体赋初值,方法与数
组的初始化相似,将各个数据成员的值按声明类型时的顺序依 次排列,使用逗号间隔,全部放在大括号中,整体赋值给变量。 例如:
C语言板书7数组

7
4. 可在定义时对 静态数组 和 外部存储(全局)数组 赋初值, 方法如下: 赋初值 方法如下 对全部元素赋初值 int a[10] ={10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; 对部分元素赋初值 int a[10]={0,1,2,3,4}; 如此,只有前 个元素初值确定,后 个元素由系 只有前5个元素初值确定 如此 只有前 个元素初值确定 后5个元素由系 统设置. 统设置.
10
7.1.3 一维数组的应用 数列. 例:求Fibonacci 数列. 定义数组,并赋初值 定义数组 并赋初值 int f [20]={1,1}; 用循环for实现 用循环 实现: 实现 for (i=2; i<20; i++) f [i]=f [i –2]+f [i –1]; 注意:下标越界问题 注意 下标越界问题:i =2且i<20 下标越界问题 且
5
§7.1 一维数组
7.1.1 一维数组的定义 形式: 数组名[ 形式 类型说明符 数组名 常量表达式]; 例: int a [20]; float x [100]; 1. 数组名的确定方法同变量名. 数组名的确定方法同变量名. 2. C语言用方括号 ]表示数组元数个数. 语言用方括号[ 表示数组元数个数. 语言用方括号 表示数组元数个数
29
二维数组一般用二重循环 有一个3× 的矩阵 的矩阵, 例2. 有一个 ×4的矩阵,要求编程序求出其中值 最大的那个元素的值,以及所在的行号和列号. 最大的那个元素的值,以及所在的行号和列号. 先用N- 流程图表示算法 先用 -S流程图表示算法
1
for循环
表达式1只执行一次 表达式3的执行时间在循环体最后,在循 环中每次都要执行. 正常循环结束时,循环变量的值为最后 一次进入循环的值加或减步长. 正常非循环结束时,循环变量的值为最 后跳出循环时的值.
《C语言程序设计基础与实训教程》第7章:数组

/webnew/
7.1.4 一维数组的应用举例
例7.5 将数组中的数按颠倒的顺序重新存放。要求,在操 作时只能借助一个临时存储单元而不能另外开辟数组。 分析:题目要求是按颠倒的顺序重新存放数据,而不是按 逆序输出。 可以使用两个变量i和j,i和j的初值分别为0和9,将a[i] 与a[j]对调,然后i++,j--,接着再将a[i]与a[j]对调。如些 重复操作,直到i>=j时,对调完成。 程序
分析:该数组元素的值是有规律的序列, ( 从 开始算起 开始算起) 分析 : 该数组元素的值是有规律的序列 , 第 i(i从0开始算起) 个 元素的值为: 元素的值为:10+2*i。 。 输出该数组时,由于该数组有30个元素,在一行中输出不太美观, 输出该数组时,由于该数组有 个元素,在一行中输出不太美观, 个元素 所以,这里我们选择每行输出6个元素。 所以,这里我们选择每行输出 个元素。 个元素
/webnew/
7.1.3 一维数组元素的引用
2.一维数组的输入与输出 一维数组的输入与输出 如何给数组元素赋值以及如何将数组元素的值输出是数 组最基本的操作。下面将讨论一维数组元素的输入与输出。 例7.1 定义一个五个元素的字符型数组,通过键盘给每 个元素赋值,并以相反的顺序的输出。 程序1 程序2 从上面的例子可以看出,一个数组中往往往包含较多的 数组元素,相同的赋值或输出操作将被重复多次进行,所以, 一维数组元素的输入与输出一般通过一重循环来实现。
/webnew/
7.1.3 一维数组元素的引用
注意: (1)数组元素的引用方式与数组说明符的形式非常相近,都是 “数组名[表达式]”形式,但两者的意义完全不同。 出现的位置不同。定义数组时,“数组名[表达式]”出现在 定义语句中,表示的是定义了一个名为“数组名”的数组,表达式的值 表示该数组中所包含元素的个数。作为数组元素的引用方式时,“数组 名[表达式]”出现在其它执行语句中,表示是数组中的下标为“表达式” 值的那个元素。 表达式的格式不同。定义数组时,“表达式”必须为常量表 达式。作为数组元素的引用方式时,表达式可以变量、常量或函数构成 的合法C表达式。 (2)在C语言中,起始下标规定为0,最大值应为:数组长度-1。 如果发生了下标越界的现象,可能破坏了其它存储单元的数据,甚至破 坏程序代码。 (3)下标必须是整型表达式,若为小数,则自动取整。如a[2.6] 系统自动默认为a[2]。
C语言基础 第7章 数组

一维数组: float mark[100];
低地址
每个数据元素占用 的字节数,就是基
类型的字节数 一个元素占4个字节
高地址
86.5 mark[0]
92.0 mark[1]
77.5 mark[2]
52.0 mark[3]
.
.
.
.
.
.
94.0
mark[99]
第7章 数组
7.1.2 一维数组的初始化 ❖ 初始化:在定义时指定初始值,编译器把初值
例:int a[10] = {0,1,2,3,4}; 仅前5个元素赋初值,后5个元素自动赋为0。 3、全部元素均初始化为0,不允许简写。 int a[10] = {0,0,0,0,0,0,0,0,0,0}; 不能写成:int a[10]={0*10};
第7章 数组
❖ 不能简写为:
❖ static int a[10] = {0*10};
第7章 数组
❖ 注意: 2)C语言不允许对数组的大小做动态定义, 如:
❖ int n;
❖ scanf("%d",&n);
❖ int a[n]; ❖ 因为在编译时,C编译器根据已知数组大
小分配内存。//只针对全局变量
❖ 说明:
1)数组名:按标识符规则。本例a就是数 组名。
2)整型常量表达式:表示数组元素个数 (数组的长度)。可以是整型常量或符 号常量,不允许用变量。整型常量表达 式在说明数组元素个数的同时也确定了 数组元素下标的范围,下标从0开始~整 型常量表达式-1(注意不是1~整型常量 表达式)。
7.1.3 数组元素的引用
❖ C语言规定,不能引用整个数组,只能逐 个引用元素,元素引用方式:
大学课件C语言数组

第3趟排序后成为:37, 48, 12, 26, 49, 64, 75, 97 第4趟排序后成为:37, 12, 26, 48, 49, 64, 75, 97 第5趟排序后成为:12, 26, 37, 4 8, 49, 64, 75, 97
第6趟排序后成为:12, 26, 37, 4 8, 49, 64, 75, 97
printf("ENTER 10 REAL NUMBERS\n"); for(i=0;i<10;i++) { scanf("%f",&value); x[i]=value; } total=0.0; for(i=0;i<10;i++) total=total+x[i]*x[i];
/*.....PRINTING OF x[i] VALUES AND TOTAL......*/
number[0] number[1] number[2] number[3] number[4]
C语言中,数组元素的序号(下标)从0开始。
对数组的引用超过了所声明的范围,会导致不可预知的结果.
9
数组的作用
数组元素的作用相当于简单变量 数组名代表的是数组在内存中的首地址 同一个数组中的元素在内存中是按顺 序连续存放的
/*.....PRINTING OF x[i] VALUES AND TOTAL......*/
printf("ENTER 10 REAL NUMBERS\n"); for(i=0;i<10;i++) { scanf("%f", &x[i]); total=total+x[i]*x[i]; } printf("\n"); for(i=0;i<10;i++) printf("x[%2d]=%5.2f\n", i, x[i]); printf("\ntotal=%.2f\n", total);
第6趟排序后成为:12, 26, 37, 4 8, 49, 64, 75, 97
printf("ENTER 10 REAL NUMBERS\n"); for(i=0;i<10;i++) { scanf("%f",&value); x[i]=value; } total=0.0; for(i=0;i<10;i++) total=total+x[i]*x[i];
/*.....PRINTING OF x[i] VALUES AND TOTAL......*/
number[0] number[1] number[2] number[3] number[4]
C语言中,数组元素的序号(下标)从0开始。
对数组的引用超过了所声明的范围,会导致不可预知的结果.
9
数组的作用
数组元素的作用相当于简单变量 数组名代表的是数组在内存中的首地址 同一个数组中的元素在内存中是按顺 序连续存放的
/*.....PRINTING OF x[i] VALUES AND TOTAL......*/
printf("ENTER 10 REAL NUMBERS\n"); for(i=0;i<10;i++) { scanf("%f", &x[i]); total=total+x[i]*x[i]; } printf("\n"); for(i=0;i<10;i++) printf("x[%2d]=%5.2f\n", i, x[i]); printf("\ntotal=%.2f\n", total);
C语言(第七章数组)

对部分元素赋初值(前面的连续元素)。如: int b[10]={0,1,2,3,4};
表示数组元素的值为:
b[0]=0; b[1]=1; b[2]=2; b[3]=3; b[4]=4; 后5个元素的初值为0。
注意:不能只对不连续部分元素或后面的连续
元素赋初值。 语句: int a[10]={, , , , ,1,2,3,4,5};
main ( ) { int a[2] [3]={{1, 2,3},{4, 5,6}}; int b[3] [2], i, j; printf("array a: \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("array b:\n"); for (i=0; i<=2; i++) { for (j=0; j<=1; j++) printf("%5d", b[i]j]); printf("\n"); } }
运行结果如下:
1
1
2
3
5
8
89
13
144
21
133
34
377
55
610
987
1597
1584
4181
6765
四、简单预处理指令
1. 指令格式:
#define 符号常量
2. 指令作用
文本串
用整型表达式替换程序中所有的符号常量。
C语言讲义第07章-结构体与其他构造数据类型(原)

atoi(char*str);将数字字符串转换为整型。
atof(char*str);将数字字符串转换为双精度的 实型。 atol(char*str);将数字字串转换长整型。 使用上述函数,要包含头文件"stdlib.h"。
7.1 结构体
• 例7-1类型转换函数在结构体变量数据输 入中的应用示例。定义结构体类型及变 量,输入一个学生的有关信息并输出。 例7-1源程序
7.1 结构体
结构体变量一旦进入其作用域,系统便根据结构体类 型定义时成员排列的先后,自动为结构体变量的每一 个成员分配相应的存储空间。结构体变量的各个成员 均有自己的存储空间,结构体变量所占存储空间的大 小为各成员所占空间之和。 例如:student1 所占空间大小为:8 + 10 + 1+ 4 * 2 = 27(字节)。
例如:指针变量p1,p2指向结构体变量x。
p1 = p2 = &x; 例如:通过结构体指针p1和p2来引用结构体变量x成员。以下三种 方式是等价的。 x.no、、x.score[0] p1->no、p1->name、p1->score[0]
(*p2).no、(*p2).name、(*p2).score[0]
7.2 结构体数组的定义和引用
• 结构体数组的输入与输出一般在循环结构中进行, 一次循环可以输入或输出一条结构体记录。 • 例7-3定义一个结构体数组用于存储和显示三个学 生的基本信息。
例7-3源程序
• 程序运行结果如下:
no. 06030217 06050105 06010116 name zhang san li si wang wu sex m m f age 19 18 18 depart Economy & Commerce engineering Computer science
chap07_数组

数组长度为常量
int a[10];
定义一个含有10个整型元素的数组 a
char c[200];
定义一个含有200个字符元素的数组 c
float f[5];
定义一个含有5个浮点型元素的数组 f
2、数组的内存结构
int a[10]; 假设系统规定int类型占用2个 字节,则对于数组a,其内存 分配形式 只要知道了数组第一个元素的 地址以及每个元素所需的字节 数,其余各个元素的存储地址 均可计算得到。
a[0]=1, a[1]=2,...… a[9]=10
静态数组、动态数组的初始化
static int b[5] = {1, 2, 3, 4, 5}; 静态存储的数组如果没有初始化,所有元素自动赋0 static int b[5]; 动态存储的数组如果没有初始化,所有元素为随机值 auto int c[5]; 等价与 int c[5];
例 7-2 计算fibonacci数列
用数组计算fibonacci数列的前10个数,并 按每行打印5个数的格式输出。
1, 1, 2, 3, 5, 8, 13, …… 用数组计算并存放fibonacci数列的前10个数 f[0] = f[1] = 1
f[n] = f[n-1] + f[n-2]
2≤n≤9
#include <stdio.h> int main(void) { int i; int fib[10] = {1, 1}; /* 数组初始化 */ 1 1 for(i = 2; i < 10; i++) 8 13 fib[i] = fib[i - 1] + fib[i - 2]; for(i = 0; i < 10; i++){ printf("%6d", fib[i]); if((i + 1) % 5 == 0) /* 5个数换行 */ printf("\n"); } return 0; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
该语句执行: num[0]=1;num[1]=2;num[2]=3;num[3]=0;num[4]=0;
数组
注意:
放在{ }内的初始数据个数不一定要与数组大小一致。所以: 如果初始化数据个数少于数组元素的个数,剩余元素将被自动 初始化为0。因此可以采用语句 int cj[10]={0};将数组cj的元 素初始化为0。 特别地:数组的元素不能自动初始化,程序设计人员至少要将 第一个数组元素初始化为0才能使所有剩余元素自动被初始化为0。 如果初始化数据过多,会出现一条警告信息。
for (i=0;i<=SIZE-1;i++) if(a[i] == x)break; if (i< SIZE) printf(“%d,poster is %d\n”,x,i); else printf(“no find %d \n”,x); } 演示6_2.C
数组
【例13】已知一维数组中存放10个互不相同的整数,从键盘输入 一个数,并从数组中删除与该值相同的元素中的值。 #include<stdio.h> 说明: 做删除操作时,首先要 #define SIZE 10 找到删除元素的位置, main() 找到后,立即用break语 {int a[SIZE]={1,2,35,6,39,47,53,4,5,10}; int i,j,x; 句推出循环并进行删除 for (i=0;i<SIZE;i++) 操作,删除操作实质是 printf(“%4d”,a[i]); 把一些数组元素向前移 printf(“please enter a x:\n”); 动一位。最后一位的删 scanf(“%d”,&x); 除不必移位,直接输出 for (i=0;i<SIZE;i++) 前size-1位。 if(a[i]= =x)break; for (j=i;j<SIZE-1;j++) a[j]=a[j+1]; for (i=0;i<SIZE-1;i++) printf(“%4d”,a[i]); printf(“\n”); } 演示6_3.C
num[0] num[1] num[2] num[3] num[4]
该语句执行后: num[0]=1;num[1]=2;num[2]=3;num[3]=4;num[4]=5;
数组
注意:
如果在定义一维数组的同时给出全部元素的初始值,则数组 长度可以省略。C 语言编译系统将自动根据初始化数据的个数来 确定数组的长度。数组元素的个数就是初始化数据列表中数据的 个数。例如:int a[ ]={1,2,3,4,5};编译系统将确定数组a 的 长度为5。 2)对数组的部分元素赋初值。 例如: int num[5]={1,2,3} ; num 1 2 3 0 0 num[0] num[1] num[2] num[3] num[4]
数组
【例9】: int a[2]; scanf(“%d%d”, &a[1],&a[2]); ——??
错误: 在C语言中数组元素的下标由 0开始,一个数组的下标的合 法范围在0~n-1,因此该题正确的写法是: int a[2]; scanf(“%d%d”, &a[0],&a[1]);
【例10】:int a[10]; float i=3; a[i]=10; ——?? 错误: 数组元素是通过数组名[下标]来访问的,其中下标必须是 大于0的整数、整型变量或整型表达式,在这段程序中,i是浮 点数,不能做数组元素的下标。
数组元素名 指定该数组 的数据个数 数组长度 cj[0] cj[1] cj[2] ……………………cj[9] cj[10] 数组名: 数组中的所有元素具有相同的名字cj。
数组
使用下标的优点?
由于有了下标,元素在数组中的位置(或者说是排列顺序)就 被唯一的确定下来。我们采用数组名+[下标]就可以准确访问到数组 中的每一个元素。 如图所示: cj[0]代表cj数组中的第一个元素。cj[9]代表cj数组中的第十个元 素。一般地: cj[i-1]引用了数组cj的第i个元素。C语言是一个有 趣的语言,它喜欢从0开始计数,而不是从1开始,所以这10个元素 的编号是从0到9。
数组
什么是数组???
这些数据称为 数组元素
就是一组具有固定数目的、有序的、类型相同的数据 的集合。根据数组下标的多少,数组可以分为一维数组和 多维数组。
车厢号10
…
车名
车厢号2 车厢号1
火车
数组
一个数组就是一组连续的内存空间,用来保存数据, 数组中的每一项称为一个元素。
用于访问的、具有相 同的数据类型。在程 序设计中相当于变量 名的用法。 为标识数组中的每个 元素,C语言对其进 行编号。这个编号称 之为数组元素下标。 (C语言规定下标从0 数组元素下标 开始)。
C语言程序设计
数组
学习目标:
数组是程序设计语言中最基本、最重要的组成 部分。在本章中将学习数组的特点和使用方法,并 通过典型例题学习数组的一般应用。
• 清楚数组的基本概念 • 理解数组的声明、初始化及引用方式
• 学会数组的编程
数组
数组是C语言中较为简单和常用的一种构造型的数据类型。
用变量来解决: 例如: #include <stdio.h> 计算10个同学 main() 的成绩:计算 { float cj1,cj2,cj3, …cj10; /*定义10个变量*/ 平均成绩、打 float pj; 印低于平均成 scanf(“%f”,&cj1); /*输入10个数据*/ 绩的同学成绩。 scanf(“%f”,&cj2); … scanf(“%f”,&cj10); pj=cj1+cj2+…+cj10; pj=pj/10; /*求平均值*/ /*打印低于平均成绩的同学成绩*/ if (cj1<pj) printf(“%f\n”,cj1); if (cj1<pj) printf(“%f\n”,cj2); … if (cj1<pj) printf(“%f\n”,cj10); }
1)对整个数组的引用;只给出数组名即可。
2)对数组元素的引用;需要给出数组名[下标]的形式。 可以是整型常 量、整型变量 或整型表达式 数组元素的引用类似于单个变量,可以自由存取。但是它与一 般变量相比有以下几个特点: 1. 数组元素是通过数组名加上该元素在数组中的位置(既数组元素 下标)来访问的。例如:a[3]代表的是数组a的第4个元素。其中 下标是整数或整型表达式。
数组
【例11】:指出并改正下列程序段中的错误。 (1)#define SIZE 100; (2)正确 (2)int b[10]={0} ,i; (3)for (i=0;i<=10;i++) b[i]=1; (4)SIZE=10; (1) 错误:使用了“;” 改正:去掉“;”
(3) 错误:引用了越界元素b[10]; 改正:循环控制最终值为9。
(4)数组说明中的数组长度说明,在以下两种情况下不必或不能 予以说明:一种情况是数组作为函数的参数,在函数的参数 说明部分不必予以说明;第二种情况是在定义数组时,如果 直接对数组进行初始化赋值,则可以省略长度说明,数组的 长度由所赋初值的个数决定。
数组
(2)一维数组的初始化
在声明数组的同时可以对数组进行初始化赋值,其方法是将初 值放在定义中的{}内,初值相互之间“,”隔开。并用“=”将其赋给 数组。 1)对数组的全部元素赋初值。 例如: num 1 int num[5]={1,2,3,4,5}; 2 3 4 5
数组
2. 数组元素的下标是由0开始的,因此一个数组a[n]的合法下标范 围是0~n-1。 使用时超过这个范围的下标访问元素将得到数组 有效元素之外的一个随机值。例如:a[-1];a[n]等。 但是C语言编译系统不检查数组下标的越界的错误。所以在编程 时要注意避免这类问题发生。 常见的错误就是引用了超出数组范围的数组元素。 3. 数组元素的赋值是逐个元素的进行,不允许将一个数组作为一个 整体赋值给另外一个数组。例如:int a[3],b[5];语句 b=a; 的赋值方式是错误的,除了数组初始化外,也不允许采用在{} 中列表的方式对数组元素整体赋值。 例如:int a[5]; a={1,2,3,4,5};是错误的。 但: int a[5] ={1,2,3,4,5};是正确的。 4. 数组名num代表的是数组num在内存中的首地址,因此可以用数组名 num来代表数组元素num[0]的地址。 scanf(“%d”,&num[0]); scanf(“%d”,num);
初始化数据元素的个数允许少于数组的长度;但不 能多于数组的长度。 常见错误:
在应该对数组元素初始化时忘记了数组元素的初始化。从而导 致运行结果出错。
数组
【例6】:int a[ ]; ——?? 错误: 只有在进行初始化的数据说明是才 能允许省略长度。在仅进行说明而 没有初始化数据时,不能省略长度。 因为编译系统无法知道这个数组的 究竟有多大。
C语言的数组有两个特点:
(1)数组的个数必须确定,不允许变动,但数组元素的 值可以改变; (2)数组元素的类型必须是相同的,不允许混合的。
数组
一维数组:只有一个下标的数组。
(1)一维数组的定义 格式: 类型说明符
指明数组中每个 元素的数据类型
数组名[常量表达式];
数组大小: 指明数组中所包含 的元素的个数
【例7】:float f[10]={1.1,2.2}; ——?? 可以: 初始化数据的个数允许少于数组长 度,此时,未被初始化的数据部分 将被编译系统自动请0。语句执行 后:f[0]=1.1;f[1]=2.2; f[2]=f[3]=…=f[9]=0;
数组
(3)一维数组的引用
C语言对数组引用有两种形式: