西南科技大学计算机学院C程序设计实验指导书
依此类推,共进行9轮比较,a[0]~a[9]中已按由大到小的顺序存放。
2、 排序完成后,这15个成绩按由大到小的顺序排列,此时用折半查找法查找某一个成绩效率较高。
折半查找法算法思想:假如有以按由小到大排好序的9个数,a[0]~a[8],其值分别为:1 3 5 7 9 11 13 15 17 若想查3是否在此数组中,可以先找出表列中居中的数,即a[4],将要找的数3与a[4]比较,a[4]值是9,发现a[4]>3,显然3应当在a[0]~a[4]范围内,而不会在a[5]~a[8]范围内。这样就可以缩小查找范围,甩掉a[5]~a[8]这一部分,即将查找范围缩小为一半。再找a[0]~a[4] 中居中的数,即a[2],将要找的数与a[2] 比较,a[2]的值是5,发现a[2]>3,显然3应当在a[0]~a[2]范围内。这样又将查找范围缩小了一半。再将3与a[0]~a[2]范围内居中的数a[1]比较,发现要找的数3等于a[1],查找结束。一共比较了3次。 [测试数据]
自己选择15数据输入。查找某一成绩时,分别选用在15个中的成绩和没有在15成绩中的数据测试。 [思考与扩展]
1、 将选择法排序与起泡法比较,分析它们的特点和效率。
2、 如果采用顺序查找的办法,即从第一个元素开始对比一直到找到与之相等的元素,和折半查找法相比,那个效率高?
3、 数组名作为函数参数,形参和实参的关系?
题目2 矩阵相乘
将两个给定的距阵(3X3)相乘得到另一个距阵并将其打印出来。提示:
?a11??a21?a ?31a12a?13?a22a?23a32a?33?3?b11b12??b21b22?bb32 X ?31b13??b23?b33?? =
?c11??c21?c?31c12c22c32c13??c23?c33??
k?1其中
要求:
1、从键盘输入两个矩阵,并输出结果矩阵。矩阵的输入输出要求行列对齐。 2、把矩阵相乘写成函数形式,在主函数中完成矩阵的输入输出。
cij??aikbkj
[实验提示]
1、定义三个数组a[2][2],b[2][2],c[2][2] 2、注意c数组的每一个元素
cij??aikbkjk?13
11
西南科技大学计算机学院C程序设计实验指导书
则应设计一个嵌套循环,一共有三个循环变量:i,j,k
for(i=0;i<3;i++;) {
for(j=0;j<3;j++;)
{
for(k=0;k<3;k++;) {
c[i][j] += a[i][k]*b[k][j]
} } } [测试数据]
自己选择一组数据输入。
题目3 字符串连接
编一程序,将两个字符串连接起来。结果取代第一个字符串。 要求
1、用字符数组,不用strcat函数; 2、用C标准中的strcat函数; [实验提示]
1、采用字符数组的方法。算法:定义的两个字符数组,第一个数组的大小应大于两个字符数组的有效大小。在串接时要注意字符处结束标志:如下图所示:
Str1[20]
I L O V E \\0 [实验提示]
1、采用字符数组的方法。算法:定义的两个字符数组,第一个数组的大小应大于两个字符数组的有效大小。在串接时要注意字符处结束标志:如下图所示:
Str1[20]
I L O V E \\0
Str2[10]
C + + \\0
串接后:str1[20]
I L O V E C + + \\0 串接过程:
1)首先找到第一个字符串的结束标志即末尾str1[5]。 2)执行str1[5+i] = str[i] 直到str[i] != ‘\\0’
12
西南科技大学计算机学院C程序设计实验指导书
3)给字符串str1末尾添加‘\\0’ 2、函数原形 strcat(char[],const char[])使用时实参只需给出数组名,如 strcat(str1,str2)使用时要确保str1数组不会溢出。 [测试数据]
自己选择一组数据输入。 [思考与扩展]
字符数组和字符串数组有什么联系或区别?
实验五 函数
5.1 实验类型:验证型实验 2学时 5.2 实验目的
1、掌握函数声明、定义和使用的方法; 2、掌握函数递归调用的方法;
3、掌握全局变量、局部变量、静态局部变量的概念和使用方法; 4、掌握定义头文件的方法,学会建立和调试多文件程序; 5、学习函数重载的实现;
3.3.3 知识点介绍
1、一个函数就是一个功能,在面向过程的结构化程序设计中,函数是程序的基本模块。 2、函数的定义:类型 函数名(参数表){}。
3、函数调用过程:程序先执行函数调用之前的语句,流程的控制转移到被调函数入口处,同时进行参数传递;执行被调函数种函数体的语句;流程返回调用函数的下一条指令处,将函数的返回值带回;接着执行主调函数中未执行的语句。
4、函数的嵌套调用:被调函数中又调用另一个函数。
5、函数的递归调用:一个函数直接或间接的调用自己,在实现递归时,再时间和空间上的开销比较大,但递归调用符合人们的思维,程序容易理解。
6、变量的作用域:全局变量和局部变量 变量的生存期:动态存储期,静态存储期
变量存储位置:内存中的静态区,内存中的动态区。寄存器存储。
13
西南科技大学计算机学院C程序设计实验指导书
3.3.4 实验内容
题目1 分析程序运行结果
输入下列程序,运行它,分析得到的结果。
要求:
1、阅读分析程序,给程序加上必要的注释 2、分析何以得出运行结果的原因
3、区分程序中那些是全局变量、局部变量、局部静态变量?这些变量的差别是什么? 4、说明函数调用时实参和形参对应关系及值传递方式? [实验提示]
运行时在程序中设置断点调试,观察各个变量值的变化以及函数的调用过程。 1、 设置断点调试你的程序观察函数调用的执行流程。具体做法是在函数调用语句处设置断点,再在该被调函数的函数体语句部分设置断点。
2、单步执行程序,观察程序的执行流程:函数调用时实参和形参的结合情况;程序从main函数转移到被调函数代码执行的及返回的流程,注意观察形参变量值的变化及形参变量的生存期。
14
西南科技大学计算机学院C程序设计实验指导书
[测试数据]
改变main( )函数中a的值令a = 10,改变func()函数中b的值令static int b=10;程序运行结果? [思考与扩展]
1、 将函数func()中的变量static int b=10;改为 int b,程序运行结果有什么变化。 2、 如果将main()函数中定义变量的语句 int a,b;移到程序第三行?程序运行结果有没有变化,为什么。
题目2 函数的递归调用和多文件结构
编写一个函数,求从n个不同的数中取r个数的所有选择的个数。其个数值为: 其中: n! = n*(n-1)*(n-2)*...*1。 1、基本要求:
主程序中设计一个循环,不断从输入接收n和r的值,计算结果并输出,当用户输入0 0时,程序结束;
能检查输入数据的合法性,要求n>=1并且n>=r; 2、分别用递归和非递归两种方式完成程序设计; 3、多文件结构实现
将上面用非递归方式写成的程序改成用多文件结构表示。要求将main()函数放在一个文件中,将另外两个函数放在另一个文件中,将函数原型说明放在一个头文件中。建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。 [测试数据]:
输入:5 3 输入:10 20 输入:-1 4 输入:50 3 输入:0 0
[实验提示]
1、利用一个非递归函数fn(int n)计算n!,利用另一个函数Cnr(int n, int r)计算Cnr,在该函数中调用fn(),
问题:你打算用什么样的变量类型来存放n!函数返回的值?注意各种数据类型的内存字长不同,整数能存放的数据范围有限,你如何解决?
可以用double数据类型来存放函数的计算结果 2、利用一个递归函数实现,利用公式实现递归: C(n,r) = C(n, r-1) * (n – r + 1) / r 注意递归结束条件: 如果 r = 0 ,则C(n, r) = 1 如果 r = 1, 则C(n, r) = n
15