版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、问 题 如果需要处理1名学生的10门课程的成绩,用什么来 存储这些数据? 方法一:定义10个变量,每个变量中存放1门成绩。 方法二:定义一个可以存储10门成绩一维数组。 课程课程1课程课程2课程课程3课程课程4课程课程5课程课程6课程课程7课程课程8课程课程9课程课程1090819377926879839470第1页/共95页第一页,编辑于星期五:十六点 六分。变量:杯子,一个变量只能存放一个数据数组:带多个杯子的托盘,一个数组可以存放多个数据第2页/共95页第二页,编辑于星期五:十六点 六分。数轴上的一维向量x = 1,2,-2,1,0,3; 就相当于一维数组 第3页/共95页第三页,编辑于
2、星期五:十六点 六分。直角坐标系中的矩阵就相当于二维数组 第4页/共95页第四页,编辑于星期五:十六点 六分。E4.1 一维数组 4.2 二维数组 4.3 字符数组第5页/共95页第五页,编辑于星期五:十六点 六分。 一维数组定义格式: 类型说明符 数组名 整型常量表达式; 例如: int a10; 就定义了一个包含10个整型元素的数组a, 它的内存大小可以存放10个整型数据。 一 维数组的定义第6页/共95页第六页,编辑于星期五:十六点 六分。类型说明符类型说明符 数组名数组名 整型常量表达式整型常量表达式;int,char等都可以, 说明此数组中每个 元素都属于此类型命名规则与变量一致不能
3、和其他变量重名指定元素的个数,最小为0,不能是变量#define N 3int aN;int a3+5;int a1.5;int n;scanf(“%d”,&n);int an;int a;int a3;int a,b3;int n = 3;int an;第7页/共95页第七页,编辑于星期五:十六点 六分。【例 4.1】 判断以下数组定义是否合法,并说明原因。 (1)int a2.5; (2) int a-3; (3)int i = 3; (4) int i; int ai; scanf(“%d”, &i); int ai; (5)#define N 3 (6)int a; i
4、nt a N; int a3; (7)int a2 + 3; (8)int i, a3, b0; 第8页/共95页第八页,编辑于星期五:十六点 六分。一维数组元素的引用 一维数组引用格式: 数组名下标 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9注意:1. 数组必须先定义,再使用。 2. 只能逐个引用数组元素,不能一次引用整个数组。例如:int a10; 可以使用a0、a1.a9 。若有 a=1; 或者a10 = 1; 出错。a10不代表整个数组,它是下标为10的元素,越界!1第9页/共95页第九页,编辑于星期五:十六点 六分。3. 下标可以是常量或变量,它表示元素的序号。例如:
5、int i=3, a10; ai=1; 表示给下标为3的元素赋值为1。 4.一维数组在内存中连续存放,先存放下标为0的元素,再存放下标为1的元素,依次直至存放完所有元素。第10页/共95页第十页,编辑于星期五:十六点 六分。【例 4.2】定义一个包含3个整型元素的数组a,输出其元素值。只定义数组,不给数组元素赋值,数组元素中存放的是随机值。一般要先给数组元素赋值,再使用。第11页/共95页第十一页,编辑于星期五:十六点 六分。数组名a中存放的是数组起始元素的地址第12页/共95页第十二页,编辑于星期五:十六点 六分。【例 4.3】定义一个包含3个整型元素的数组a,从键盘给数组元素输入值,然后输
6、出。第13页/共95页第十三页,编辑于星期五:十六点 六分。【例 4.4】定义一个包含10个整型元素的数组a, 从键盘给数组元素输入值,然后输出。第14页/共95页第十四页,编辑于星期五:十六点 六分。一维数组的初始化 定义一维数组的同时给数组元素赋初值称为一维数 组的初始化。 其一般格式为: 类型说明符 数组名N = 初值1, 初值2, 初值N; 其中,N是表示数组元素个数的常量。第15页/共95页第十五页,编辑于星期五:十六点 六分。 一维数组的初始化方式有以下几种: (1)全部元素初始化: char a3 = 1, 2, n; int b5 = 2,11,3,14,5; int b =
7、2,11,3,14,5; int b4 = 2,11,3,14,5;在对数组的所有元素赋初值时,可以不指定数组长度。系统自动定义其长度为5初值个数不能超过数组长度。否则,会出现语法错误。第16页/共95页第十六页,编辑于星期五:十六点 六分。 (2)全部元素初始化: int a10 = 0,1,2; char a10=1, 2; (3)全部元素初始化为0: int a10=0; 将a0a2依次初始化为0、1、2。未赋值的元素a3a9值全部被初始化为int中表示假的值0。 将元素a0a9 全部初始化为0将a0a1依次初始化为0、1。未赋值的元素a2a9值全部被初始化为char中表示假的值0 。若
8、想全部初始化为1int a10=1; 错误第17页/共95页第十七页,编辑于星期五:十六点 六分。【例 4.5】定义一个含有10个元素的整型一维数组并全部初始化,将数组中所有元素逆序输出。第18页/共95页第十八页,编辑于星期五:十六点 六分。【例4.64.6】 :用冒泡法对5个数排序。解:冒泡排序过程如后面图所示,其中,红圈以内为已排好序的记录。 规则:令相邻位置的数依次比较,若上面的数大,则交换。第19页/共95页第十九页,编辑于星期五:十六点 六分。414135241 交换43 交换342 交换1 13 不交换34 32 交换513245 12 交换12345 12不交换结果 12345
9、R 第0趟 第1趟 第2趟 第3趟第0次第1次第2次第3次for(i=0;iRj+1 的值)则交换 j增1 for(j=0;j4i;j+) / 内循环 如果( Rj的值R2的值) temp R1; R1 R2; R2 temp; j增加1,比较Rj 和 Rj+1的大小 如果(Rj的值Rj+1的值) j增加1,比较Rj 和 Rj+1 的大小实现交换43 交换R1R243 不交换4R25R32R4temp 2. 交 换 过 程 与 核 心 程 序434第21页/共95页第二十一页,编辑于星期五:十六点 六分。 int i; int j; for(i=0;i=3;i+)for(j=0;jRj+1的大
10、小)temp Rj;Rj Rj+1;Rj+1 temp;3. 循 环 与 核 心 程 序 的 组 合 int i, j;类型一样,合并在一起外循环,将处理5个数推广到处理n个数 for(i=0;i=n-2;i+)内循环for(j=0;jRj+1)满足交换条件,则交换;在程序中将赋值箭头转换为赋值等号temp=Rj;Rj=Rj+1;Rj+1=temp;标出交换的起始位置标出内循环的起始位置标出外循环的起始位置第22页/共95页第二十二页,编辑于星期五:十六点 六分。4. 冒 泡 算法整理 int i, j ; / 定义int 类型的变量i , j int temp; / 定义新的存储单元 tem
11、pfor(i=0;i=n-2;i+) / 外循环 for1 / 外循环for1开始 for(j=0;jRj+1) / 比较数组R 中相邻元素值的大小 / 开始交换 temp=R j; / 先将R j中的值赋给 temp Rj=Rj+1; / 再将Rj+1中的值赋给Rj R j+1=temp; / 最后又把temp中的值赋给Rj+1 / 结束交换 / 内循环for2结束 / 外循环for1结束 / 经过n1=4 次循环,完成排序功能第23页/共95页第二十三页,编辑于星期五:十六点 六分。5. 冒泡算法真实程序第24页/共95页第二十四页,编辑于星期五:十六点 六分。第25页/共95页第二十五页
12、,编辑于星期五:十六点 六分。6. 优化推广程序第26页/共95页第二十六页,编辑于星期五:十六点 六分。第27页/共95页第二十七页,编辑于星期五:十六点 六分。改进的冒泡排序算法例如:待排序的数组元素为:3,1,2,5,4第28页/共95页第二十八页,编辑于星期五:十六点 六分。313124531 交换32 交换224 不交换451 13 不交换23 34 不交换45 45 不交换 12不交换结果 12345R i=0 i=1j=0j=1j=2j=3排好设置一个标识量,若某趟中一次交换也没有进行,设置标识量的值,代表数据已完全排好,不需要进行后面的排序。第29页/共95页第二十九页,编辑于
13、星期五:十六点 六分。【例 4.7】改进冒泡排序算法。第30页/共95页第三十页,编辑于星期五:十六点 六分。第31页/共95页第三十一页,编辑于星期五:十六点 六分。【例 4.8】从键盘输入10个学生成绩,计算出 平均成绩,并输出高于平均分的学生成绩。第32页/共95页第三十二页,编辑于星期五:十六点 六分。第33页/共95页第三十三页,编辑于星期五:十六点 六分。【例】求fibonacci数列的前20项,并输出。fibonacci: 1,1,2,3,5,8,13,21 第34页/共95页第三十四页,编辑于星期五:十六点 六分。 4.1 一维数组E4.2 二维数组 4.3 字符数组第35页/
14、共95页第三十五页,编辑于星期五:十六点 六分。问 题 如果需要处理3名学生的期末成绩,每名学生有4门课 程的成绩,用什么来存储这些数据? 方法一:定义12个变量,每个变量存储1个学生的 1门课程成绩。 方法二:为3名学生各定义3个数组,每个数组可以存 放4门成绩。 方法三:用一个3行4列的二维数组来存储。 成绩表成绩表数学数学英语英语计算机计算机C语言语言学生学生1928996.580学生学生288.5679070学生学生371908860第36页/共95页第三十六页,编辑于星期五:十六点 六分。二维数组的定义 类型说明符 数组名常量表达式M常量表达式N ; 例: float a34; 01
15、20 1 2 3M和N只能是正整数第37页/共95页第三十七页,编辑于星期五:十六点 六分。例:float a34第38页/共95页第三十八页,编辑于星期五:十六点 六分。3. 二维数组在内存中连续存放,先顺序存放第一行的元素,再存放第二行的元素,依次直至存放完所有元素。第39页/共95页第三十九页,编辑于星期五:十六点 六分。二维数组的引用 数组名行下标列下标 ; 例: int a23; a00、a01、a02 a10、a11、 a1212 15 365 8 13常出现的错误:下标越界!a23=3; /*应为a12=3;*/第40页/共95页第四十页,编辑于星期五:十六点 六分。二维数组的初
16、始化 1、分行赋初值: 例:int a34 = 1,2,3,4,5,6,7,8, 9,10,11,12; 1 2 3 4 5 6 7 8 9 10 11 122、全部数据写在一个花括号内,按数组排列的顺序对各元素赋初值:例:int a34 = 1,2,3,4,5,6,7,8,9,10,11,12;赋初值时,数组的行下标可以省略,例如:int a 4 = .。第41页/共95页第四十一页,编辑于星期五:十六点 六分。 3、对部分元素赋初值: (1) int a34 = 0,1,2; 0 1 2 0 0 0 0 0 0 0 0 0 功能: 仅对a00、a01、a02赋值,其余为0(2)int a3
17、4 = 1,5,6,9; 1 0 0 0 5 6 0 0 9 0 0 0 功能:仅对a00、a10、a11、a20赋值,其余为0第42页/共95页第四十二页,编辑于星期五:十六点 六分。【例4.9】求一个3*4矩阵的最大值及其所在 行列下标。第43页/共95页第四十三页,编辑于星期五:十六点 六分。第44页/共95页第四十四页,编辑于星期五:十六点 六分。【例4.10】3名学生各有4门课程的成绩,计算每个学生的平均成绩。第45页/共95页第四十五页,编辑于星期五:十六点 六分。【例4.11】打印输出杨辉三角形(输出前10行)第46页/共95页第四十六页,编辑于星期五:十六点 六分。第47页/共
18、95页第四十七页,编辑于星期五:十六点 六分。第48页/共95页第四十八页,编辑于星期五:十六点 六分。定义格式: 类型 数组名常量表达式1常量表达式2 ;例:int a333;注意:多维数组的元素在内存中的排列顺序是按行存放。引用格式: 数组名下标下标例: a000=100; a012=20; a222=50;一个n维数组可以看成由多个n-1维数组构成。第49页/共95页第四十九页,编辑于星期五:十六点 六分。 4.1 一维数组 4.2 二维数组E4.3 字符数组第50页/共95页第五十页,编辑于星期五:十六点 六分。 在程序中如果要存储姓名、地址等类型的数据,例 如: “小明”、 “成都市
19、高新西区西园大道1号”等需 要使用什么样的类型呢?这些是字符串,C语言中 没有专门的字符串变量,如果要存储字符串,需要 用到字符数组。字符数组是专门用来存放字符数据 的。字符数组中的一个元素存放一个字符。 第51页/共95页第五十一页,编辑于星期五:十六点 六分。字符数组字符数组中可以存储普通字符序列,也可以存储字符串,两者依据字符数组末尾是否有字符串结束符0来区分。例如:第52页/共95页第五十二页,编辑于星期五:十六点 六分。 (1) char c11 = “I am happy”; 或 char c = “I am happy”; (2)char c11 = “I am happy”;
20、或 char c = “I am happy”; (3)char c11 = I, , a, m, , h, a, p, p, y, 0; 或 char c = I, , a, m, , h, a, p, p, y, 0; (4)char c11 = I, , a, m, , h, a, p, p, y ;这四种方式,字符数组c存储的是字符串第53页/共95页第五十三页,编辑于星期五:十六点 六分。 (5)char c10 = I, , a, m, , h, a, p, p, y ; 或 char c = I, , a, m, , h, a, p, p, y ;这种方式,字符数组c存储的是普通
21、字符序列第54页/共95页第五十四页,编辑于星期五:十六点 六分。若要重新给字符数组(字符串变量)赋值,使它改而存放别的字符串,应注意以下几点: (1)应充分估计新字符串所需的最大空间,不要出 现越界情况。 例如:char c = “fish”;数组c的长度是5。 若要将“chicken”赋给c,新字符串需要8个字节的 内存空间,就会出错。为了防止这类的错误发生, 习惯上将字符数组长度设置大一些。例如: char c20 = “fish”;第55页/共95页第五十五页,编辑于星期五:十六点 六分。 (2)不能使用赋值语句对字符串变量集体赋值,而 应该使用赋值语句为每个字符数组元素单独赋值。 例
22、如: char c = “fish”;若要将数组c的内容修改为 “cat”, 直接写为:c = “cat”; 或者c = “cat”; 都是错 误的。 可以对c中的元素逐个重新赋值:c0= c; c1= a; c2= t; c3= 0; 注意:不要省略给c3赋值为 0,否则c中新的字符 串内容为“cath”。第56页/共95页第五十六页,编辑于星期五:十六点 六分。字符数组的输入输出 一、 使用 scanf 函数输入字符串到字符数组中。 (1)以单个字符的格式逐个输入。 例如:char c5; scanf(“%c%c%c%c%c”,&s0,&s1, &s2,&s
23、3, &s4);数组元素跟普通变量一样,前面要加取地址符第57页/共95页第五十七页,编辑于星期五:十六点 六分。 (2)以字符串的格式输入。 例如:char c5; scanf(“%s”, c); 说明: 1. %s是字符串的格式字符,数组名代表数组的起始地址,因此输入表列中只需要给出数组名即可。若写为&c,程序出错。 2. 输入字符串时,空格或者回车键是输入结束符,不能作为有效的字符输入。 第58页/共95页第五十八页,编辑于星期五:十六点 六分。 假如从键盘输入cat或者cat。数组c中存入cat后,C编译 系统会自动在后面补上一个 0。 3. 输入的字符串长度应该比字符
24、数组的长度短。 例如:从键盘输入catcat,数组c中存入catca,没有 0的位 置,容易出现内存错误。第59页/共95页第五十九页,编辑于星期五:十六点 六分。 4. 可以用scanf 输入多个字符串,输入时以空格键或回车键隔开。 例如:char c15, c25, c35; scanf(“%s%s%s”, c1, c2, c3); 从键盘输入Catordog? 第60页/共95页第六十页,编辑于星期五:十六点 六分。 二、使用 printf 函数将字符数组中的字符串输出。 (1)以单个字符的格式逐个输出。 例如:char c5; printf(“%c%c%c%c%c”,c0,c1, c2
25、,c3, c4); (2)以字符串的格式输出,将数组名写在输出表列中。 例如:char c5; printf(“%s”, c); 第61页/共95页第六十一页,编辑于星期五:十六点 六分。注意: (1) 若数组长度大于字符串的实际长度,也只输出到 遇到0结束。 例如:char c10=“China”; printf(“%s”,c); (2) 如果一个字符数组中包含一个以上0,则遇第一个0时输出就结束。第62页/共95页第六十二页,编辑于星期五:十六点 六分。【例4.12】删除字符串中的空格,并输出。第63页/共95页第六十三页,编辑于星期五:十六点 六分。 三、使用scanf和 printf
26、为二维数组输入输出字符串 二维数组可看作由一维数组组成。如果将一维字符数 组看作是存放字符串的变量,那么二维字符数组就可 以看作是存放字符串的一维字符串数组。 例如:定义char c35 ; 相当于定义了3个字符串变量。 c0、 c1、 c2分别是3个字符串的起始地址。可以使 用scanf 和 printf 函数为其输入、输出字符串。第64页/共95页第六十四页,编辑于星期五:十六点 六分。【例4.13】利用二维字符数组输入、输出字符串。第65页/共95页第六十五页,编辑于星期五:十六点 六分。【例】 输出一个菱形图。第66页/共95页第六十六页,编辑于星期五:十六点 六分。字符串处理函数 C
27、语言提供了多个常用的字符串处理函数。 字符串输入函数、输出函数、比较函数、连接 函数及求字符串长度等函数。注意:字符串函数均在头文件 string.h 中定义,要使用这些函数,需将此文件包含进来。有的编译器会自动包含。第67页/共95页第六十七页,编辑于星期五:十六点 六分。 格 式:puts(字符串) 功 能:将字符串结束符0转换成n后输出字符串。 例如:char c6=“China”; 执行函数:puts(c); 等价于: printf(%sn,c); puts函数也可以直接输出字符串常量。例如:puts(“China”);第68页/共95页第六十八页,编辑于星期五:十六点 六分。格 式:
28、gets(字符数组) 功 能:从键盘输入一个字符串到字符数组中。例如:char s10; 执行函数 : gets(s); 从键盘输入:China 将包括0在内的6个字符送到字符数组s中。第69页/共95页第六十九页,编辑于星期五:十六点 六分。gets、puts与scanf、printf函数的使用区别:(1) gets()、puts()函数一次只能输入输出一个字符串; scanf( )、printf( )则可以输入输出多个字符串。 例如:char s110, s210;1. gets(s1); gets(s2); puts(s1); puts(s2); 2. scanf(“%s%s”,s1,s
29、2); printf(“%sn%sn”,s1,s2); 第70页/共95页第七十页,编辑于星期五:十六点 六分。(2)使用gets函数输入的字符串以回车符结束;而 scanf函数以空格或回车符结束字符串的输入。例如:char s130, s230;从键盘输入HELLO WORLD! ,1. 执行gets(s1); gets(s2); 执行结果:s1中存入字符串“HELLO WORLD!”,光标等待用户再次输入字符串,从键盘输入hello world!s2中获得字符串“hello world!”。第71页/共95页第七十一页,编辑于星期五:十六点 六分。例如:char s130, s230;从键
30、盘输入HELLO WORLD! ,2. 执行scanf(“%s%s”,s1,s2);执行结果:s1中存入字符串“HELLO”,s2中存入字符串“WORLD!”。第72页/共95页第七十二页,编辑于星期五:十六点 六分。格 式:strcat(字符数组1,字符数组2或字符串)功 能:把字符数组2中的字符串连接到字符数组1中的字符串的后面,结果放到字符数组1中。注 意:1)数组1必须足够大,以容纳连接后的新字符串。2)连接时串1后面的0被覆盖,只在新串后保留1个0字符数组2可为字符串常量,1呢?第73页/共95页第七十三页,编辑于星期五:十六点 六分。例如:char s10 = “te”; strc
31、at(s, “st!”); 执行过程中数组s的存储情况:第74页/共95页第七十四页,编辑于星期五:十六点 六分。【例4.14】使用strcat函数实现两个字符串连接的功能。第75页/共95页第七十五页,编辑于星期五:十六点 六分。【例4.15】不使用strcat函数实现两个字符串连接的功能。第76页/共95页第七十六页,编辑于星期五:十六点 六分。 格 式:strcpy(字符数组1,字符数组2或字符串) 功 能:将字符串2复制到字符数组1中,该字符数组1 中原有内容被覆盖。说明:(1)字符数组1必须足够大,能容纳复制过来的字符串(2)复制时连同0一起复制到字符数组1中。第77页/共95页第七
32、十七页,编辑于星期五:十六点 六分。 (3)不能用赋值语句将一个字符串常量或字符数组 直接赋给一个字符数组。 例如:char str130 = “China”,str230; str2 = str1; (4)可以用strncpy函数将字符串2中的前n个字符 复制到字符数组中。字符数组其他位置的元素不发 生变换。 例如: char str130 = Chengdu; char str230 = Beijing; strncpy(str1,str2,2); 执行结果:str1为Beengdu。第78页/共95页第七十八页,编辑于星期五:十六点 六分。【例4.16】使用strcpy函数实现字符串的拷
33、贝。第79页/共95页第七十九页,编辑于星期五:十六点 六分。【例4.17】不使用strcpy函数实现字符串的拷贝。第80页/共95页第八十页,编辑于星期五:十六点 六分。格 式:strcmp(字符串1,字符串2)功 能:比较“字符串1”和“字符串2”。比较规则:自左至右逐个字符比较ASCII码,直到遇到不同字符或0,比较的结果由函数值带回。 字符串1 字符串2, 函数返回正整数 , 1第81页/共95页第八十一页,编辑于星期五:十六点 六分。 例如: strcmp(“CHINA”, “china”); 函数值是-1 表示:“CHINA”“CHINA” 注意:字符串只能用strcmp 函数比较,不能用关系
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年宿舍安全宣传培训
- 2026年商场防踩踏演练
- 人教部编版七年级历史下册 第二单元辽宋夏金元时期 第六课北宋的政治 教案
- 失能老人护理中的社会支持网络
- 电子元件包装流程规范
- 2026年高考化学二轮复习(全国)微专题02V、Cr、Mn、Co等过渡金属化合物的制备流程(讲义)(解析版)
- 某船舶厂船体建造细则
- 2026年面部经络按摩美颜抗衰老实操培训
- 母婴护理中的职业道德
- 吉林省长春市2026年中考物理适应性模拟试题(含答案解析)
- 投诉处理资料归档管理制度
- 1.3 《利用磁铁辨别方向》 课件(内嵌视频) 2025-2026学年科学三年级下册教科版
- 《网页设计语言》-第1章 HTML
- 分级诊疗双向转诊共享决策机制
- 2026年及未来5年中国连续排放监测系统(CEMS)行业市场发展现状及投资方向研究报告
- (2026春新版)人教版二年级数学下册全册教学设计
- 炼钢厂各岗位薪酬制度
- 产前诊断中心建设方案
- 乡镇卫生院医保基金使用管理制度
- 横纹肌肉瘤免疫治疗耐药性的逆转策略
- 2026年锡林郭勒职业学院单招综合素质考试题库附答案解析
评论
0/150
提交评论