C语言程序设计-数组.ppt

上传人:scccc 文档编号:11875034 上传时间:2021-10-08 格式:PPT 页数:57 大小:1.06MB
返回 下载 相关 举报
C语言程序设计-数组.ppt_第1页
第1页 / 共57页
C语言程序设计-数组.ppt_第2页
第2页 / 共57页
C语言程序设计-数组.ppt_第3页
第3页 / 共57页
C语言程序设计-数组.ppt_第4页
第4页 / 共57页
C语言程序设计-数组.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《C语言程序设计-数组.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计-数组.ppt(57页珍藏版)》请在三一文库上搜索。

1、C语言程序设计,5.1 数组,了解数组含义及功能 理解数组变量在内存中的分配和使用方式 掌握数组的定义、初始化及引用方法 掌握字符数组及字符串的用法及基本操作,调查电视节目欢迎程度。某电视台要进行一次对该台8个栏目(设相应栏目编号为18)的受欢迎情况,共调查了1000位观众,现要求编写程序,输入每一位观众的投票,每位观众只能选择一个最喜欢的栏目投票,统计输出各栏目的得票情况。,投票情况统计,7.1.1 程序解析排序,# include int main( void ) int count9; /* 设立数组,栏目编号对应数组下标 */ int i,response; for(i = 1;i 8

2、) /* 检查投票是否有效*/ printf(this is a bad response: %dn,response); else countresponse+; /* 对应栏目得票加1 */ printf(result:n); /* 输出各栏目得票情况 */ for(i = 1;i = 8;i+) printf(%4d%4dn,i,counti); return 0; ,input your response: 3 input your response: 6 input your response: 9 this is a bad response: 9 input your respo

3、nse: 8 result: 1 2 2 0 3 4 ,for(i = 1;i = 8;i+) printf(%4d%4dn,i,counti);,count,count0 count1 count8,为何不使用count0?,数组:相同类型数据的有序集合,在内存中连续存放。 由数组名和下标惟一地确定每个数组元素 每个元素都属于同一类型 一批相同类型的变量使用同一个数组变量名,用下标来相互区分。 优点:表述简洁,可读性高;便于使用循环结构,5.1 数组,5.1.1 导例:如何存储和操作某班C语言课程的成绩 问题描述 一个班(假设有10名同学)C语言课程考试后,如何利用C程序来显示这些同学的成绩

4、?如果有的同学的成绩统计错了,如何将它改正过来?如果有2个同学的成绩统计混淆了,如何将他们的成绩交换过来?,5.1 数组,5.1.1 导例:如何存储和操作某班C语言课程的成绩 问题分析 如何存储学生成绩? 变量 数组,5.1 数组,#include #define N 10 void main ( ) /*定义一维数组并初始化,长度必须为常量*/ int scoreN=82,76,69,92,53,78,80,88,65,72; int i, t; for(i=0;iN;i+) /*显示所有学生的成绩*/ printf(%d ,scorei); printf(n); score4=60; /*

5、修改第5名同学的成绩*/ t=score1; /*互换第2和第7名同学的成绩*/ score1=score6; score6=t; for(i=0;iN;i+)/*再次显示所有学生的成绩*/ printf(%d ,scorei); ,for(i=0;iN;i+) printf(“%d ”,scorei);,score,score0 score1 score9,数组,一维数组的定义和引用,1、定义 类型名 数组名数组长度 类型名:数组元素的类型 数组名:数组(变量)的名称,标识符 数组长度:常量表达式,给定数组的大小 int a10; 定义一个含有10个整型元素的数组 a char c200;

6、定义一个含有200个字符元素的数组 c float f5; 定义一个含有5个浮点型元素的数组 f,数组长度为常量,2、数组的内存结构,a,int a10;,假设系统规定int类型占用2个 字节,则对于数组a,其内存 分配形式,只要知道了数组第一个元素的 地址以及每个元素所需的字节 数,其余各个元素的存储地址 均可计算得到。,数组名是一个地址常量,存放 数组内存空间的首地址。不允许被修改。,3、引用,先定义,后使用 只能引用单个的数组元素,不能一次引用整个数组 数组名下标 下标:整型表达式 取值范围:0,数组长度-1 int a10; 10个元素:a0、a1、 a9 数组元素的使用方法与同类型的

7、变量相同 scanf(%d, ,下标不要越界 不能使用a10,定义数组 类型名 数组名数组长度 引用数组元素 数组名下标 int a10; a0 = a9 = 0; ak = temp;,区分数组的定义和数组元素的引用,下标不要越界,数组长度为常量,一维数组的初始化,定义数组时,对数组元素赋初值 类型名 数组名数组长度 = 初值表; int a10 = 1,2,3,4,5,6,7,8,9,10; a0=1, a1=2,. a9=10 静态数组、动态数组的初始化 static int b5 = 1, 2, 3, 4, 5; 静态存储的数组如果没有初始化,所有元素自动赋0 static int b

8、5; 动态存储的数组如果没有初始化,所有元素为随机值 auto int c5; 等价与 int c5;,static int b5 = 1, 2, 3; b0 = 1, b1 = 2, b2 = 3, b3 = 0, b4 = 0 auto int fib20 = 0, 1; fib0 = 0, fib1 = 1, 其余元素不确定 如果对全部元素都赋初值,可以省略数组长度 int a 10 = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,针对部分元素的初始化,建议不要省略数组长度,使用一维数组编程,数组和循环 for(i = 0; i n; i+) printf(%d , ai)

9、; 数组下标作为循环变量,通过循环,逐个处理数组元素,一维数组示例,例5-1 用数组计算fibonacci数列的前10个数,并按每行打印5个数的格式输出。1, 1, 2, 3, 5, 例5-2 顺序查找法。输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的最小下标,否则,输出“Not Found”。 例5-3 输入n(n10),再输入n个数 (1) 输出最小值和它所对应的下标 (2) 将最小值与第一个数交换,输出交换后的n个数 例5-4 选择排序法。 例5-5 二分查找法。,用数组计算fibonacci数列的前10个数,并按每行打印5个数的格式输出。 1

10、, 1, 2, 3, 5, 8, 13, 用数组计算并存放fibonacci数列的前10个数 f0 = f1 = 1 fn = fn-1 + fn-2 2n9,例 5-1 计算fibonacci数列,#include int main(void) int i; int fib10 = 1, 1; /* 数组初始化 */ for(i = 2; i 10; i+) fibi = fibi - 1 + fibi - 2; for(i = 0; i 10; i+) printf(%6d, fibi); if(i + 1) % 5 = 0) /* 5个数换行 */ printf(n); return 0

11、; ,例 5-1 源程序,1 1 2 3 5 8 13 21 34 55,输入5个整数,将它们存入数组a中,再输入1个数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出“Not Found”。 输入:2 9 8 1 9 9 输出:1 输入:2 9 8 1 6 7 输出:Not Found,例5-2在数组中查找一个给定的数,#include int main(void) int i, flag, x; int a5; printf(“Enter 5 integers: ); for(i = 0; i 5; i+) scanf(%d, ,例 5-2 源程序,Enter 5 intege

12、rs: 2 9 8 1 9 Enter x: 9 Index is 1,Enter 5 integers: 2 9 8 1 9 Enter x: 7 Not Found,flag的作用?,#include int main(void) int i, flag, x; int a5; printf(“Enter 5 integers: ); for(i = 0; i 5; i+) scanf(%d, ,例 5-2思考(1),Enter 5 integers: 2 9 8 1 9 Enter x: 9 Index is 1 Index is 4,去掉break语句,结果?,#include int

13、 main(void) int i, sub, x; int a5; printf(“Enter 5 integers: ); for(i = 0; i 5; i+) scanf(%d, ,例 5-2 思考(2),Enter 5 integers: 2 9 8 1 9 Enter x: 9 Index is 4,sub的作用?,#include int main(void) int i, min, n; int a10; printf(“Enter n: ); scanf(%d, ,例 5-3 求最小值,Enter n: 6 Enter 6 integers: 2 9 -1 8 1 6 min

14、 is -1,方法!,虽得到了最小值,但不能 确定最小值所在下标!,输入n(n10), 再输入n个数, 输出最小值和它所对应的下标。 用index记录最小值对应的下标 aindex就是最小值,例 5-3(1) 求最小值及其下标,流程图,#include int main(void) int i, index, n; int a10; printf(“Enter n: ); scanf(%d, ,求最小值及下标,Enter n: 6 Enter 6 integers: 2 9 -1 8 1 6 min is -1 sub is 2,输入n(n a0,例 5-5(2) 交换最小值,导例5.1.2

15、选择法排序,利用选择排序方法将5.1.1导例中全班同学C语言课程成绩按照从低到高的顺序排列。,第1次: 53 76 69 92 82 78 80 88 65 72 第2次: 53 65 69 92 82 78 80 88 76 72 第3次: 53 65 69 92 82 78 80 88 76 72 第4次: 53 65 69 72 82 78 80 88 76 92 第5次: 53 65 69 72 76 78 80 88 82 92 第6次: 53 65 69 72 76 78 80 88 82 92 第7次: 53 65 69 72 76 78 80 88 82 92 第8次: 53

16、65 69 72 76 78 80 82 88 92 第9次: 53 65 69 72 76 78 80 82 88 92,下标 值,82 76 69 92 53 78 80 88 65 72(n=10) 10个数(a0a9)中找最小数,与a0交换 (1) 53 76 69 92 82 78 80 88 65 72 a4 a0 9个数(a1a9)中找最小数,与a1交换 (2) 53 65 69 92 82 78 80 88 76 72 a8 a1 8个数(a2a9)中找最小数,与a2交换 (3) 53 65 69 92 82 78 80 88 76 72 a2 a2 7个数(a3a9)中找最小

17、数,与a3交换 (4) 53 65 69 72 82 78 80 88 76 92 a9 a3 6个数(a4a9)中找最小数,与a4交换 (5) 53 65 69 72 76 78 80 88 82 92 a8 a4 5个数(a5a9)中找最小数,与a5交换 (6) 53 65 69 72 76 78 80 88 82 92 a5 a5,选择法(1),76 69 92 53 78 80 88 65 72(n=10) 5个数(a5a9)中找最小数,与a5交换 (6) 53 65 69 72 76 78 80 88 82 92 a5 a5 4个数(a6a9)中找最小数,与a6交换 (7) 53 6

18、5 69 72 76 78 80 88 82 92 a6 a6 3个数(a7a9)中找最小数,与a7交换 (8) 53 65 69 72 76 78 80 82 88 92 a8 a7 2个数(a8a9)中找最小数,与a8交换 (9) 53 65 69 72 76 78 80 82 88 92 a8 a8,选择法(1),(1) n个数 (a0an-1) 中找最小数,与 a0 交换 (2) n-1个数 (a1an-1) 中找最小数,与 a1 交换 (n-1) 2个数 (an-2an-1) 中找最小数,与 an-2 交换,(1) 10个数 (a0a9) 中找最小数,与 a0 交换 (2) 9个数

19、(a1a9) 中找最小数,与 a1 交换 (3) 8个数 (a2a9) 中找最小数,与 a2 交换 (4) 7个数 (a3a0) 中找最小数,与 a3 交换,选择法(2),n个数重复n-1次,流程图,外循环控制: n 个数选择 排序共需要 n-1次,内循环控制: 在下标范围 k,n-1内找 最小值所在 位置index,选择法排序 (程序段),for( i =0; i n -1; i +) k = i; /*查找最小元素的下标*/ for( j = i +1; j n; j +) if( aj ak) k = j; if( k != i)/*将ak和ai交换*/ t = ak; ak = ai;

20、 ai = t; ,排序前学生成绩: 82 76 69 92 53 78 80 88 65 72 排序后学生成绩: 53 65 69 72 76 78 80 82 88 92,5.1.4导例:二分查找算法,已知某个成绩,查找该成绩在班级中的排名,即返回该成绩下标。,5.2导例顺序查找是最简单明了的一种,其查找过程就是对 数组元素从头到尾的遍历过程。但是一旦数组元素量很大的 情况下,其查找的效率不高。 二分查找是查找效率较高的一种,但前提是数组元素必须 是有序的。,二分查找流程图,二分法查找 (程序段),int binarySearch(int a, int n, int x) int low

21、= 0; int high = n - 1; while(low = high) int mid = (low + high)/2; if(x=amid) return mid; /*mid为x在数组中的下标*/ else if(xamid) /*在左半边*/ high = mid - 1; else /*在右半边*/ low = mid + 1; return -1; /*没找到*/ ,5.1.6 统计字符串中字符的信息,问题描述 从键盘输入一个字符串,统计出该字符串中数字、大写字母、小写字母以及其他字符的数量。 问题分析 如何表示字符串?,#include #include void ma

22、in ( ) char s50; int dig=0,up=0,lw=0,other=0; int i,n; gets(s);/*通过键盘给s赋值*/ n=strlen(s);/*求s的长度并赋值给n*/ for(i=0;i=0 ,Hi, Mr Li, Are you 25 years old? dig= 2 up= 4 lw= 16 other= 10,一维字符数组,字符串的存储和运算可以用一维字符数组实现 一维字符数组的定义、引用、初始化与其他类型的一维数组一样。 char str80; 定义一个含有80个字符型元素的数组str char t5=H, a, p, p, y; 初始化数组 t

23、,输出数组 t 的所有元素 for(i=0; i5; i+) putchar( ti );,字符串的存储,char c11=“I am happy”; 字符串遇 0 结束 第一个 0 前面的所有字符和 0 一起构成了字符串 “I am happy” 0 之后的其他数组元素与该字符串无关,字符串由有效字符和字符串结束符 0 组成,一维字符数组,char c11=”I am happy”; 当用字符串初始化字符数组时,必须在定义字符数组的同时进行初始化,而不能定义完字符数组后再将字符串赋值给字符数组,char c11; c=”I am happy”; /*错误*/,字符串,字符串常量 用一对双引号

24、括起来的字符序列 一个字符串结束符 0 Happy 6个字符 H a p p y 0,有效字符,字符串结束符,字符串的有效长度:有效字符的个数,字符串与一维字符数组,字符串:一个特殊的一维字符数组 把字符串放入一维字符数组(存储) 对字符串的操作 = 对字符数组的操作,2. 对字符串的操作,把字符串放入一维字符数组(存储) 对字符串的操作 = 对字符数组的操作 普通字符数组:数组元素的个数是确定的,一般用下标控制循环 字符串:没有显式地给出有效字符的个数,只规定在字符串结束符 0 之前的字符都是字符串的有效字符,一般用结束符 0 来控制循环 循环条件:si != 0,for(i = 0; si

25、 != 0; i+) putchar(si); for(i = 0; i 80; i+) putchar(si); for(i = 0; i len; i+) putchar(si);,输出字符串,输出?,3. 字符串的存储赋值和输入,把字符串放入一维字符数组(存储) 对字符串的操作 = 对字符数组的操作 存储 数组初始化 static char s6= Hello; 赋值 s0=a; s1=0; 或者 static char s6= a;,a 2 个字符 a 和 0 a 1 个字符常量,区分a 和 a,字符串的输入,字符串的存储 字符数组初始化:static char s6 = Happy;

26、 赋值:s0 = a; s1 = 0; 输入 0 代表空操作,无法输入 输入时,设定一个输入结束符 将输入结束符转换为字符串结束符 0,输入一个以回车结束的字符串(少于10个字符),判断该字符串是否是回文? 所谓回文就是字符串中心对称,如“abcba”、“abccba”是回文,“abcdba”不是回文。,判断回文,程序解析-判断回文,# include int main(void) int i, n, m; char s10; printf(Enter a string: ); i = 0; while(si = getchar( ) != n) i+; si = 0; for(n = 0,m

27、 = i-1; n = m) printf(“ It is a plalindromen”); else printf(“ It is not a plalindromen”); return 0; ,Enter a string: abcba It is a plalindrome,Enter a string: abcdba It is not a plalindrome,输入一个以回车结束的字符串(少于80个字符),统计其中数字字符的个数。 分析: 数组长度取上限80 以 n 做为输入结束符,统计数字字符个数,#include int main(void) int count, i; c

28、har str80; printf(“Enter a string: ); i = 0; while(stri = getchar( ) != n) i+; stri = 0; /* 输入结束符字符串结束符 */ count = 0; for(i = 0; stri != 0; i+) if(stri = 0) count+; printf(count = %dn, count); return 0; ,Enter a string: Its 512 count = 3,如何改变输入结束符?,能省略stri = 0吗?,输入一个以回车结束的字符串(少于80个字符),滤去所有的非十六进制字符后,

29、组成一个新字符串(十六进制形式),输出该字符串并将其转换为十进制数后输出。,例: 进制转换,例如: 输入字符串: zx1?ma0!kbq 去掉非十六进制后组成新字符串:1a0b 转换为十进制为:6667,分析,输入原字符串 str1,虑调非16进制 字符后生成新 字符串str2,把字符串str2 转换成十进制 数number,输出number,i = 0; while(str1i = getchar() != n) i+; stri = 0;,k=0; /k控制新字符串str2的下标 for(i = 0; str1i != 0; i+) if ( str1i = 0 /新字符串结束标记,num

30、ber = 0; /清0 for(i = 0; str2i != 0; i+) /逐个转换 if(str2i = 0 ,字符串小结,字符串:一个特殊的一维字符数组 0 把字符串放入一维字符数组(存储) 数组长度足够 字符数组初始化: static char s80 = Happy; 赋值: s0 = a; s1 = 0; 输入: 输入结束符 = 字符串结束符0 i = 0; while(si=getchar( ) != n) i+; si = 0;,把字符串放入一维字符数组(存储) 对字符串的操作 = 对字符数组的操作 只针对字符串的有效字符和字符串结束符 0 检测 for(i = 0; si != 0; i+) putchar(si);,个人观点供参考,欢迎讨论,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1