《C语言程序设计项目教程》-项目六 技能大赛评分_第1页
《C语言程序设计项目教程》-项目六 技能大赛评分_第2页
《C语言程序设计项目教程》-项目六 技能大赛评分_第3页
《C语言程序设计项目教程》-项目六 技能大赛评分_第4页
《C语言程序设计项目教程》-项目六 技能大赛评分_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

项目六技能大赛评分任务6.1一维数组任务6.2二维数组任务6.3排序方法返回任务6.1一维数组【实例6.1】定义一个数组a[10],给数组赋值0~9,并输出数组的值。#include<stdio.h>main(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;//给数组赋值printf("数组中各元素的值为:\n");for(i=9;i>=0;i--)下一页返回任务6.1一维数组printf("a[%d]=%-2d",i,a[i]);//打印数组值printf("\n");system("pause");}实例6.1的运行结果如图6-3所示。【实例6.2】用数组来处理求fibonacci数列问题。#include<stdio.h>main(){inti;intf[20]={1,1};//数组赋初值上一页下一页返回任务6.1一维数组for(i=2;i<20;i++)f[i]=f[i-1]+f[i-2];//每项值等于前两项值得和for(i=0;i<20;i++){if(i%5==0)//每行输入5个值printf("\n");printf("%8d",f[i]);}system("pause");}(1)运行结果。实例6.2的运行结果如图6-4所示。上一页下一页返回任务6.1一维数组(2)知识链接。①一维数组定义的一般形式:类型说明符数组名[常量表达式];例如:“inta[10];”表示:数组名为a,此数组有10个元素,每一个元素均为整型。②数组名的命名规则和变量名相同,遵循标识符命名规则——以字母或下划线开始,后面可以跟若干个字母、数字或下划线。③数组名后是用方括号括起来的常量表达式,不能用圆括号,下面的用法是错误的:inta(10)。上一页下一页返回任务6.1一维数组④常量表达式表示元素的个数,即数组长度。例如,在a[10]中,10表示a数组有10个元素,下标从0开始,这10个元素是a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]。需要注意的是,不能使用数组元素a[10],该元素并不存在。⑤常量表达式可以包括常量和符号常量,但不能包含变量。也就是说,C语言不允许对数组的大小作动态定义。例如,像下面这样定义数组是不行的:intn;scanf("%d",&n);inta[n];上一页下一页返回任务6.1一维数组⑥数组必须先定义,然后使用。C语言规定只能逐个引用数组元素而不能一次引用整个数组。数组元素的表示形式为:数组名[下标]下标可以是整型常量或整型表达式,例如“a[0]=a[3]-a[3*3]”是正确的表示方法。⑦数组初始化是指对数组中的元素赋初值,可以采用以下几种方式进行初始化:a.定义数组时对数组元素赋以初值。例如:inta[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。上一页下一页返回任务6.1一维数组b.可以只给一部分元素赋值。例如:inta[10]={0,1,2,3,4};定义a数组有10个元素,但花括号内只提供5个初值,这表示只给前面5个元素赋初值,后5个元素值为0。c.给全部数组元素赋初值时,可以不指定数组长度。例如:inta[]={1,2,3,4,5};花括号中有5个数,系统会据此自动定义a数组的长度为5。若定义的数组长度与初值的个数不相同,则数组长度不能省略。上一页返回任务6.2二维数组【实例6.3】二维数组的赋值和输出。#include<stdio.h>main(){inti,j,a[3][3];printf("请输入9个数:");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);//二维数组赋值printf("您输入的矩阵是:\n");for(i=0;i<3;i++)下一页返回任务6.2二维数组{for(j=0;j<3;j++)printf("%4d",a[i][j]);//打印二维数组值printf("\n");}system("pause");}实例6.3的运行结果如图6-5所示。上一页下一页返回任务6.2二维数组【实例6.4】输入一个矩阵,输出它的转置矩阵。#include<stdio.h>main(){inti,j,a[3][3],b[3][3];printf("请输入9个数:");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);//键盘输入值放入二维数组中printf("转置之前的矩阵是:\n");for(i=0;i<3;i++){上一页下一页返回任务6.2二维数组for(j=0;j<3;j++)printf("%4d",a[i][j]);//打印二维数组值printf("\n");}for(i=0;i<3;i++)for(j=0;j<3;j++)b[j][i]=a[i][j];//数组转置printf("转置之后的矩阵是:\n");for(i=0;i<3;i++){上一页下一页返回任务6.2二维数组for(j=0;j<3;j++)printf("%4d",b[i][j]);//打印转置后的二维数组printf("\n");}system("pause");}(1)运行结果。实例6.4的运行结果如图6-6所示。上一页下一页返回任务6.2二维数组(2)知识链接。①二维数组定义的一般形式:类型说明符数组名[常量表达式][常量表达式];二维数组可以看作一种特殊的一维数组。例如:floata[3][4];可以把a看作一个一维数组,它有3个元素:a[0]、a[1]、a[2],每个元素又是一个包含4个元素的一维数组。C语言中,二维数组中元素排列的顺序是按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。例如a[0][0],a[0][1],a[0][2],a[0][3],a[1][0],a[1][1],a[1][2],a[1][3],a[2][0],a[2][1],a[2][2],a[2][3]上一页下一页返回任务6.2二维数组②二维数组元素的引用形式:数组名[下标][下标];例如,引用第三行第四列元素为a[2][3]。数组下标可以是整型表达式,如a[2-1][2*2-1],不能写成a[2,3],a[2-1,2*2-1]的形式,使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。常出现的错误是inta[3][4];a[3][4]=3;定义a为3×4的数组,它可用的行下标值最大为2,列下标值最大为3,a[3][4]超过了数组的范围。③同一维数组类似,二维数组通常也会进行初始化操作,可以采用以下几种方式进行初始化。a.分行给二维数组赋初值,如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};上一页下一页返回任务6.2二维数组b.可以将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值,如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};c.可以对部分元素赋初值,如:inta[3][4]={{1},{5},{9}};它的作用是只对各行第1列的元素赋初值,其余元素值自动为0。赋初值后数组各元素为:100050009000也可以对各行中的某一元素赋初值,如:inta[3][4]={{1},{0,6},{0,0,11}};上一页返回任务6.3排序方法排序是程序设计中经常使用的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。排序分为内部排序和外部排序。如果整个排序过程不需要访问外存便能完成,则称此类排序为内部排序,反之,如果参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。本书涉及的排序均为内部排序。在待排序的记录序列中,如果存在具有相同关键字的记录,经过排序后,这些记录的相对次序保持不变,即在原序列中,Ri=Rk,且Ri在Rk

之前,使用某种排序算法对关键字排序,在排序后的序列中,若Ri仍然在Rk

之前,则称这种排序算法是稳定的,否则是不稳定的。下一页返回任务6.3排序方法排序方法可以分为以下几类。基于“交换”思想的算法有冒泡排序和快速排序;基于“选择”思想的算法有简单选择排序和堆排序;基于“插入”思想的算法有直接插入排序、二分插入排序和shell排序;基于“归并”思想的算法有2路归并排序等。【实例6.5】用冒泡排序法对8个数56,4567,76,38,12,37,25排序。#include<stdio.h>main(){inti,a[9],j,k,t;printf("请输入8个数:");for(k=1;k<=8;k++)上一页下一页返回任务6.3排序方法scanf("%d",&a[k]);//键盘输入8个值放入数组中printf("排序前数组的值:\n");for(k=1;k<=8;k++)printf("%5d",a[k]);//打印排序前数组printf("\n排序过程为:\n");for(i=1;i<=7;i++)//控制排序趟数{for(j=1;j<=8-i;j++)//控制每趟的比较次数if(a[j]>a[j+1])//前数大于后数,则交换{t=a[j];a[j]=a[j+1];上一页下一页返回任务6.3排序方法a[j+1]=t;}sleep(1000);//屏幕暂停1000msprintf("第%d趟:",i);for(k=1;k<=8;k++)printf("%5d",a[k]);//打印排序后数组printf("\n");}system("pause");}(1)运行结果。实例6.5的运行结果如图6-7所示。上一页下一页返回任务6.3排序方法(2)知识链接。①冒泡排序算法思想:假设有N个待排序的关键字,共需比较N-1趟,在每一趟中,依次比较相邻的两个数,将小数放到前面,大数放到后面。②排序过程:第一趟排序中,首先比较第1个数和第2个数,将小数放前,大数放后,然后比较第2个数和第3个数,将小数放前,大数放后,……,如此继续,直至比较最后两个数,将小数放前,大数放后,至此第一趟排序结束,将最大的数放到了最后。在第二趟排序中,仍从第一对数开始比较,将小数放前,大数放后,一直比较到倒数第二个数(经过第一趟的比较,倒数第一的位置上已经是最大的数),第二趟排序结束,在倒数第二的位置上得到一个新的最大数(在第二趟排序中是最大的数,在整个序列中是第二大的数)……,依次继续,重复以上排序过程,直到排序N-1趟,算法结束。上一页下一页返回任务6.3排序方法按照上述排序过程,实例6.5中对{56,4567,76,38,12,37,25}8个数进行排序,共需要排序7趟,每一趟的排序结果如下:第一趟:4556673812372576第二趟:4556381237256776第三趟:4538123725566776第四趟:3812372545566776第五趟:1237253845566776第六趟:1225373845566776第七趟:1225373845566776③冒泡排序是稳定的排序算法。上一页下一页返回任务6.3排序方法【实例6.6】用简单选择排序法对8个数56,4567,76,38,12,37,25排序。#include<stdio.h>main(){inti,a[9],j,k,t;printf("请输入8个数:");for(t=1;t<=8;t++)scanf("%d",&a[t]);//键盘输入8个值放入数组中printf("排序前数组的值:\n");for(t=1;t<=8;t++)上一页下一页返回任务6.3排序方法printf("%4d",a[t]);//打印排序前数组printf("\n排序过程:\n");for(i=1;i<=7;i++)//控制排序趟数{k=i;//k指向最小值得位置for(j=i+1;j<=8;j++)//控制每趟的比较次数if(a[k]>a[j])k=j;//k指向新的最小值位置if(k!=i)//如果最小值位置不等于恰当位置,则交换{t=a[i];上一页下一页返回任务6.3排序方法a[i]=a[k];a[k]=t;}sleep(1000);printf("第%d趟:",i);for(t=1;t<=8;t++)printf("%4d",a[t]);//打印排序后的数组printf("\n");}system("pause");}上一页下一页返回任务6.3排序方法(1)运行结果。实例6.6的运行结果如图6-8所示。(2)知识链接。①简单选择排序算法的思想:假设有N个待排序的关键字,共需比较N-1趟,每一趟排序,在剩余关键字中选择最小的关键字放到恰当的位置上。②排序过程:在第一趟排序中,从第1个关键字开始,依次比较相邻的两个关键字,一直比到最后一个关键字,找出最小的一个关键字与第1个关键字交换位置,至此完成了第一趟排序,将最小的值放到了第一个位置。在第二趟排序中,从第2个关键字开始,依次比较相邻的两个关键字,一直比到最后一个关键字,找出最小的一个关键字与第2个关键字交换位置,至此完成了第二趟排序,将最小的关键字(在整个序列中是第2小的关键字)放到了第二个位置。上一页下一页返回任务6.3排序方法依次继续,重复以上排序过程,直到排序N-1趟,算法结束。按照上述排序过程,实例6.6中对{56,4567,76,38,12,37,25}这8个数进行排序,共需要排序7趟,每一趟的排序结果如下:第一趟:1245677638563725第二趟:1225677638563745第三趟:1225377638566745第四趟:1225373876566745第五趟:1225373845566776第六趟:1225373845566776第七趟:1225373845566776③简单选择排序是不稳定的排序算法。上一页下一页返回任务6.3排序方法【实例6.7】用直接插入排序法对8个数56,4567,76,38,12,37,25排序。#include<stdio.h>main(){inti,a[9],j,k,t;printf("请输入8个数:");for(k=1;k<=8;k++)scanf("%d",&a[k]);//键盘输入8个值放入数组中printf("排序前数组的值:\n");for(k=1;k<=8;k++)上一页下一页返回任务6.3排序方法printf("%5d",a[k]);//打印排序前数组printf("\n排序过程为:\n");for(i=2;i<=8;i++)//控制排序趟数{a[0]=a[i];//将待排序关键字复制到a[0]中j=i-1;//用j指向待比较位置while(a[0]<a[j])//当待排关键字小于j指向的关键字时{a[j+1]=a[j];//将j指向的关键字后移一位j=j-1;//j指向前一个关键字上一页下一页返回任务6.3排序方法}a[j+1]=a[0];//将待排关键字放入j+1的位置上sleep(1000);printf("第%d趟:",i-1);for(k=1;k<=8;k++)printf("%

温馨提示

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

评论

0/150

提交评论