实验7 数组的应用

更新时间:2023-10-23 23:56:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

38563235.doc (匡珍春制作)

实验七 数组的应用(4学时)

实验前必须做的操作——新建文件夹: .................

1、先在对应的K:盘上建立一个父文件夹(用来存放本人整个学期的作业),格式为:“专业+班级+学号+姓名”,如:工业1091班、学号为05的匡珍春同学,其父文件夹名称为:工业109105匡珍春,然后在此父文件夹下建立子文件夹,名称为:实验7(用来存放实验7需要上交的文件)。

2、在E:盘上建立一个以本人姓名为名称的文件夹(本次实验的工作文件夹),例如:E:\\匡珍春

【实验目的】

1、 掌握一维数组和二维数组的定义、初始化、数组元素的引用及数组的输入输出方法; 2、 掌握与数组有关的算法(如排序算法); 3、 熟悉循环处理语句与数组处理语句结合的方法; 4、 掌握字符数组和字符串函数的使用;

5、 巩固VC的调试方法,熟练掌握包括断点的设置和取消,运行到光标处等跟踪调试程序的方法。

【实验内容】

[实验任务一]:断点的设置和取消、运行到光标处等跟踪调试程序的方法练习 程序跟踪调试实例7-1:调试示例(请仔细按以下各步骤进行操作):

从键盘输入一个正整数n(0

源程序(有错误的程序) #include void main( ) { int i, j, n, x, a[n]; scanf(\

printf(\输入%d个整数:\ for(i = 0; i < n; i++)

scanf(\ printf(\输入要插入的整数:\ scanf(\ for(i = 0; i < n; i++)

{

if(x > a[i]) continue; j = n - 1;

while(j >= i) /* 调试时设置断点 */

第 1 页 共 10 页

printf(\输入数据的个数n:\

38563235.doc (匡珍春制作)

{ a[j] = a[j+1];

}

j++;

} /* 调试时设置断点 */ a[i] = x; }

if(i == n) a[n]=x; for(i = 0; i < n + 1; i++) printf(\

break;

putchar('\\n');

运行结果(改正错误后程序的运行结果) 输入数据的个数n:5 输入5个整数:1 2 4 5 7 输入要插入的整数:3 1 2 3 4 5 7

算法提示:先找到插入点,从插入点开始,所有的数据顺序后移,然后插入数据;如果插入点在最后,则直接插入(说明插入的数排在该组数据中的最后)。

【操作步骤】:

(1)输入源程序,并以error7_1.c文件名最终保存在实验7文件夹里,编译程序,出现错误信息:

以上错误信息指出:定义数组a时,数组长度必须是常量。程序中的数组定义错误的用了a[n],改为a[10]后,重新编译和连接,没有出现错误信息。

(2)调试程序开始,设置2个断点,具体位置见源程序的注释。 (3)单击

(go),运行程序,依次输入5和1 2 4 5 7,以及3,程序运行到第一个断点,在Watch窗口

观察输入的a数组和插入的数x均正确,而且3 < 4(x

(4)再单击

(go),程序运行到第二个断点,在Watch窗口观察a[j]和a[j+1]的值均是一个负数,

这显然不对。仔细分析,算法要求数组元素后移,而程序中a[j]=a[j+1]是前移,而且j++也同样有问题,只要加一次,数组下标就越界了。

(5)找出问题后,单击

(Stop Debugging )停止调试,把a[j]=a[j+1]改为a[j+1]=a[j],j++改为j--

后,重新编译和连接,没有错误和警告。

(6)单击

(Rstart ),重新开始调试,并取消第一个断点,单击(go),程序运行到断点,

Watch窗口显示a[j]=5和a[j+1]=7,排列正确。

(7)再单击

(go),程序运行到断点,观察Watch窗口中a[j]和a[j+1]的值均排列正确。

第 2 页 共 10 页

38563235.doc (匡珍春制作)

(8)单击

(9)再单击

(Step Over)2次,程序跳出while循环,箭头指向了要插入数据的语句。

(Step Over),程序跳出for循环,在Watch窗口观察a数组的元素排列正确。

(Run to Cursor),程序运行到最后,输出1 2 3 4 5 7,运行

(10)把光标放在最后一行,单击

结果正确。

(11)单击

(Stop Debugging (Shift F5)),程序调试结束。

程序跟踪调试实例7-2:输入一个以回车结束的字符串(少于80个字符),将它的内容颠倒过来再输

出。如\颠倒为\。

源程序(有错误的程序) #include void main( ) {

int i, k, temp; char str[ ]; i = 0;

while((str[i] = getchar( )) != '\\n') i++; str[i] = '\\0'; k = i - 1;

for(i = 0; i < k; i++) /* 调试时设置断点 */

{ temp = str[i]; str[i] = str[k]; str[k] = temp; k++;

} /* 调试时设置断点 */ for(i = 0; str[i] != '\\0'; i++) putchar(str[i]); printf(\; }

运行结果(改正错误后程序的运行结果)

printf(\

Welcome to you! !uoy ot emocleW 【操作步骤】:

(1)输入源程序,并以error7_2.c文件名最终保存在实验7文件夹里,编译程序,出现错误信息:

第 3 页 共 10 页

38563235.doc (匡珍春制作)

双击该出错信息,箭头指向第5行,指出定义数组str时,长度不确定。因为程序中错误地用了str[ ],改为str[80]后,重新编译和连接,没有出现错误信息。

(2)调试程序开始,设置2个断点,具体位置见源程序的注释。

(3)单击

(go),运行程序,输入Welcome to you!,程序运行到第一个断点,在Watch窗口输

入str,显示的内容和输入一致。

(4)再单击

(go),程序运行到第二个断点,在Watch窗口观察第1个字符和最后一个字符的调

换是否正确,输入str[0]显示惊叹号!,输入str[k-1]显示W,正确。

(5)再单击

(go),程序再次运行到第二个断点,在Watch窗口观察第2个字符和倒数第2个字

符的调换是否正确,输入str[1]显示\\0,不正确,输入str[k-1]显示e,正确。仔细分析for循环体,两头对调不能写成k++,应该是k--。

(6)找出问题后,单击

(Stop Debugging )停止调试,把k++改为k--后,重新编译和连接,没

有错误和警告。

(7)单击

(Rstart ),重新开始调试,并取消第一个断点,单击2次(go),程序运行到断点,

Watch窗口中显示字符串str为\,说明前2次对调正确。

(8)取消断点,把光标放在最后一行,单击

(Run to Cursor),程序运行到最后,输出!uoy ot

emocleW,运行结果正确。

(9)单击

(Stop Debugging (Shift F5)),程序调试结束。

[实验任务二]:补充完整程序,掌握C语言中与数组有关的算法。

程序填空实例7-1:调试下面的程序,将程序中\删除,并填上正确的内容,使其程序能 输出正确的结果。程序调用函数fx计算代数多项式:f(x)=1.1+2.2*x+3.3*x*x+4.4*x*x*x+5.5*x*x*x*x 当 x=1.7时的值。将填空后完整的程序以文件名为blank7_1.c保存在实验7文件夹里。(需要存盘)

第 4 页 共 10 页

38563235.doc (匡珍春制作)

程序填空实例7-2:以下程序以每行输出8个数据的形式输出a数组。将填空后完整的程序以文件名为blank7_2.c保存在实验7文件夹里。(需要存盘)

程序填空实例7-3:以下程序将数组中的数据按逆序存放。将填空后完整的程序以文件名为blank7_3.c保存在实验7文件夹里。(需要存盘)

#include #define SIZE 12 void main( ) { int a[SIZE], i, j, t; for(i=0; i

scanf(“%d”, ); /*读入数到a数组中*/ i=0; j= ; while (i

; i++; j ; }

for(i=0; i

第 5 页 共 10 页

38563235.doc (匡珍春制作)

程序填空实例7-4:假设a数组中的数按由小到大的顺序存放,以下程序把a数组中相同的数删得只剩下一个,然后以每行5个数的形式输出a数组中的数,请填空。将填空后完整的程序以文件名为blank7_4.c保存在实验7文件夹里。(需要存盘)

#include #define MAX 20 void main( ) { int a[MAX], i, j, n; for(i=0; i

scanf(“%d”, ); /*读入数到a数组中*/ n=i=MAX-1; while( ) { if (a[i]==a[i-1]) /*相同删除*/ { for(j= ; j<=n; j++) a[ ]=a[j]; n ; } i ; }

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

{ if ( ) printf(“\\n”); printf(“=”, a[i]); }

printf(“\\n”); }

程序填空实例7-5:下面程序的功能为求主、次对角线元素之和。请将程序补充完整,然后上机调试。将填空后完整的程序以文件名为blank7_5.c保存在实验7文件夹里。(需要存盘)

#include void main( )

{ int a[3][3]={9,7,5,3,1,2,4,6,8}; int i, j, s1=0, s2=0; for(i=0; i<3; i++)

for(j=0; j<3; j++)

{ if( ) s1=s1+a[i][j]; if( ) s2=s2+a[i][j]; }

printf(“s1=%d, s2=%d\\n”, s1, s2); }

第 6 页 共 10 页

38563235.doc (匡珍春制作)

[实验任务三]:掌握函数的嵌套调用和递归调用的程序的执行过程,会使用嵌套调用和递归调用编写程序;

编程实例7-1:试编写一个程序,使得该程序可实现以下功能:将两个有序顺序表合并成一个新的有序顺序表。将编写好的程序以文件名meld.c最终保存在实验7文件夹里。(需要存盘)

编程实例7-2:编写一个程序:将用户从键盘上输入的一个不大于256的十进制正整数(应对输入的整数进行合法性的检查)转换成对应的八位二进制数输出。

【要求】:定义一个长度为8的一维数组来存放相应的二进制数。将编写好的程序以文件名DtoB.c最终保存在实验7文件夹里。(需要存盘)

编程实例7-3:青年歌手参加歌曲大奖赛,有10个评委对她进行打分,试编程求这位选手的平均得分(去掉一个最高分和一个最低分)。将编写好的程序以文件名match.c最终保存在实验7文件夹里。

【分析】:这道题的核心是排序。将评委所打的10个分数利用数组按增序(或降序)排列,计算数 组中除第一个和最后一个分数以外的数的平均分,其中排序部分这里用选择法实现。

编程实例7-4:编写程序编写程序实现矩阵相乘:C=A*B,其中:

【算法提示】:

① 定义3个二维数组A,B,C; ② 用双重循环给矩阵A、B赋初始值;

③ 用三重循环求矩阵A的i行与矩阵B的j列对应元素相乘的累加和,即矩阵C的第i行第j个元素; ④ 用双重循环输出矩阵C对应的元素。

将编写好的程序以文件名matrix.c最终保存在实验7文件夹里。(需要存盘)

编程实例7-5:输入一个字符串,将其中所有大写字母改为小写字母,而所有小写字母全部改为大写字母,其它字符不动。最后请输出新的字符串。将编写好的程序以文件名rewrite.c最终保存在实验7文件夹里。(需要存盘)

编程实例7-6:编写一个程序实现将一个字符串str的内容进行循环右移,由键盘输入移动的距离。 例如:原字符串为: a b c d e \\0 如从键盘输入2则原字符串变成: 新字符串: d e a b c \\0 【算法提示】:

① 定义字符数组,并初始化初始字符串

② 用键盘输入的n控制移动的次数,一次移动一个字符。

③ 每一次移动都是先保存字符串中最后一个字符,注意:不是字符数组中最后的元素,也不是'\\0'。 ④ 前面的元素依次向后移动,并把刚才保存的字符存到最前面的位置。 ⑤ 输出新的字符串。

将编写好的程序以文件名string.c最终保存在实验7文件夹里。(需要存盘)

第 7 页 共 10 页

38563235.doc (匡珍春制作)

编程实例7-7:形成并输出如下矩阵:

【算法提示】:① 要形成上述矩阵需用5*5的二维数组; ② 该数组中每个元素的值的形成规律为:

? 数组中“行下标值<=列下标值”的元素(即对角线和对角线之上的各元素)其值为1; ? 数组中“行下标值>列下标值”元素的值为(行下标-列下标+1)

将编写好的程序以文件名phalanx.c最终保存在实验7文件夹里。(需要存盘)

编程实例7-8:以下程序完成的功能是输出如下所示的图形(即杨辉三角,该程序可输出10行):

程序清单:

#include #define N 11 void main( ) { int i, j, a[N][N]; printf(“\\n”); for(i=1; i

for(i=3; i

38563235.doc (匡珍春制作)

for(j=1; j<=i; j++) printf(\ printf(“\\n”); } }

【说明】:程序中的 代表空格,请编写程序输出以下图形(要求输出15行的杨辉三角):

【分析】:杨辉三角形是(a+b)n展开后各项的系数。例如: (a+b)0展开后为1 系数为1

(a+b)1展开后为a+b 系数为1,1 (a+b)2展开后为a2+2ab+b2 系数为1,2,1 (a+b)3展开后为a3+3a2b+3ab2+b3 系数为1,3,3,1 (a+b)4展开后为a4+4a3b+6a2b2+4ab3+b4 系数为1,4,6,4,1 以上就是杨辉三角形的前5行,杨辉三角形各行的系数有以下的规律: (1) 各行第一个数都是1;

(2) 各行最后一个数都是1,即每一行对角线(即行标等于列标)上的值都为1;

(3) 从第3行起,除上面指出的第一个数和最后一个数外,其余各数是上一行同列和前一列

两个数之和。例如第4行第2个数“3”是第3行第2个数和第3行第1个数之后。可以这样表示:a[i][j]=a[i-1][j]+a[i-1][j-1],其中i为行数,j为列数。

将编写好的程序以文件名为yanghui.c最终保存在实验7文件夹里。(需要存盘)

[实验任务四]:通过设计几个实际例子熟悉一维数组和函数的综合编程方法以及二维数组、函数和常用算法的的综合编程方法。

设计程序实例7-1:学生成绩统计(一维数组和函数综合编程练习)

从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别统计下列内容:

(1)统计不及格人数并打印不及格学生名单;

第 9 页 共 10 页

38563235.doc (匡珍春制作)

(2)统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单; (3)统计各分数段的学生人数及所占的百分比;

将编写好的程序以文件名为cjtj.c最终保存在实验7文件夹里。(需要存盘)

【说明】:数组的一个重要的应用是用数组作函数变元,当数组作函数变元使用时,与普通变量作函数变元的区别在于,传入函数的是数组的首地址,此时,函数中的代码是对实参数组操作的,如果发生修改,则修改的是实参数组的实际内容。

【本题编程提示】:

(1)用num[i]存放第i+1个学生的学号,用score[i]存放第i+1个学生的成绩。设置计数器count,当score[i]<60分时,计数器count计数一次,并打印num[i]和score[i]。

(2)先计算全班平均分aver,当第i个学生的成绩score[i]>=aver时,打印num[i]和score[i]。 (3)将成绩分为六个分数段,60分以下为第0段,60~69为第1段,70~79为第2段,80~89为第3段,90~99为第4段,100分为第5段,因此,成绩与分数段的对应关系为:

?0分数段???(成绩?50)/10成绩?60时

成绩??60时各分数段的学生人数保存在数组stu中,用stu[i]存放第i段的学生人数。对于每个学生的成绩,先计算出该成绩所对应的分数段,然后将相应的分数段的人数加1,即stu[i]++。 设计程序实例7-2:成绩排名次(二维数组、函数和常用算法综合编程练习)

某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过30人参加考试。考试后要求: (1)计算每个学生的总分和平均分; (2)按总分成绩由高到低排出成绩的名次;

(3)打印出名次表,表格内包括学生编号、各科分数、总分和平均分; (4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。 将编写好的程序以文件名为cjrank.c最终保存在实验7文件夹里。(需要存盘) 【本题编程提示】:

用二维数组score存放每个学生各门课程的成绩,用一维数组num存放每个学生的学号,用一维数组sum存放每个学生的总分,用一维数组aver存放每个学生的平均分。 (1)用函数编程实现计算每个学生的总分;

(2)用函数编程实现按总分由高到低对学生成绩排序,注意:排序时,一维数组sum元素的变化应连同二维数组score和一维数组num和aver一起变化;

(3)用函数编程实现查找学号为k的学生在班级中的排名名次及相关成绩等信息,找不到时返回-1值。

★作业上交(千万不要忘记):

C程序编译、连接、运行成功后,请务必将源程序(扩展名为.C、存于E:盘以本人姓名为名称的文件夹下,如E:\\匡珍春\\c01.c)复制到K:盘对应的文件夹中,如K(01):\\ 工业109105匡珍春\\实验7,才算上交作业。

注:为了方便自己使用,不妨将源程序备份到可移动存储器上(如U盘、手机卡等)

第 10 页 共 10 页

本文来源:https://www.bwwdw.com/article/rhy2.html

Top