实验四报告
一、实验结论:
Part1 ~ Part4
(有些老师总结的很完美,就直接套用了)
1.数组名作为函数参数时,形参、实参的语法形式书写注意事项:
函数声明和函数定义中,函数名init后面括号里出现的是形式参数,数组名后面要加[ ]。
即:void init(int a[], int n, int value);
函数调用中,函数名init后面括号里出现的是实际参数,直接写数组名。
即:init(b, N, -1);
2.函数调用和参数传递过程
![](https://img2018.cnblogs.com/blog/1617989/201904/1617989-20190425164222993-1114843008.png)
3.对冒泡法排序算法的理解,尤其是边界条件的理解和归纳总结:
冒泡法的算法思想:
把一组数据中相邻的两个数进行比较,较大的数放到后面。
这样,经过一轮以后,最大的数就放到了最后。
把剩余的数,再进行两两比较,经过第2轮后,第2大的数就放到了倒数第二的位置。
边界条件的理解和归纳总结:
用冒泡法对n个数小→大排序,共需扫描(n-1)遍,第i遍扫描时需要比较(n-i)次。
4.c语言支持在对数组初始化时,只初始化一部分元素。这种情形下,剩余没有被初始化的元素值,系统自动设为0。
5.sizeof是c语言中的运算符,用于计算数据占用的字节数。表达式sizeof(a) / sizeof(a[0])用于计算数组元素的个数。其中:
sizeof(a)计算数组a占用的总的字节数
sizeof(a[0])计算数组元素a[0]占用的字节数
由于数组中元素类型相同,每一个元素占用的字节数都是相同的。所以,这样就可以计算出一共有多少个元素。
同理,使用sizeof(a)/sizeof(int)也可以。因为这里每一个数组元素是int型,sieof(int)计算出一个int型数据占用的字节数。
6.const:以这个为例const int i=100;
这表示i的值不能被改变,也就是常变量,如果你在程序中再给i赋值,比如i=200;
这就会报错。也可用在函数上,格式:int sort(int ,int) const{}
用处:让不想改变的变量不被无意或有意的改变
这就会报错。也可用在函数上,格式:int sort(int ,int) const{}
用处:让不想改变的变量不被无意或有意的改变
Part5: 编程练习
练习1:补全程序,查找一组整型数据的最大值。
// 功能描述:输入一组整数,输出最大值 #include <stdio.h> int findMax(int a[], int n); // 函数声明 const int N=5; int main() { int a[N]; int max, i; printf("输入%d个整数: \n", N); // 利用循环输入N个整数给数组a // 补足程序1 for(i=0; i<N; i++) scanf("%d",&a[i]); // 调用子函数max求数组a的最大元素值,并赋值给max // 补足程序2 max=findMax(a, N); // 输出最大值 printf("数组a中最大元素值为: %d\n\n", max); return 0; } // 函数定义 // 功能描述:找出整型数组a中元素的最大值,并返回次此最大值 // 补足函数findMax()的实现部分3 int findMax(int x[],int n ){ int i,max; max=x[0]; for (i=1;i<n;i++){ if(max<x[i]) max=x[i]; } return max; }
运行结果:
![](https://img2018.cnblogs.com/blog/1617989/201904/1617989-20190425180352447-1462252441.png)
练习2:补全程序,使用冒泡法对字符数组由大到小排序。
#include <stdio.h> const int N=4; void output(char x[], int n); // 函数声明 // 排序函数声明 // 补足代码1 void bubbleSort( char b[], int n); int main() { char string[N] = {'2','0','1','9'}; int i; printf("排序前: \n"); output(string, N); // 调用排序函数对字符数组中的字符由大到小排序 // 补足代码2 bubbleSort(string, N); printf("\n排序后: \n"); output(string, N); printf("\n"); return 0; } // 函数定义 // 函数功能描述:输出包含有n个元素的字符数组元素 // 形参:字符数组,以及字符数组元素个数 void output(char x[], int n) { int i; for(i=0; i<N; i++) printf("%c", x[i]); } // 函数定义 // 函数功能描述:对一组字符由大到小排序 // 形参:字符数组,以及字符数组元素个数 // 补足代码3 void bubbleSort( char b[], int n){ int j,k; char t; for(j=0;j<n;j++){ for(k=0;k<n-1-j;k++){ if(b[k]<b[k+1]){ t=b[k+1]; b[k+1]=b[k]; b[k]=t;} } } }
运行结果:
二、实验反思
(1)在part5练习中,第一次编程中未把max=findMax(a, N);中的“max=”导致运行结果不对,最后去看了其他同学的报告,才知道问题出在哪里。
现在针对问题,总结一下return的用法作用:
1.返回值,这个返回值是和函数的类型有关的,函数的类型是什么,他的返回值就是什么。
例:主函数int main()
{ }这里就必须有一个return,只有void时可以不用返回值。
2.功能函数
int fun()
{
return 1;
}
这个时候fun函数的作用就是返回一个int 类型的值,
例:主函数int main()
{ }这里就必须有一个return,只有void时可以不用返回值。
2.功能函数
int fun()
{
return 1;
}
这个时候fun函数的作用就是返回一个int 类型的值,
可以直接拿来用
如int a=fun();
这里就相当于int a=1;
3。return后面的语句不会执行,我们可以用它来结束程序
比方找出三个数种最大的一个数
void main
{
int a,b,c;
if(a>b)
if(b>c)
{
return printf("最大值为%d",a);
}
.....
}
在这里if(b>c)
我们就可以直接得出a是最大了,就没必要执行下面的语句了,return就起到了终止语句的作用了。
这里就相当于int a=1;
3。return后面的语句不会执行,我们可以用它来结束程序
比方找出三个数种最大的一个数
void main
{
int a,b,c;
if(a>b)
if(b>c)
{
return printf("最大值为%d",a);
}
.....
}
在这里if(b>c)
我们就可以直接得出a是最大了,就没必要执行下面的语句了,return就起到了终止语句的作用了。
(2)part5练习二,因为if后面语句的小括号没有打,导致整个运算结果出错。在以后的学习实验中应更加注意细节。
#include <stdio.h> const int N=4; void output(char x[], int n); // 函数声明 // 排序函数声明 // 补足代码1 void bubbleSort( char b[], int n); int main() { char string[N] = {'2','0','1','9'}; int i; printf("排序前: \n"); output(string, N); // 调用排序函数对字符数组中的字符由大到小排序 // 补足代码2 bubbleSort(string, N); printf("\n排序后: \n"); output(string, N); printf("\n"); return 0; } // 函数定义 // 函数功能描述:输出包含有n个元素的字符数组元素 // 形参:字符数组,以及字符数组元素个数 void output(char x[], int n) { int i; for(i=0; i<N; i++) printf("%c", x[i]); } // 函数定义 // 函数功能描述:对一组字符由大到小排序 // 形参:字符数组,以及字符数组元素个数 // 补足代码3 void bubbleSort( char b[], int n){ int j,k; char t; for(j=0;j<n;j++){ for(k=0;k<n-1-j;k++){ if(b[k]<b[k+1]) t=b[k+1]; b[k+1]=b[k]; b[k]=t; } } }