C程序设计实验报告
班级 一班 姓名 赵东珠 日期 2014年10月7日星期二 同组人 薛莲 指导教师 刘宝超 评分
一、实验名称:数组应用程序设计实验 二、实验内容(问题描述)
1) 改正下列程序的错误,使之具有如下功能:输入10个整数,按每行3个数输出这些整数,最后输出10个整数的平均值,保留1位小数。 #include
int a[10], av;/* av表示平均值*/ for(i=1; i<=10; i++) scanf(\; for(i=1; i<=10; i++) {
av = av + a[i]; printf(\;
if(i%3==0) printf(\; }
printf(\; }
2) 已有一个已排好序的数组(如{5,12,22,34,45,55,67,78,89,98}),要求输入一个数后,按原来排序的规律将它插入到该数组中,并用二分法查找新插入的数所在位置(下标)。假设:所有的数都互不相同。
3) 按数组初始化方法设置5名学生6门课程成绩(0~100),输出:
(1) 每个学生的平均成绩
(2) 【选作】每门课程的平均成绩
(3) 平均成绩最高的学生序号(有多个最高成绩时,只需输出一个,下同) (4) 【选作】平均成绩最高的课程序号
(5) 【选作】每门课的不及格率(不及格学生数比例) (6) 每个学生各门课成绩升序排序的结果
(7) 【选作】每个学生各课成绩中去掉一个最高分和最低分后的平均成绩
需解决的主要问题: 1)【实验内容1:计算平均值】
1.1) 数组元素的初始化 1.2) 确定数组下标的下限和上限,避免下标溢出 1.3) 平均值如何转换为实型数 2)【实验内容2:插入】 4.1) 插入点的确定
4.2) 插入点之后的数组元素的移动 4.3) 二分查找(一定会成功)
3)【实验内容3:二维数组数据处理】
3.1) 定义数组并初始化 3.2) 求二维数组行平均和列平均 3.3) 最大(最小)值及其序号的调整 3.4) 求二维数组中小于60的元素个数统计 3.5) 数据类型(成绩、平均成绩) 3.6) 问题(6)-(7)的程序框架:
/* N行M列int型二维数组s存放成绩,N:学生人数,M:课程门数 */
/* 长度为N的一位数组avgs存放每个学生各课成绩中去掉一个最高分和最低分后的平均成绩*/
for (i=0; i /* 求s[i][1]~s[i][M-2]的平均值,存放到avgs[i]中 */ } /* 输出 */ for (i=0; i for (j=0; j 三、主要思路(分析过程、算法) 1)实验一: Step1 : float av=0; ; Step4 :for(i=1; i<=10; i++)应改为for(i=0; i<10; i++) ; Step5 :scanf(\;应改为scanf(\; ; Step6 :if(i%3==0)应改为if(i%3==2) ; Step7 :printf(\应改为printf(\ ; 2)实验二: Step1 :输入的这个数插入数组时有三种情况,分别为:①该数小于数组中任何一 个数,插入最前面②该数大于数组中任何一个数,插入最后面③该数介于 数组中相邻两个数之间,插入中间 ; Step2 :先定义一个新的数组a[11],定义变量i,num,k,j,m。i表示数组下标, num表示输入的一个数,k表示数组下标,j表示数组下标。 Step3 :输出数组a[10]中的数据即a[11]中的前十个数据 ; Step4 :输入一个数num ; Step5 :针对输入一个数的第一种情况,将该数插入最前面,同时数组中原来的数 全部向后移一位。执行如下循环: for(i=9;i>=0;i--) { a[i+1]=a[i]; } a[0]=num; Step6 :针对输入一个数的第二种情况,将该数插入最后面,其他数不变。即直接 执行 a[N]=num; Step7 :针对第三种情况,利用for(j=0;j if(a[j] break; } } 找到插入该数字的位置。 Step8 :将插入该数字后后面的数字向后挪一位。 Step9 :插入该数字a[j+1]=num Step10:利用循环输出该数组for(i=0;i printf(\ printf(\ } Step11:用二分法查找下标位置先定义变量并初始化 left=0; right=N; Step12:二分法: while(left<=right) { m=(left+right)/2; if(a[m] left=m; }else if(a[m]>num) { right=m; } else { printf(\的位置是%d\\n\ break; } Step13:考虑到不合法的问题if(left>right) { m=-1; printf(\ } 2)实验三: Step1:首先定义变量i,j,sum,max_i,max_jave,max;定义数组stu_ave_array[5] C_ave_array[6];数组初始化 inta[5][6]={{50,60,70,80,90,95},{68,70,80,90,85,90},{70,80,60,80,90,95},{50, 80,70,48,98,67},{80,80,90,70,68,78}}; Step2:利用循环 for(i=0;i<5;i++) { printf(\ for(j=0;j<6;j++) printf(\ printf(\ } 输出如图所示数组。 Step3:求每名学生的平均成绩 for(i=0;i<5;i++) { sum=0; for(j=0;j<6;j++) { sum=sum+a[i][j]; } ave=(float)sum/6; stu_ave_array[i]=ave; Step4:求每门课程的平均成绩 for(j=0;j<6;j++) { sum=0; for(i=0;i<5;i++) { sum=sum+a[i][j]; } ave=(float)sum/5; C_ave_array[j]=ave; Step5:求平均成绩最高的学生序号 max=stu_ave_array[0]; max_i=0; for(i=0;i<5;i++) { if(stu_ave_array[i]>max) { max=stu_ave_array[i]; max_i=i; } } Step6:求平均成绩最高的课程序号 max=C_ave_array[0]; max_j=0; for(j=0;j<6;j++) { if(C_ave_array[j]>max) { max=C_ave_array[j]; max_j=j; }