描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787302512127丛书名: 计算机系列教材
编辑推荐
学好计算机程序设计语言,*有效的方法就是上机编程练习。要提高编程能力,需要不断加强计算机语言基础和算法基础,不断提升逻辑思维能力和程序调试技巧,并保持对编程的兴趣。本书在充分考虑这些要素的基础上,以Visual C 6.0为实验平台,讲述C程序初步、输入输出、分支结构、循环结构、数组、函数、指针、结构体、位运算与文件,在每章中以基本知识提要、实验、练习题3个部分来组织内容。*后一章给出综合实验。全书阐述深入浅出,条理清晰,符合学习者认知规律,适合对C语言编程感兴趣的初学者,是C语言程序设计实验课的理想教材。
本书可作为高等学校理工类各专业程序设计实验教材,也可作为科技人员学习C语言程序设计的参考书。
本书可作为高等学校理工类各专业程序设计实验教材,也可作为科技人员学习C语言程序设计的参考书。
内容简介
学好计算机程序设计语言,*有效的方法就是上机编程练习。要提高编程能力,需要不断加强计算机语言基础和算法基础,不断提升逻辑思维能力和程序调试技巧,并保持对编程的兴趣。本书在充分考虑这些要素的基础上,以Visual C 6.0为实验平台,讲述C程序初步、输入输出、分支结构、循环结构、数组、函数、指针、结构体、位运算与文件,在每章中以基本知识提要、实验、练习题3个部分来组织内容。*后一章给出综合实验。全书阐述深入浅出,条理清晰,符合学习者认知规律,适合对C语言编程感兴趣的初学者,是C语言程序设计实验课的理想教材。
本书可作为高等学校理工类各专业程序设计实验教材,也可作为科技人员学习C语言程序设计的参考书。
本书可作为高等学校理工类各专业程序设计实验教材,也可作为科技人员学习C语言程序设计的参考书。
目 录
目录
第1章开发环境与C程序初步1
1.1开发环境1
1.1.1C程序的上机步骤1
1.1.2VC 6.0编程环境1
1.1.3调试方法4
1.2C程序初步基本知识提要5
1.2.1C语言的特点5
1.2.2C语言标识符6
1.2.3C程序的组成6
1.3实验1: 两个简单的C程序6
1.3.1字符串加密6
1.3.23个数的最大值8
练习题9第2章输入输出11
2.1输入输出基本知识提要11
2.1.1数据类型11
2.1.2常量和变量12
2.1.3运算符与表达式12
2.1.4输入输出语句13
2.2实验2: 输入输出14
2.2.1三角形面积14
2.2.2温度转换16
练习题17第3章分支结构20
3.1分支结构基本知识提要20
3.1.1if语句20
3.1.2switch语句23
3.1.3算法24
3.1.4算法描述工具和算法的评价24
3.2实验3: 分支结构26
3.2.1百分制成绩转换为等级26
3.2.2二次方程28
3.2.3乌龟旅行29
练习题31第4章循环结构35
4.1循环结构基本知识提要35
4.1.1while循环结构35
4.1.2dowhile循环结构36
4.1.3for循环结构37
4.1.4循环结构的嵌套与优化39
4.1.5break和continue语句40
4.2经典算法40
4.2.1穷举法40
4.2.2迭代法42
4.3实验4: 循环结构43
4.3.1棋盘上的魔数43
4.3.2猴子吃桃45
4.3.3韩信点兵46
4.3.4牛顿迭代法47
4.3.5二分法48
4.3.6百钱买百鸡49
练习题51第5章数组55
5.1数组基本知识提要55
5.1.1一维数组55
5.1.2二维数组59
5.1.3字符串与字符数组62
5.2排序与查找算法64
5.2.1排序算法64
5.2.2查找算法68
5.3实验5: 数组70
5.3.1数组元素排序70
5.3.2按条件筛选数组元素72
5.3.3数组元素逆置73
5.3.4二分法查找75
5.3.5字符数组操作77
5.3.6随机数数组操作79
练习题81第6章函数84
6.1函数基本知识提要84
6.1.1库函数84
6.1.2用户自定义函数85
6.1.3嵌套调用与递归调用87
6.1.4变量的属性89
6.1.5宏定义90
6.2实验6: 函数92
6.2.1求组合数92
6.2.2求对数和的平方根函数94
6.2.3打印数字三角形 95
6.2.4二十进制数的转换96
6.2.5验证哥德巴赫猜想97
6.2.6梯形法求函数f(x)定积分99
练习题100第7章指针104
7.1指针基本知识提要104
7.1.1指针变量104
7.1.2数组的指针表示105
7.1.3指针数组107
7.2实验7: 指针108
7.2.1有序数据108
7.2.2转置矩阵110
7.2.3计算分数112
练习题115第8章结构体119
8.1结构体基本知识提要119
8.1.1结构体变量119
8.1.2结构体数组122
8.1.3指针与结构体124
8.1.4动态存储分配126
8.1.5单链表127
8.2实验8: 结构体129
8.2.1学生成绩129
8.2.2链表建立与删除131
练习题135第9章位运算与文件140
9.1位运算与文件基本知识提要140
9.1.1位运算140
9.1.2文件140
9.2实验9: 位运算与文件144
9.2.1整数取位144
9.2.2文件合并145
练习题149第10章综合实验152
练习题157附录A各章练习题参考答案166参考文献170
第1章开发环境与C程序初步1
1.1开发环境1
1.1.1C程序的上机步骤1
1.1.2VC 6.0编程环境1
1.1.3调试方法4
1.2C程序初步基本知识提要5
1.2.1C语言的特点5
1.2.2C语言标识符6
1.2.3C程序的组成6
1.3实验1: 两个简单的C程序6
1.3.1字符串加密6
1.3.23个数的最大值8
练习题9第2章输入输出11
2.1输入输出基本知识提要11
2.1.1数据类型11
2.1.2常量和变量12
2.1.3运算符与表达式12
2.1.4输入输出语句13
2.2实验2: 输入输出14
2.2.1三角形面积14
2.2.2温度转换16
练习题17第3章分支结构20
3.1分支结构基本知识提要20
3.1.1if语句20
3.1.2switch语句23
3.1.3算法24
3.1.4算法描述工具和算法的评价24
3.2实验3: 分支结构26
3.2.1百分制成绩转换为等级26
3.2.2二次方程28
3.2.3乌龟旅行29
练习题31第4章循环结构35
4.1循环结构基本知识提要35
4.1.1while循环结构35
4.1.2dowhile循环结构36
4.1.3for循环结构37
4.1.4循环结构的嵌套与优化39
4.1.5break和continue语句40
4.2经典算法40
4.2.1穷举法40
4.2.2迭代法42
4.3实验4: 循环结构43
4.3.1棋盘上的魔数43
4.3.2猴子吃桃45
4.3.3韩信点兵46
4.3.4牛顿迭代法47
4.3.5二分法48
4.3.6百钱买百鸡49
练习题51第5章数组55
5.1数组基本知识提要55
5.1.1一维数组55
5.1.2二维数组59
5.1.3字符串与字符数组62
5.2排序与查找算法64
5.2.1排序算法64
5.2.2查找算法68
5.3实验5: 数组70
5.3.1数组元素排序70
5.3.2按条件筛选数组元素72
5.3.3数组元素逆置73
5.3.4二分法查找75
5.3.5字符数组操作77
5.3.6随机数数组操作79
练习题81第6章函数84
6.1函数基本知识提要84
6.1.1库函数84
6.1.2用户自定义函数85
6.1.3嵌套调用与递归调用87
6.1.4变量的属性89
6.1.5宏定义90
6.2实验6: 函数92
6.2.1求组合数92
6.2.2求对数和的平方根函数94
6.2.3打印数字三角形 95
6.2.4二十进制数的转换96
6.2.5验证哥德巴赫猜想97
6.2.6梯形法求函数f(x)定积分99
练习题100第7章指针104
7.1指针基本知识提要104
7.1.1指针变量104
7.1.2数组的指针表示105
7.1.3指针数组107
7.2实验7: 指针108
7.2.1有序数据108
7.2.2转置矩阵110
7.2.3计算分数112
练习题115第8章结构体119
8.1结构体基本知识提要119
8.1.1结构体变量119
8.1.2结构体数组122
8.1.3指针与结构体124
8.1.4动态存储分配126
8.1.5单链表127
8.2实验8: 结构体129
8.2.1学生成绩129
8.2.2链表建立与删除131
练习题135第9章位运算与文件140
9.1位运算与文件基本知识提要140
9.1.1位运算140
9.1.2文件140
9.2实验9: 位运算与文件144
9.2.1整数取位144
9.2.2文件合并145
练习题149第10章综合实验152
练习题157附录A各章练习题参考答案166参考文献170
前 言
前言
C语言作为计算机高级程序设计语言,有顽强的生命力和应用空间,在我国高等学校中广泛被设置为必修课程,其重要性毋庸置疑。尽管学习C语言的教材种类繁多,各有特色,但20多年的教学经验让作者深刻认识到编程实践是学好程序设计语言的最有效方法。要提高编程能力,需要不断加强计算机语言基础和算法基础,不断提升逻辑思维能力和程序调试技巧,并保持浓厚持久的编程兴趣。本书的编写充分考虑了这些要素,具有如下特点:
(1) 注重基础知识和基本算法的学习和提高,奠定解决问题的方法基础。
(2) 突出从问题到程序的抽象映射训练,培养学生的抽象思维及逻辑思维能力。
(3) 实验内容从易到难,循序渐进,逐步提高学生的编程及调试能力。
(4) 体现一定的工程应用背景,与后继面向对象程序设计实训课程相衔接。
在本书前9章中以基本知识提要、实验、练习题3个部分来组织内容。在基本知识提要部分,点到为止,提纲挈领,帮助学生复习和抓住主要知识点。在实验部分,按实验内容、实验要求、设计分析、操作指导、进一步实验5个环节描述,反映了从问题到分析再到代码的映射过程。其中,在操作指导环节中,给出了实验内容的基础代码和运行结果,而在进一步实验中,提高实验内容难度,需要学生自学必要的知识,独立完成实验。这是一个逐步提高的过程。在练习题部分,结合本章的知识点,给出习题,巩固本章所学内容。第10章给出一个综合实验。
希望读者通过编程实践认识到: 学习C语言,不仅要精通C语言的语法,具有较高的编程技能,而且要以C语言为实践工具,了解和学习计算机程序设计的思想和方法,从而能够举一反三,具备解决实际问题的能力,具备快速学习新的计算机语言的能力。
本书主要面向没有编程知识和编程经验的初学者。作为实验教材,本书要配合C程序设计理论课程的教材来学习使用。
需要强调的是,在学习编程的实践过程中,不仅要多读程序,多写程序,而且亲自动手调试程序是更重要的。通过实际的编程以及积极的思考,学习者可以较快地掌握C语言的知识体系,积累许多宝贵的编程经验;通过不断实践和大量的编程练习,逐步成长为解决实际问题的C语言编程高手,这对后续课程的学习和个人编程水平提升都是必不可少的环节。
本书由武建华、邱桔、严冬松共同执笔,全书的统稿工作由武建华负责。在编写过程中,为确保内容的正确性,作者参阅了不少参考文献,在此对相关作者表示感谢。学生杨蓉蓉完成了部分程序代码的调试。尽管我们尽了很大的努力,但限于水平,疏漏之处在所难免,欢迎同行专家和读者批评指正。
C语言作为计算机高级程序设计语言,有顽强的生命力和应用空间,在我国高等学校中广泛被设置为必修课程,其重要性毋庸置疑。尽管学习C语言的教材种类繁多,各有特色,但20多年的教学经验让作者深刻认识到编程实践是学好程序设计语言的最有效方法。要提高编程能力,需要不断加强计算机语言基础和算法基础,不断提升逻辑思维能力和程序调试技巧,并保持浓厚持久的编程兴趣。本书的编写充分考虑了这些要素,具有如下特点:
(1) 注重基础知识和基本算法的学习和提高,奠定解决问题的方法基础。
(2) 突出从问题到程序的抽象映射训练,培养学生的抽象思维及逻辑思维能力。
(3) 实验内容从易到难,循序渐进,逐步提高学生的编程及调试能力。
(4) 体现一定的工程应用背景,与后继面向对象程序设计实训课程相衔接。
在本书前9章中以基本知识提要、实验、练习题3个部分来组织内容。在基本知识提要部分,点到为止,提纲挈领,帮助学生复习和抓住主要知识点。在实验部分,按实验内容、实验要求、设计分析、操作指导、进一步实验5个环节描述,反映了从问题到分析再到代码的映射过程。其中,在操作指导环节中,给出了实验内容的基础代码和运行结果,而在进一步实验中,提高实验内容难度,需要学生自学必要的知识,独立完成实验。这是一个逐步提高的过程。在练习题部分,结合本章的知识点,给出习题,巩固本章所学内容。第10章给出一个综合实验。
希望读者通过编程实践认识到: 学习C语言,不仅要精通C语言的语法,具有较高的编程技能,而且要以C语言为实践工具,了解和学习计算机程序设计的思想和方法,从而能够举一反三,具备解决实际问题的能力,具备快速学习新的计算机语言的能力。
本书主要面向没有编程知识和编程经验的初学者。作为实验教材,本书要配合C程序设计理论课程的教材来学习使用。
需要强调的是,在学习编程的实践过程中,不仅要多读程序,多写程序,而且亲自动手调试程序是更重要的。通过实际的编程以及积极的思考,学习者可以较快地掌握C语言的知识体系,积累许多宝贵的编程经验;通过不断实践和大量的编程练习,逐步成长为解决实际问题的C语言编程高手,这对后续课程的学习和个人编程水平提升都是必不可少的环节。
本书由武建华、邱桔、严冬松共同执笔,全书的统稿工作由武建华负责。在编写过程中,为确保内容的正确性,作者参阅了不少参考文献,在此对相关作者表示感谢。学生杨蓉蓉完成了部分程序代码的调试。尽管我们尽了很大的努力,但限于水平,疏漏之处在所难免,欢迎同行专家和读者批评指正。
作者
2018年5月
免费在线读
第5章数组
实验目的
掌握一维数组和二维数组的定义、赋值和输入输出的方法。
掌握应用一维数组的基本算法,实现对一维数组的置数、逆置、查找、排序等操作。
掌握应用二维数组的基本算法,了解其与矩阵的关系,实现对二维数组进行置数,对每行每列或指定行列的元素进行处理。
掌握字符数组和字符串函数的使用。
5.1数组基本知识提要〖1〗5.1.1一维数组〖*4/5〗1. 一维数组的定义一维数组是指每个元素只有一个下标的数组。在C语言中,定义一维数组的语句形式如下: 类型名数组名 [整型常量表达式];例如: int a[10]; 说明:
(1) a为一维数组的数组名。
(2) a数组含有10个元素,它们分别是a[0],a[1],a[2],…,a[9]。
(3) a数组中的每个元素都是整型,即每个元素中只能存放整型数据。
(4) 每个元素只有一个下标,C语言规定每个数组第一个元素的下标为0,这里a数组中最后一个元素的下标为9,即该数组下标的上限为9。
(5) C编译程序为a数组在内存中开辟10个连续的存储单元,如图51所示。
图51数组a在内存中开辟的存储单元示意图
(6) 在一个数组定义语句中,可以有多个数组说明符,它们之间用逗号隔开。例如: float x[10],y[15],z[20]; 定义了名为x、y、z的3个实型数组。其中,x数组中含有10个元素,x数组的下标上限为9;y数组中含有15个元素,y数组的下标上限为14;z数组中含有20个元素,z数组的下标上限为19。
(7) 数组说明符和普通变量名也可同时出现在一个类型定义语句中。例如: char c1,c2,str[80]; 注意: 数组说明符的一对中括号中只能是整型常量或整型常量表达式,不能是变量。上述定义语句还可以写成 char c1,c2,str[50 30];2. 一维数组元素的引用
一维数组元素的引用形式为 数组名 [下标表达式] 例如,若有以下定义语句: int a[10];则a[0]、a[i]、a[i k]都是对a数组中的元素的合法引用形式,其中0、i、i k称为下标表达式。由于定义了数组a有10个元素,因此各下标表达式的值必须是整数,大于或等于0,并且小于10。
注意:
(1) 一个数组元素实质上就是一个变量名,代表内存中的一个存储单元。一个数组占用一片连续的存储单元。
(2) C语言中,数组名中存放的是一个地址常量,它代表整个数组的首地址。
(3) 只能逐个引用各个数组元素,不能一次引用整个数组。例如上述定义的a数组,不能用数组名a代表a[0]到a[9]这10个元素。
(4) 引用数组元素时,数组的下标可以是整型常量或整型表达式,下标的下限为0。
(5) 在C语言程序运行过程中,编译系统并不检查数组元素的下标是否越界,数组的上、下限均有可能越界,从而可能破坏其他存储单元中的数据或程序代码。因此,编写程序时需保证数组下标不能越界。
3. 一维数组初始化
定义数组时,系统为该数组在内存中开辟一片连续的存储单元,但这些存储单元中并没有确定的值。可以通过以下几种方式对数组元素赋初值:
(1) 在定义数组时对数组元素赋初值。例如: int a[10]={0,1,2,3,4,5,6,7,8,9}; 所有元素的初值放在赋值号后的一对大括号中,数值的类型必须与数组定义中说明的类型一致,各元素的初值之间用逗号隔开。系统将按这些数值的排列顺序,从a[0]开始依次给个元素赋初值。上述语句就是将a[0]赋初值0,将a[1]赋初值1……将a[9]赋初值9。
在指定初值时,第一个值必定赋给下标为0的元素,然后依次赋值,不可能跳过前面的元素给后面的元素赋初值。当所赋初值少于数组的元素个数时,将自动给后面的元素赋初值0;当所赋初值个数多于数组的元素个数时,编译时,系统将给出出错信息。例如: int a[10]={0,1,2,3,4}; 相当于 int a[10]={0,1,2,3,4,0,0,0,0,0}; (2) 对于字符型数组,也同样对未赋初值的元素赋初值0,即’\0’(其ASCII码值为0)。例如: char c[5]={ ‘’}; 相当于 char c[5]={ ‘’,’\0′,’\0′,’\0′,’\0′ }; (3) 可以通过赋初值来定义数组的大小。例如: int a[]={0,1,2,3,4,5,6,7,8,9}; 赋值号后面的一对大括号内有10个数值,即隐含定义了a数组含有10个元素。
4.一维数组应用举例
【例51】编写程序,定义一个含有30个元素的int类型数组,依次给数组元素赋值为1,3,5,…,然后分别以每行10个数输出,先顺序输出,再逆序输出。
本例展示了如何利用循环控制变量顺序或逆序逐个引用数组元素,以及在连续输出数组元素的过程中如何利用循环变量来进行换行控制。
程序代码: #include
#define M 30
main()
{int s[M],i,k=1;
for(i=0; i {s[i]=k; k =2; }/给数组元数依次赋值为1,3,5,…/
printf(“\n Sequence Output:\n”);
for(i=0; i {printf(“%4d”,s[i]);
if((i 1)%10==0) printf(“\n”); /利用i控制换行符的输出/
}
printf(“\n Invert Output:\n”);
for(i=M-1; i>=0; i–) /从后往前逆序输出各元素值/
printf(“%3d%c”,s[i],(i%10==0? ‘\n’:’ ‘));
/利用条件表达式来决定输出换行符还是输出空格/
} 运行该程序,输出结果如下: Sequence Output:
135791113151719
21232527293133353739
41434547495153555759
Invert Output:
59575553514947454341
39373533312927252321
191715131197531【例52】已知某班50个学生的期末考试成绩分别为
43655127791156618292536749556374
8149374049167587913324587865567667
45543663122173495119394968938559
编写程序,分别统计出成绩为0~9,10~19,20~29,…,90~99,100的学生人数。
程序代码: #include
#define MAXVAL 50
#define COUNTER 11
void main()
{
float value[MAXVAL];
int i,low,high;
int group[COUNTER]={0,0,0,0,0,0,0,0,0,0,0};
for(i=0; i{scanf(“%f”,&value[i]); /输入成绩/
group[(int)(value[i])/10]; /对成绩分段处理/
}
printf(“\n”);
printf(“GROUPRANGEFREQUENCY\n\n”);
for(i=0; i{
low=i10;
if(i==10)
high=100;
else
high=low 9;
printf(“%2d\t%3d\tto%3d\t%d\n”,i 1,low,high,group[i]);
}
} 程序的运行结果: GROUPRANGEFREQUENCY
10 to 9 2
2 10 to 19 4
3 20 to 29 4
4 30 to 39 5
5 40 to 49 8
6 50 to 59 8
7 60 to 69 7
8 70 to 79 6
9 80 to 89 4
10 90 to 99 2
11 100 to 100 05.1.2二维数组〖*4/5〗1. 二维数组的定义当数组中每个元素带有两个下标时,称为二维数组。在逻辑上,也可以把二维数组看成是一个具有行和列的表格或矩阵。
在C语言中,二维数组中元素的排列顺序是按行存放。即在内存中先按顺序存放第一行的元素,再存放第二行的元素……因此,二维数组元素的存放方式与一维数组类似,总是占用一块连续的存储单元。
二维数组的定义语句形式为 类型名数组名[常量表达式1][常量表达式2];例如: int a[3][4]; int 是类型名,a[3][4]是二维数组说明符。从此定义语句可知:
(1) a是一个具有3行4列的二维数组a,注意不能写成a[3,4]。
(2) a数组中每个元素都是整型。
(3) a数组中有3×4=12个元素,a数组是一个具有如下形式的3行4列的矩阵或表格:
第0列第1列第2列第3列
第0行a[0][0]a[0][1]a[0][2]a[0][3]
第1行a[1][0]a[1][1]a[1][2]a[1][3]
第2行a[2][0]a[2][1]a[2][2]a[2][3]
每个元素有两个下标: 第一个中括号中的下标表示行号,称为行下标;第二个中括号中的下标表示列号,称为列下标。a数组的行下标下限为0,上限为2;列下标下限为0,上限为3。
a数组中的元素在内存中占一片连续的存储单元,其排列顺序为按行存放,即先存放第0行的元素,再存放第1行的元素,最后存放第2行的元素,如图52所示。
图52二维数组a的元素在内存中的排列顺序示意图
在C语言中,可以把一个二维数组看成一个一维数组,只是该一维数组中的每个数组元素又是包含若干个元素的一维数组。例如,上述a数组可以看成是由a[0]、a[1]、a[2]这3个元素组成的一维数组,其中每个元素又是由4个整型元素组成的一维数组。
2. 二维数组元素的引用
引用二维数组元素必须给出两个下标,引用形式为 数组名[下标表达式1][下标表达式2] 例如,若有以下定义语句: double x[3][4];则x[0][1]、x[i][j]、x[i k][j k]都是合法的数组元素引用形式,只是每个下标表达式的值必须是整数,且不得超过数组定义中的上、下限。
注意: 引用二维数组元素时,必须将两个下标分别放在两个中括号内。例如,引用上述x数组中的元素时,不可以写成x[0,1]、x[i,j]、x[i k,j k],这些都是不合法的。
3. 二维数组的初始化
二维数组的初始化赋值通常有以下几种形式:
(1) 所赋初始值个数与数组元素的个数相同。
可以在定义二维数组的同时给二维数组的各元素赋初值。例如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 全部初值放在一对大括号中,每一行的初值又分别放在一对大括号中,大括号之间用逗号隔开。
(2) 每行所赋初值个数与数组元素的个数不同。
当某行一对大括号内的初值个数少于该行中元素的个数时。例如: int a[3][4]={{1,2},{5},{9,10,11,12}}; 系统自动将该行后面的元素赋初值0。这里a[0][2]、a[0][3]、a[1、1]、a[1][2]、a[1][3]这几个元素的初值均自动赋为0。
(3) 所赋初值行数少于数组行数。
当代表着给每行赋初值的大括号数少于数组的行数时。例如: int a[3][4]={{1,2},{4,5}}; 系统将自动给后面各行的元素赋初值0。
(4) 赋初值时省略大括号对。
给二维数组赋初值时也可以不用大括号对。例如: int a[3][4]={1,2,4,5};注意,此时所赋初值与情况(3)中所赋初值的结果完全不同。在这里是将a数组的第0行的4个元素依次赋值为1、2、4、5,即a[0][0]=1, a[0][1]=2, a[0][2]=4, a[0][3]=5,而数组中的其他元素的初值都为0。
(5) 通过赋初值定义二维数组的大小。
对于一维数组,可以在数组定义语句中省略中括号中的常量表达式,通过所赋初值的个数来确定数组的大小;对于二维数组,则只可以省略第一个中括号中的常量表达式,而不能省略第二个中括号中的常量表达式。例如: int a[][4]={{1,2,3,4},{5},{9}};上述语句中,a 数组的第一维的中括号中的常量表达式省略了,在所赋初值中,含有3个大括号对,则第一维的大小由所赋初值的行数来决定。因此,它等同于 int a[3][4]={{1,2,3,4},{5},{9}};如果用以下形式赋初值: int b[][3]={1,2,3,4,5,9}; 第一维的大小按以下规则确定:
(1) 当初值的个数能被第二维的常量表达式的值整除时,所得的商就是第一维的大小。
(2) 当初值的个数不能被第二维的常量表达式的值整除时,则第一维的大小为商 1。
因此,按照此规则,上述b数组第一维的大小应该是2,也就是以上语句等同于int b[2][3]={1,2,3,4,5,9};4. 二维数组应用举例
【例53】编程计算并输出9×9乘法表。
程序代码: #include
#define ROWS 9
#define COLUMNS 9
void main()
{int row, column, product[ROWS][COLUMNS];
int i,j;
printf(“MULTIPLICATIONTABLE \n\n”);
printf(“”);
for(j=1; j<=COLUMNS; j )
printf(“%4d”,j);/打印表头/
printf(“\n”);
printf(“————————————————–\n”);
for(i=0; i{ row=i 1;
printf(“%2d | “,row);
for(j=1; j<=COLUMNS; j )
{ column=j;
product[i][j]=rowcolumn;
printf(“%4d”,product[i][j]);
}
printf(“\n”);
}
} 程序运行结果如下: MULTIPLICATIONTABLE
123456789
————————————————–
1|123456789
2|24681012141618
3|369121518212427
4|4812162024283236
5|51015202530354045
6|61218243036424854
7|71421283542495663
8|81624324046566472
9|9 18273645546372815.1.3字符串与字符数组
C语言本身并没有设置一种类型来定义字符串变量,字符串的存储完全依赖于字符数组,但字符数组又不等同于字符串变量。
1. C语言对字符串的约定
在C语言中,字符串是借助字符型一维数组来存放的,并规定以字符’\0’作为字符串结束标志。’\0’是一个转义字符,称为“空值”,它的ASCII码值为0。’\0’作为标志也要占用存储空间,但不计入串的实际长度。
2. C语言对字符串常量的约定
虽然C语言中没有字符串数据类型,但允许使用字符串常量。字符串常量是由双引号括起来的一串字符,在表示字符串常量时,不需要人为在其末尾加入’\0’,C编译程序将自动在字符串的末尾加入字符’\0’。
3. C语言中字符串常量给出的是地址值
每一个字符串常量都分别占用内存中一片连续的存储空间,这片连续的存储空间实际上就是字符型一维数组。这个数组没有名字,C编译系统以字符串常量的形式给出存放每一字符串的存储空间首地址,不同的字符串具有不同的起始地址。也就是说,在C语言中,字符串常量被隐含处理成一个以’\0’结尾的无名字符型一维数组。
4. 字符数组与字符串的区别
字符串是字符数组的一种具体应用。字符数组的每个元素中可存放一个字符,但它并不限定最后一个字符应该是什么。而在C语言中,因为有关字符串的大量操作都与串结束标志’\0’有关,因此,在字符数组中的有效字符后加上’\0’,就可以把一维字符数组看作字符串变量。
注意: 仅可以在字符数组内存放字符串,不能通过赋值语句将字符串常量或其他字符数组中的字符串直接赋值给字符串变量。
【例54】 编程实现以下功能: 从终端输入一个字符串,将其复制到另一个字符数组中,并统计复制的字符个数。
程序代码: #include
#include
void main()
{
char string1[80],string2[80];
int i;
printf(“Enter a string \n”);
scanf(“%s”,string1);
for(i=0; string1[i] !=’\0′; i )
string2[i]=string1[i];
string2[i]=’\0′;
printf(“\n”);
printf(“%s\n”,string2);
printf(“Number of characters=%d\n”,i);
} 运行程序,在键盘上输入Appleissweet后按回车键,输出Number of characters=12【例55】编程输出大小写26个字母及其对应的ASCII码值。
程序代码: #include
void main()
{
char c;
int i=0;
printf(“\n\n”);
for(c=65; c<=122; c )
{
if(c>90&&c<97)
continue;
if(i%8==0) printf(“\n”);
{printf(“|%2c–%4d”,c,c);i ;}
}
printf (“|\n”);
}
运行程序,得到如下输出结果: |A–65|B–66|C–67|D–68|E–69|F–70|G–71
|H–72|I–73|J–74|K–75|L–76|M–77|N–78
|O–79|P–80|Q–81|R–82|S–83|T–84|U–85
|V–86|W–87|X–88|Y–89|Z–90|a–97|b–98
|c–99|d–100|e–101|f–102|g–103|h–104|i–105
|j–106|k–107|l–108|m–109|n–110|o–111|p–112
|q–113|r–114 |s–115|t–116|u–117|v–118|w–119
|x–120|y–121|z–122
5.2排序与查找算法〖*4/5〗5.2.1排序算法所谓排序,就是将一个任意顺序的数据元素序列重新排列成有序的序列。排序的算法有很多,对空间的要求及其时间效率也不尽相同。计算机程序设计中常用的排序方法有冒泡排序、选择排序、插入排序、快速排序、希尔排序、归并排序、基数排序等。其中,冒泡排序、选择排序、插入排序又被称作简单排序,它们对空间的要求不高,但是时间效率却不稳定;后面几种排序对空间的要求稍高一点,但时间效率能稳定在很高的水平。
1. 冒泡排序
冒泡排序算法基本思想是: 对两个相邻的数比较大小,较大的数下沉或较小的数上
实验目的
掌握一维数组和二维数组的定义、赋值和输入输出的方法。
掌握应用一维数组的基本算法,实现对一维数组的置数、逆置、查找、排序等操作。
掌握应用二维数组的基本算法,了解其与矩阵的关系,实现对二维数组进行置数,对每行每列或指定行列的元素进行处理。
掌握字符数组和字符串函数的使用。
5.1数组基本知识提要〖1〗5.1.1一维数组〖*4/5〗1. 一维数组的定义一维数组是指每个元素只有一个下标的数组。在C语言中,定义一维数组的语句形式如下: 类型名数组名 [整型常量表达式];例如: int a[10]; 说明:
(1) a为一维数组的数组名。
(2) a数组含有10个元素,它们分别是a[0],a[1],a[2],…,a[9]。
(3) a数组中的每个元素都是整型,即每个元素中只能存放整型数据。
(4) 每个元素只有一个下标,C语言规定每个数组第一个元素的下标为0,这里a数组中最后一个元素的下标为9,即该数组下标的上限为9。
(5) C编译程序为a数组在内存中开辟10个连续的存储单元,如图51所示。
图51数组a在内存中开辟的存储单元示意图
(6) 在一个数组定义语句中,可以有多个数组说明符,它们之间用逗号隔开。例如: float x[10],y[15],z[20]; 定义了名为x、y、z的3个实型数组。其中,x数组中含有10个元素,x数组的下标上限为9;y数组中含有15个元素,y数组的下标上限为14;z数组中含有20个元素,z数组的下标上限为19。
(7) 数组说明符和普通变量名也可同时出现在一个类型定义语句中。例如: char c1,c2,str[80]; 注意: 数组说明符的一对中括号中只能是整型常量或整型常量表达式,不能是变量。上述定义语句还可以写成 char c1,c2,str[50 30];2. 一维数组元素的引用
一维数组元素的引用形式为 数组名 [下标表达式] 例如,若有以下定义语句: int a[10];则a[0]、a[i]、a[i k]都是对a数组中的元素的合法引用形式,其中0、i、i k称为下标表达式。由于定义了数组a有10个元素,因此各下标表达式的值必须是整数,大于或等于0,并且小于10。
注意:
(1) 一个数组元素实质上就是一个变量名,代表内存中的一个存储单元。一个数组占用一片连续的存储单元。
(2) C语言中,数组名中存放的是一个地址常量,它代表整个数组的首地址。
(3) 只能逐个引用各个数组元素,不能一次引用整个数组。例如上述定义的a数组,不能用数组名a代表a[0]到a[9]这10个元素。
(4) 引用数组元素时,数组的下标可以是整型常量或整型表达式,下标的下限为0。
(5) 在C语言程序运行过程中,编译系统并不检查数组元素的下标是否越界,数组的上、下限均有可能越界,从而可能破坏其他存储单元中的数据或程序代码。因此,编写程序时需保证数组下标不能越界。
3. 一维数组初始化
定义数组时,系统为该数组在内存中开辟一片连续的存储单元,但这些存储单元中并没有确定的值。可以通过以下几种方式对数组元素赋初值:
(1) 在定义数组时对数组元素赋初值。例如: int a[10]={0,1,2,3,4,5,6,7,8,9}; 所有元素的初值放在赋值号后的一对大括号中,数值的类型必须与数组定义中说明的类型一致,各元素的初值之间用逗号隔开。系统将按这些数值的排列顺序,从a[0]开始依次给个元素赋初值。上述语句就是将a[0]赋初值0,将a[1]赋初值1……将a[9]赋初值9。
在指定初值时,第一个值必定赋给下标为0的元素,然后依次赋值,不可能跳过前面的元素给后面的元素赋初值。当所赋初值少于数组的元素个数时,将自动给后面的元素赋初值0;当所赋初值个数多于数组的元素个数时,编译时,系统将给出出错信息。例如: int a[10]={0,1,2,3,4}; 相当于 int a[10]={0,1,2,3,4,0,0,0,0,0}; (2) 对于字符型数组,也同样对未赋初值的元素赋初值0,即’\0’(其ASCII码值为0)。例如: char c[5]={ ‘’}; 相当于 char c[5]={ ‘’,’\0′,’\0′,’\0′,’\0′ }; (3) 可以通过赋初值来定义数组的大小。例如: int a[]={0,1,2,3,4,5,6,7,8,9}; 赋值号后面的一对大括号内有10个数值,即隐含定义了a数组含有10个元素。
4.一维数组应用举例
【例51】编写程序,定义一个含有30个元素的int类型数组,依次给数组元素赋值为1,3,5,…,然后分别以每行10个数输出,先顺序输出,再逆序输出。
本例展示了如何利用循环控制变量顺序或逆序逐个引用数组元素,以及在连续输出数组元素的过程中如何利用循环变量来进行换行控制。
程序代码: #include
#define M 30
main()
{int s[M],i,k=1;
for(i=0; i {s[i]=k; k =2; }/给数组元数依次赋值为1,3,5,…/
printf(“\n Sequence Output:\n”);
for(i=0; i {printf(“%4d”,s[i]);
if((i 1)%10==0) printf(“\n”); /利用i控制换行符的输出/
}
printf(“\n Invert Output:\n”);
for(i=M-1; i>=0; i–) /从后往前逆序输出各元素值/
printf(“%3d%c”,s[i],(i%10==0? ‘\n’:’ ‘));
/利用条件表达式来决定输出换行符还是输出空格/
} 运行该程序,输出结果如下: Sequence Output:
135791113151719
21232527293133353739
41434547495153555759
Invert Output:
59575553514947454341
39373533312927252321
191715131197531【例52】已知某班50个学生的期末考试成绩分别为
43655127791156618292536749556374
8149374049167587913324587865567667
45543663122173495119394968938559
编写程序,分别统计出成绩为0~9,10~19,20~29,…,90~99,100的学生人数。
程序代码: #include
#define MAXVAL 50
#define COUNTER 11
void main()
{
float value[MAXVAL];
int i,low,high;
int group[COUNTER]={0,0,0,0,0,0,0,0,0,0,0};
for(i=0; i{scanf(“%f”,&value[i]); /输入成绩/
group[(int)(value[i])/10]; /对成绩分段处理/
}
printf(“\n”);
printf(“GROUPRANGEFREQUENCY\n\n”);
for(i=0; i{
low=i10;
if(i==10)
high=100;
else
high=low 9;
printf(“%2d\t%3d\tto%3d\t%d\n”,i 1,low,high,group[i]);
}
} 程序的运行结果: GROUPRANGEFREQUENCY
10 to 9 2
2 10 to 19 4
3 20 to 29 4
4 30 to 39 5
5 40 to 49 8
6 50 to 59 8
7 60 to 69 7
8 70 to 79 6
9 80 to 89 4
10 90 to 99 2
11 100 to 100 05.1.2二维数组〖*4/5〗1. 二维数组的定义当数组中每个元素带有两个下标时,称为二维数组。在逻辑上,也可以把二维数组看成是一个具有行和列的表格或矩阵。
在C语言中,二维数组中元素的排列顺序是按行存放。即在内存中先按顺序存放第一行的元素,再存放第二行的元素……因此,二维数组元素的存放方式与一维数组类似,总是占用一块连续的存储单元。
二维数组的定义语句形式为 类型名数组名[常量表达式1][常量表达式2];例如: int a[3][4]; int 是类型名,a[3][4]是二维数组说明符。从此定义语句可知:
(1) a是一个具有3行4列的二维数组a,注意不能写成a[3,4]。
(2) a数组中每个元素都是整型。
(3) a数组中有3×4=12个元素,a数组是一个具有如下形式的3行4列的矩阵或表格:
第0列第1列第2列第3列
第0行a[0][0]a[0][1]a[0][2]a[0][3]
第1行a[1][0]a[1][1]a[1][2]a[1][3]
第2行a[2][0]a[2][1]a[2][2]a[2][3]
每个元素有两个下标: 第一个中括号中的下标表示行号,称为行下标;第二个中括号中的下标表示列号,称为列下标。a数组的行下标下限为0,上限为2;列下标下限为0,上限为3。
a数组中的元素在内存中占一片连续的存储单元,其排列顺序为按行存放,即先存放第0行的元素,再存放第1行的元素,最后存放第2行的元素,如图52所示。
图52二维数组a的元素在内存中的排列顺序示意图
在C语言中,可以把一个二维数组看成一个一维数组,只是该一维数组中的每个数组元素又是包含若干个元素的一维数组。例如,上述a数组可以看成是由a[0]、a[1]、a[2]这3个元素组成的一维数组,其中每个元素又是由4个整型元素组成的一维数组。
2. 二维数组元素的引用
引用二维数组元素必须给出两个下标,引用形式为 数组名[下标表达式1][下标表达式2] 例如,若有以下定义语句: double x[3][4];则x[0][1]、x[i][j]、x[i k][j k]都是合法的数组元素引用形式,只是每个下标表达式的值必须是整数,且不得超过数组定义中的上、下限。
注意: 引用二维数组元素时,必须将两个下标分别放在两个中括号内。例如,引用上述x数组中的元素时,不可以写成x[0,1]、x[i,j]、x[i k,j k],这些都是不合法的。
3. 二维数组的初始化
二维数组的初始化赋值通常有以下几种形式:
(1) 所赋初始值个数与数组元素的个数相同。
可以在定义二维数组的同时给二维数组的各元素赋初值。例如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 全部初值放在一对大括号中,每一行的初值又分别放在一对大括号中,大括号之间用逗号隔开。
(2) 每行所赋初值个数与数组元素的个数不同。
当某行一对大括号内的初值个数少于该行中元素的个数时。例如: int a[3][4]={{1,2},{5},{9,10,11,12}}; 系统自动将该行后面的元素赋初值0。这里a[0][2]、a[0][3]、a[1、1]、a[1][2]、a[1][3]这几个元素的初值均自动赋为0。
(3) 所赋初值行数少于数组行数。
当代表着给每行赋初值的大括号数少于数组的行数时。例如: int a[3][4]={{1,2},{4,5}}; 系统将自动给后面各行的元素赋初值0。
(4) 赋初值时省略大括号对。
给二维数组赋初值时也可以不用大括号对。例如: int a[3][4]={1,2,4,5};注意,此时所赋初值与情况(3)中所赋初值的结果完全不同。在这里是将a数组的第0行的4个元素依次赋值为1、2、4、5,即a[0][0]=1, a[0][1]=2, a[0][2]=4, a[0][3]=5,而数组中的其他元素的初值都为0。
(5) 通过赋初值定义二维数组的大小。
对于一维数组,可以在数组定义语句中省略中括号中的常量表达式,通过所赋初值的个数来确定数组的大小;对于二维数组,则只可以省略第一个中括号中的常量表达式,而不能省略第二个中括号中的常量表达式。例如: int a[][4]={{1,2,3,4},{5},{9}};上述语句中,a 数组的第一维的中括号中的常量表达式省略了,在所赋初值中,含有3个大括号对,则第一维的大小由所赋初值的行数来决定。因此,它等同于 int a[3][4]={{1,2,3,4},{5},{9}};如果用以下形式赋初值: int b[][3]={1,2,3,4,5,9}; 第一维的大小按以下规则确定:
(1) 当初值的个数能被第二维的常量表达式的值整除时,所得的商就是第一维的大小。
(2) 当初值的个数不能被第二维的常量表达式的值整除时,则第一维的大小为商 1。
因此,按照此规则,上述b数组第一维的大小应该是2,也就是以上语句等同于int b[2][3]={1,2,3,4,5,9};4. 二维数组应用举例
【例53】编程计算并输出9×9乘法表。
程序代码: #include
#define ROWS 9
#define COLUMNS 9
void main()
{int row, column, product[ROWS][COLUMNS];
int i,j;
printf(“MULTIPLICATIONTABLE \n\n”);
printf(“”);
for(j=1; j<=COLUMNS; j )
printf(“%4d”,j);/打印表头/
printf(“\n”);
printf(“————————————————–\n”);
for(i=0; i{ row=i 1;
printf(“%2d | “,row);
for(j=1; j<=COLUMNS; j )
{ column=j;
product[i][j]=rowcolumn;
printf(“%4d”,product[i][j]);
}
printf(“\n”);
}
} 程序运行结果如下: MULTIPLICATIONTABLE
123456789
————————————————–
1|123456789
2|24681012141618
3|369121518212427
4|4812162024283236
5|51015202530354045
6|61218243036424854
7|71421283542495663
8|81624324046566472
9|9 18273645546372815.1.3字符串与字符数组
C语言本身并没有设置一种类型来定义字符串变量,字符串的存储完全依赖于字符数组,但字符数组又不等同于字符串变量。
1. C语言对字符串的约定
在C语言中,字符串是借助字符型一维数组来存放的,并规定以字符’\0’作为字符串结束标志。’\0’是一个转义字符,称为“空值”,它的ASCII码值为0。’\0’作为标志也要占用存储空间,但不计入串的实际长度。
2. C语言对字符串常量的约定
虽然C语言中没有字符串数据类型,但允许使用字符串常量。字符串常量是由双引号括起来的一串字符,在表示字符串常量时,不需要人为在其末尾加入’\0’,C编译程序将自动在字符串的末尾加入字符’\0’。
3. C语言中字符串常量给出的是地址值
每一个字符串常量都分别占用内存中一片连续的存储空间,这片连续的存储空间实际上就是字符型一维数组。这个数组没有名字,C编译系统以字符串常量的形式给出存放每一字符串的存储空间首地址,不同的字符串具有不同的起始地址。也就是说,在C语言中,字符串常量被隐含处理成一个以’\0’结尾的无名字符型一维数组。
4. 字符数组与字符串的区别
字符串是字符数组的一种具体应用。字符数组的每个元素中可存放一个字符,但它并不限定最后一个字符应该是什么。而在C语言中,因为有关字符串的大量操作都与串结束标志’\0’有关,因此,在字符数组中的有效字符后加上’\0’,就可以把一维字符数组看作字符串变量。
注意: 仅可以在字符数组内存放字符串,不能通过赋值语句将字符串常量或其他字符数组中的字符串直接赋值给字符串变量。
【例54】 编程实现以下功能: 从终端输入一个字符串,将其复制到另一个字符数组中,并统计复制的字符个数。
程序代码: #include
#include
void main()
{
char string1[80],string2[80];
int i;
printf(“Enter a string \n”);
scanf(“%s”,string1);
for(i=0; string1[i] !=’\0′; i )
string2[i]=string1[i];
string2[i]=’\0′;
printf(“\n”);
printf(“%s\n”,string2);
printf(“Number of characters=%d\n”,i);
} 运行程序,在键盘上输入Appleissweet后按回车键,输出Number of characters=12【例55】编程输出大小写26个字母及其对应的ASCII码值。
程序代码: #include
void main()
{
char c;
int i=0;
printf(“\n\n”);
for(c=65; c<=122; c )
{
if(c>90&&c<97)
continue;
if(i%8==0) printf(“\n”);
{printf(“|%2c–%4d”,c,c);i ;}
}
printf (“|\n”);
}
运行程序,得到如下输出结果: |A–65|B–66|C–67|D–68|E–69|F–70|G–71
|H–72|I–73|J–74|K–75|L–76|M–77|N–78
|O–79|P–80|Q–81|R–82|S–83|T–84|U–85
|V–86|W–87|X–88|Y–89|Z–90|a–97|b–98
|c–99|d–100|e–101|f–102|g–103|h–104|i–105
|j–106|k–107|l–108|m–109|n–110|o–111|p–112
|q–113|r–114 |s–115|t–116|u–117|v–118|w–119
|x–120|y–121|z–122
5.2排序与查找算法〖*4/5〗5.2.1排序算法所谓排序,就是将一个任意顺序的数据元素序列重新排列成有序的序列。排序的算法有很多,对空间的要求及其时间效率也不尽相同。计算机程序设计中常用的排序方法有冒泡排序、选择排序、插入排序、快速排序、希尔排序、归并排序、基数排序等。其中,冒泡排序、选择排序、插入排序又被称作简单排序,它们对空间的要求不高,但是时间效率却不稳定;后面几种排序对空间的要求稍高一点,但时间效率能稳定在很高的水平。
1. 冒泡排序
冒泡排序算法基本思想是: 对两个相邻的数比较大小,较大的数下沉或较小的数上
评论
还没有评论。