程序设计(C语言)(1).ppt_第1页
程序设计(C语言)(1).ppt_第2页
程序设计(C语言)(1).ppt_第3页
程序设计(C语言)(1).ppt_第4页
程序设计(C语言)(1).ppt_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章 数 组 数组是内存中的一种数据集合,用于存贮较大量的相同类型的数据元素,在程序中数组有一个名字,并通过下标访问数组的某个元素。 7.1 一维数组 一、一维数组的定义 语法格式:元素类型名 数组名元素个数; 如:int a5,b8;double y15,c20; #define N 10 long posN;int cN+1;/*正确*/ 例如:int n=10,an;/*错误*/,只能是整型常量表达式,二、一维数组元素的引用 语法格式:数组名下标表达式 如:若有定义 int a4; 则元素a0,a1,a2,a3是数组的有效元素。a4并非有效元素,属于下标超范围。下标超范围会引起死机或程序错误,但C语言不自动检查下标是否超范围,故必须在设计阶段从程序逻辑上保证下标不超范围。,必须是整型表达式,数组下标固定从0开始编号,7.1 一维数组,一维数组的元素在内存中是连续存放的。 例如:若有int a10;,则a数组中包含的10个元素在内存中的存储情况如下:,三、一维数组存贮空间分析:,如: double a5; 该数组共5个元素,存贮5个double型实数,共占用40字节存贮空间。,7.1 一维数组,四、一维数组的初始化,在定义数组时,允许对静态(数组定义前加有static保留字)数组、外部数组(定义于所有函数以及复合语句之外)及main()定义的auto型数组进行初始化。,7.1 一维数组,初始化格式:,static 类型说明符 数组名=常量列表;,例: static int a4=1,2,3,4;,(1)static与外部数组不初始化,初值自动为0 (2)初始化时,可以不指定元素个数 static int a=1,2,3,4; 则数组a自动为4个元素, 与上面的定义形式完全等价。 (3)可以只对前部分元素进行初始化,余下的元 素初值自动为0。(main()中的auto型也是这样) 如: static int a5=1,2,3;则 a3与a4自动为0。,说明:,四、一维数组的初始化,例7.1 将数值5,3,4,5,3,6,6,4,3,2,9赋予数组a并求其和。 程序:,#include int a=5,3,4,5,3,6,6,4,3,2,9; main() int sum,i; sum=0; for (i=0;i=10;i+) sum+=ai; printf(“sum=%dn“,sum); ,7.1.3 一维数组应用举例,例7.2 编写一程序,求全班40个学生计算机的平均成绩。 其算法可用如图7.1所示的流程图表示。 程序:(要求学生自己写出),7.1.3 一维数组应用举例,基本思想:每一趟在n-i+1(i=1,2,n-1)个记录中(第i趟)选取关键字最小的记录作为有序序列中第i个记录。 方法:n个数,比较n-1趟 第i趟(i=1,2,n-1) 比较n-i次,选择一个最小的记录交换一次。,选择排序总共要进行(n-1)+(n-2)+1=n(n-1)/2比较,最多n-1次交换。,例7.3 使用选择法对输入的10个整型数据进行从小到大排序。,选择排序法,for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(ajak) k=j; if(k!=i) t=ai;ai=ak;ak=t; ,要求学生写出完整程序,语言描述:,/*k指示当前比较的最小值下标*/,练习:写出该程序,选择排序法,一、二维数组的定义 语法格式: 元素类型名 数组名下标1维数下标2维数; 如:int a58; /*5行8列整型数组*/ 又如:#define N 6 long mNN; /*N行N列长整型数组*/,行数,列数,7.2 二维数组,二、二维数组元素的引用 语法格式: 数组名行下标列下标 其中,下标表达式必须是整型表达式;下标固定从0开始编号。 如: 若有定义int a34; 则左上角元素下标为a00, 右下角元素下标为a23。 C语言不自动检查下标是否超范围,故必须在设计阶段从程序逻辑上保证下标不超范围。,例如,若有int a23;,则a数组中包含的二行三列共6个元素在内存中的存储情况如下:,三、二维数组存贮空间分析:,也只能对static或外部数组、main()中的auto型数组进行初始化。 初始化方法: 标准形式 static int a23=1,2,3,4,5,6; 注意:用内层表示行,每行可视作一个一维 数组,并按行初始化。 2.对所有元素初始化可以缺省行数和内层 如:上述初始化可写为 static int a3=1,2,3,4,5,6或 static int a3=1,2,3,4,5,6; 或 static int a23=1,2,3,4,5,6;,7.2.2、二维数组的初始化,(3)static与外部数组不初始化,初值自动为0 (4)每行可以只对前几列元素进行初始化,余下的元素初值自动为0。 如: static int a3=1,2,3;则 矩阵元素初值如下:,(5)指定行数时,可以只初始化前面几行,余下各行元素初值自动为0. 如: static int a43=1,2,3,4,5,6; 则矩阵初值如下:,1 0 0 2 3 0,1 0 0 2 3 4 5 6 0 0 0 0,7.2.2、二维数组的初始化,例7.4 将下表存入数组a,按行求元素之和并显示。 25 13 32 10 54 53,7.2.3 应用举例,程序: #include main() int a24,i; a00=25;a01=13;a02=32; a10=10;a11=54;a12=53; for (i=0;i=1;i+) ai3=ai0+ai1+ai2; for (i=0;i=1;i+) printf(“%d %d %d %d n“,ai0,ai1,ai2,ai3); ,例7.5:输入一个三行四列的矩阵A,计算其转 置矩阵B,输出矩阵B。,bji=aij,7.2.3 应用举例,7.2.3 应用举例,#include main() int a23=1,2,3,4,5,6; int b32,i,j; printf(“array a:n“); for (i=0;i=1;i+) for (j=0;j=2;j+) printf(“%5d“,aij); bji=aij; printf(“n“); printf(“array b:n“); for (i=0;i=2;i+) for (j=0;j=1;j+) printf(“%5d“,bij); printf(“n“); ,程序:,例7.6 编写一程序,求全班40个学生每个学生三门功课的平均成绩。,1.定义数据结构 40个学生3门功课的存放:int a4030; 每个学生三门功课的平均成绩存放:int v40; 2.输入学生成绩 3.求每个学生平均成绩: vi= (ai0+ai1+ai2)/3, 4.输出结果.,分析:,7.2.3 应用举例,程序: #include main() int a403,s,i,j,v40; for(i=0;i40;i+) for(j=0;j3;j+) scanf(“%d“, ,例7.7 在N行M列的二维数组x中,找出数组的最大值以及此最大值所在的行、列下标。,分析:1.定义二维数组:int xNM; 定义变量 max:存放最大值 line:存放最大值行号 col:存放最大值列号 2.找最大值:max初始值= x00, line及col的初始值为0, 再将二维数组x中的元素逐个与max进行比较,确定新的max和line及col的值,直到二维数组x中的元素全部处理完。 3.输出数据,7.2.3 应用举例,程序运行结果如下: input array numbers: 12 31 40 20 67 80 max=80 line=1 col=2,程序: #define N 2 #define M 3 #include “stdio.h“ main() int i,j,xNM,max,line,col; printf(“input array numbers:n“); for(i=0;iN;i+) for(j=0;jM;j+) scanf(“%d“, ,7.3.1 字符数组的定义、引用与初始化 1字符数组的定义 一维字符数组的定义形式如下: char 数组名常量表达式; 例如: char a10; 二维字符数组的定义形式如下: char 数组名常量表达式1常量表达式2; 例如: char a34;,7.3 字符数组,7.3 字符数组,2字符数组元素的引用 一维字符数组元素的引用形式如下: 数组名下标 例如: a2 a1+1 二维字符数组的元素的引用形式如下: 数组名行下标列下标 例如: a10 a03-2,7.3 字符数组,3字符数组的初始化 一维字符数组的初始化形式如下: static 类型说明符 数组名=字符常量列表; 例如: char a10=H,e,l,l,o,! 二维字符数组的初始化形式如下: static 类型说明符 数组名=字符常量列表,; 例如:char a23=A,B,C,D,7.3 字符数组,说明: (1)如果花括号中提供的字符个数大于数组长度,则作语法错误处理。 (2)如果花括号中提供的字符个数小于数组长度,则只将这些字符赋给数组中的前面那些元素,其余元素自动定为空字符(即0)。 (3)如果花括号中提供的字符个数与预定的数组长度相同,在定义时可以省略数组长度,系统会自动根据初值个数确定数组长度。,7.3.2 字符串与字符数组,1字符串和字符串结束标志 C语言约定用0作为字符串的结束标志,它占内存空间,但不计入串的长度。0的代码值为0。 字符型一维数组来存储一个字符串,用字符型二维数组来存储多个字符串。,7.3.2 字符串与字符数组,2用字符串常量给数组赋初值(初始化)。 例如,如果有:char c6=“china”; 或char c6= “china”; 或char c = “china”; 则数组c在内存中的存储情况如下:,3字符数组与字符串的输入输出 (1)用格式符“%c”逐个字符输入输出:,7.3.2 字符串与字符数组,#include main() char a10; int i; for(i=0;i10;i+) scanf(“%c“, ,(2)用格式符“%s”整个字符串输入输出:,#include main() char a10; scanf(“%s“,a); printf(“n“); printf(“%s“,a); ,7.3.2 字符串与字符数组,注意: (1)用%s格式输出字符数组时,遇0结束输出,且输出字符中不包含0。 (2)若数组中包含一个以上的0,则遇第一个0时结束输出。 (3)用%s格式输入或输出字符数组时,函数scanf的地址项、函数printf的输出项都是字符数组名。这时数组名前不能再加”为字符数组s输入数据时,遇空格键或回车键时结束输入,但所读入的字符串中不包含空格键或回车键,而是在字符串末尾添加0。 (5)用一个scanf函数输入多个字符串,输入时应以空格键或回车键作为字符串间的分隔。,7.3.2 字符串与字符数组,使用字符串函数时应在程序前包含头文件: #include (1)puts(字符串):字符串输出函数。 功能:将一个字符串输出到终端。输出的字符串包含转义字符。 示例:char str =“chinanbeijing“; puts(str); 输出: china beijing,7.3.3 字符串函数,7.3.3 字符串函数,(2)gets(字符数组):字符串数组输入函数。 功能:从终端输入一个字符串到字符数组,该函数返回值是字符数组的起始地址。 示例:char str10 ;gets(str); 如果键盘输入:China 则数组str在内存中的存储情况如下:,注意:用puts和gets函数只能输入或输出一个字符串。,7.3.3 字符串函数,(3)strcat(字符数组1,字符数组2):连接两个字符串函数。 功能:连接两个字符串中的字符,把字符串2接到字符串1的后面,结果放在字符串1中,函数调用后得到一个函数值字符串1的地址。 示例:如果有:char str110 =“Ch“; char str2 =“ina“; strcat(str1,str2); 则:字符数组str1中存储的字符串为“Ch ina”。,说明: (1)字符数组1必须足够大,以便能容纳连接后的新字符串。 (2)连接前两个字符串后面都有一个0,连接时将字符串1后面的0取消,只在新串的最后保留一个0。,7.3.3 字符串函数,(4)strcpy(字符数组,字符串):字符串复制函数。 功能:将字符串拷贝到字符数组中去。 示例:如果有:char str110,str2 = “china“; strcpy (str1,str2); 则:字符数组str1中存储的字符串为“Ch ina”。 示例:下面的用法是不合法的: str1=“china“; str1=str2; 如果用赋值语句,则只能将字符逐个赋给一字符数组元素。 示例:char a6; a0=c;a1=h;a2=i;a3=n;a4=a;a5= 0,7.3.3 字符串函数,(5)strcmp(字符串1,字符串2):字符串比较函数。 功能:按ASCII码值大小比较,将两个字符串自左至右逐个字符相比较,直到出现不同的字符或到0为止。如果全部字符相同,则认为相等;如果出现不相同的字符,则以第一个不相同的字符的比较结果为准。比较的结果由函数值带回。 (1)字符串1=字符串2,函数值为0。 (2)字符串1字符串2,函数值为正整数。 (3)字符串1字符串2,函数值为负整数。,7.3.3 字符串函数,示例:如果有:char str110 =“Chinese“, str2 =“China“; int a; a=strcmp(str1,str2); 则:a的值为一正整数。 注意:对两个字符比较,不能用以下形式: if(str1= =str2)printf(“yes“); 而只能用:if(strcmp(str1,str2)= =0)printf(“yes“); 。,7.3.3 字符串函数,(6)strlen(字符数组):求字符串长度函数。 功能:求字符串长度。函数值为字符串的实际长度,不包括0在内。 示例:如果有:char str10=“china“; printf(“%d“,strlen(str); 则输出结果为: 5,7.3.3 字符串函数,(7)strlwr(字符串):字符串小写函数。 功能:将字符串中的大写字母转换成小写字母。 (8)strupr(字符串):字符串大写函数。 功能:将字符串中的小写字母转换成大写字母。,7.3.3 字符串函数,例7.8 用户从键盘输入一个字符串(字符串中不包含空格),当输入回车时认为输入结束,统计输入字符串中的小写英文字母、大写英文字母、数字字符、其他字符的个数。 分析: 字符串放在字符数组s 用普通的整型变量m,n,x,y分别存储统计得到的输入字符串中的小写英文字母、大写英文字母、数字字符、其他字符的个数。 用一个单循环控制,对字符数组s中的元素逐个进行判断,根据不同情况(元素值是否为小写英文字母、大写英文字母、数字字符、其他字符)对相应计数变量计数。 循环控制条件是当前所处理的字符串中的字符不是字符串结束标志0,即一个字符串的所有字符还没有处理完毕。,程序: #include main() int i,m,n,x,y; char s80; printf(“input a string:n“); scanf(“%s“,s); m=n=x=y=0; i=0; while(si!=0) if(si=a ,7.3.3 字符串函数,例7.9 将字符串s1从第m个字符开始剩余的所有字符送入字符数组s2中。 分析: 该程序用一个单循环控制,将字符数组s1中的元素从第m个字符开始剩余的所有字符依次逐个送入字符数组s2中。 程序中用两个整型变量i、j分别标识元素在原字符数组s1中的下标和在目标数组s2中的下标,每循环一次,即传送一个字符后,i、j的值增1。 循环控制条件是当前所处理的原字符数组s1中的元素不是字符串结束标志0,即原字符数组s1中从第m个字符开始剩余的所有字符还没有处理完毕。,程序: #include main() int i,j,m; char s180,s280; printf(“input a string:n“); gets(s1); printf(“input start point:n“); scanf(“%d“, ,7.4 本章考点,一维数组的定义、引用及初始化。 二维数组的定义、引用及初始化。 字符串和字符数组。 字符串处理函数。,7.5 典型试题详解,1以下能正确定义一维数组的选项是_。 A)int num; B)#define N 100; int numN; C)int num0100 D)int N=100; int numN; 正确答案:B(知识点:一维数组的定义),7.5 典型试题详解,2假设int类型变量占用两个字节,其有定义:int x10=0,2,4;,则数组x在内存中所占的字节数是_。 A)3 B)6 C)10 D)20 正确答案:D(知识点:一维数组的定义),7.5 典型试题详解,3以下程序运行后的输出结果是_。 main() int i,n=0,0,0,0,0; for(i=1;i=4;i+) ni=ni-1*2+1; printf(“%d “,ni); 正确答案:1 3 7 15(知识点:一维数组的定义与引用),7.5 典型试题详解,4以下数组定义中不正确的是_。 A)int a23; B)int b3=0,1,2,3; C)int c100100=0; D)int3= 1,2,1,2,3,1,2,3,4; 正确答案:D(知识点:二维数组的初始化) 试题分析:二维数组初始化时,对数组第一维的长度可以不指定,但第二维的长度不能省略。,7.5 典型试题详解,5有以下程序: main () int aa44= 1,2,3,4,5,6,7,8,3,9,10,2,4,2,9,6; int i,s=0; for(i=0;i4;i+) s+=aail printf(“%dn“,s) 执行后的输出结果是_。 A)11 B)19 C)13 D)20 正确答案:B(知识点:二维数组的定义、引用及初始化) 试题分析:该程序是求aa0l、aa1l、aa2l、aa3l之和并输出。,7.5 典型试题详解,6以下不能正确进行字符串赋初值的语句是_。 A)char str5=“good!“; B)char str =“good!“; C)char str6=“good!“; D)char str5=g, o,o,d; 正确答案:A(知识点:字符数组的初始化) 试题分析:每个字符串末尾都有一个结束0,因此,字符串 “good!“在内存中占6个字符型存储单元,在初始化时,可以不指定数组的大小,或指定一个大于或等于6的值。选项D中给出的初值个数小于数组的大小5,则将初值赋给数组前面的元素,其后的元素值为0。,7.5 典型试题详解,7以下程序的输出结果是_。 main() char ch35= “AAAA“, “BBB“, “CC“; printf(“%sn“,ch1); A)AAAA B)BBB C)BBBCC D)CC 正确答案:B(知识点:字符数组的初始化) 试题分析:程序中定义ch是一个字符型的二维数组,由于二维数组可以看做是由一维数组构成的一维数组,ch35是由ch0、ch1、ch2构成的,而ch0、ch1、ch2又都是由5个字符型元素构成的一维数组,因此ch1即是二维数组ch35的第二行的字符串“BBB“所在一维数组的名字,因为其元素是字符类型,可以用数组的名字(即数组的首地址)来表示所存储的字符串“BBB“,输出时去掉字符串定界符“”。,7.5 典型试题详解,8有下列程序: main() char s = “n123“ printf(“%d,%dn“,strlen(s),sizeof(s); 程序运行后的输出结果是_。 A)赋初值的字符串有错 B)6,7 C)5,6 D)6,6 正确答案:C(知识点:字符串处理函数、转义字符) 试题分析:程序的输出结果是strlen(s)和sizeof(s)两个函数的值。函数strlen(s)是求字符串s(用字符数组存储)的长度,即字符串s中有效字符的个数,不包括字符串结束标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论