1、C程序设计数组PPT课件本章主要内容本章主要内容 1.数组基本概念数组基本概念 2.一维数组及应用一维数组及应用 3.二维数组及应用二维数组及应用 4.字符数组和字符串字符数组和字符串5.1 数组的概念数组的概念 C语言中定义普通变量就是语言中定义普通变量就是按变量的数据类型找到相应大按变量的数据类型找到相应大小的存储空间例如:小的存储空间例如:int a1,a2;float a3;char a4a1a2整型变量占两个字节int a1,a2;float a3;char a4a1a2a3实型变量占四个字节 C语言中定义普通变量就是语言中定义普通变量就是按变量的数据类型找到相应大按变量的数据类型找
2、到相应大小的存储空间例如:小的存储空间例如:5.1 数组的概念数组的概念5.1 数组的概念数组的概念int a1,a2;float a3;char a4a1a2a3a4 C语言中定义普通变量就是语言中定义普通变量就是按变量的数据类型找到相应大按变量的数据类型找到相应大小的存储空间例如:小的存储空间例如:字符型变量占1个字节5.1 数组的概念数组的概念 C语言中定义数组就是按数组语言中定义数组就是按数组数据类型及元素个数找到相应大数据类型及元素个数找到相应大小的一组连续的存储空间。例如:小的一组连续的存储空间。例如:int a4a0=2a3=5a2=3a定义了定义了0 3共共4个元个元素占素占8
3、个字个字节节01235.1 数组的概念数组的概念int a4a0=2a3=5a2=3a2 C语言中定义数组就是按数组语言中定义数组就是按数组数据类型及元素个数找到相应大数据类型及元素个数找到相应大小的一组连续的存储空间。例如:小的一组连续的存储空间。例如:5.1 数组的概念数组的概念int a4a0=2a3=5a2=3a C语言中定义数组就是按数组语言中定义数组就是按数组数据类型及元素个数找到相应大数据类型及元素个数找到相应大小的一组连续的存储空间。例如:小的一组连续的存储空间。例如:525.1 数组的概念数组的概念int a4a0=2a3=5a2=3a C语言中定义数组就是按数组语言中定义数
4、组就是按数组数据类型及元素个数找到相应大数据类型及元素个数找到相应大小的一组连续的存储空间。例如:小的一组连续的存储空间。例如:5235.1 数组的概念数组的概念1、数组数组是内存中的一块连续的存储区域,该区域由若干是内存中的一块连续的存储区域,该区域由若干个数据成员组成;个数据成员组成;2、每一个数据成员称为一个、每一个数据成员称为一个数组元素数组元素,有统一的名字,有统一的名字(即数组名),用元素在数组中的序号(称为下标)(即数组名),用元素在数组中的序号(称为下标)来标识;来标识;3、数组可以是一维的,也可以是多维的,不管一维还是、数组可以是一维的,也可以是多维的,不管一维还是多维,各元
5、素在内存中都是连续存放的;多维,各元素在内存中都是连续存放的;4、数组的每一维下标必须用方括号括起来;、数组的每一维下标必须用方括号括起来;5.1 数组的概念数组的概念5、一维数组一维数组是指只有一个下标的数组,定义一个数组必是指只有一个下标的数组,定义一个数组必须说明数组类型、名称、下标维数及每维下标最多须说明数组类型、名称、下标维数及每维下标最多元素个数。例如:元素个数。例如:int a65.1 数组的概念数组的概念5、一维数组一维数组是指只有一个下标的数组,定义一个数组必是指只有一个下标的数组,定义一个数组必须说明数组类型、名称、下标维数及每维下标最多须说明数组类型、名称、下标维数及每维
6、下标最多元素个数。例如:元素个数。例如:int a6 数组的类型,决定数组每个数组的类型,决定数组每个元素所占的存储区域大小元素所占的存储区域大小5.1 数组的概念数组的概念5、一维数组一维数组是指只有一个下标的数组,定义一个数组必是指只有一个下标的数组,定义一个数组必须说明数组类型、名称、下标维数及每维下标最多须说明数组类型、名称、下标维数及每维下标最多元素个数。例如:元素个数。例如:int a6 数组的名称,是程序中引用数组的名称,是程序中引用数组元素的依据之一数组元素的依据之一5.1 数组的概念数组的概念5、一维数组一维数组是指只有一个下标的数组,定义一个数组必是指只有一个下标的数组,定
7、义一个数组必须说明数组类型、名称、下标维数及每维下标最多须说明数组类型、名称、下标维数及每维下标最多元素个数。例如:元素个数。例如:int a6 数组的维说明,决定数组由数组的维说明,决定数组由几维组成,本例为一维数组,几维组成,本例为一维数组,只有一个下标只有一个下标5、一维数组一维数组是指只有一个下标的数组,定义一个数组必是指只有一个下标的数组,定义一个数组必须说明数组类型、名称、下标维数及每维下标最多须说明数组类型、名称、下标维数及每维下标最多元素个数。例如:元素个数。例如:int a6 数组的元素个数,本例共定数组的元素个数,本例共定义义6个元素,下标从个元素,下标从055.1 数组的
8、概念数组的概念 假设数组元素假设数组元素a3在内存中的在内存中的地址为地址为3100,那,那a0的地址?的地址?a5呢?呢?6、二维数组二维数组是指有两个下标的数组,二维数组在逻辑上是指有两个下标的数组,二维数组在逻辑上表现为二维表格,是若干个一维数组的集合。例如:表现为二维表格,是若干个一维数组的集合。例如:5.1 数组的概念数组的概念int a23 定义了一个整型二维数组,逻辑上由两行定义了一个整型二维数组,逻辑上由两行三列共三列共6个元素组成。元素分别为:个元素组成。元素分别为:a00、a01、a02 a10、a11、a126、二维数组二维数组是指有两个下标的数组,二维数组在逻辑上是指有
9、两个下标的数组,二维数组在逻辑上表现为二维表格,是若干个一维数组的集合。例如:表现为二维表格,是若干个一维数组的集合。例如:5.1 数组的概念数组的概念int a23a00 a01 a02 a10 a11 a12a0a1 假设定义数组假设定义数组float a56,已知已知a11在在内存中的地址为内存中的地址为3100,那,那a22的地址?的地址?a45呢?呢?7、字符数组字符数组是用于存放字符的数组,每个元素可以存放是用于存放字符的数组,每个元素可以存放一个字符,主要用于处理字符串。例如:一个字符,主要用于处理字符串。例如:5.1 数组的概念数组的概念char a10 定义了一个字符型一维数
10、组,最多可以存定义了一个字符型一维数组,最多可以存放放10个字符。个字符。char a1010 定义了一个字符型二维数组,最多可以存定义了一个字符型二维数组,最多可以存放放100个字符;一般用于存放长度不超过个字符;一般用于存放长度不超过10个个字符的字符串。字符的字符串。5.2 一维数组及应用一维数组及应用5.2.1 一维数组的定义(一维数组的定义(P133)与初始化)与初始化(P136)5.2.2 一维数组的引用与遍历一维数组的引用与遍历 所谓遍历,是指对数组中的所有元素扫描一遍,对所谓遍历,是指对数组中的所有元素扫描一遍,对于一维数组,通常用单层循环完成。例如:于一维数组,通常用单层循环
11、完成。例如:1.遍历赋值遍历赋值为每个元素赋值为每个元素赋值 for(i=0;iN;i+)printf(请输入第%d个元素的值:,i);scanf(%d,&ai);5.2 一维数组及应用一维数组及应用5.2.2 一维数组的引用与遍历一维数组的引用与遍历2.遍历输出遍历输出输出每个元素的值输出每个元素的值printf(数组各元素的值为:);for(i=0;iN;i+)printf(%5d,ai);5.2 一维数组及应用一维数组及应用5.2.3 一维数组应用举例一维数组应用举例 利用数组编程的一般步骤为:利用数组编程的一般步骤为:(1)定义数组;)定义数组;(2)为数组各元素赋值;)为数组各元素赋
12、值;(3)遍历数组各元素,按要求处理;)遍历数组各元素,按要求处理;(4)输出处理结果。)输出处理结果。5.2 一维数组及应用一维数组及应用5.2.3 一维数组应用举例一维数组应用举例 1.从键盘输入从键盘输入10个学生成绩,求平均分并统计高于平个学生成绩,求平均分并统计高于平均分的人数均分的人数(1)定义有)定义有10个元素的个元素的数组数组,求平均分就需要累加,求平均分就需要累加,所以还需要一个所以还需要一个累加器累加器,要统计人数还需要一个,要统计人数还需要一个计计数器数器,要循环遍历数组各元素还需要,要循环遍历数组各元素还需要循环变量;循环变量;(2)通过)通过遍历遍历为数组各元素赋值
13、为数组各元素赋值(3)累加各数组元素值,需要)累加各数组元素值,需要遍历遍历各数组元素各数组元素(4)求出平均分后还要统计高于平均分的人数,需要拿)求出平均分后还要统计高于平均分的人数,需要拿每个元素和平均分进行比较,所以还需要每个元素和平均分进行比较,所以还需要遍历遍历各数各数组元素组元素5.2 一维数组及应用一维数组及应用5.2.3 一维数组应用举例一维数组应用举例 1.从键盘输入从键盘输入10个学生成绩,求平均分并统计高于平个学生成绩,求平均分并统计高于平均分的人数均分的人数(5)输出处理结果。)输出处理结果。5.2.3 一维数组应用举例一维数组应用举例 2.随机产生随机产生10个两位整
14、数放入一维数组,再将各数组个两位整数放入一维数组,再将各数组元素按逆序存放,如元素按逆序存放,如a0与与a9对换,对换,a1与与a8对换对换;3.随机产生随机产生10个两位整数放入一维数组,找出其中最个两位整数放入一维数组,找出其中最大值及其位置;大值及其位置;5.2 一维数组及应用一维数组及应用5.2 一维数组及应用一维数组及应用main()int a10,max,k,i,j;printf(原数据为:);for(i=0;i10;i+)ai=rand()%90+10;printf(%5d,ai);k=0;for(i=1;i10;i+)if(akai)k=i;printf(n最大值%d,在第%d
15、位!,ak,k);5.2.3 一维数组应用举例一维数组应用举例 4.对对8个数按降序排序个数按降序排序比较交换法比较交换法 5.2 一维数组及应用一维数组及应用第第1趟:假设趟:假设a0元素最大,将其和后面元素最大,将其和后面a1-a7各元素值进行比较,如果有比它更大的数,则各元素值进行比较,如果有比它更大的数,则交换。交换。代码段如下:for(j=1;i8;j+)if(a0aj)t=a0;a0=aj;aj=t;5.2 一维数组及应用一维数组及应用7192935950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj1j5.2 一维数组
16、及应用一维数组及应用7192935950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a01j5.2 一维数组及应用一维数组及应用7192935950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj条件成立!交换!1j5.2 一维数组及应用一维数组及应用9271935950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj1j5.2 一维数组及应用一维数组及应用9271935950277941代码段如下:for(j=1;j8
17、;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj2j5.2 一维数组及应用一维数组及应用9271935950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj2j条件成立!交换!5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj2j5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj3j5.2 一维
18、数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj3j条件不成立!5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj4j5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj4j条件不成立!5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:fo
19、r(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj5j5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj5j条件不成立!5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj6j5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0ai)t=a0;a0=aj;aj=t;a0aj6j
20、条件不成立!5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj7j5.2 一维数组及应用一维数组及应用9371925950277941代码段如下:for(j=1;j8;j+)if(a0aj)t=a0;a0=aj;aj=t;a0aj7j条件不成立!第一趟比较结束后,最大值被放在了a0位置。5.2 一维数组及应用一维数组及应用 第第2趟是将趟是将a0排除在外,设排除在外,设a1是剩下的数中最是剩下的数中最大的,与后面大的,与后面a2-a7比较。比较。第第3趟是将趟是将a0、a1排除在外
21、,设排除在外,设a2是剩下的是剩下的数中最大的,与后面数中最大的,与后面a3-a7比较。比较。第第7趟是将趟是将a0 a5排除在外,设排除在外,设a6是剩下是剩下的数中最大的,与后面的的数中最大的,与后面的a7-a7比较。完成排序。比较。完成排序。以此类推,若要对以此类推,若要对N个数排序,要处理的趟数是个数排序,要处理的趟数是N-1。由此增加一个外循环控制趟数:由此增加一个外循环控制趟数:for(i=0;in-1;i+)完整的比较交换法排序核心程序段为:完整的比较交换法排序核心程序段为:for(i=0;in-1;i+)for(j=i+1;jn;j+)if(aiaj)交换两个元素值交换两个元素
22、值 5.2.3 一维数组应用举例一维数组应用举例 4.对对8个数按降序排序个数按降序排序选择法选择法 与比较交换法类似,与比较交换法类似,只是每次比较后不马上交只是每次比较后不马上交换,而是只记录极值位置,换,而是只记录极值位置,一趟比较完成后再和假想一趟比较完成后再和假想的极值交换,极大地提高的极值交换,极大地提高了排序效率。了排序效率。5.2 一维数组及应用一维数组及应用main()int a8,i,j,k,t;printf(排序前数据为:);for(i=0;i8;i+)ai=rand()%90+10;printf(%5d,ai);for(i=0;i7;i+)k=i;for(j=i+1;j
23、8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;printf(n排序后数据为:);for(i=0;i8;i+)printf(%5d,ai);5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941i5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ki5.2 一维数组及应用一维数组及应用for(i=0;
24、i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941kij5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj5.2 一维数组及应用一维数组及应用for(i=0;i7;
25、i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj因为条件不成立,所以K位置不变5.2 一维数组及应用一维数组及应
26、用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj因为条件不成立,所以K位置不变5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj5.2 一
27、维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj因为条件不成立,所以K位置不变5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;719293595027
28、7941ikj因为条件不成立,所以K位置不变5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;7192935950277941ikj因为条件不成立,所以K位置不变5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t
29、=ai;ai=ak;ak=t;7192935950277941ikj交换ai、ak两元素的值5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;9392715950277941ikj交换ai、ak两元素的值5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;9392715950277941ikj第二趟开始,I取值为15.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k
30、=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;9392715950277941ikj重新定位K,取与I相同值5.2 一维数组及应用一维数组及应用for(i=0;i7;i+)k=i;for(j=i+1;j8;j+)if(akaj)k=j;t=ai;ai=ak;ak=t;9392715950277941ikjJ从I+1重新开始循环int a6=0,i;char c;printf(请输入选票编号:);while(c=getche()!=#)if(c5)c=0;ac-48+;for(i=0;i6;i+)printf(“n%d号:%d票n,i,ai);5.
31、2 一维数组及应用一维数组及应用5.用数组可以优化程序用数组可以优化程序 统计选票:有统计选票:有5个侯选人,选票号分别为个侯选人,选票号分别为15,从键,从键盘键入,盘键入,“#”号结束。除号结束。除15以外的其它号以废票计。以外的其它号以废票计。本题可以用多分支结构完成,但程序代码长度较长,本题可以用多分支结构完成,但程序代码长度较长,如果用数组则非常简单。如果用数组则非常简单。5.3.1 二维数组的定义(二维数组的定义(P138)5.3.2 二维数组元素的引用与遍历二维数组元素的引用与遍历 与二维数组元素的引用相似,元素由下标来确定位置与二维数组元素的引用相似,元素由下标来确定位置:数组
32、名数组名行下标行下标列下标列下标 如果要遍历一个二维数组的所有元素,一般用双循环如果要遍历一个二维数组的所有元素,一般用双循环嵌套完成。嵌套完成。5.3 二维数组及应用二维数组及应用5.3 二维数组及应用二维数组及应用main()int i,j,a1010;/*定义10*10数组*/for(i=0;i10;i+)/*遍历行*/for(j=0;j10;j+)/*遍历列*/aij=i+j;/*遍历赋值*/for(i=0;i10;i+)for(j=0;j10;j+)printf(“%5d”,aij);/*遍历输出*/printf(“n”);/*换行输出*/5.3.3 二维数组的应用二维数组的应用 1
33、.输出输出10行杨辉三角形行杨辉三角形(直角三角形直角三角形)特点如下图所示:如果将各数据放入一个二维数组特点如下图所示:如果将各数据放入一个二维数组的话,那杨辉三角形占据了二维数组的下半部分,且列的话,那杨辉三角形占据了二维数组的下半部分,且列标为标为0的元素及行列标相等的元素值为的元素及行列标相等的元素值为1,其它元素均为,其它元素均为其左肩元素和头顶元素之和。其左肩元素和头顶元素之和。5.3 二维数组及应用二维数组及应用5.3 二维数组及应用二维数组及应用/*核心代码为赋值*/for(i=0;i10;i+)/*遍历行,共10行*/for(j=0;j=i;j+)/*遍历列,不需为所有数组元
34、素赋值*/if(i=j|j=0)/*如果是第0列或主对角线(行列标相等)*/aij=1;/*这些元素赋值为1*/else /*否则其它元素等于*/aij=ai-1j+ai-1j-1;/*头顶元素与左肩元素之和*/5.3.3 二维数组的应用二维数组的应用 2.输出输出10行杨辉三角形行杨辉三角形(等腰三角形等腰三角形)杨辉三角数据一旦进入二维数组后,以什么样的形杨辉三角数据一旦进入二维数组后,以什么样的形式输出就非常简单了,比如还可以以等腰三角形输出。式输出就非常简单了,比如还可以以等腰三角形输出。这里需要用到一个定位输出函数这里需要用到一个定位输出函数gotoxy(列,行列,行)函数。函数。5
35、.3 二维数组及应用二维数组及应用5.3 二维数组及应用二维数组及应用/*核心代码为输出*/for(i=0;i10;i+)gotoxy(40-i*3,i+1);/*只需要定位每行的起点,*/*3和1是试出来的,可用别的值试试*/for(j=0;j=i;j+)printf(“%6d”,aij);/*遍历输出,注意6和前面3的关系*/*因为每行的起点由gotoxy函数定位,所以不需要换行语句了*/5.3.3 二维数组的应用二维数组的应用 3.二维数组的转置二维数组的转置(如下图所示如下图所示)(1)定义两个数组定义两个数组A,B;(2)为为A数组各元素赋值,为方便我们可用随机数;数组各元素赋值,为
36、方便我们可用随机数;(3)将将Aij元素的值赋给元素的值赋给Bji,完成转置;,完成转置;(4)输出输出A数组各元素和数组各元素和B数组各元素;数组各元素;5.3 二维数组及应用二维数组及应用5.3.3 二维数组的应用二维数组的应用 4.为为15个学生个学生5门课成绩求总分,并排序后输出门课成绩求总分,并排序后输出5.3 二维数组及应用二维数组及应用 (1)定义数组定义数组A158,多出三列用于放总分和名次、,多出三列用于放总分和名次、学号;学号;(2)赋值时,学号用赋值时,学号用1-15,成绩用随机数生成;,成绩用随机数生成;(3)对每个学生计算总分;对每个学生计算总分;(4)对对总分列总分
37、列按降序排序,按降序排序,注意交换时整行交换;注意交换时整行交换;(5)填入名次填入名次 (6)输出整个数组输出整个数组#define swap(x,y)t=x;x=y;y=t;/*定义交换两个变量的宏*/main()int i,j,a158,k,p,q,t;for(i=0;i15;i+)ai0=i+1;/*用i+1作为学号*/for(j=1;j6;j+)aij=rand()%51+50;/*随机产生学生成绩赋值*/for(i=0;i15;i+)/*求总分,放在第6列*/ai6=0;for(j=1;j6;j+)ai6+=aij;for(p=0;p14;p+)/*对第6例用比较交换法排序*/fo
38、r(q=p+1;q15;q+)if(ap6aq6)for(k=0;k7;k+)swap(apk,aqk);/*注意交换时要换整行数据*/for(i=0;i15;i+)ai7=i+1;/*用将名次放在第7列,没有考虑总分相同的情况*/for(i=0;i15;i+)for(j=0;j8;j+)printf(“%5d”,aij);/*输出数组的各元素*/printf(n);getch();5.3 二维数组及应用二维数组及应用 知识引申:如何将处理结果永久存放呢?这就需要存放到文件中:知识引申:如何将处理结果永久存放呢?这就需要存放到文件中:将数据写入文件需要有以下几步:将数据写入文件需要有以下几步:
39、1.程序中包含头文件:程序中包含头文件:#include 2.定义一个文件指针:定义一个文件指针:FILE *fp;/*fp是指针名,可任意是指针名,可任意*/3.在指定文件夹下创建一个文件,格式为:在指定文件夹下创建一个文件,格式为:文件指针文件指针=fopen(文件名文件名,”w”);4.将数据写入文件中的格式:将数据写入文件中的格式:fprintf(文件指针文件指针,”格式符格式符”,变量列表变量列表);5.文件写完成后,需要关闭打开的文件,格式为:文件写完成后,需要关闭打开的文件,格式为:fclose(文件指针文件指针);5.3 二维数组及应用二维数组及应用#define swap(x
40、,y)t=x;x=y;y=t;/*定义交换两个变量的宏*/#include /*文件操作必须要包含的头文件*/main()int i,j,a158,k,p,q,t;FILE*fp;/*定义文件指针*/for(i=0;i15;i+)ai0=i+1;/*用i+1作为学号*/for(j=1;j6;j+)aij=rand()%51+50;/*随机产生学生成绩赋值*/for(i=0;i15;i+)/*求总分,放在第6列*/ai6=0;for(j=1;j6;j+)ai6+=aij;for(p=0;p14;p+)/*对第6例用比较交换法排序*/for(q=p+1;q15;q+)if(ap6aq6)for(k
41、=0;k7;k+)swap(apk,aqk);/*注意交换时要换整行数据*/for(i=0;i15;i+)ai7=i+1;/*用将名次放在第7列,没有考虑总分相同的情况*/fp=fopen(c:abc.txt,w);/*在C盘根目录下创建一个新文件*/for(i=0;i15;i+)for(j=0;j8;j+)fprintf(fp,%5d,aij);/*将数组的各元素值写入文件*/fprintf(fp,n);/*每写完一行换行*/fclose(fp);/*关闭数据文件*/printf(ok!);/*提示信息*/getch();*5.N阶魔方阵问题阶魔方阵问题,(N为奇数为奇数)魔方阵的条件是魔方
42、阵的条件是:(1)1在首行的正中间;在首行的正中间;(2)下一个数在上一个数的上一行下一列;下一个数在上一个数的上一行下一列;(3)如果当前位置为首行,则其上一行为最后一行;如果当前位置为首行,则其上一行为最后一行;如果当前列为最后一列,则其下一列为首列。如果当前列为最后一列,则其下一列为首列。(4)如果发生冲突(即计算出的位置上已经有值)如果发生冲突(即计算出的位置上已经有值),则则将下一个值放在当前位置的下一行相同列位置上。将下一个值放在当前位置的下一行相同列位置上。5.3 二维数组及应用二维数组及应用6.3 二维数组及应用二维数组及应用main()int a2020=0,n,m,x,y,
43、p,q;/*因为C中不能动态定义数组,所以先定义一个大一点的二维数组*/do printf(please input n(n is a odd number):);scanf(%d,&n);while(n%2=0);/*精典程序段,保证输入合法数据*/x=1;y=n/2+1;axy=1;/*将1放在第1行中间*/for(m=2;m=n*n;m+)p=x;q=y;/*记录当前放置的位置*/if(x=1)x=n;else x-;/*定位下一个数的行位置*/if(y=n)y=1;else y+;/*定位下一个数的列位置*/if(axy!=0)x=p+1,y=q;/*如果已经放过数,则重新定位*/ax
44、y=m;/*放入一个数到指定位置*/for(x=1;x=n;x+)/*输出放好数的魔方阵*/for(y=1;y=n;y+)printf(%7d,axy);printf(n);getch();*6.心灵感应心灵感应 先想一个先想一个060之间的数之间的数,再依次从六张卡片中回答有再依次从六张卡片中回答有还是没有你想的数还是没有你想的数,最后由计算机输出你想的那个数最后由计算机输出你想的那个数.原理原理:(1)对于一个二进制数来说对于一个二进制数来说,将从低位到高位的每一个将从低位到高位的每一个1按按1,2,4,8,16,32转换转换,再相加就是对应的十进制数再相加就是对应的十进制数.(2)060
45、之间的数化为二进制后不超过之间的数化为二进制后不超过6位位,转换成转换成二进制后二进制后,从低位到高位从低位到高位,只要第只要第1位上有位上有1的数都在第的数都在第1张张卡片上卡片上,第第2位有位有1的数都在第的数都在第2张卡片上张卡片上,(3)每张卡片上第每张卡片上第1个数刚好依次是个数刚好依次是1,2,4,8,16,32,只只回答回答”有有”,就将这张卡片上的第就将这张卡片上的第1个数相加个数相加,最后就可以得最后就可以得到这个数到这个数.5.3 二维数组及应用二维数组及应用6.3 二维数组及应用二维数组及应用main()int a630=1,3,5,7,9,11,13,15,17,19,
46、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
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;int x=0,i,j,q;printf(请想一个160之间的数,想好了以后按任意键n);getch();for(i=0;i6;i+)printf(这是第%d张卡片n,i+1);for(j=0;j60)pri
48、ntf(你想的数不在1-60之间!n);/*累加超过60,输出错误信息*/else printf(你想的数字是:%dn,x);5.4 一维字符数组一维字符数组1.字符数组用于存放字符的字符数组用于存放字符的ASCII码值,每个数组元素码值,每个数组元素 存放一个字符,占用一个字节。存放一个字符,占用一个字节。2.字符串存放于字符数组中,其中最后一个元素值为字符串存放于字符数组中,其中最后一个元素值为0。3.字符数组与字符串的区别字符数组与字符串的区别 (1)字符串肯定是存放在字符数组中的字符串肯定是存放在字符数组中的,且最后一个,且最后一个元素的值为元素的值为0(0就是就是“0”);(2)以以
49、“0”结束的字符数组结束的字符数组可以当可以当字符串字符串处理处理。4.字符数组元素的引用字符数组元素的引用 与前面介绍过的数值引用相同,一个元素占一个字节,与前面介绍过的数值引用相同,一个元素占一个字节,-128127(带符号)或(带符号)或0255(无符号)之间(无符号)之间,当只,当只用作字符处理时,二者是一致的,没有正负之分。用作字符处理时,二者是一致的,没有正负之分。5.4 一维字符数组一维字符数组5.字符串长度函数字符串长度函数strlen 求字符串长度函数是从指定地址开始,遇到求字符串长度函数是从指定地址开始,遇到0结束,求结束,求出长度中不包括出长度中不包括0那个字节。那个字节
50、。6.字符串常量字符串常量 用双引号引住的内容被称为字符串常量,字符串常量用双引号引住的内容被称为字符串常量,字符串常量在内存中被保存在一个特殊的区域,字符串常量后会自在内存中被保存在一个特殊的区域,字符串常量后会自动加动加0,以保证字符串能正常结束。,以保证字符串能正常结束。7.从键盘为字符串赋值可用从键盘为字符串赋值可用scanf或或gets,后者更方便。后者更方便。8.字符串输出可以用字符串输出可以用printf或或puts,后者更方便。,后者更方便。9.字符数组元素的遍历,先求出字符串长度,再用字符数组元素的遍历,先求出字符串长度,再用for循循环完成环完成(前提:必须有前提:必须有0