第6章数组11_第1页
第6章数组11_第2页
第6章数组11_第3页
第6章数组11_第4页
第6章数组11_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1、1第第6章章 数组数组C语言程序设计2摸底考试摸底考试l请编写程序,先从键盘输入请编写程序,先从键盘输入m和和n,再用双重循再用双重循环结构分别读入环结构分别读入m名学生名学生n门课的成绩(成绩门课的成绩(成绩为百分制整数),计算并输出每个学生的为百分制整数),计算并输出每个学生的n门门课程的总成绩和平均成绩。课程的总成绩和平均成绩。 C语言程序设计3数据结构的概念数据结构的概念l程序设计程序设计=计算机编程语言计算机编程语言+数据结构数据结构+算法。算法。l算法是算法是灵魂灵魂,数据结构是加工对象,语言是工具。,数据结构是加工对象,语言是工具。l选择合适的数据结构就是选择合适的数据类型来存放

2、选择合适的数据结构就是选择合适的数据类型来存放要处理的数据。要处理的数据。l对同一个问题的求解,可以采用不同的算法和数据结对同一个问题的求解,可以采用不同的算法和数据结构。构。l算法依赖于数据结构。不同的数据结构有不同的实现算法依赖于数据结构。不同的数据结构有不同的实现算法,其复杂程度也不相同。算法,其复杂程度也不相同。l选择合适的数据结构,可以降低算法的复杂程度。选择合适的数据结构,可以降低算法的复杂程度。l处理若干个相同类型的数据,就要用到构造类型。处理若干个相同类型的数据,就要用到构造类型。l构造类型:由简单的数据类型按照一定的规则构成的构造类型:由简单的数据类型按照一定的规则构成的数据

3、类型,如数组、结构、联合等。数据类型,如数组、结构、联合等。C语言程序设计4l本章任务:掌握用数组这种结构类型求大量数据的和、本章任务:掌握用数组这种结构类型求大量数据的和、平均值、最大最小值、排序等。平均值、最大最小值、排序等。l学习要点:学会定义数组以及数组中每个元素的表示学习要点:学会定义数组以及数组中每个元素的表示方式。方式。C语言程序设计56.1 一维数组的定义和引用一维数组的定义和引用l本段任务:做一个考试成绩处理系统。本段任务:做一个考试成绩处理系统。l提问:为什么需要数组?提问:为什么需要数组?l输入输入10个数,并输出这个数,并输出这10个数个数#include void m

4、ain() int a0,a1,a2,a3,a4,a5,a6,a7,a8,a9; scanf(%d %d %d %d %d %d %d %d %d %d, &a0,&a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8,&a9); printf(The datas are:n); printf(%d %d %d %d %d %d %d %d %d %d, a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);C语言程序设计6l例例6.1已知一个班已知一个班10名学生的程序设计基础(一)的名学生的程序

5、设计基础(一)的考试成绩,求平均成绩,输出所有考试成绩和平均成考试成绩,求平均成绩,输出所有考试成绩和平均成绩。绩。l为了保留原始数据,又不定义大量的简单变量,办法为了保留原始数据,又不定义大量的简单变量,办法就是定义数组。就是定义数组。l数组包括一维数组、二维数组、多维数组、字符数组。数组包括一维数组、二维数组、多维数组、字符数组。C语言程序设计7用数组知识解决用数组知识解决例例6.1l步骤:步骤: 定义数组,定义变量定义数组,定义变量Sum,Aver。 输入数组各个元素的值,循环使用输入数组各个元素的值,循环使用scanf()函数对函数对数组元素进行输入,同时累加。数组元素进行输入,同时累

6、加。 利用求出的总成绩计算平均成绩。利用求出的总成绩计算平均成绩。 输出所有的成绩和平均成绩。输出所有的成绩和平均成绩。l程序:程序:C语言程序设计8#include void main()float score10,sum,aver;int i;sum=0.0f;for(i=0;i10;i+)scanf(%f,&scorei);sum+=scorei;aver=sum/10;for(i=0;i10;i+)printf(%6.2f,scorei);printf(naverage=%6.2fn,aver);说明数组引用数组元素引用数组元素引用数组元素数组的下标从0开始C语言程序设计9l简

7、单类型变量只含有一个成员。简单类型变量只含有一个成员。l数组是由相同类型的变量,按照一定的次序组织起来数组是由相同类型的变量,按照一定的次序组织起来的数据类型。的数据类型。l说明格式:类型说明符说明格式:类型说明符 数组名数组名数组长度数组长度; 如:如:float score5; 数组名为数组名为score,它含有,它含有5个成员,每个成员的类型为个成员,每个成员的类型为单精度浮点型。单精度浮点型。l说明数组后系统会在内存中为其开辟一段连续的存储说明数组后系统会在内存中为其开辟一段连续的存储空间。空间。数组的概念数组的概念score0scorescore1 score2 score3 sco

8、re4地址地址 1000 1004 1008 1012 1016C语言程序设计10l类型说明符用来说明数组中各个数据元素的类型。在类型说明符用来说明数组中各个数据元素的类型。在任何一个数组中,数据元素的类型都是一致的。任何一个数组中,数据元素的类型都是一致的。l数组名的命名规则遵循标识符命名规则。数组名的命名规则遵循标识符命名规则。l数组名代表的不是一个数,而是一组数,或者代表一数组名代表的不是一个数,而是一组数,或者代表一组连续的内存单元。组连续的内存单元。l问题:若有数组问题:若有数组a8,数组名,数组名a代表什么?代表什么? &a1-&a0=? 数组名中存放的是一个地址常

9、量,它代表整个数组数组名中存放的是一个地址常量,它代表整个数组的首地址。其他元素的地址是通过首地址得到的。的首地址。其他元素的地址是通过首地址得到的。 注意:注意:a+; 是错误的是错误的 数组元素的地址数组元素的地址&a0 程序:程序: &a1-&a0=数组元素占用的字节数数组元素占用的字节数C语言程序设计11l数组中的每个成员称为数组元素,每个元素的引用方数组中的每个成员称为数组元素,每个元素的引用方法:法:数组名数组名下标下标。l数组元素是有顺序的,只不过数组下标从数组元素是有顺序的,只不过数组下标从0开始(开始(注注意!意!)。)。l如果定义如果定义5个元素,个

10、元素, float score5,是从第,是从第0个元素个元素至第至第4个元素,没有下标为个元素,没有下标为5的元素。如:的元素。如: score0, score1, score4。 注意:无注意:无score5。l数组的下标只能是非负整数。没有数组的下标只能是非负整数。没有a-2、a3.5这些元这些元素。素。l下标越界属于逻辑错误,系统并不检查。下标越界属于逻辑错误,系统并不检查。C语言程序设计12l数组长度可以是常量表达式,用方括号数组长度可以是常量表达式,用方括号 括起来。括起来。不能用圆括号不能用圆括号( )。l数组长度中不允许含变量。下面的用法是数组长度中不允许含变量。下面的用法是错

11、误错误的。的。 int n;int n;scanf(%d,&n);scanf(%d,&n); int xn; int xn;l下面的用法是正确的:下面的用法是正确的:#define SIZE 100int numSIZE; char textSIZE*2+1;C语言程序设计13l#define NUMCODES 4char gradesNUMCODES;l#define NUMELS 8double pricesNUMELS ;l#define SIZE 100char amountSIZE ;l问题:一个数组究竟要占用多少内存?问题:一个数组究竟要占用多少内存? 元素个数元素

12、个数*sizeof(数据类型数据类型)C语言程序设计14l引用:取出数组中的某一元素的值或将数存放到数组中的引用:取出数组中的某一元素的值或将数存放到数组中的指定位置。指定位置。lC语言规定,只能一个一个地引用数组元素,而不能一次引语言规定,只能一个一个地引用数组元素,而不能一次引用数组中的全部元素。用数组中的全部元素。一维数组元素的引用一维数组元素的引用C语言程序设计15l使用说明:使用说明: 如果要引用数组中的元素,这个数必须是已经定义如果要引用数组中的元素,这个数必须是已经定义过的,遵循过的,遵循先定义,后引用先定义,后引用的原则。的原则。 下标用一对方括号下标用一对方括号 括起来,它表

13、示要引用数组括起来,它表示要引用数组中的第几个元素。引用时,下标可以是常量表达式,中的第几个元素。引用时,下标可以是常量表达式,也可以是变量表达式。也可以是变量表达式。 如:如:a0=1; a1=1; a2=a0+a1; (ai=ai-1+ai-2;)C语言程序设计16特别强调特别强调:在运行在运行C语言程序过程中,系统并不自动语言程序过程中,系统并不自动检验数组元素的下标是否越界。因此在编写程序时,检验数组元素的下标是否越界。因此在编写程序时,保证数组下标不越界是十分重要的保证数组下标不越界是十分重要的。 一个数组元素,实质上就是一个数组元素,实质上就是1个变量,它具有和相个变量,它具有和相

14、同类型单个变量一样的属性,可以对它进行赋值和同类型单个变量一样的属性,可以对它进行赋值和参与各种运算。参与各种运算。 在在C语言中,数组作为一个整体不能参加数据运算,语言中,数组作为一个整体不能参加数据运算,只能对单个的元素进行处理。只能对单个的元素进行处理。C语言程序设计17一维数组的初始化一维数组的初始化l初始化格式:数据类型数据类型 数组名数组名常量表达式常量表达式初值表初值表;l使用说明:使用说明: 对数组的初始化操作只能在定义数组时进行,其中对数组的初始化操作只能在定义数组时进行,其中常量表达式表示数组元素的个数,大括号中的内容常量表达式表示数组元素的个数,大括号中的内容即为数组的初

15、值,各项用逗号隔开。即为数组的初值,各项用逗号隔开。 int a10=0,1,2,3,4,5,6,7,8,9; 注意:不能分成两句写注意:不能分成两句写 int a10; a10 =0,1,2,3,4,5,6,7,8,9;C语言程序设计18注意:注意: 初值的个数不应超过一维数组元素的个数,但可以初值的个数不应超过一维数组元素的个数,但可以少于一维数组元素的个数。少于一维数组元素的个数。 例:例:int a10=2,4,6,8,10; 在对全部数组元素赋初值时,数组长度说明可以缺在对全部数组元素赋初值时,数组长度说明可以缺省。例:省。例:int a =1,2,3,4,5; 相当于相当于int

16、a5=1,2,3,4,5; 可以只给部分数组元素赋初值。可以只给部分数组元素赋初值。 int a10=2,4,6; 注意:只能缺省最右边连续元素的初值。注意:只能缺省最右边连续元素的初值。 如果想将数组中的所有元素全部赋为如果想将数组中的所有元素全部赋为0时,时, int a10=0,0,0,0,0,0,0,0,0,0; 或或int a10=0; 但不能:但不能: int a10=0*10;C语言程序设计19例例6_2#include void main(void)int a4;printf(%dn,a0);printf(%dn,a1);printf(%dn,a2);printf(%dn,a3

17、);C语言程序设计21想一想:想一想:l已知整型数组已知整型数组a有有10个元素,要使个元素,要使a0=1,a3=5,a4=7,其余元素都等于,其余元素都等于0,共有几种,共有几种赋值方法。赋值方法。lint a10; a0=1; a1=0; a2=0; a3=5; a4=7; a5=0; a6=0; a7=0; a8=0; a9=0;lint a10=1,0,0,5,7,0,0,0,0,0;lint a10=1,0,0,5,7;C语言程序设计22l列出下列代码段显示的元素列出下列代码段显示的元素lfor(m=1;m =5 ; m+) printf(%d, am);lfor(k=1;k =5

18、; k=k+2) printf(%d, ak);lfor(j=3;j 10 ; j+) printf(%f, bj);C语言程序设计23例例6.2l输入一个班级输入一个班级10名学生的计算机成绩,求出总成绩、名学生的计算机成绩,求出总成绩、平均成绩、最高分和最低分。平均成绩、最高分和最低分。l步骤:步骤: 定义数组,定义变量定义数组,定义变量Sum,Aver。 输入数组各个元素的值,循环使用输入数组各个元素的值,循环使用scanf()函数对函数对数组元素进行输入,同时累加。数组元素进行输入,同时累加。 利用求出的总成绩计算平均成绩。利用求出的总成绩计算平均成绩。 考查数组中的每个元素,求出最大

19、、最小值。考查数组中的每个元素,求出最大、最小值。 输出所有的成绩和平均成绩,以及最大、最小值。输出所有的成绩和平均成绩,以及最大、最小值。C语言程序设计24试一试试一试l如果想在输入输出最高分、最低分分数的同时,输出如果想在输入输出最高分、最低分分数的同时,输出最高分学生的编号和最低分学生的编号,应该如何改最高分学生的编号和最低分学生的编号,应该如何改编程序?编程序?C语言程序设计256.1.2 数组的运算和数组作为函数参数数组的运算和数组作为函数参数l数组的运算:数组的输入、输出、赋值及基本运算。数组的运算:数组的输入、输出、赋值及基本运算。l数组的运算一般只能作用于基本类型的单个元素。数

20、组的运算一般只能作用于基本类型的单个元素。l输入、输出整个数组或对整个数组输出,则需使用循环语输入、输出整个数组或对整个数组输出,则需使用循环语句。句。C语言程序设计26l例例1:数组的输入输出。:数组的输入输出。 #define MAXGRADES 30int i;float xMAXGRADES ;for(i=0;i MAXGRADES;i+) scanf(%f,&xi); for(i=0;i MAXGRADES;i+) if (!(i%6) printf(n); printf(%8.2f,xi);printf(n);C语言程序设计27l例例2:数组赋值与数组拷贝:数组赋值与数组拷

21、贝#define SIZE 10int aSIZE,bSIZE,i;for(i=0;i SIZE;i+)ai=i+1;for(i=0;i SIZE;i+)bi=ai;注意:不能写成 b=a;C语言程序设计28l例例 N盏灯排成一排,从盏灯排成一排,从1到到N按顺序依次编号。有按顺序依次编号。有N个人也从个人也从1到到N依次编号。第一个人(依次编号。第一个人(1号)将灯全部号)将灯全部关闭。第二个人(关闭。第二个人(2号)将凡是号)将凡是2和和2的倍数的灯打开。的倍数的灯打开。第三个人将凡是第三个人将凡是3和和3的倍数的灯做相反处理(该灯如的倍数的灯做相反处理(该灯如为打开的,将它关闭;如为关闭

22、的,将它打开)。以为打开的,将它关闭;如为关闭的,将它打开)。以后的人都和后的人都和3号一样,将凡是与自己相同的灯和是自号一样,将凡是与自己相同的灯和是自己编号倍数的灯做相反处理。请问:当第己编号倍数的灯做相反处理。请问:当第N个人操作个人操作之后,哪几盏灯是点亮的。之后,哪几盏灯是点亮的。#include #define N 10void main(void) int lampN+1; int i,j,k; for(i=1;i=N;i+) /*将灯全部关闭将灯全部关闭*/ lampi=0; for(i=2;i=N;i=i+2) /*将凡是将凡是2和和2的倍数的灯打开的倍数的灯打开*/ lam

23、pi=1; for(j=3;j=N;j+) /*将将3和和3的倍数的灯做相反处理的倍数的灯做相反处理*/ for(i=j;i=N;i=i+j) lampi=!lampi; for(i=1;i=N;i+) if(lampi) printf(%2d, i);C语言程序设计30数组作为函数参数数组作为函数参数l数组元素作为函数参数:数组元素作为函数参数: 一维数组元素、多维数组元素均可做函数参数。一维数组元素、多维数组元素均可做函数参数。 用变量作实参同。用变量作实参同。 值调用:值调用:值传递值传递。 例例:#include void swap(int ,int);void main(void)i

24、nt a,b; a=100;b=200;printf(inicial:a=%d b=%dn,a,b);swap(a,b);printf(in main:a=%d b=%dn,a,b);void swap(int x,int y)int temp;temp=x;x=y;y=temp;printf(in swap:x=%d y=%dn,x,y);C语言程序设计32l下列程序的运行结果是(下列程序的运行结果是( )。)。#include void main() int z,y3=2,3,4; yy2=10; printf(%dn,z);A、10B、2C、3D、运行时出错,得不到值、运行时出错,得不到

25、值C语言程序设计33l下列程序段的运行结果是(下列程序段的运行结果是( )。)。#include void main() double z,y3=2,3,4; z=yy0; printf(%dn,z);A、 2B、 3C、 4D、有语法错,得不到值、有语法错,得不到值例例:C语言程序设计35l数组名作为函数参数:数组名作为函数参数: 实参:数组名。实参:数组名。 形参:数组名形参:数组名 ,数组元素的数目或下标。数组元素的数目或下标。 地址调用:传递数组的首地址。地址调用:传递数组的首地址。#include #define N 10void add(int ,int);void main(vo

26、id)int aN,i;for(i=0;iN;i+)ai=i;add(a,N);for(i=0;iN;i+)printf(%3d,ai);printf(n);void add(int x,int n) int i;for(i=0;in;i+) xi=xi+1; 声明函数原型函数调用(实参数组)函数定义(数组)C语言程序设计37注意:注意: 用数组名作函数参数,应该在主调函数和被调函数中用数组名作函数参数,应该在主调函数和被调函数中分别定义数组,不能只在一方定义。分别定义数组,不能只在一方定义。 实参数组和形参数组的类型应一致。实参数组和形参数组的类型应一致。 C编译系统对形参数组的大小不做检查

27、,形参数组可编译系统对形参数组的大小不做检查,形参数组可以不指定大小,在定义数组时在数组名后跟一个以不指定大小,在定义数组时在数组名后跟一个空的空的方括弧方括弧即可。有时为了在被调用函数中处理数组元素即可。有时为了在被调用函数中处理数组元素的需要,可以另设一个参数,传递所需要的数组元素的需要,可以另设一个参数,传递所需要的数组元素的个数。的个数。 用数组名做函数参数时,不是把数组元素的值传递给用数组名做函数参数时,不是把数组元素的值传递给形参,而是把实参数组的形参,而是把实参数组的首地址首地址传递给形参。形参数传递给形参。形参数组和实参数组共占同一段单元。在程序设计中可以利组和实参数组共占同一

28、段单元。在程序设计中可以利用这一特点改变实参数组元素的值(如排序)。用这一特点改变实参数组元素的值(如排序)。C语言程序设计38成绩排序成绩排序l排序方法:冒泡排序、排序方法:冒泡排序、shell排序、选择排序。排序、选择排序。l例例6.4:冒泡排序:冒泡排序升序升序l思想:思想: 每趟在待排序的数据中将相邻的两个数进行比较,每趟在待排序的数据中将相邻的两个数进行比较,将小数放在前面,将大数放在后面。共比较将小数放在前面,将大数放在后面。共比较n-1次。次。 n个数中最大的数就会排在最后一个。个数中最大的数就会排在最后一个。 第二轮在剩下的第二轮在剩下的n-1个数中继续进行,共比较个数中继续进

29、行,共比较n-2次。次。 N-1个数中最大的数就会排在倒数第二个。个数中最大的数就会排在倒数第二个。 如此进行,直到最后一轮。如此进行,直到最后一轮。l 9 2 4 1 8 6l程序程序C语言程序设计39#include #define N 10void sort(int ,int);void main(void)int aN,i;for(i=0;iN;i+)scanf(%d,&ai);sort(a,N);for(i=0;iN;i+)printf(%3d,ai);printf(n);C语言程序设计40void sort(int v ,int n) int i,j,temp;for(i=

30、0;in-1;i+) for(j=0;jvj+1) temp=vj; vj=vj+1; vj+1=temp; C语言程序设计41例例6.5 shell排序(快速排序)排序(快速排序)l思想:思想: 将将n个数的队列分成两段。个数的队列分成两段。 把后一段的每个元素分别与前一段间隔把后一段的每个元素分别与前一段间隔n/2处的元处的元素进行比较,如果后者大于前者,则交换。素进行比较,如果后者大于前者,则交换。 当后一段的所有元素都处理完后,则将比较间隔减当后一段的所有元素都处理完后,则将比较间隔减小一半,然后从距离第一个元素为当前间隔的那个小一半,然后从距离第一个元素为当前间隔的那个元素开始直到队

31、列最后一个元素重复上述的比较、元素开始直到队列最后一个元素重复上述的比较、交换过程;交换过程; 在每一轮比较、交换过程中,一旦发生交换,被交在每一轮比较、交换过程中,一旦发生交换,被交换到前面的那个值还要继续与前面距离为当前比较换到前面的那个值还要继续与前面距离为当前比较间隔的那些元素进行比较和交换,一直进行到比较间隔的那些元素进行比较和交换,一直进行到比较中位于前面的那个元素距离队列的第一个元素小于中位于前面的那个元素距离队列的第一个元素小于当前比较间隔为止。当前比较间隔为止。 当间隔减小到当间隔减小到0时算法结束。时算法结束。C语言程序设计42 72 73 71 23 94 16 5 68

32、(1) gap=4 (2) gap=2 (3) gap=1 7316 571 5727194717268732371687268717394C语言程序设计43例例6.6用选择法对用选择法对10个整数排序(升序)个整数排序(升序)l思路思路: 将将a0与与a1-a9比较,若比较,若a0比比a1-a9都小,都小,则不进行交换。若则不进行交换。若a1-a9中有一个以上比中有一个以上比a0小,则将其中最小的与小,则将其中最小的与a0交换,此时交换,此时a0中中存放了这存放了这10个数中最小的数。个数中最小的数。 第二轮,将第二轮,将a1与与a2-a9比较,将剩下比较,将剩下9个数个数中的最小者中的最小

33、者ai与与a1交换。交换。 依此类推,共进行依此类推,共进行9轮比较,最后轮比较,最后a0-a9已已按顺序存放。按顺序存放。C语言程序设计45void output(int s ,int n) int i; for(i=0;in;i+) printf(%5d,si);C语言程序设计46void sort(int s ,int n) int i,j,min,temp; for(i=0;in;i+) min=i; for(j=i+1;jsj) min=j; if(i!=min) temp=si; si=smin; smin=temp; C语言程序设计47数据查找数据查找l数据查找:数据查找: 线性

34、查找。线性查找。 二分查找。二分查找。l线性查找:顺序查找线性查找:顺序查找#define TRUE 1#define FALSE 0int linesearch(int list,int size,int key)int index,found,i; index=-1;found=FLASE;i=0;while(isize&!found) if(listi=key) found=TRUE; index=i; i+;return index;C语言程序设计49l例例6.7 二分查找函数二分查找函数 思想:思想:l按折半的方法在一个有序数组中查找一个给定按折半的方法在一个有序数组中查找一

35、个给定值的元素。如果找到,则返回元素的位置,否值的元素。如果找到,则返回元素的位置,否则返回则返回-1。ltop=0,bottom=n-1,mid=(top+bottom)/2l首先将首先将x与位于数组中间那个元素与位于数组中间那个元素vmid进行比进行比较,如果较,如果x小于小于vmid,则在数组的前一半元素,则在数组的前一半元素中查找。否则,在数组的后一半元素中查找。中查找。否则,在数组的后一半元素中查找。l无论往前还是往后,下一步要与无论往前还是往后,下一步要与x比较的是位于比较的是位于所选的那一半中间的那个元素。所选的那一半中间的那个元素。l该过程一直进行到所有元素都已被检查为止。该过

36、程一直进行到所有元素都已被检查为止。 调用方式:调用方式:C语言程序设计50成绩的插入和删除成绩的插入和删除l数据查找数据查找l例例6.8假设成绩已经输入,并按照从大到小的顺序排假设成绩已经输入,并按照从大到小的顺序排列好。现在发现有某个成绩被重复输入,需要把该成列好。现在发现有某个成绩被重复输入,需要把该成绩删除,使剩下的所有成绩依然有序。绩删除,使剩下的所有成绩依然有序。l步骤:步骤: 查找待删除数据的位置。查找待删除数据的位置。 移动部分元素。移动部分元素。 从被删除位置的后一个元素开始到最后一个元素都从被删除位置的后一个元素开始到最后一个元素都向前移动一个位置。向前移动一个位置。l程序

37、:程序:C语言程序设计51l问题:问题: 元素是否可以从最后一个元素开始向前移动,最后元素是否可以从最后一个元素开始向前移动,最后再移动删除位置后的那个元素?再移动删除位置后的那个元素? 如果要求将错误的成绩更正,如何修改程序?如果要求将错误的成绩更正,如何修改程序?C语言程序设计52l例例6.9假设成绩已经输入,并按照从大到小的顺序排假设成绩已经输入,并按照从大到小的顺序排列好。现在发现有某个成绩被遗漏,需要插入,并使列好。现在发现有某个成绩被遗漏,需要插入,并使插入后的所有成绩依然有序。插入后的所有成绩依然有序。l步骤:步骤: 查找待插入数据的位置。查找待插入数据的位置。 移动部分元素,先

38、移动最后一个元素,最后移动待移动部分元素,先移动最后一个元素,最后移动待插入位置元素。插入位置元素。l注意:注意: 数组元素的个数要足够。数组元素的个数要足够。l程序程序C语言程序设计53例例6.10用筛法求用筛法求100以内的素数。以内的素数。l基本思想:判断基本思想:判断100以内的每个数,找出一个非素数以内的每个数,找出一个非素数则把它去除,最后剩下的全是素数。则把它去除,最后剩下的全是素数。l具体做法为:具体做法为: 先去除先去除1。 用用2、3、4、100作为除数,去除该除数以后作为除数,去除该除数以后的各数,把该除数的倍数标注为的各数,把该除数的倍数标注为0,表示此数已从,表示此数

39、已从数组中被去除。数组中被去除。 循环结束后,数组中保留的即为循环结束后,数组中保留的即为100以内的素数。以内的素数。C语言程序设计54C语言程序设计55void getprime(int pm ,int n)int i,j;for(i=2;isqrt(n);i+) for(j=i+1;j=n;j+) if(pmi!=0&pmj!=0) if(pmj%pmi=0) pmj=0; C语言程序设计56void output(int pm ,int n) int i,j=0; for(i=2;i=n;i+) if(pmi!=0) printf(%5d,pmi); j+; if(j%10=0

40、) printf(n); C语言程序设计57练习:练习:l编程求某年第编程求某年第n天的日期。天的日期。l思想:思想: 将每月的天数存放于数组中。将每月的天数存放于数组中。 当当n足够大(大于足够大(大于31)时用)时用n减去减去1月的天数,如果月的天数,如果其差又大于其差又大于2月的天数,则再减去月的天数,则再减去2月的天数,如此月的天数,如此循环下去,直到循环结束求得所求日期。循环下去,直到循环结束求得所求日期。C语言程序设计58#include int leap(int);void dayofyear(int ,int,int);void main(void)int day_tab12= 31,28,31,30,31,30,31,31,30,31,30,31;int year,day;printf(请输入年份请输入年份:);scanf(%d,&year);printf(请输入天数请输入天数:);scanf(%d,&day);dayofyear(day_tab,year,day);C语言程序设计59int leap(int y)if(y%4=0&y%100!=0|y%400=0)return 1;elsereturn 0;C语言程序设计60void dayofyear(int tab ,int y,int d) int i,j=0,t=

温馨提示

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

评论

0/150

提交评论