C程序设计-数组课件_第1页
C程序设计-数组课件_第2页
C程序设计-数组课件_第3页
C程序设计-数组课件_第4页
C程序设计-数组课件_第5页
已阅读5页,还剩201页未读 继续免费阅读

下载本文档

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

文档简介

数组

数组本章主要内容

1.数组基本概念

2.一维数组及应用

3.二维数组及应用

4.字符数组和字符串本章主要内容1.数组基本概念5.1数组的概念C语言中定义普通变量就是按变量的数据类型找到相应大小的存储空间例如:

inta1,a2;floata3;chara4a1a2整型变量占两个字节5.1数组的概念C语言中定义普通变量就是按变量

inta1,a2;floata3;chara4a1a2a3实型变量占四个字节C语言中定义普通变量就是按变量的数据类型找到相应大小的存储空间例如:5.1数组的概念inta1,a2;a1a5.1数组的概念

inta1,a2;floata3;chara4a1a2a3a4C语言中定义普通变量就是按变量的数据类型找到相应大小的存储空间例如:字符型变量占1个字节5.1数组的概念int5.1数组的概念C语言中定义数组就是按数组数据类型及元素个数找到相应大小的一组连续的存储空间。例如:

inta[4]a[0]=2a[3]=5a[2]=3a定义了0~3共4个元素占8个字节[0][1][2][3]5.1数组的概念C语言中定义数组就是按数组数据5.1数组的概念

inta[4]a[0]=2a[3]=5a[2]=3a2C语言中定义数组就是按数组数据类型及元素个数找到相应大小的一组连续的存储空间。例如:5.1数组的概念int5.1数组的概念

inta[4]a[0]=2a[3]=5a[2]=3aC语言中定义数组就是按数组数据类型及元素个数找到相应大小的一组连续的存储空间。例如:525.1数组的概念int5.1数组的概念

inta[4]a[0]=2a[3]=5a[2]=3aC语言中定义数组就是按数组数据类型及元素个数找到相应大小的一组连续的存储空间。例如:5235.1数组的概念int5.1数组的概念1、数组是内存中的一块连续的存储区域,该区域由若干个数据成员组成;2、每一个数据成员称为一个数组元素,有统一的名字(即数组名),用元素在数组中的序号(称为下标)来标识;3、数组可以是一维的,也可以是多维的,不管一维还是多维,各元素在内存中都是连续存放的;4、数组的每一维下标必须用方括号括起来;5.1数组的概念1、数组是内存中的一块连续的存储区域,该区5.1数组的概念5、一维数组是指只有一个下标的数组,定义一个数组必须说明数组类型、名称、下标维数及每维下标最多元素个数。例如:inta[6]5.1数组的概念5、一维数组是指只有一个下标的数组,定义一5.1数组的概念5、一维数组是指只有一个下标的数组,定义一个数组必须说明数组类型、名称、下标维数及每维下标最多元素个数。例如:inta[6]数组的类型,决定数组每个元素所占的存储区域大小5.1数组的概念5、一维数组是指只有一个下标的数组,定义一5.1数组的概念5、一维数组是指只有一个下标的数组,定义一个数组必须说明数组类型、名称、下标维数及每维下标最多元素个数。例如:inta[6]数组的名称,是程序中引用数组元素的依据之一5.1数组的概念5、一维数组是指只有一个下标的数组,定义一5.1数组的概念5、一维数组是指只有一个下标的数组,定义一个数组必须说明数组类型、名称、下标维数及每维下标最多元素个数。例如:inta[6]数组的维说明,决定数组由几维组成,本例为一维数组,只有一个下标5.1数组的概念5、一维数组是指只有一个下标的数组,定义一5、一维数组是指只有一个下标的数组,定义一个数组必须说明数组类型、名称、下标维数及每维下标最多元素个数。例如:inta[6]数组的元素个数,本例共定义6个元素,下标从[0]~[5]

5.1数组的概念假设数组元素a[3]在内存中的地址为3100,那a[0]的地址?a[5]呢?5、一维数组是指只有一个下标的数组,定义一个数组必须说明数组6、二维数组是指有两个下标的数组,二维数组在逻辑上表现为二维表格,是若干个一维数组的集合。例如:5.1数组的概念inta[2][3]定义了一个整型二维数组,逻辑上由两行三列共6个元素组成。元素分别为:

a[0][0]、a[0][1]、a[0][2]

a[1][0]、a[1][1]、a[1][2]6、二维数组是指有两个下标的数组,二维数组在逻辑上表现为二维6、二维数组是指有两个下标的数组,二维数组在逻辑上表现为二维表格,是若干个一维数组的集合。例如:5.1数组的概念inta[2][3]a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a[0]a[1]假设定义数组floata[5][6],已知a[1][1]在内存中的地址为3100,那a[2][2]的地址?a[4][5]呢?6、二维数组是指有两个下标的数组,二维数组在逻辑上表现为二维7、字符数组是用于存放字符的数组,每个元素可以存放一个字符,主要用于处理字符串。例如:5.1数组的概念chara[10]定义了一个字符型一维数组,最多可以存放10个字符。chara[10][10]定义了一个字符型二维数组,最多可以存放100个字符;一般用于存放长度不超过10个字符的字符串。7、字符数组是用于存放字符的数组,每个元素可以存放一个字符,5.2一维数组及应用5.2.1一维数组的定义(P133)与初始化(P136)5.2.2一维数组的引用与遍历所谓遍历,是指对数组中的所有元素扫描一遍,对于一维数组,通常用单层循环完成。例如:

1.遍历赋值——为每个元素赋值for(i=0;i<N;i++){printf("请输入第%d个元素的值:",i);scanf("%d",&a[i]);}5.2一维数组及应用5.2.1一维数组的定义(P133)5.2一维数组及应用5.2.2一维数组的引用与遍历2.遍历输出——输出每个元素的值printf("数组各元素的值为:");for(i=0;i<N;i++)printf("%5d",a[i]);5.2一维数组及应用5.2.2一维数组的引用与遍历pri5.2一维数组及应用5.2.3一维数组应用举例

利用数组编程的一般步骤为:(1)定义数组;(2)为数组各元素赋值;(3)遍历数组各元素,按要求处理;(4)输出处理结果。5.2一维数组及应用5.2.3一维数组应用举例5.2一维数组及应用5.2.3一维数组应用举例1.从键盘输入10个学生成绩,求平均分并统计高于平均分的人数(1)定义有10个元素的数组,求平均分就需要累加,所以还需要一个累加器,要统计人数还需要一个计数器,要循环遍历数组各元素还需要循环变量;(2)通过遍历为数组各元素赋值(3)累加各数组元素值,需要遍历各数组元素(4)求出平均分后还要统计高于平均分的人数,需要拿每个元素和平均分进行比较,所以还需要遍历各数组元素5.2一维数组及应用5.2.3一维数组应用举例(1)定义5.2一维数组及应用5.2.3一维数组应用举例1.从键盘输入10个学生成绩,求平均分并统计高于平均分的人数(5)输出处理结果。5.2一维数组及应用5.2.3一维数组应用举例(5)输出5.2.3一维数组应用举例2.随机产生10个两位整数放入一维数组,再将各数组元素按逆序存放,如a[0]与a[9]对换,a[1]与a[8]对换……;3.随机产生10个两位整数放入一维数组,找出其中最大值及其位置;5.2一维数组及应用5.2.3一维数组应用举例3.随机产生10个两位整数5.2一维数组及应用main(){inta[10],max,k,i,j;printf("原数据为:");for(i=0;i<10;i++){a[i]=rand()%90+10;printf("%5d",a[i]);}k=0;for(i=1;i<10;i++)if(a[k]<a[i])k=i;printf("\n最大值%d,在第%d位!",a[k],k);}5.2一维数组及应用main()5.2.3一维数组应用举例4.对8个数按降序排序——比较交换法5.2一维数组及应用第1趟:假设a[0]元素最大,将其和后面a[1]-a[7]各元素值进行比较,如果有比它更大的数,则交换。代码段如下:for(j=1;i<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}5.2.3一维数组应用举例5.2一维数组及应用第1趟:假5.2一维数组及应用7192935950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]1j5.2一维数组及应用7192935950277941代码段5.2一维数组及应用7192935950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]1j5.2一维数组及应用7192935950277941代码段5.2一维数组及应用7192935950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]条件成立!交换!1j5.2一维数组及应用7192935950277941代码段5.2一维数组及应用9271935950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]1j5.2一维数组及应用9271935950277941代码段5.2一维数组及应用9271935950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]2j5.2一维数组及应用9271935950277941代码段5.2一维数组及应用9271935950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]2j条件成立!交换!5.2一维数组及应用9271935950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]2j5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]3j5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]3j条件不成立!5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]4j5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]4j条件不成立!5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]5j5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]5j条件不成立!5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]6j5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[i]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]6j条件不成立!5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]7j5.2一维数组及应用9371925950277941代码段5.2一维数组及应用9371925950277941代码段如下:for(j=1;j<8;j++)if(a[0]<a[j]){t=a[0];a[0]=a[j];a[j]=t;}a[0]a[j]7j条件不成立!第一趟比较结束后,最大值被放在了a[0]位置。5.2一维数组及应用9371925950277941代码段5.2一维数组及应用

第2趟是将a[0]排除在外,设a[1]是剩下的数中最大的,与后面a[2]-a[7]比较。

第3趟是将a[0]、a[1]排除在外,设a[2]是剩下的数中最大的,与后面a[3]-a[7]比较。

……

第7趟是将a[0]~a[5]排除在外,设a[6]是剩下的数中最大的,与后面的a[7]-a[7]比较。完成排序。

以此类推,若要对N个数排序,要处理的趟数是N-1。由此增加一个外循环控制趟数:

for(i=0;i<n-1;i++)

完整的比较交换法排序核心程序段为:

for(i=0;i<n-1;i++)

for(j=i+1;j<n;j++)if(a[i]<a[j])交换两个元素值

5.2一维数组及应用第2趟是将a[0]排除在外,设5.2.3一维数组应用举例4.对8个数按降序排序——选择法

与比较交换法类似,只是每次比较后不马上交换,而是只记录极值位置,一趟比较完成后再和假想的极值交换,极大地提高了排序效率。5.2一维数组及应用main(){inta[8],i,j,k,t;printf("排序前数据为:");for(i=0;i<8;i++){a[i]=rand()%90+10;printf("%5d",a[i]);}for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}printf("\n排序后数据为:");for(i=0;i<8;i++)printf("%5d",a[i]);}5.2.3一维数组应用举例5.2一维数组及应用main(5.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941i5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ki5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941kij5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj因为条件不成立,所以K位置不变5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj因为条件不成立,所以K位置不变5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj因为条件不成立,所以K位置不变5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj因为条件不成立,所以K位置不变5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj因为条件不成立,所以K位置不变5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

7192935950277941ikj交换a[i]、a[k]两元素的值5.2一维数组及应用for(i=0;i<7;i++)7195.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

9392715950277941ikj交换a[i]、a[k]两元素的值5.2一维数组及应用for(i=0;i<7;i++)9395.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

9392715950277941ikj第二趟开始,I取值为15.2一维数组及应用for(i=0;i<7;i++)9395.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

9392715950277941ikj重新定位K,取与I相同值5.2一维数组及应用for(i=0;i<7;i++)9395.2一维数组及应用for(i=0;i<7;i++){k=i;for(j=i+1;j<8;j++)if(a[k]<a[j])k=j;t=a[i];a[i]=a[k];a[k]=t;}

9392715950277941ikjJ从I+1重新开始循环……5.2一维数组及应用for(i=0;i<7;i++)939inta[6]={0},i;charc;printf("请输入选票编号:");while((c=getche())!='#'){if(c<'1'||c>'5')c='0';a[c-48]++;}for(i=0;i<6;i++)printf(“\n%d号:%d票\n",i,a[i]);5.2一维数组及应用5.用数组可以优化程序统计选票:有5个侯选人,选票号分别为1~5,从键盘键入,“#”号结束。除1~5以外的其它号以废票计。本题可以用多分支结构完成,但程序代码长度较长,如果用数组则非常简单。inta[6]={0},i;charc;5.2一维数组5.3.1二维数组的定义(P138)5.3.2二维数组元素的引用与遍历与二维数组元素的引用相似,元素由下标来确定位置:数组名[行下标][列下标]

如果要遍历一个二维数组的所有元素,一般用双循环嵌套完成。5.3二维数组及应用5.3.1二维数组的定义(P138)5.3二维数组及应用5.3二维数组及应用main(){inti,j,a[10][10];/*定义10*10数组*/for(i=0;i<10;i++)/*遍历行*/for(j=0;j<10;j++)/*遍历列*/a[i][j]=i+j;/*遍历赋值*/for(i=0;i<10;i++){for(j=0;j<10;j++)printf(“%5d”,a[i][j]);/*遍历输出*/printf(“\n”);/*换行输出*/}}5.3二维数组及应用main()5.3.3二维数组的应用

1.输出10行杨辉三角形(直角三角形)特点如下图所示:如果将各数据放入一个二维数组的话,那杨辉三角形占据了二维数组的下半部分,且列标为0的元素及行列标相等的元素值为1,其它元素均为其左肩元素和头顶元素之和。5.3二维数组及应用5.3.3二维数组的应用5.3二维数组及应用5.3二维数组及应用/*核心代码为赋值*/for(i=0;i<10;i++)/*遍历行,共10行*/for(j=0;j<=i;j++)/*遍历列,不需为所有数组元素赋值*/if(i==j||j==0)/*如果是第0列或主对角线(行列标相等)*/a[i][j]=1;/*这些元素赋值为1*/else/*否则其它元素等于*/a[i][j]=a[i-1][j]+a[i-1][j-1];/*头顶元素与左肩元素之和*/5.3二维数组及应用/*核心代码为赋值*/5.3.3二维数组的应用

2.输出10行杨辉三角形(等腰三角形)杨辉三角数据一旦进入二维数组后,以什么样的形式输出就非常简单了,比如还可以以等腰三角形输出。这里需要用到一个定位输出函数gotoxy(列,行)函数。5.3二维数组及应用5.3.3二维数组的应用5.3二维数组及应用5.3二维数组及应用/*核心代码为输出*/for(i=0;i<10;i++){gotoxy(40-i*3,i+1);/*只需要定位每行的起点,*//*3和1是试出来的,可用别的值试试*/for(j=0;j<=i;j++)printf(“%6d”,a[i][j]);/*遍历输出,注意6和前面3的关系*//*因为每行的起点由gotoxy函数定位,所以不需要换行语句了*/}5.3二维数组及应用/*核心代码为输出*/5.3.3二维数组的应用

3.二维数组的转置(如下图所示)(1)定义两个数组A,B;

(2)为A数组各元素赋值,为方便我们可用随机数;

(3)将A[i][j]元素的值赋给B[j][i],完成转置;

(4)输出A数组各元素和B数组各元素;5.3二维数组及应用5.3.3二维数组的应用5.3二维数组及应用5.3.3二维数组的应用

4.为15个学生5门课成绩求总分,并排序后输出5.3二维数组及应用(1)定义数组A[15][8],多出三列用于放总分和名次、学号;

(2)赋值时,学号用1-15,成绩用随机数生成;(3)对每个学生计算总分;(4)对总分列按降序排序,注意交换时整行交换;(5)填入名次(6)输出整个数组5.3.3二维数组的应用5.3二维数组及应用(1#defineswap(x,y){t=x;x=y;y=t;}/*定义交换两个变量的宏*/main(){inti,j,a[15][8],k,p,q,t;for(i=0;i<15;i++){a[i][0]=i+1;/*用i+1作为学号*/for(j=1;j<6;j++)a[i][j]=rand()%51+50;}/*随机产生学生成绩赋值*/for(i=0;i<15;i++)/*求总分,放在第6列*/{a[i][6]=0;for(j=1;j<6;j++)a[i][6]+=a[i][j];}for(p=0;p<14;p++)/*对第6例用比较交换法排序*/for(q=p+1;q<15;q++)if(a[p][6]<a[q][6])for(k=0;k<7;k++)swap(a[p][k],a[q][k]);/*注意交换时要换整行数据*/for(i=0;i<15;i++)a[i][7]=i+1;/*用将名次放在第7列,没有考虑总分相同的情况*/for(i=0;i<15;i++){for(j=0;j<8;j++)printf(“%5d”,a[i][j]);/*输出数组的各元素*/printf("\n");}getch();}5.3二维数组及应用#defineswap(x,y){t=x;x=y;y=t知识引申:如何将处理结果永久存放呢?这就需要存放到文件中:将数据写入文件需要有以下几步:1.程序中包含头文件:#include<stdio.h>2.定义一个文件指针:FILE*fp;/*fp是指针名,可任意*/

3.在指定文件夹下创建一个文件,格式为:

文件指针=fopen(文件名,”w”);4.将数据写入文件中的格式:fprintf(文件指针,”格式符”,变量列表);5.文件写完成后,需要关闭打开的文件,格式为:

fclose(文件指针);5.3二维数组及应用知识引申:如何将处理结果永久存放呢?这就需要存放到文件#defineswap(x,y){t=x;x=y;y=t;}/*定义交换两个变量的宏*/#include<stdio.h>/*文件操作必须要包含的头文件*/main(){inti,j,a[15][8],k,p,q,t;

FILE*fp;/*定义文件指针*/for(i=0;i<15;i++){a[i][0]=i+1;/*用i+1作为学号*/for(j=1;j<6;j++)a[i][j]=rand()%51+50;}/*随机产生学生成绩赋值*/for(i=0;i<15;i++)/*求总分,放在第6列*/{a[i][6]=0;for(j=1;j<6;j++)a[i][6]+=a[i][j];}for(p=0;p<14;p++)/*对第6例用比较交换法排序*/for(q=p+1;q<15;q++)if(a[p][6]<a[q][6])for(k=0;k<7;k++)swap(a[p][k],a[q][k]);/*注意交换时要换整行数据*/for(i=0;i<15;i++)a[i][7]=i+1;/*用将名次放在第7列,没有考虑总分相同的情况*/

fp=fopen("c:\\abc.txt","w");/*在C盘根目录下创建一个新文件*/for(i=0;i<15;i++){for(j=0;j<8;j++)fprintf(fp,"%5d",a[i][j]);/*将数组的各元素值写入文件*/

fprintf(fp,"\n");}/*每写完一行换行*/

fclose(fp);/*关闭数据文件*/printf("ok!");/*提示信息*/getch();}#defineswap(x,y){t=x;x=y;y=t*5.N阶魔方阵问题,(N为奇数)

魔方阵的条件是:(1)1在首行的正中间;

(2)下一个数在上一个数的上一行下一列;

(3)如果当前位置为首行,则其上一行为最后一行;如果当前列为最后一列,则其下一列为首列。

(4)如果发生冲突(即计算出的位置上已经有值),则将下一个值放在当前位置的下一行相同列位置上。5.3二维数组及应用*5.N阶魔方阵问题,(N为奇数)5.3二维数组及应用6.3二维数组及应用main(){inta[20][20]={0},n,m,x,y,p,q;/*因为C中不能动态定义数组,所以先定义一个大一点的二维数组*/do{printf("pleaseinputn(nisaoddnumber):");scanf("%d",&n);}while(n%2==0);/*精典程序段,保证输入合法数据*/x=1;y=n/2+1;a[x][y]=1;/*将1放在第1行中间*/for(m=2;m<=n*n;m++){p=x;q=y;/*记录当前放置的位置*/if(x==1)x=n;elsex--;/*定位下一个数的行位置*/if(y==n)y=1;elsey++;/*定位下一个数的列位置*/if(a[x][y]!=0)x=p+1,y=q;/*如果已经放过数,则重新定位*/a[x][y]=m;/*放入一个数到指定位置*/}for(x=1;x<=n;x++)/*输出放好数的魔方阵*/{for(y=1;y<=n;y++)printf("%7d",a[x][y]);printf("\n");}getch();}6.3二维数组及应用main()*6.心灵感应

先想一个0~60之间的数,再依次从六张卡片中回答有还是没有你想的数,最后由计算机输出你想的那个数.原理:(1)对于一个二进制数来说,将从低位到高位的每一个1按1,2,4,8,16,32转换,再相加就是对应的十进制数.(2)0~60之间的数化为二进制后不超过6位,转换成二进制后,从低位到高位,只要第1位上有1的数都在第1张卡片上,第2位有1的数都在第2张卡片上……,

(3)每张卡片上第1个数刚好依次是1,2,4,8,16,32,只回答”有”,就将这张卡片上的第1个数相加,最后就可以得到这个数.5.3二维数组及应用*6.心灵感应5.3二维数组及应用6.3二维数组及应用main(){inta[6][30]={{1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59},{2,3,6,7,10,11,14,15,18,19,22,23,26,27,30,31,34,35,38,39,42,43,46,47,50,51,54,55,58,59},{4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31,36,37,38,39,44,45,46,47,52,53,54,55,60,0},{8,9,10,11,12,13,14,15,24,25,26,27,28,29,30,31,40,41,42,43,44,45,46,47,56,57,58,59,60,0},{16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,48,49,50,51,52,53,54,55,56,57,58,59,60,0},{32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,0}};intx=0,i,j,q;printf("请想一个1~60之间的数,想好了以后按任意键……\n");getch();for(i=0;i<6;i++){printf("这是第%d张卡片\n",i+1);for(j=0;j<30;j++){if(a[i][j]!=0)printf("%4d",a[i][j]);if((j+1)%5==0)printf("\n");}printf("有你所想的数字么[有1/无0]?");scanf("%d",&q);/*这里可增加控制无效数据录入的程序段*/if(q==1)x=x+a[i][0];}/*如果有,则累加左上角数据,即位权*/if(x>60)printf("你想的数不在1-60之间!\n");/*累加超过60,输出错误信息*/elseprintf("你想的数字是:%d\n",x);}6.3二维数组及应用main()5.4一维字符数组1.字符数组用于存放字符的ASCII码值,每个数组元素存放一个字符,占用一个字节。2.字符串存放于字符数组中,其中最后一个元素值为0。3.字符数组与字符串的区别(1)字符串肯定是存放在字符数组中的,且最后一个元素的值为0(0就是“\0”);(2)以“\0”结束的字符数组可以当字符串处理。4.字符数组元素的引用与前面介绍过的数值引用相同,一个元素占一个字节,-128~127(带符号)或0~255(无符号)之间,当只用作字符处理时,二者是一致的,没有正负之分。

5.4一维字符数组1.字符数组用于存放字符的ASCII5.4一维字符数组5.字符串长度函数strlen

求字符串长度函数是从指定地址开始,遇到0结束,求出长度中不包括0那个字节。6.字符串常量用双引号引住的内容被称为字符串常量,字符串常量在内存中被保存在一个特殊的区域,字符串常量后会自动加0,以保证字符串能正常结束。7.从键盘为字符串赋值可用scanf或gets,后者更方便。8.字符串输出可以用printf或puts,后者更方便。5.4一维字符数组5.字符串长度函数strlen9.字符数组元素的遍历,先求出字符串长度,再用for循环完成(前提:必须有0做结束标志,否则求不出长度!)#include<string.h>main(){chara[]="Ilovethisgame!";intn=strlen(a),i;for(i=0;i<n;i++){printf("%c",a[i]);sleep(1);}getch();}5.4一维字符数组9.字符数组元素的遍历,先求出字符串长度,再用for循环完#include<string.h>main(){chara[]="Ilovethisgame!";inti;for(i=0;a[i]!='\0';i++){printf("%c",a[i]);sleep(1);}getch();}10.字符数组元素的遍历,也可以用0作循环结束条件。5.4一维字符数组#include<string.h>10.字符数组元素的11.字符数组的输入

(1)scanf函数并用%c作为格式控制符,一次只能为一个数组元素赋值,数组元素名必须加&,不会自动加\0,少用;

scanf("%c",&a[i]);5.4一维字符数组11.字符数组的输入scanf("%c",&a[i]);11.字符数组的输入

(2)scanf函数并用%s作为格式控制符,一次可为一个数组所有元素赋值,直接用数组名,不能再加&符,会在最后自动加\0,缺点:输入带空格的字符串时只能接收第一个空格前的字符。

scanf("%s",a);

scanf("%s",&a);因为数组名本来就是字符串的首地址,所以不能再加“&”符号。5.4一维字符数组11.字符数组的输入scanf("%s",a);sca11.字符数组的输入

(3)用gets(起始地址)函数赋值,将输入的一行字符依次赋给数组各元素,自动在末尾加\0,最常用。gets(a);

gets(&a);5.4一维字符数组11.字符数组的输入gets(a);gets(&a);512.字符数组的输出

(1)printf函数并用%c作为格式控制符,一次只能输出一个数组元素;

printf("%c",a[i]);5.4一维字符数组12.字符数组的输出printf("%c",a[i])12.字符数组的输出

(2)printf函数并用%s作为格式控制符,格式为:

printf(“%s”,一个地址);功能:从指定地址的元素开始输出,到遇到的第一个\0时结束。注意:输出时指定的必须是一个地址main(){chara[]="Ilovethisgame!";inti;for(i=0;a[i]!='\0';i++)printf("%s\n",a[i]);getch();}printf("%s\n",&a[i]);5.4一维字符数组12.字符数组的输出printf(“%s”,一个地址);12.字符数组的输出

(3)用puts(字符数组首地址)函数输出,最常用,它是从指定地址开始,输出到遇到第一个\0结束。puts(a);

puts(&a);

puts(&a[i]);main(){chara[]="Ilovethisgame!";inti;for(i=0;a[i]!='\0';i++)puts(&a[i]);getch();}5.4一维字符数组12.字符数组的输出puts(a);puts(&a);示例:从键盘上输入一个英文句子,统计其中英文单词的个数(单词之间用空格隔开)。main(){chara[100];/*不知道句子有多长,所以定义100个字符*/intn=0,i;printf("Pleaseintpuasentence:\n");gets(a);for(i=0;a[i]!=0;i++)if(a[i]==32)n++;printf("Thissentencehas%dword(s)\n",n+1);getch();}

如果两个单词之间有多个空格呢?5.4一维字符数组示例:从键盘上输入一个英文句子,统计其中英文单词main()主要用于存储多个字符串,与二维数值数组相同,只是需要注意每一行行尾需要一个\0作本行字符串的结束标志,并要求必须按这些字符串中最长的字符串字符个数定义列数。示例.将"China","Russin",Japan","America","Canada","NewZealand"等六个国家名存入一个二维数组并输出。5.5二维字符数组main(){charp[6][11]={"China","Russin",Japan","America","Canada","NewZealand"};inti;for(i=0;i<6;i++)puts(p[i]);getch();}主要用于存储多个字符串,与二维数值数组相同,只是需要示例.从键盘上输入10个学生姓名并输出。main(){chara[10][20];inti;for(i=0;i<10;i++){printf("请输入第%d个学生姓名:",i+1);gets(a[i]);}for(i=0;i<10;i++)printf("第%d个学生姓名是:%s\n",i+1,a[i]);}5.5二维字符数组示例.从键盘上输入10个学生姓名并输出。main()5.55.5字符串处理函数1.字符串测长度函数strlen

格式:strlen(地址)

功能:从指定地址开始到遇到第一个0为止的字节数,结果为一个整型值。示例:main(){chara[]="Ilovethisgame!";inti;for(i=0;a[i]!='\0';i++)printf(“%d\n”,strlen(&a[i]);getch();}5.5字符串处理函数1.字符串测长度函数strlenma5.5字符串处理函数2.字符串连接函数strcat

格式:strcat(地址1,地址2)

功能:将从地址2开始到遇到第一个0为止的内容连接到地址1后面第一个0开始的那个字节。示例1:将从键盘上输入的两个字符串连成一个字符串。main(){chara[100],b[100];printf("pleaseinputfirstsentence:\n");gets(a);printf("pleaseinputsecondsentence:\n");gets(b);strcat(a,b);printf("result:\n");puts(a);getch();}5.5字符串处理函数2.字符串连接函数strcatmai5.5字符串处理函数3.字符串整体复制函数strcpy

格式:strcpy(地址1,地址2)

功能:将从地址2那个字节开始到遇到第一个0为止的所有内容(连同那个0),复制到地址1所指向的那个字节。示例:去掉从键盘上输入的一个有若干前导空格的字符串的所有前导空格。main(){chara[100]="ilovethisgame!";inti;printf("before:\n");puts(a);for(i=0;a[i]==32;i++);strcpy(&a[0],&a[i]);printf("after:\n");puts(a);getch();}5.5字符串处理函数3.字符串整体复制函数strcpym5.5字符串处理函数4.字符串部分复制函数strncpy

格式:strncpy(地址1,地址2,n)功能:将从地址2那个字节开始的n个字符复制到地址1指定的那个位置,如果中间有0,则复制到0为止(含0!问题:如何验证呢?)。main(){chara[100]="ilovethisgame!";inti;printf("before:\n");puts(a);for(i=0;a[i]!='g';i++);strncpy(&a[0],&a[i],4);printf("after:\n");puts(a);getch();}5.5字符串处理函数4.字符串部分复制函数strncpy5.5字符串处理函数5.字符串比较函数strcmp

格式:strcmp(地址1,地址2)

功能:将两个地址所对应的字节内容自左向右逐个进行比较,直到遇到不同值或其中一个0为止。比较结果是两个不同值的差值(整型值)。如果两个字符串长度相等,对应位置字符也相同,则比较结果为0,说明这两个字符串相等。main(){chara[]="this",b[]="that";printf("%d",strcmp(a,b));getch();}5.5字符串处理函数5.字符串比较函数strcmpmai5.5字符串处理函数示例:将"China","Russin",Japan","America","Canada","NewZealand"等六个国家名按升序排序后输出main(){chara[][20]={"China","Russin","Japan","America","Canada","NewZealand"},b[20];inti,j;for(i=0;i<6;i++)/*输出排序前的国家名*/puts(&a[i][0]);for(i=0;i<5;i++)for(j=i+1;j<6;j++)if(strcmp(&a[i][0],&a[j][0])>0)/*注意与数值型数据比较方法的区别*/{strcpy(b,&a[i][0]);/*注意与数值型数据交换方法的区别*/strcpy(&a[i][0],&a[j][0]);strcpy(&a[j][0],b);}printf("\n\n");for(i=0;i<6;i++)puts(a[i]);/*注意这里和前面输出语句的区别*/getch();}5.5字符串处理函数示例:将"China","R1.理解基本概念:数组、数组元素、数组元素地址、二维数组的行首地址;

2.什么是连续存储、二维数组按行存储?

3.P132中定义数组的一般形式中格式为类型说明符数组标识符[常量表达式]

常量表达式是什么意思?

4.怎样理解对数组越界读无意义,越界写可能破坏其它程序数据?

5.如何初始化数组元素,定义数组时省略数组元素个数时,数组元素个数是如何确定的(P137及P142)?6.二维数组对全部元素赋初值时能省略哪一维的长度(P142)?7.本章所有讲到的例题需要认真理解。5.6本章小结1.理解基本概念:数组、数组元素、数组元素地址、二

1.。5.7作业与实习1.。5.7作业与实习

数组

数组本章主要内容

1.数组基本概念

2.一维数组及应用

3.二维数组及应用

4.字符数组和字符串本章主要内容1.数组基本概念5.1数组的概念C语言中定义普通变量就是按变量的数据类型找到相应大小的存储空间例如:

inta1,a2;floata3;chara4a1a2整型变量占两个字节5.1数组的概念C语言中定义普通变量就是按变量

inta1,a2;floata3;chara4a1a2a3实型变量占四个字节C语言中定义普通变量就是按变量的数据类型找到相应大小的存储空间例如:5.1数组的概念inta1,a2;a1a5.1数组的概念

inta1,a2;floata3;chara4a1a2a3a4C语言中定义普通变量就是按变量的数据类型找到相应大小的存储空间例如:字符型变量占1个字节5.1数组的概念int5.1数组的概念C语言中定义数组就是按数组数据类型及元素个数找到相应大小的一组连续的存储空间。例如:

inta[4]a[0]=2a[3]=5a[2]=3a定义了0~3共4个元素占8个字节[0][1][2][3]5.1数组的概念C语言中定义数组就是按数组数据5.1数组的概念

inta[4]a[0]=2a[3]=5a[2]=3a2C语言中定义数组就是按数组数据类型及元素个数找到相应大小的一组连续的存储空间。例如:5.1数组的概念int5.1数组的概念

inta[4]a[0]=2a[3]=5a[2]=3aC语言中定义数组就是按数组数据类型及元素个数找到相应大小的一组连续的存储空间。例如:525.1数组的概念int5.1数组的概念

inta[4]a[0]=2a[3]=5a[2]=3aC语言中定义数组就是按数组数据类型及元素个数找到相应大小的一组连续的存储空间。例如:5235.1数组的概念int5.1数组的概念1、数组是内存中的一

温馨提示

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

评论

0/150

提交评论