C语言程序设计(2)

上传人:lc****zq 文档编号:57925340 上传时间:2018-10-25 格式:PPT 页数:30 大小:167.50KB
返回 下载 相关 举报
C语言程序设计(2)_第1页
第1页 / 共30页
C语言程序设计(2)_第2页
第2页 / 共30页
C语言程序设计(2)_第3页
第3页 / 共30页
C语言程序设计(2)_第4页
第4页 / 共30页
C语言程序设计(2)_第5页
第5页 / 共30页
点击查看更多>>
资源描述

《C语言程序设计(2)》由会员分享,可在线阅读,更多相关《C语言程序设计(2)(30页珍藏版)》请在金锄头文库上搜索。

1、沈洋 南京航空航天大学,1,C+语言程序设计,Lecture 5,沈洋 南京航空航天大学,2,第5章 数组,数组的概念 数组的声明和初始化 字符串和字符串数组 二维数组 一些例子,沈洋 南京航空航天大学,3,5.1 数组的概念,艺术类项目打分的例子: double scores1, scores2, scores3, scores4, scores5; 如何完成整个程序? 如果使用数组来完成则可减少大量输入 double scores5; 数组是一个由若干个同类型元素(存储单元)组成的集合。他们存放在一个连续的区域 数组中每个元素均属于同一类型。,沈洋 南京航空航天大学,4,数组的使用,数组的

2、使用过程: 定义、初始化、赋值和引用 数组的定义 类型 数组名常量表达式; 常量表达式说明数组中元素的数目的多少。 常量说明数组中元素的个数是确定的,不能改变。 数组的定义是用方括号 ,而不是用圆括号( ) 数组的下标从0开始,沈洋 南京航空航天大学,5,例,double scores5; 在内存中创建连续的5个double类型的数据项,标号从0开始; 发生了什么? scores0=2.7; scores2=9.5; scores1= scores0;,沈洋 南京航空航天大学,6,数组的初始化,我们在前面说过,已经声明的变量必须先赋值后使用,我们可以在定义的同时初始化 int sum = 0,

3、 i = 1; 数组在定义时也可以同时初始化 double scores5=0,0,0,0,0; 注意:这时表示集合,而非复合语句,故后应有分号”;” 全局数组的元素会被默认初始化为0,而局部变量必须显示初始化,沈洋 南京航空航天大学,7,初始化时的注意事项,部分初始化:数值的个数可少于数组元素个数,如: int a5=2,4; /ok,2,4分别赋给a0,a1 但 int a5=2,4, ; /错 在初始化时,可以省略数组的大小。如 int a =2,4,6,8,10; 系统会自动根据大括号内的数据数目决定数组的大小,省略数组的大小,只能在初始化时出现,否则将会出错。如: int b ; /

4、error,沈洋 南京航空航天大学,8,初始化数值的个数不能多于数组元素个数。如: int a5=2,4,6,8,10,12; /错,数组a有5个元素,而括号中的数值数目6个5。 部分初始化时,对于整型或实型数组,没有赋初值的元素的值默认为0。 但若没有初始化,元素的值是不确定的。,沈洋 南京航空航天大学,9,数组中的每个存储单元相当于一个简单变量,因此,数组中的每个元素都可以象简单变量一样使用。数组中每个元素均能直接访问,用数组的下标来识别数组的元素 数组名下标 下标是数组元素到数组开始的偏移量,可以是常量、变量、表达式、函数 注意访问数组时,下标从0开始计数,且不能越界 数组元素与变量一样

5、,在被使用前应有确定的值(即应先赋值),数组元素的引用,沈洋 南京航空航天大学,10,5.4 示例:打印元素,#include using namespace std; int main() int i; double scores5=0.5,1.5,2.5,3.5,4.5; for(i=0;i5;i+) coutscoresi“ “; return 0; ,沈洋 南京航空航天大学,11,练习5.1.3,写一个程序来提示用户输入7个值,将这些值存储到数组中,然后打印每一个值,最后打印它们的和 提示:你可能要写两个循环,一个用于收集数据,另一个用于求和.,沈洋 南京航空航天大学,12,例 用冒泡

6、法对n个数进行由小到大排序,算法思路: (1)对n个数,从左到右逐一将相邻两个数比较,将小的调到左边,大的调到右边,当逐一比较过一遍后(比较n-1次),最大的一个就移到最右边。 (2)再对左边n-1个数,重复进行上述的步骤,如此重复n-1次,实例:(假设6个数) 原始顺序8 3 7 5 9 2 3 8 7 5 9 2 3 7 8 5 9 2 3 7 5 8 9 2 3 7 5 8 9 2 第一趟:3 7 5 8 2 9 第二趟:3 5 7 2 8 9 第三趟:3 5 2 7 8 9 第四趟:3 2 5 7 8 9 第五趟:2 3 5 7 8 9,沈洋 南京航空航天大学,13,算法流程及程序,v

7、oid main( ) int i,j,temp,a11;/只要下标110 for (i=1;iai; for(j=1; jai+1) /交换 temp=ai; ai=ai+1; ai+1=temp; cout“the sorted numbers:n”; for(i=1; i11; i+) coutai“ “; ,执行,沈洋 南京航空航天大学,14,例 用插入法对n个数进行由小到大排序,做法:假设待排数据存放在数组a中,把a划分为两个子区间a0ai-1和aian-1,其中前一区间为有序区,后一区间为无序区。基本操作是:将当前无序区中的第一个数据ai插入到有序区的适当位置,使a0ai变为新的有

8、序区。,实例:(假设6个数) 原始顺序 8 3 7 5 9 2 3 8 7 5 9 2 3 7 8 5 9 2 3 5 7 8 9 2 3 5 7 8 9 2 2 3 5 7 8 9,沈洋 南京航空航天大学,15,程序,void main( ) int i, temp, k,a6=8,3,7,5,9,2; for( i =1; i=0 ,沈洋 南京航空航天大学,16,练习:用选择法对n个数进行由小到大排序,算法:假设待排数据存放在数组a中,把a划分为两个子区间a0ai-1和aian-1,其中前一区间为有序区,后一区间为无序区。基本操作是:第i趟在当前无序区中aian-1选择最小的数据amin,

9、 将amin与ai交换。重复n-1次。,实例:(假设7个数) 原始顺序 8 3 7 1 5 9 2 1 3 7 8 5 9 2 1 2 7 8 5 9 3 1 2 3 8 5 9 7 1 2 3 5 8 9 7 1 2 3 5 7 9 8 1 2 3 5 7 8 9,沈洋 南京航空航天大学,17,5.5 验证随机性,还记得rand0toN1吗? 在C+中产生随机数的原理 但这真的“随机”吗? 编写一个程序,验证rand0toN1的随机性 思路:如果测试次数足够大,那么0N-1之间每个数被取值的次数应当趋向于相等 需要用到什么原材料? 存放每个数被取值次数的数组,循环计数,当然,还有rand0t

10、oN1函数 操作步骤 请用自己的语言描述 C+代码表示,沈洋 南京航空航天大学,18,核心代码,srand(time(NULL); for(i=1 ;i(hitsi)/(n/10)endl;,有问题吗?,沈洋 南京航空航天大学,19,提示与练习,提示:练习5.2.2 符号常量 #define VALUES 5 注意:没有“ ;”,define是关键字,应小写,而符号常量习惯上全大写 作用:含义明确,便于维护 练习:5.2.3 改写main中的代码,让它使用一个循环,用户可运行任意次数的会话,直到输入0来终止。,沈洋 南京航空航天大学,20,5.6 字符串和字符串数组,我们已经使用过字符串常量,

11、如 cout“Input a Number and Press Enter:”; 但在一些情况下,需要将字符串存入变量中 M1: char * message=“what a good C+ am I.”; Or M2: char message= =“what a good C+ am I.”; 但两者的本质是不同的,建议使用第一种方式 如何不同? M1: message=“other message”; /ok M2: message=“other message”; /error 为什么? 数组在定义时即被分配了一块连续空间,且在其生命周期内不可变更,指针则不然。,沈洋 南京航空航天大学

12、,21,字符串数组,与声明整数数组的方法类似,只要记住“字符串”等于“char *” char * members4=“Sa”,”Al”,”Ge”,”Mar”; 引用时与引用整数数组类似 coutmembers0; 记住数组下标从0开始,引用时不需要“*”不妨理解为char *是一个不可分割的整体,沈洋 南京航空航天大学,22,5.75.9 发牌程序,如果需要模拟发牌的过程,应该怎么做呢? 为了简化问题,先假设同一张牌可被多次发出,即假设发一张牌后把它放回去,重新洗牌,然后再发下一张 这样的程序应该怎么设计呢? 体现随机性:rand0toN1() 将随机数映射到一张牌上 应当向rand0toN

13、1()传入多大的数值呢? 先随机取一花色,再随机取一该花色的牌,沈洋 南京航空航天大学,23,程序,void draw_a_card() int r,s; r=rand0toN1(13); s=rand0toN1(4); cout? 出现的问题:如何输出不同的花色及J,Q,K,A呢?,沈洋 南京航空航天大学,24,字符串数组,可使用字符串数组解决该问题 char * suits4=“红心”,”方块”,”黑桃”,”梅花”; char * ranks13=“A”,”2”,”3”,”4”,”5”,”6”,”7”,”8”,”9”,”10”,”J”,”Q”,”K”; 那么,输出时就可以 coutsuit

14、ssranksrendl; 还缺少什么? 在main()中加入一个循环,不断地发牌即可 让我们来完成它!,沈洋 南京航空航天大学,25,程序的背后,如果是我们发牌,我们会怎么做? 大概会先进行几次洗牌,然后从上往下发 那么,我们的程序是这么做的吗? 程序的发牌方式,是牌都是按固定顺序摆放的,然后随机抽出一张 预告:按我们习惯的方式改写发牌程序,将会是本周上机作业,沈洋 南京航空航天大学,26,改进的策略,使用两个随机数是不是让我们隐隐感到不安呢?发牌是一次完成,并不是先发花色再发大小 使用一个随机数不行吗?当然可以,也应该如此 int card = rand0toN1(52); r=card

15、% 13; s=card /13;,沈洋 南京航空航天大学,27,再次改进:避免重复发牌,要避免重发发牌需要处理哪些事情? 需要给已经发过的牌做上标记 需要动态改变向rand0toN1()传递的数值 在上一个版本中始终传52 这个数据的含义是什么? 剩余牌的数量 那么返回的随机数n含义又是什么呢? 剩余牌中的第n张牌 需要从未发出的牌中找出第n张 这似乎比想象中的要困难,沈洋 南京航空航天大学,28,找出第n张未发出的牌(是52张中的第几张),假设我们以一个数组来标记一张牌是否已经发过 card_drawnm=true表示第m张已经被发出 那么首先,我们要跳过已经发出的牌 while(card_drawni) i+; 然后开始循环计数 while(jn) i+; while(card_drawni)i+; j+; ,沈洋 南京航空航天大学,29,5.10 一些忠告,观察这样的例子 int m5; M5=10; 有问题吗? 是的,会导致莫名的错误 编译时会报错误或警告吗? 不会 因此,我们必须很小心地不让数组越界,沈洋 南京航空航天大学,30,5.11 二维矩阵简介,只需了解下面的应用方式 int m1010; int i,j; for(i=0;i10;i+) for(j=0;j10;j+) mij=97; 二维数组中元素被赋值的次序是怎样的呢?,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号