实验7 数组的应用.doc_第1页
实验7 数组的应用.doc_第2页
实验7 数组的应用.doc_第3页
实验7 数组的应用.doc_第4页
实验7 数组的应用.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

bb7449657d9225215f97462023b36fdc.pdf (匡珍春制作)实验七 数组的应用(4学时)实验前必须做的操作新建文件夹:1、先在对应的K:盘上建立一个父文件夹(用来存放本人整个学期的作业),格式为:“专业+班级+学号+姓名”,如:航海1091班、学号为05的匡珍春同学,其父文件夹名称为:航海109105匡珍春,然后在此父文件夹下建立子文件夹,名称为:实验7(用来存放实验7需要上交的文件)。2、在E:盘上建立一个以本人姓名为名称的文件夹(本次实验的工作文件夹),例如:E:匡珍春【实验目的】1、 掌握一维数组和二维数组的定义、初始化、数组元素的引用及数组的输入输出方法;2、 掌握与数组有关的算法(如排序算法);3、 熟悉循环处理语句与数组处理语句结合的方法;4、 掌握字符数组和字符串函数的使用;5、 巩固VC的调试方法,熟练掌握包括断点的设置和取消,运行到光标处等跟踪调试程序的方法。【实验内容】实验任务一:断点的设置和取消、运行到光标处等跟踪调试程序的方法练习程序跟踪调试实例7-1:调试示例(请仔细按以下各步骤进行操作):从键盘输入一个正整数n(0n=9)和一组(n个)有序的整数,再输入一个整数x,把x插入到这组数据中,使得该组数据仍然有序。源程序(有错误的程序)#include void main( ) int i, j, n, x, an; printf(输入数据的个数n:); scanf(%d, &n); printf(输入%d个整数:, n); for(i = 0; i n; i+) scanf(%d, &ai); printf(输入要插入的整数:); scanf(%d, &x); for(i = 0; i ai) continue; j = n - 1; while(j = i) /* 调试时设置断点 */ aj = aj+1; j+; /* 调试时设置断点 */ ai = x; break;if(i = n) an=x;for(i = 0; i n + 1; i+) printf(%d , ai); putchar(n); 运行结果(改正错误后程序的运行结果)输入数据的个数n:5输入5个整数:1 2 4 5 7输入要插入的整数:31 2 3 4 5 7算法提示:先找到插入点,从插入点开始,所有的数据顺序后移,然后插入数据;如果插入点在最后,则直接插入(说明插入的数排在该组数据中的最后)。【操作步骤】:(1)输入源程序,并以error7_1.c文件名最终保存在实验7文件夹里,编译程序,出现错误信息:以上错误信息指出:定义数组a时,数组长度必须是常量。程序中的数组定义错误的用了an,改为a10后,重新编译和连接,没有出现错误信息。(2)调试程序开始,设置2个断点,具体位置见源程序的注释。(3)单击(go),运行程序,依次输入5和1 2 4 5 7,以及3,程序运行到第一个断点,在Watch窗口观察输入的a数组和插入的数x均正确,而且3 4(xa2),需要将a2及其后面的数据顺序后移,然后把3插入到a2中。(4)再单击(go),程序运行到第二个断点,在Watch窗口观察aj和aj+1的值均是一个负数,这显然不对。仔细分析,算法要求数组元素后移,而程序中aj=aj+1是前移,而且j+也同样有问题,只要加一次,数组下标就越界了。(5)找出问题后,单击(Stop Debugging )停止调试,把aj=aj+1改为aj+1=aj,j+改为j-后,重新编译和连接,没有错误和警告。(6)单击(Rstart ),重新开始调试,并取消第一个断点,单击(go),程序运行到断点,Watch窗口显示aj=5和aj+1=7,排列正确。(7)再单击(go),程序运行到断点,观察Watch窗口中aj和aj+1的值均排列正确。(8)单击(Step Over)2次,程序跳出while循环,箭头指向了要插入数据的语句。(9)再单击(Step Over),程序跳出for循环,在Watch窗口观察a数组的元素排列正确。(10)把光标放在最后一行,单击(Run to Cursor),程序运行到最后,输出1 2 3 4 5 7,运行结果正确。(11)单击(Stop Debugging (Shift F5)),程序调试结束。程序跟踪调试实例7-2:输入一个以回车结束的字符串(少于80个字符),将它的内容颠倒过来再输出。如ABCD 颠倒为DCBA。源程序(有错误的程序)#include void main( )int i, k, temp; char str ; printf(input a string: ); i = 0; while(stri = getchar( ) != n) i+; stri = 0; k = i - 1; for(i = 0; i k; i+) /* 调试时设置断点 */ temp = stri; stri = strk; strk = temp; k+; /* 调试时设置断点 */ for(i = 0; stri != 0; i+) putchar(stri);printf(n);运行结果(改正错误后程序的运行结果)Welcome to you!uoy ot emocleW【操作步骤】:(1)输入源程序,并以error7_2.c文件名最终保存在实验7文件夹里,编译程序,出现错误信息:双击该出错信息,箭头指向第5行,指出定义数组str时,长度不确定。因为程序中错误地用了str ,改为str80后,重新编译和连接,没有出现错误信息。(2)调试程序开始,设置2个断点,具体位置见源程序的注释。(3)单击(go),运行程序,输入Welcome to you!,程序运行到第一个断点,在Watch窗口输入str,显示的内容和输入一致。(4)再单击(go),程序运行到第二个断点,在Watch窗口观察第1个字符和最后一个字符的调换是否正确,输入str0显示惊叹号!,输入strk-1显示W,正确。(5)再单击(go),程序再次运行到第二个断点,在Watch窗口观察第2个字符和倒数第2个字符的调换是否正确,输入str1显示0,不正确,输入strk-1显示e,正确。仔细分析for循环体,两头对调不能写成k+,应该是k-。(6)找出问题后,单击(Stop Debugging )停止调试,把k+改为k-后,重新编译和连接,没有错误和警告。(7)单击(Rstart ),重新开始调试,并取消第一个断点,单击2次(go),程序运行到断点,Watch窗口中显示字符串str为!ulcome to yoeW,说明前2次对调正确。(8)取消断点,把光标放在最后一行,单击(Run to Cursor),程序运行到最后,输出!uoy ot emocleW,运行结果正确。(9)单击(Stop Debugging (Shift F5)),程序调试结束。 实验任务二:补充完整程序,掌握C语言中与数组有关的算法。程序填空实例7-1:调试下面的程序,将程序中/-N-/删除,并填上正确的内容,使其程序能输出正确的结果。程序调用函数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文件夹里。(需要存盘)程序填空实例7-2:以下程序以每行输出8个数据的形式输出a数组。将填空后完整的程序以文件名为blank7_2.c保存在实验7文件夹里。(需要存盘)程序填空实例7-3:以下程序将数组中的数据按逆序存放。将填空后完整的程序以文件名为blank7_3.c保存在实验7文件夹里。(需要存盘)#include #define SIZE 12void main( ) int aSIZE, i, j, t; for(i=0; iSIZE; i+) scanf(“%d”, ); /*读入数到a数组中*/ i=0; j= ; while (ij) t=ai; ; ;i+;j ;for(i=0; iSIZE; i+) printf(“%3d”, ai);printf(“n”);程序填空实例7-4:假设a数组中的数按由小到大的顺序存放,以下程序把a数组中相同的数删得只剩下一个,然后以每行5个数的形式输出a数组中的数,请填空。将填空后完整的程序以文件名为blank7_4.c保存在实验7文件夹里。(需要存盘)#include #define MAX 20void main( ) int aMAX, i, j, n; for(i=0; iMAX; i+) scanf(“%d”, ); /*读入数到a数组中*/n=i=MAX-1;while( ) if (ai=ai-1) /*相同删除*/ for(j= ; j=n; j+) a =aj; n ; i ;for(i=0; i=n; i+) if ( ) printf(“n”); printf(“%3d”, ai);printf(“n”);程序填空实例7-5:下面程序的功能为求主、次对角线元素之和。请将程序补充完整,然后上机调试。将填空后完整的程序以文件名为blank7_5.c保存在实验7文件夹里。(需要存盘)#include void main( ) int a33=9,7,5,3,1,2,4,6,8; int i, j, s1=0, s2=0; for(i=0; i3; i+)for(j=0; j3; j+) if( ) s1=s1+aij;if( ) s2=s2+aij;printf(“s1=%d, s2=%dn”, s1, s2); 实验任务三:掌握函数的嵌套调用和递归调用的程序的执行过程,会使用嵌套调用和递归调用编写程序;编程实例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-7:形成并输出如下矩阵:【算法提示】: 要形成上述矩阵需用5*5的二维数组; 该数组中每个元素的值的形成规律为: 数组中“行下标值列下标值”元素的值为(行下标-列下标+1)将编写好的程序以文件名phalanx.c最终保存在实验7文件夹里。(需要存盘)编程实例7-8:以下程序完成的功能是输出如下所示的图形(即杨辉三角,该程序可输出10行):程序清单:#include #define N 11void main( ) int i, j, aNN; printf(“n”); for(i=1; iN; i+) aii=1;ai1=1;for(i=3; iN; i+)for(j=2; j=i-1; j+) aij=ai-1j-1+ai-1j;for(i=1; iN; i+) for(j=1; j=N-i; j+) printf( );for(j=1; j=i; j+) printf(%d , aij); 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个数之后。可以这样表示:aij=ai-1j+ai-1j-1,其中i为行数,j为列数。将编写好的程序以文件名为yanghui.c最终保存在实验7文件夹里。(需要存盘) 实验任务四:通过设计几个实际例子熟悉一维数组和函数的综合编程方法以及二维数组、函数和常用算法的的综合编程方法。设计程序实例7-1:学生成绩统计(一维数组和函数综合编程练习)从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别统计下列内容:(1)统计不及格人数并打印不及格学生名单;(2)统计成绩在全班平均分及平均分之上的学生人数并打印其学生名单;(3)统计各分数段的学生人数及所占的百分比;将编写好的程序以文件名为cjtj.c最终保存在实验7文件夹里。(需要存盘)【说明】:数组的一个重要的应用是用数组作函数变元,当数组作函数变元使用时,与普通变量作函数变元的区别在于,传入函数的是数组的首地址,此时,函数中的代码是对实参数组操作的,如果发生修改,则修改的是实参数组的实际内容。【本题编程提示】:(1)用numi存放第i+1个学生的学号,用scorei存放第i+1个学生的成绩。设置计数器count,当scorei=aver时,打印numi和scorei。(3)将成绩分为六个分数段,60分以下为第0段,6069为第1段,7079为第2段,8089为第3段,9099为第4段,100分为第5段,因此,成绩与分数段的对应关

温馨提示

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

评论

0/150

提交评论