第8章 数组
C语言第8章习题及答案
第八章用一个数组存放图书信息,每本书是一个结构,包括下列几项信息:书名、作者、出版年月、借出否,试写出描述这些信息的说明,并编写一个程序,读入若干本书的信息,然后打印出以上信息。
#include <>typedef struct{char Name[20];char Author[20];int Date_Year;int Date_Month;int loaned;} BOOK;#define N 10void main(){BOOK books[N];int i;for (i=0;i<N;i++){printf("Input Book's Name:");gets(books[i].Name);printf("Input Book's Author:");gets(books[i].Author);printf("Input Book's Year of Publishing:");scanf("%d",&books[i].Date_Year);printf("Input Book's Month of Publishing:");scanf("%d",&books[i].Date_Month);printf("Input Book's Status, 1-Loaned, 2-Keepin:");scanf("%d",&books[i].loaned);}for (i=0;i<N;i++){printf("Book: %s, Author: %s, Publishing:%d-%d, Status:%d\n", books[i].Name, books[i].Author, books[i].Date_Year, books[i].Date_Month, books[i].loaned);}}编写一个函数,统计并打印所输入的正文中的各个英文单词出现的次数,并按次数的递减顺序输出。
第八章 数组
例: int a[2][3]; 它在内存情况:
a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
8.2 二维数组的引用与初始化
一、引用形式:数组名[下标][下标]
(1)下标可以是整型表达式或符号常量 例如:a[2][3],a[2-1][2*2-1]
(2)数组元素可以出现在表达式中,也可以被赋值。
例如: 有定义 int a[10]; 数组元素引用举例 /*可以引用元素的从a[0]到a[9]*/
a[5]=6; a[7]=a[5]++;
a[6]=3; a[0]=a[5]+a[7]-a[2*3];
8.1.3 一维数组的初始化
1.初始化--在定义数组时对数组元素赋初值; 2.初始化方法:
[static] 数组类型 数组名[数组长度]={数组元素值};
运行结果: I am happy
例8-stdio.h>
void main( )
{
char c[5][5]={{‘ ‘,’ ‘,’* ‘},{‘ ‘,’*’,’ ‘,’*’},{‘*’,’ ‘,’ ‘,’ ‘,’*’}, {‘ ‘,’*’,’ ‘,’*’},{‘ ‘,’ ‘,’*’}};
举例:
(1)给数组a各元素赋以初值: [static] int a[10]={0,1,2,3,4,5,6,7,8,9}; (2)可以只给一部分元素赋初值,后几个元素值为 0 [static] int a[10]={0,1,2,3,4}; (3)如果想使一个数组中全部元素值为0,可以写成: static int a[10]={0,0,0,0,0,0,0,0,0,0} 或static int a[10]; (4)在全部数组元素赋初值时,可以不指定数组长度: int a[5]={1,2,3,4,5}; 可以写成: int a[ ]={1,2,3,4,5};
精品课件-C程序设计(第三版)(荣政)-第8章
第八章 指针
指针类型是对所有类型的指针的总称,指针的类型是指 针所指对象的数据类型。例如,pc是指向字符变量的指针, 简称字符指针。字符指针是基本类型的指针之一,除各种基 本类型之外,允许说明指向数组的指针、指向函数的指针、 指向结构体和共用体的指针以及指向各类指针的指针。在C 语言中只有指针被允许用来存放地址的值,其它类型的变量 只能存放该类型的数据。(很多书中用指针一词来指地址值, 或用指针变量来代表指针,阅读中应注意其具体含义。)
例8.2中指向整型的指针point在定义之后直接使用了,这 两条语句在编译时不会出现语法错误,但在使用时却几乎肯定 会出问题。表面上看,scanf()函数的参数要求给出的是地址, 而point的值就代表的是地址,但是point的值究竟是多少,也 就是说point究竟指向哪里,我们无法得知,在这种情况下就 对point指向的单元进行输入操作,将冲掉point指向的单元的 原有内容,假如这个单元是操作系统的所在处,就破坏了操作 系统,显然是一件危险的事。
为了理解指针的概念,程序员要有关于计算机如何在存储 器中存储信息的基本知识。以下简单地介绍个人计算机中存储 器存储的情况。
第八章 指针
个人计算机中CPU可以直接访问的,用来存储程序和数据 的记忆部件称为内存储器,内存储器由成千上万个顺序存储单 元组成,每个单元由一个惟一的地址标识。给定计算机的存储 器地址范围为从0到所安装的存储器数量的最大值。在计算机 上运行的每一个程序都要使用存储器。例如,操作系统要占用 一些计算机存储空间,每个应用程序也要占用计算机存储空间。 按照面向过程的结构化程序设计方法,程序代码和程序要处理 的数据是分开存储的,所以,一个程序在内存中要占两部分空 间:数据部分和指令代码部分。
第八章 指针
高中信息技术 信息学奥赛C语言第八章 数组课件
int a[5]={0,1,2,3,4}; 也可以省略为:
int a[ ]={0,1,2,3,4};
说明:
1.可以只给部分数组元素赋初值。当{}中 值的个数少于数组元素个数时,则表示初 值只赋于数组开始的若干个元素,余下部 分元素为相应类型的缺省值,int为整型数0, 字符型为空格等。
二维数组存储结构是“按行存放,先行后列”,
说明:
(1)数组名是用户定义标识符
(2)数组名后面的两对方括号必不可少, 之间不能有空格。方括号中必须是常量表 达式,表达式1表示数组的行数,表达式2 表示数组的列数。其中必须是正的整型常 量,绝对不能是变量。
(3)定义后,a数组在内存中占用6个连续 的存储单元,按照行的顺序依次存储各个 元素。 见书p75图8-2、图8-3.
8.数组定义中,数组长度除多数情况下作显式说明 外,有两种情况下不必或不能用长度说明,而用[] 代替。
(1)给数组全体元素赋初值时,可省去数组长度说 明。
(2)数组名作为函数的参数,在函数的参数说明部 分,当指出参数是数组时,不能用长度说明。
二、一维数组的初始化
• 当系统为所定义的数组在内存中开辟一串连续的 存储单元时,这些存储单元中并没有确定的值,数 组的初始化就是指在定义数组时给数组元素赋初值。
为一维数组。 • 一维数组的定义方式为:
类型名 数组名[常量表达式]; 例如: int array[10];
它表示定义了一个名为array的数组, 此数组有10个元素,每个元素的数据类型 为整型。
一维数组定义的说明:
东北石油大学vb教程第8章
Private Sub Command1_Click() For m% = 100 To 200 If sushu(m) Next m End Sub
= True Then Print m;
练习 定义函数过程求1个整数的各位数字之和 调用这个过程求100-200之间各位数字之和能被3
①形参:指出现在Sub 和Function过程形参表中的变 量名、数组名。过程被调用前,没有分配内存。
形参可以是: 除定长字符串变量之外的合法变量名; 后面跟()括号的数组名
②实参:是在调用Sub 和Function过程时,传送给相 应过程的变量名、数组名、常数或表达式。 ③形参与实参的关系:形参如同公式中的符号,实参 就是符号具体的值;调用过程即实现形参与实参的结合, 也就是把值代入公式进行计算。 ④在过程调用传递参数时,形参与实参的个数、类型、 位置一一对应。
Private Sub Form_Click() Dim m As Integer, n As Integer m = InputBox("输入m") n = InputBox("输入n")
p = gys(m, n)
Print m; n;"的公约数是:"; p End Sub
§8.3 参数传递
一、形参与实参的概念
Private Sub Command2_Click() Dim m%, n% For m = 0 To 7 For n = 0 To m Print Tab(n * 6); fac(m) / (fac(n) * fac(m - n)); Next n Print Next m End Sub
例5 输出100-200之间的所有素数
C语言程序设计ppt数组
达数组中打头元素旳地址
2024/10/10
6
8.2.1 一维数组旳申明
例8.1 具有基本数据类型旳一维数组旳申明
#define SIZE 10 int array[5]; double d[5],e[SIZE]; char name[SIZE*5];
13. double even;
21. course_even[i]=course_su
/*分别为全部课程旳总分、平均分 m[i]/5.0;
*/
22. sum+=course_sum[i];
14. int i;
23.
} /* 计算各门课平总分 */
24. even=sum/(3.0*SIZE);
2024/10/10
2024/10/10
17
例8.10
8. int course_sum[3]={0,0,0}; 15. for(i=0;i<5;i++){
9. double course_even[3];
16. course_sum[0]+=math[i];
/组**分/ 别为各门课程总分、平均分数17. course_sum[1]+=physics[i];
用若干个数字序号(下标)来区别各数组元素
例如定义float score[30],可表述30位学生成绩 用数组具有什么好处?
2024/10/10
3
8.1 数组概述
问题
计算全班30位同学某门课程旳平均成绩
处理措施
设置30个float型变量来统计成绩 设置一种有30个float型元素旳数组来统计成绩
第8章 数组和广义表
第8章数组和广义表[能力要求](1)计算机基础知识:掌握线性表的概念以及顺序表和链表的基本操作。
(2)分析问题:针对具体的问题,要能够运用线性表去进行分析,逐步找到解决问题的方法。
(3)具有概念化和抽象化能力:针对具体的应用和实际的问题,能够运用线性表对问题进行抽象,提取它的逻辑结构和存储结构。
(4)发现问题和表述问题:在具体的工程中,能够发现工程中涉及到顺序表和链表的问题,并能够明确表述。
(5)建模:在具体的工程中,能够使用线性表进行建模,设计合理的数据结构和相应的算法。
(6)解决方法和建议:在具体工程应用中,发现了关于线性表的问题,要能够解决问题,并提出合理的建议。
(7)定义功能、概念和结构:使用线性表这种逻辑结构处理一些具体问题,实现系统的功能。
(8)设计过程的分段与方法:采取不同的阶段去设计(概念设计、详细设计)一个具体的线性表的应用项目。
(9)软件实现过程:了解系统中各个模块中的关于线性表的设计;讨论算法(数据结构、控制流程、数据流程);使用编程语言实施底层设计(编程)。
8.1知识点:数组的定义和顺序存储一、选择题1①常对数组进行的两种基本操作是()。
A.建立与删除 B.索引和修改C.对数据元素的存取和修改D.查找与索引2①下面说法中,不正确的是()。
A.数组是一种线性结构B.数组是一种定长的线性表结构C.除了插入与删除操作外,数组的基本操作还有存取、修改、检索和排序等D.数组的基本操作有存取、修改、检索和排序等,没有插入与删除操作3②数组A中,每个元素的长度为3个字节,行下标I从1到8,列下标J从1到10,从首地址SA开始连续存放在存储器内,该数组占用的字节数为()。
A.80 B.100 C.240 D.2704②在二维数组A[9][10]中,每一个数组元素A[i][j] 占用3个存储空间,所有数组元素相继存放于一个连续的存储空间中,则存放该数组至少需要的存储空间是()。
A. 80 B.100 C.240 D.2705②设有一个n*n的对称矩阵A,将其下三角部分按行存放在一个一维数组B中,A[0][0]存放于B[0]中,那么第I行的对角元素A[I][I]存放于B中()处。
第8章 数组
– 二维数组的存储
• 从逻辑上看,二维数组元素间的关系相当 于矩阵:第一维长度是矩阵的行数,第二 维长度是矩阵的列数。 • 从存储上看,内存是一维的、线性的空间, 那么就要采取一定的方式将二维的数组映 射到一维的内存中去。 • C语言中采用行优先的方式来存储二维数 组,同一行中再按列顺序存放。 • 若有定义: static float f[3][4]; 则f是一个3行4列的数组,它在内存中的 存储示意图如右图所示: 上一页
• b[i]和b+i都表示第i行首地址,二者值相同,但类型却不同: 前者的基类型为二维数组元素类型,后者的基类型为二维数 组的行(即一维数组类型)。 • 若考虑b为一维数组类型的一维数组,*(b+i)为b的第i个元 素,则*(b+i)与b[i]等价。
– 数组元素的地址
• 二维数组元素地址的类型是基类型为数组元素类型的指针 类型,如&b[i][j]就可以看作基类型为整型的指针类型。 • 对于二维数组b中第i行、第j列(0<=i<=2,0<=j<=3)的元素的 地址可表示为:b[i]+j或*(b+i)+j。 •二维数组在内存中按行序顺次存放,元素b[i][j]之前已存放 了第0行、第1行、…第i-1行共i行元素;在第i行中,b[i][j]之 前已经存放了第0列、第1列、…第j-1列共j个元素,即b[i][j] 之前共有i*4+j个元素,那么,b[i][j]的地址也可表示为 : &b[0][0]+i*4+j或b[0]+i*4+j。 上一页
– 将字符串常量赋给字符数组
• 可将字符串常量中的字符逐个赋值给字符数组,且最后一 个字符是空字符。 • 可以在定义字符数组时同时将字符串常量赋值给它。 • 定义字符数组时可省略数组的长度,系统会根据所赋字符 串常量的实际长度来确定字符数组的长度。 上一页
数据结构教程李春葆课后答案第8章图
3
3
3
3 5 3
图 8.10 图 G
图 8.11 图 G 中的关键路径
14. 假设不带权有向图采用邻接矩阵 g 存储,设计实现以下功能的算法: (1)求出图中每个顶点的入度。 (2)求出图中每个顶点的出度。 (3)求出图中出度为0的顶点数。 解:利用邻接矩阵的特点和相关概念得到如下算法:
????????????????????????????????????????????0303034050640a图89邻接矩阵a10234545643331023454564333图810图g图811图g中的关键路径14
第8章 图
教材中练习题及参考答案
1. 图G是一个非连通图,共有28条边,则该图至少有多少个顶点? 答:由于G是一个非连通图,在边数固定时,顶点数最少的情况是该图由两个连通分 量构成,且其中之一只含一个顶点(没有边),另一个为完全无向图。设该完全无向图的 顶点数为n, 其边数为n(n-1)/2,即n(n-1)/2=28,得n=8。所以,这样的非连通图至少有1+8=9 个顶点。 2. 有一个如图 8.2(a)所示的有向图,给出其所有的强连通分量。 答:图中顶点0、1、2构成一个环,这个环一定是某个强连通分量的一部分。再考察顶 点3、4,它们到这个环中的顶点都有双向路径,所以将顶点3、4加入。考察顶点5、6,它 们各自构成一个强连通分量。该有向图的强连通分量有3个,如图8.2(b)所示。
2
数据结构教程学习指导
接表表示的有向图,图中的边数等于边结点的个数。 (2)对于邻接矩阵g表示的无向图,邻接矩阵数组元素g.edges[i][j]为1表示它们有边相 连,否则为无边相连。对于邻接矩阵g表示的有向图,邻接矩阵数组元素g.edges[i][j]为1表 示从顶点i到顶点j有边,g.edges[j][i]为1表示从顶点j到顶点i有边。 对于邻接表G表示的无向图,若从头结点G->adjlist[i]的单链表中找到编号为j的边表结 点,表示它们有边相连;否则为无边相连。对于邻接表 G 表示的有向图,若从头结点 G->adjlist[i] 的单链表中找到编号为 j的边表结点,表示从顶点 i到顶点 j有边。若从头结点 G->adjlist[j]的单链表中找到编号为i的边表结点,表示从顶点j到顶点i有边。 (3)对于邻接矩阵表示的无向图,顶点i的度等于第i行中元素为1的个数;对于邻接矩 阵表示的有向图,顶点i的出度等于第i行中元素为1的个数,入度等于第i列中元素为1的个 数,顶点i度等于它们之和。 对于邻接表G表示的无向图,顶点i的度等于G->adjlist[i]为头结点的单链表中边表结点 个数。 对于邻接表G表示的有向图,顶点i的出度等于G->adjlist[i]为头结点的单链表中边表结 点的个数;入度需要遍历所有的边结点,若G->adjlist[j]为头结点的单链表中存在编号为 i 的边结点,则顶点i的入度增1,顶点i的度等于入度和出度之和。 5. 对于如图 8.3 所示的一个无向图 G,给出以顶点 0 作为初始点的所有的深度优先遍 历序列和广度优先遍历序列。
大一c语言课本电子版
大一c语言课本电子版目录:第1篇基础知识第1章C语言概述视频讲解:29分钟1.1 C语言的发展史1.1.1 程序语言简述1.1.2 C语言的历史1.2 C语言的特点1.3 一个简单的C程序1.4 一个完整的C程序1.5 C语言程序的格式1.6 开发环境1.6.1 Turbo C2.01.6.2 Visual C 6.01.7 小结第2章算法视频讲解:22分钟2.1 算法的基本概念2.1.1 算法的特性2.1.2 算法的优劣2.2 算法的描述2.2.1 自然语言2.2.2 流程图2.2.3 N-S流程图2.3 小结第3章数据类型视频讲解:39分钟3.1 编程规范3.2 关键字3.3 标识符3.4 数据类型3.5 常量3.5.1 整型常量3.5.2 实型常量3.5.3 字符型常量3.5.4 转义字符3.5.5 符号常量3.6 变量3.6.1 整型变量3.6.2 实型变量3.6.3 字符型变量3.7 变量的存储类别3.7.1 静态存储与动态存储3.7.2 auto变量3.7.3 static变量3.7.4 register变量3.7.5 extern变量3.8 混合运算3.9 小结3.10 实践与练习第4章运算符与表达式视频讲解:29分钟4.1 表达式4.2 赋值运算符与赋值表达式4.2.1 变量赋初值4.2.2 自动类型转换4.2.3 强制类型转换4.3 算术运算符与算术表达式4.3.1 算术运算符4.3.2 算术表达式4.3.3 优先级与结合性4.3.4 自增/自减运算符4.4 关系运算符与关系表达式4.4.1 关系运算符4.4.2 关系表达式4.4.3 优先级与结合性4.5 逻辑运算符与逻辑表达式4.5.1 逻辑运算符4.5.2 逻辑表达式4.5.3 优先级与结合性4.6 位逻辑运算符与位逻辑表达式4.6.1 位逻辑运算符4.6.2 位逻辑表达式4.7 逗号运算符与逗号表达式4.8 复合赋值运算符4.9 小结4.10 实践与练习第5章常用的数据输入/输出函数视频讲解:40分钟5.1 语句5.2 字符数据输入/输出5.2.1 字符数据输出5.2.2 字符数据输入5.3 字符串输入/输出5.3.1 字符串输出函数5.3.2 字符串输入函数5.4 格式输出函数5.5 格式输入函数5.6 顺序程序设计应用5.7 小结5.8 实践与练习第6章选择结构程序设计视频讲解:44分钟6.1 if语句6.2 if语句的基本形式6.2.1 if语句形式6.2.2 if…else语句形式6.2.3 else if语句形式6.3 if的嵌套形式6.4 条件运算符6.5 switch语句6.5.1 switch语句的基本形式6.5.2 多路开关模式的switch语句6.6 if…else语句和switch语句的区别6.7 选择结构程序应用6.8 小结6.9 实践与练习第7章循环控制视频讲解:41分钟7.1 循环语句7.2 while语句7.3 do…while语句7.4 for语句7.4.1 for语句使用7.4.2 for循环的变体7.4.3 for语句中的逗号应用7.5 3种循环语句的比较7.6 循环嵌套7.6.1 循环嵌套的结构7.6.2 循环嵌套实例7.7 转移语句7.7.1 goto语句7.7.2 break语句7.7.3 continue语句7.8 小结7.9 实践与练习第2篇核心技术第8章数组视频讲解:1小时7分钟8.1 一维数组8.1.1 一维数组的定义和引用8.1.2 一维数组初始化8.1.3 一维数组应用8.2 二维数组8.2.1 二维数组的定义和引用8.2.2 二维数组初始化8.2.3 二维数组的应用8.3 字符数组8.3.1 字符数组的定义和引用8.3.2 字符数组初始化8.3.3 字符数组的结束标志8.3.4 字符数组的输入和输出8.3.5 字符数组的应用8.4 多维数组8.5 数组的排序算法8.5.1 选择法排序8.5.2 冒泡法排序8.5.3 交换法排序8.5.4 插入法排序8.5.5 折半法排序8.5.6 排序算法的比较8.6 字符串处理函数8.6.1 字符串复制8.6.2 字符串连接8.6.3 字符串比较8.6.4 字符串大小写转换8.6.5 获得字符串长度8.7 数组应用8.7.1 反转输出字符串8.7.2 输出系统日期和时间8.7.3 字符串的加密和解密8.8 小结8.9 实践与练习第9章函数视频讲解:55分钟9.1 函数概述9.2 函数的定义9.2.1 函数定义的形式9.2.2 定义与声明9.3 返回语句9.3.1 从函数返回9.3.2 返回值9.4 函数参数9.4.1 形式参数与实际参数9.4.2 数组作函数参数9.4.3 main函数的参数9.5 函数的调用9.5.1 函数的调用方式9.5.2 嵌套调用9.5.3 递归调用9.6 内部函数和外部函数9.6.1 内部函数9.6.2 外部函数9.7 局部变量和全局变量9.7.1 局部变量9.7.2 全局变量9.8 函数应用9.9 小结9.10 实践与练习第10章指针视频讲解:1小时2分钟10.1 指针相关概念10.1.1 地址与指针10.1.2 变量与指针10.1.3 指针变量10.1.4 指针自加自减运算10.2 数组与指针10.2.1 一维数组与指针10.2.2 二维数组与指针10.2.3 字符串与指针10.2.4 字符串数组10.3 指向指针的指针10.4 指针变量作函数参数10.5 返回指针值的函数10.6 指针数组作main函数的参数10.7 小结10.8 实践与练习第3篇高级应用第11章结构体和共用体视频讲解:40分钟11.1 结构体11.1.1 结构体类型的概念11.1.2 结构体变量的定义11.1.3 结构体变量的引用11.1.4 结构体类型的初始化11.2 结构体数组11.2.1 定义结构体数组11.2.2 初始化结构体数组11.3 结构体指针11.3.1 指向结构体变量的指针11.3.2 指向结构体数组的指针11.3.3 结构体作为函数参数11.4 包含结构的结构11.5 链表11.5.1 链表概述11.5.2 创建动态链表11.5.3 输出链表11.6 链表相关操作11.6.1 链表的插入操作11.6.2 链表的删除操作11.7 共用体11.7.1 共用体的概念11.7.2 共用体变量的引用11.7.3 共用体变量的初始化11.7.4 共用体类型的数据特点11.8 枚举类型11.9 小结11.10 实践与练习第12章位运算视频讲解:35分钟12.1 位与字节12.2 位运算操作符12.2.1 “与”运算符12.2.2 “或”运算符12.2.3 “取反”运算符12.2.4 “异或”运算符12.2.5 “左移”运算符12.2.6 “右移”运算符12.3 循环移位12.4 位段12.4.1 位段的概念与定义12.4.2 位段相关说明12.5 小结12.6 实践与练习第13章预处理视频讲解:39分钟13.1 宏定义13.1.1 不带参数的宏定义13.1.2 带参数的宏定义13.2 #include指令13.3 条件编译13.3.1 #if命令13.3.2 #ifdef及#ifndef命令13.3.3 #undef命令13.3.4 #line命令13.3.5 #pragma命令13.4 小结13.5 实践与练习第14章文件视频讲解:55分钟14.1 文件概述14.2 文件基本操作14.2.1 文件指针14.2.2 文件的打开14.2.3 文件的关闭14.3 文件的读写14.3.1 fputc函数14.3.2 fgetc函数14.3.3 fputs函数14.3.4 fgets函数14.3.5 fprintf函数14.3.6 fscanf函数14.3.7 fread和fwrite函数14.4 文件的定位14.4.1 fseek函数14.4.2 rewind函数14.4.3 ftell函数14.5 小结14.6 实践与练习第15章存储管理视频讲解:22分钟15.1 内存组织方式15.1.1 内存的组织方式15.1.2 堆与栈15.2 动态管理15.2.1 malloc函数15.2.2 calloc函数15.2.3 realloc函数15.2.4 free函数15.3 内存丢失15.4 小结15.5 实践与练习第16章网络套接字编程视频讲解:39分钟16.1 计算机网络基础16.1.1 IP地址16.1.2 OSI七层参考模型16.1.3 地址解析16.1.4 域名系统16.1.5 TCP/IP协议16.1.6 端口16.1.7 套接字的引入16.1.8 网络字节顺序16.2 套接字基础16.2.1 套接字概述16.2.2 TCP的套接字的socket编程16.2.3 UDP的套接字的socket编程16.3 套接字函数16.3.1 套接字函数介绍16.3.2 基于TCP的网络聊天程序16.4 小结16.5 实践与练习第4篇项目实战第17章学生成绩管理系统视频讲解:40分钟17.1 需求分析17.2 系统设计17.3 功能设计17.3.1 功能选择界面17.3.2 录入学生成绩信息17.3.3 查询学生成绩信息17.3.4 删除学生成绩信息17.3.5 修改学生成绩信息17.3.6 插入学生成绩信息17.3.7 统计学生人数17.4 小结附录ASCII表。
第8章++排序+课后习题答案
第8章排序1.选择题(1)从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为()。
A.归并排序B.冒泡排序C.插入排序D.选择排序(2)从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端的方法,称为()。
A.归并排序B.冒泡排序C.插入排序D.选择排序(3)对n个不同的关键字由小到大进行冒泡排序,在下列()情况下比较的次数最多。
A.从小到大排列好的B.从大到小排列好的C.元素无序D.元素基本有序(4)对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为()。
A.n+1 B.n C.n-1 D.n(n-1)/2 (5)快速排序在下列()情况下最易发挥其长处。
A.被排序的数据中含有多个相同排序码B.被排序的数据已基本有序C.被排序的数据完全无序D.被排序的数据中的最大值和最小值相差悬殊(6)对n个关键字作快速排序,在最坏情况下,算法的时间复杂度是()。
A.O(n) B.O(n2)C.O(nlog2n) D.O(n3)(7)若一组记录的排序码为(46, 79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为()。
A.38,40,46,56,79,84 B.40,38,46,79,56,84C.40,38,46,56,79,84D.40,38,46,84,56,79 (8)下列关键字序列中,()是堆。
A.16,72,31,23,94,53 B.94,23,31,72,16,53C.16,53,23,94,31,72 D.16,23,53,31,94,72(9)堆是一种()排序。
A.插入B.选择C.交换D.归并(10)堆的形状是一棵()。
A.二叉排序树B.满二叉树C.完全二叉树D.平衡二叉树(11)若一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为()。
vb学习第8n章
8.3 数组的基本操作 1.数组的引用 如: x(8) 数组的引用
A (4,8)
注意: 引用数组元素时与数组声明时的维数、数组名、 注意: 引用数组元素时与数组声明时的维数、数组名、类型一 致. 引用的下标应在数组声明时的下标范围内。 引用的下标应在数组声明时的下标范围内。 2.数组元素的输入 用赋值语句 a(1)= li a(1)=“li li” 用循环和InputBox语句输入 输入 For i = 1 To 10 a(i)=inputbox(“输入数据”) 输入数据” 输入数据 Next i (多维数组用多重循环输入)
随机产生十个10 100的整数 10~ 的整数, 选择排序法” 例8.4 随机产生十个10~100的整数,用“选择排序法”按值 从小到大顺序排序输出
解题方法: 解题方法:
(1) 利用 利用Int(91*Rnd+10)产生值为 到100的随机整数 将 产生值为10到 的随机整数,将 产生值为 的随机整数 10个数放入数组 中, a(1), a(2), a(3), … ,a(10) 个数放入数组a中 个数放入数组 (2)按值从小到大进行排序。排序方法: 按值从小到大进行排序。 按值从小到大进行排序 排序方法:
将一维数组中前后各元素交换(课后 题 将一维数组中前后各元素交换 课后8.4题) 课后 For i =1 To 10\2 t=a(i) a(i)=a(10-i+1) a(10-i+1)=t Next
交换二维数组第1,3行各元素 课后8.7 8.7题 交换二维数组第1,3行各元素 (课后8.7题) 1,3
y(x(2)+k)就是 就是y(12) 就是 只要有规则地改变下标值, 只要有规则地改变下标值,就可以很方便地使下 标变量(如 标变量 如a(i))成为所需要的具体下标变量 成为所需要的具体下标变量
《C语言程序设计》教材习题答案第8章
一、选择题1.以下数组定义中,错误的是:C)int a[3]={1,2,3,4};2.以下数组定义中,正确的是:B) int a[][2]={1,2,3,4};3.设有定义“int a[8][10];”,在VC中一个整数占用4字节,设a的起始地址为1000,则a[1][1]的地址是:D)10444.已知有数组定义“int a[][3]={1,2,3,4,5,6,7,8,9};”,则a[1][2]的值是:C)65.在以下字符串定义、初始化和赋值运算中,错误的是:A) char str[10];str=”String”;6.设有以下字符串定义,char s1[]={‘S’,’t’,’r’,’i’,’n’,’g’};char s2[]=”String”;则s1和s2:C)长度不同,但内容相同。
7.设有定义“int a[10]={0};”,则说法正确的是:A)数组a有10个元素,各元素的值为0.8.设已定义“char str[6]={‘a’,’b’,’\0’,’c’,’d’,’\0’};”,执行语句“printf(“%s”,str)”后,输出结果为:B)ab9.引用数组元素时,数组元素下标不可以是:C)字符串10.已定义字符串S1和S2,以下错误的输入语句是:C)gets(s1,s2);11.下面程序段的运行结果是:A)123void main(){char a[]=”abcd”,b[]=”123”;strcpy(a,b);printf(“%s\n”,a);}12.下面程序段的运行结果是:A)123void main(){char a[]=”123”,b[]=”abcd”;if(a>b)printf(“%s\n”,a);else printf(“%s\n”,b);}二、编程题1.一维数字a的值已经,请把数组中的值按逆序存放,然后输出数组。
例如数组中原来的值为3,4,2,1,6,颠倒后变成6,1,2,4,3.#include<stdio.h>main(){int i,a[5]={2,3,45,12,5},t;printf("转换前:");for(i=0;i<5;i++)printf("%d\t",a[i]);for(i=0;i<5/2;i++){t=a[i];a[i]=a[5-i-1];a[5-i-1]=t;}printf("\n转换后:");for(i=0;i<5;i++)printf("%d\t",a[i]);}2.输入一个整数(位数不确定),从高位到低位依次输出各位数字,其间用逗号分隔。
第8章 排序习题解析
排序习题解析11. 填空题⑴排序的主要目的是为了以后对已排序的数据元素进行()。
【解答】查找【分析】对已排序的记录序列进行查找通常能提高查找效率。
⑵对n个元素进行起泡排序,在()情况下比较的次数最少,其比较次数为()。
在()情况下比较次数最多,其比较次数为()。
【解答】正序,n-1,反序,n(n-1)/2⑶对一组记录(54, 38, 96, 23, 15, 72, 60, 45, 83)进行直接插入排序,当把第7个记录60插入到有序表时,为寻找插入位置需比较()次。
【解答】3【分析】当把第7个记录60插入到有序表时,该有序表中有2个记录大于60。
⑷对一组记录(54, 38, 96, 23, 15, 72, 60, 45, 83)进行快速排序,在递归调用中使用的栈所能达到的最大深度为()。
【解答】3⑸对n个待排序记录序列进行快速排序,所需要的最好时间是(),最坏时间是()。
【解答】O(nlog2n),O(n2)⑹利用简单选择排序对n个记录进行排序,最坏情况下,记录交换的次数为()。
【解答】n-1【分析】60是该键值序列对应的完全二叉树中最后一个分支结点。
2. 选择题⑴下述排序方法中,比较次数与待排序记录的初始状态无关的是()。
A插入排序和快速排序B归并排序和快速排序C选择排序和归并排序D插入排序和归并排序【解答】C【分析】选择排序在最好、最坏、平均情况下的时间性能均为O(n2),归并排序在最好、最坏、平均情况下的时间性能均为O(nlog2n)。
⑵下列序列中,()是执行第一趟快速排序的结果。
A [da,ax,eb,de,bb] ff [ha,gc]B [cd,eb,ax,da] ff [ha,gc,bb]C [gc,ax,eb,cd,bb] ff [da,ha]D [ax,bb,cd,da] ff [eb,gc,ha]【解答】A【分析】此题需要按字典序比较,前半区间中的所有元素都应小于ff,后半区间中的所有元素都应大于ff。
C语言程序设计_2 第8章 数组
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}} a[3][3]={{1 },{4 },{7
.2). 按行连续赋值 把数组元素顺序赋值。例如: 把数组元素顺序赋值。例如:
int a[5][3]={1,2,3,4,5,6,7,8,9} a[5][3]={1
通常写为如下矩阵形式,比较直观: 通常写为如下矩阵形式,比较直观:
二维数组存储是按行排列的, 二维数组存储是按行排列的, 即放完一行之后顺次放入第二 行。
8.2.2 二维数组元素的表示方法
二维数组的元素也称为双下标变量,其表示的形式为: 二维数组的元素也称为双下标变量,其表示的形式为:
数组名[下标1][下标 数组名[下标1][下标2] 下标2
其中下标应为整型常量或整型表达式。例如: 其中下标应为整型常量或整型表达式。例如:
8.2 二维数组
只有一个下标的数组称为一维数组, 只有一个下标的数组称为一维数组,其数组 元素称为单下标变量。 元素称为单下标变量。有多个下标的数组称为 多维数组, 其数组元素称为多下标变量。 多维数组, 其数组元素称为多下标变量。 最 常用的是二维数组, 常用的是二维数组,更高维数的数组与二维数 组相似。 组相似。
8.1.2 数组元素的表示方法
数组元素是数组的基本单元,它是一种变量,其标识方法为 数组元素是数组的基本单元, 它是一种变量, 数组名后跟一个下标。下标指定元素在数组中的顺序号。 数组名后跟一个下标。下标指定元素在数组中的顺序号。数组元 素的一般形式为: 素的一般形式为:
数组名[下标] 数组名[下标]
例如,单独使用一个下标变量: 例如,单独使用一个下标变量:
int a[10]; a[10] a[7]=6; a[7]=6
《c语言程序设计教学资料》第8章---数组
一维数组的初始化
不为自动数组初始化,数组中的元素值是不确定的 不为静态或外部数组初始化,则对数值型数组元素, 初值为0,而对字符型数组元素,初值为空字符 ‘\0’ 对数组元素初始化的实现方法:
1.在定义数组时对数组元素赋以初值。
例如: int a[10]={0,1,2,3,4,5,6,7,8,9}; 将数组元素的初值依次放在一对花括弧内。经过上 面的定义和初始化之后,a[0]=0,a[1]=1,a[2]=2, a[3]=3,a[4]=4,a[5]=5,a[6]=6,a[7]=7,a[8]=8, a[9]=9。
0
30
b1]
1
34
b[2]
2
38
b[3]
3
3c
b[4]
4
40
c
52
44
a
61
48
i
14678910235
4c
b[8]
8
50
b[9]
9
54
b[10]
10
58
c和a的值因数组越界编辑p而pt 被破坏了 b[11]
11
5c
二维数组程序举例
例: 将一个二维数组行和列元素互换,存到另一个二维数 组中。
数组名 [下标] 下标可以是整型常量或整型表达式。例如: a[0]=a[5]+a[7]-a[2*3]
注意
定义数组时用到的“数组名[常量表达式]” 和引用数 组元素时用到的“数组名[下标]” 是有区别的。 例如∶ int a[10]; // 定义数组长度为10
t=a[6]; //引用a数组中序号为6的元素
sizeof(数组名)
编辑ppt
C语言,第8章 数组(字符数组)
(字符数组)
内 容 提 要
• • • • • • • •
•
• •
什么是字符串? 字符数组的作用 字符数组的定义 字符数组的输入和输出 字符数组的初始化 程序实例 字符串复制函数strcpy 字符串连接函数strcat 字符串比较函数strcmp 字符串长度函数strlen 程序实例
什么是字符串?
给字符数组赋值
例如:
char c[]={“boy”}; char c[]=“boy”; char c[]={„b‟, „o‟, „y‟, „\0‟};
赋值后字符数组c在内存中的状态:
c[0] b c[1] c[2] o y c[3] \0
给字符数组赋值
• 从键盘输入:
•
例如:: 使用循环逐个字符输入 #include <stdio.h> int main(void) { char c[20]; int i; for (i=0; i<3; i++) { scanf(“%c”, &c[i]); } c[i] = „\0‟; …….. return 0;
输出结果
printf(“zimu=%d,shuzi=%d,kongge=%d,qita=%d\n",
zimu, shuzi, kongge, qita);
return 0; }
使用字符串处理函数必须加头文件 <string.h>
字符串复制函数strcpy
1. strcpy(字符数组1,字符串2) 作用:将字符串2复制到字符数组1中去。
例如:输入 My name is chdong!
遇到第一个空格结束,因此只输入 My
字符数组的输出
第8章参考答案08
一、选择题1.在待排序的元素序列基本有序的前提下,效率最高的排序方法是(A)。
A.插入排序B.选择排序C.快速排序D.归并排序2.设有1000个无序的元素,希望用最快的速度挑选出其中煎10个最大的元素,最好选用(C)法。
A.冒泡排序B.快速排序C.堆排序D.基数排序3.具有12个记录的序列,采用冒泡排序最少的比较次数是(C)。
A. 1B. 144C. 11D. 664.下列4种排序方法中,要求内存容量最大的是(D)。
A.插入排序B.选择排序C.快速排序D.归并排序5.初始序列已经按键值有序时,用直接插人算法进行排序,需要比较的次数为(D).A. n2B. nlog2nC. log2nD. n-16.下列4种排序方法,在排序过程中,关键码比较的次数与记录的初始排列顺序无关的是(C)。
A.直接插人排序和快速排序B.快速排序和归并排序C.直接选择排序和归并排序D.直接插人排序和归并排序7.一组记录的排序码为(46,79,56,38,40,84),则利用堆排序的方法建立的初始堆为(B)。
A. 79,46,56,38,40,84B. 84,79,56,38,40,46C. 84,79,56,46,40,38D. 84,56,79,40,46,388.一组记录的排序码为(46,79,56,38,40,84),则利用快速排序的方法,以第1个记录为基准得到的一次划分的结果为(C)。
A. 38,40,46,56,79,84B. 40,38,46,79,56,84C. 40,38,46,56,79,84D. 40,38,46,84,56,799.用某种排序方法对线性表(25,84,21,47,15,27,68,35,20)进行排序时,元素序列的变化情况如下:25,84,21,47,15,27,68,35,2020,15,21,25,47,27,68,35,8415,20,21,25,35,27,47,68,8415,20,21,25,27,35,47,68,84则采用的排序方法是(D)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
8.1.1 引例
由此,我们引入数组。用一批具有相同名字、不同下 标的下标变量来存放一组数据。在VB中,把一组具有相 同名字、不同下标的下标变量称为数组。 用数组求100名学生的平均成绩的程序段如下: Dim score(1 To 100) As Integer Sum = 0 For i = 1 To 100 score(i) = InputBox("输入" + i + "位学生的成绩") Sum = Sum + score(i) Next i average = Sum / 100 若要再求低于平均分的学生人数,可接着写如下语句: num=0 For i = 1 To 100 If score(i) < average Then num = num + 1 主讲:常国锋 Next i
8.1.2 数组的定义
数组应当先定义后使用。定义中要声明数组名、类型、 维数及数组的大小。数组在计算机内存中占据一块区域, 数组名是这个区域的名称,区域的每个单元都有自己的地 址,该地址用下标表示。定义数组的目的就是通知计算机 为其留出所需的内存空间。 数组的维数也就是定义时下标的个数。一个数组如果 只用一个下标就能确定一个数组元素在数组中的位置,就 称为一维数组。如果要用两个或多个下标才能确定一个数 组元素在数组中的位置,则称为二维数组或多维数组。 VB中的数组最多可以有60维。 在VB中,可以用4个语句来定义数组,它们的格式相同 ,但适用范围不同。这4个语句为: Dim 用在窗体模块或标准模块中,也可以用于过程中 ReDim 用在过程中 Static 用在过程中 Public 用在标准模块中,定义全局数组
主讲:常国锋
8.1.2 数组的定义
⑹在定义数组时,每一维的元素个数必须是常数,不 能是变量或表达式。如果需要在运行时定义数组的大 小,可以用动态数组的方法来解决这将在8.2节中详细 讲解。 ⑺数组的类型通常用As给出,如果省略As,则定义的 是默认数组。 ⑻ 数组的下界都必须小于上界。VB中提供了两个函 数LBound和UBound来测试一个数组中指定维的下界值 和上界值,这两个函数的格式为: LBound(数组名[,维]) UBound(数组名[,维]) 如果测试的是一维数组,则参数“维”可以省略, 如果测试的是多维数组,则参数“维”不能省略。
第8章 数组
前面使用的字符串、整型、实型等数据都是基本数据 类型的数据,通过简单变量来存取一个数据。然而在实 际应用中经常需要处理一批数据,因此,VB中也为我 们提供了数组类型。利用数组,可以方便灵活地组织和 使用数据。 数组是有序的数据的集合,数组中每一个数据称为数 组的一个元素。对于数组来说,不能用一个简单变量名 来访问它的某个元素。 在其它程序设计语言中,数组中的所有元素必须属 于同一种数据类型,而在VB中,一个数组中的元素可 以是相同类型的数据,也可以是不同数据类型的数据。
主讲:常国锋
8.1 数组的概念及定义
8.1.1 引例 【例8.1】求一个班100名学生某门课的平均成绩。 分析:很显然,我们不能去定义100个简单变量解决这个问题 。但我们可以结合循环结构用一个简单变量来设计程序段如下 : Sum = 0 For i = 1 To 100 score = InputBox("输入" + i + "位学生的成绩") Sum = Sum + score Next i average = Sum / 100 但是,因为存放学生成绩的变量score是一个简单变量,它只 能存放一个学生的成绩,而无法把100名学生的成绩全部保存起 来。因此,如果接下来要对这100名学生的成绩再作其它处理, 如统计不及格学生人数或统计高于平均分的人数,就要再重复 主讲:常国锋 输入100名学生的成绩,工作量大而且效率低。
For Each…Next语句与For…Next语句类似,都用来执行 指定次数的重复操作。但For Each…Next语句专门用于数组 ,其一般格式为: For Each 成员 In 数组名 循环体 [Exit For] … Next [成员] 其中:成员是一个变体变量,它是为循环提供的,它实际 上代表的是数组中的每个元素。 用For Each…Next语句可以对数组中的元素进行显示、读 取等处理,它所重复执行的次数由数组中元素的个数确定, 也就是说,数组中有多少个元素,就自动重复执行多少次
主讲:常国锋
8.1.2 数组的定义
2.根据需要指定数组下标的下界。格式如下:
Dim 数组名([下界 To] 上界,[下界 To] 上界,…) As 类型名称
说明: ⑴ 数组名的命名规则与变量名相同。但在同一个过程中,数 组名不能与变量名同名。 ⑵ 数组必须先定义,后使用。BASIC的早期版本支持数组 的隐式定义,即如果一个数组未经定义而直接使用,则该数 组的各维的默认上界为10,下界为0或1。但在VB中,不允许 使用隐式定义。 ⑶ 当用Dim语句定义数组时,数组中的全部元素都被初始化 为0(数值型数组)或空字符串(字符型数组)。 ⑷ 在第一种格式中,下标的下界只能是0或1,而在第二种格 式中,下标的范围可以是-32768~32767。 ⑸注意区分“可以使用的最大下标值”和“元素个数”:前 者指的是下标值的上界,后者指数组中元素个数。
数组元素的输出可以用循环及Print方法来实现。如 :
For i=0 To 3 For j=0 To 4 Print s(i , j);” Next j Print Next i
“;
主讲:常国锋
8.3.4 数组的赋值
数组的赋值是指将一个数组各个元素的值赋给另一 数组的各个元素。在VB6.0以前的版本中,要通过一个 For循环来实现。在VB6.0中,只要通过一条简单的赋值 语句即可实现。例如: Dim a(4) As Integer,b() As Integer a(0)=0:a(1)=5:a(2)=10:a(3)=15:a(4)=20 b=a 其中:b=a语句相当于执行了 ReDim b(UBound(a)) For i=0 To UBound(a) b(i)=a(i) Next i
主讲:常国锋
8.3.1 对数组元素进行初始化
Array函数用来为数组元素赋值,即把一个数据集读入 某个数组。其格式为: 数组变量名=Array(数组元素值) 其中:数组变量名是预先定义的数组名,它后面没有括 号,之所以称为“数组变量”,是因为它作为数组使用, 但作为变量定义,既没有维数,也没有上下界,并且数组 变量不能是具体的数据类型,只能是Variant类型。数组元 素值是需要赋给数组各元素的值,各值之间以逗号分隔。 数组变量可以有三种定义方式: ⑴显式定义为Variant变量。如:Dim Num As Variant ⑵ 在定义时不指明类型。 如:Dim Num ⑶不定义而直接使用。 注意:Array函数只能对一维数组进行初始化,不能对二 维或多维数组进行初始化。
主讲:常国锋
8.2 静态数组与动态数组
在定义时已确定了数组占用内存空间大小的数组称为 静态数组,前面我们所使用的数组都是静态数组。动态数 组是指在声明数组时未给出数组占用内存的大小(省略括 号中的下标),当要使用它时,随时用ReDim语句重新指 出数组数组的下标,从新为其开辟内存区的数组。 因此静态数组是在程序编译时就为数组分配好了内存
主讲:常国锋
8.3.2 数组元素的输入
数组元素一般通过For循环语句及InputBox函数输入。如
For i=0 To 3 For j=0 To 4 s(i,j)=InputBox(“ 输 入 ” & i & ”,” & j & ” Next j Next i
主讲:常国锋
8.3.3 数组元素的输出
语句中的下标可以是常量,也可以是有了确定值的变量。
⑵在过程中可以多次使用ReDim语句来改变数组的大小,也 可以改变数组的维数,但最多不能超过8维。
⑶可以用ReDim语句直接定义数组。如果在窗体层或标准模
块 层 没 有 用 Dim或 Public 语 句 声 明 过 同 名 的 数 组 , 则 用 ReDim定义的数组最多可有60维。 ⑷每次使用ReDim语句都会使原来数组中的值丢失,但如果 在ReDim语句中的ReDim关键字和数组名之间加上Preserve
主讲:常国锋
8.1.2 数组的定义
下面我们以Dim语句为例介绍数组定义的格式,其它语句 定义数组的格式与Dim相同。在VB中可以用两种格式定义 数组: 1.只给出每一维下标的上界,即可以使用的下标的最大值 。 格式如下:
Dim 数组名(第一维下标上界,第二维下标上界,…) As 类型名称
注意:在增加数组的维数时,数组所占的存储空间会大幅 度的增加,所以要慎用多维数组。使用Variant数组时更要 格外小心,因为它们需要更大的存储空间。 在一般情况下,数组下标的下界默认为0。如果希望下标 从1开始,也可以通过Option Base语句来设置,其格式为: Option Base n 其中n的值只能是0或1。Option Base语句 只能出现在窗体层或模块层,不能出现在过程中,并且必 须出现在数组定义之前。如果定义的是多维数组,则下标 的默认下界对每一维都有效。
主讲:常国锋
8.1.3 默认数组
所谓默认数组,就是数组类型为Variant(默认)的数 组。VB中允许定义默认数组。一般情况下,定义数组时应 指明其类型。如:Static Arr(3 to 5) As Integer 定义了一个数组Arr,该数组有3个元素,每个元素都是 一个整型数据。 如果把上述定义改为:Static Arr(3 to 5) 则数组 Arr是一个默认数组,其类型为Variant。即等价于如下定 义: Static Arr(3 to 5) As Variant 那么,默认数组有什么作用呢?前面我们已经知道: 几乎在所有的程序设计语言中,一个数组中的所有元素必 须属于同一种数据类型,而在VB中,一个数组中的元素可 以是相同类型的数据,也可以是不同数据类型的数据。而 默认数组就是可以存放不同类型数据的数组。因此,默认 数组也可以说是一种“混合数组”。