《C语言实验报告 数组.doc》由会员分享,可在线阅读,更多相关《C语言实验报告 数组.doc(12页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、学 生 实 验 报 告 学 院: 软件与通信工程学院 课程名称: C语言与程序设计 专业班级: 通信121 姓 名: 学 号: 学生实验报告(4)学生姓名学号同组人实验项目函数必修 选修演示性实验 验证性实验 操作性实验 综合性实验实验地点M002实验仪器台号指导教师 实验日期及节次周一56节课一、实验综述1、实验目的及要求1一维数组和二维数组的定义方法,以及其元素的访问形式2用字符数组来处理字符串及字符串处理函数3掌握数组处理中的有关排序和查找算法2、实验仪器、设备或软件 计算机、VC+6.0、office、相关的操作系统等。二、实验过程(实验步骤、记录、数据、分析)实验题目:1用冒泡法将从
2、控制台输入的10个学生的成绩从高到低进行排序;输入一个学生的成绩,插入到已排好序的学生成绩数组中去;最后将排好序的成绩单进行反序存放。(一)、程序如下:#includevoid order(int n,int a)int i,j,t;for(i=0;i=n-2;i+)for(j=1;jaj)t=aj-1;aj-1=aj;aj=t;void insert(int n,int a)order(n,a);void main()int a11,i;for(i=0;i=0;i-)printf(%2d ,ai);putchar(n);printf(Enter a students grade:);scan
3、f(%d,&a10);insert(11,a);for(i=0;i=10;i+)printf(%2d ,ai);putchar(n);(二)、在VC+中输入程序并编译它。如图:程序没有错误(三)、结论1、实验结果:2、分析讨论: (1)此道实验题主要是让我们学会使用冒泡法将一组无序的数据按照一定的顺序(由小到大或有大到小)进行排列:先两个两个(邻近的两个数据)比较,使得每次最大的数总在前面或后面(或最小的数总在前面或后面),这样,经过n*(n-1)/2次的比较之后,所有的数据将会按照一定顺序排列。(2)本题中包含多个实验项目,但每个实验项目之间又有一定的联系。在已排好顺序的学生成绩中插入一个学
4、生成绩并重新排序,可以考虑采用调用刚刚排序的函数,避免再次编写类似的程序。(3)此实验让我对数组最为函数参数有了更加深刻的了解。函数实参和形参变量的数据类型和形式必须相同。作为函数实参的可以是数组元素或数组名,当作为函数实参的是数组名时,形参变量也必须是数组名,实际上,此时,实参与形参之间的值传递是将实参数组的起始地址(指针值)传递给形参变量。(四)、指导教师评语及成绩:2. 编写程序,将两个字符串连接起来,不使用strcat()函数。(一)、程序如下:#includevoid main()char a80,b80;int i=0,j=0;gets(a);gets(b);while(ai!=0
5、)i+;ai= ;while(bj!=0)a+i=bj+;a+i=0;puts(a);(二)、在VC+中输入程序并编译它。如图:三、结论1、实验结果:2、分析讨论: (1)本次实验使用了puts和gets函数来代替printf和scanf函数进行输出和输入,带来了极大的方便。puts函数在进行字符数组输出时遇到0才会停止输出,并且该函数在输出结束后自动回车换行,这一点有别于printf函数,却很方便;gets函数在从标准输入设备输入字符时,遇到换行符才会停止输入,若用scanf函数,则碰到空格符或者换行符就停止输入,对于本题,明显不符合题意,用gets函数则不会出现这样的情况。 (2)此外,由
6、于puts函数遇到0才会停止输出(这是正常输出)的特殊性,所以在连接时,必须将第一个字符数组中的第一个0修改为空格(或其他字符),并且连接完成后,必须加上一个0的元素,否则会有输出错误。(四)、指导教师评语及成绩:3、 (1) 求33矩阵的对角线元素之和。(一) 程序如下:#include#define N 3void main()int aNN,sum=0,i,j;printf(Please input an array:n);for(i=0;iN;i+)for(j=0;jN;j+)scanf(%d,&aij);for(i=0;iN;i+)for(j=0;jN;j+)if(i=j|i+j=N
7、-1) sum+=aij;printf(The sum of special elements is %dn,sum);(二)、在VC+中输入程序并编译它。如图: 程序没有错误(三)、结论1、实验结果:2、分析讨论: (1)对于二维数组元素值的读入,应使用双重循环来实现。 (2)二维数组定义时,数组长度必须是常量或者符号常量,不能是变量,这一点尤其要注意。 (3)矩阵处于对角线上的元素的下标要么相等,要么相加等于一常数,这一点是我们解题的关键。(四)、指导教师评语及成绩:3、(2) 从键盘输入一个099999之间的整数。它是一个几位数;将该数的各位数字按逆序输出。(一)、程序如下:#inclu
8、devoid main()int a5,x,i=0,j;printf(Please input an integer from zero to one thousand:n);scanf(%d,&x);while(x!=0)ai+=x%10;x=x/10;printf(它是一个%d位数n,i+);for(j=0;ji-1;j+)printf(%d ,aj);putchar(n);(二)、在VC+中输入程序并编译它。如图 程序没有错误(三)、结论1、实验结果:2、分析讨论: (1)持续使用求余运算可以分离出一个整数各个位数上的数。(2)持续使用整除(对于两整数而言)可以帮助判别一个整数是几位数。
9、(3)数组与数组之间不可以进行赋值运算,但数组元素可以被赋值,这一点暗示了strcpy函数存在的必要性。(7)编写一个函数void ad(int aMN)找出一个M行N列(M、N为符号常量)的二维数组a中的“鞍点”。在主函数中输入二维数组a的值,并将它作为实参调用ad函数。所谓“鞍点”是指该位置上的元素在该行上最大,而在该列上最小(一个二维数组中可能没有鞍点)。假设二维数组a中的所有整数都是不相等的。(一) 、程序如下:#include#define M 3#define N 3void ad(int aN)int max,i,j,k,s,r;for(i=0;iM;i+) s=1;max=ai
10、0;r=0;for(j=1;jmax) max=aij; r=j;for(k=0;kN;k+)if(maxakr)|(max=akr) s=0;else s=1;break;if(s=0) printf( The ad is %dn,max);if(s=1) printf(There is no adn);void main()int i,j,aMN;printf(Please input an array:n);for(i=0;iM;i+)for(j=0;jN;j+)scanf(%d,&aij);ad(a);(二)、在VC+中输入程序并编译它。如图(三)、结论1、实验结果:2、分析讨论:二维数组作为函数参数时,实参应是数组元素或者数组名。形参数组名和实参数组名指向的相同的内存单元,形参数组元素的值被修改,实参数组相对应元素的值也会做相同的修改。所以使用二维数组名作为函数实参时应特别小心。(四)、指导教师评语及成绩: