break;
case'-':
……
default:
……
}
[测试数据]
自己设计一组测试数据,要求覆盖switch选择结构的中所有路径即每条case语句都被执行一次。
[思考与扩展]
1、使用switch语句中的break起什么作用?
2、你还有更好的实现方法么?
实验三循环控制
题目1下面程序计算n!
要求:
1、看懂代码,添加必要的注释。
2、分别用fordo-while语句改写程序。
3、当程序运行时输入20,会遇到困难,请改写程序?
4、计算-1!
+2!
-3!
-…+20!
。
要求1)分别采用从左到右相加和从右到左相加的计算顺序;2)采用所有负项和所有正项分别相加
[实验提示]
1、设置断点调试程序。
在循环体语句部分设置几个断点,单步执行,观察需循环体语句的执行流程,即循环控制变量的变化,观察执行过程中个变量的值。
2、如果循环次数太大时,。
你应该设置合适的循环条件,使循环次数减少,否则单步执行完所有的循环次数太费时间,如某个循环共1000次,在调试时可以设置较小的循环次数10,待调试完毕再设置为1000。
[思考与扩展]
1、计算n!
时,当程序运行时输入20,会遇到困难,如何改写程序?
2、计算-1!
+2!
-3!
-…+20!
程序中使用的循环嵌套,可以用forwhiledo-while结构进行组合,有几种组合方式?
题目2计算生日时星期几
编写一个程序,只要输入年月日,就能回答那天是星期几。
[实验提示]
1、已知公元1年1月1日是星期一
2、算法提示:
如果输入的是2006年3月12日,计算方法是
(1)先计算从公元0001年初(0001-1-1)到2005年末(2005-12-31)共多少天,注意其中有闰年,闰年是366天,平年是365天。
闰年的判断条件满足(见教材例3.8题):
((year%4==0&&year%100!
=0)!
!
(year%400==0))
(2)然后再计算2006年1月1日到2006-3-12是多少天。
注意同样判断本年度是否闰年,即二月份是28天还是29天。
(3)上述两部分相加即从公元0001年初(0001-1-1)到2006年末(2006-3-12)的天数,用该天数模7(total%7)即得到星期数。
2、用户多次循环输入数据并计算可采用while语句实现:
//首先输入三个数据:
cout<<"pleaseenteryearmonthday:
"
cin>>year>>month>>day; //首先输入三个数:
年月日
while(year!
=0&&month!
=0&&month!
=0)
{
……//具体计算语句
//本次循环结束前再次输入三个数据(年月日),为下次循环计算做准备
cout<<"pleaseenteryearmonthday:
"
cin>>year>>month>>day;
}
[测试数据]
1、1年1月1日是星期一
2、2年1月1日是星期二
3、用上机日期
4、2000年1月1日是星期六
[思考与扩展]
1、用switch语句实现程序。
比较if和switch语句的区别。
2、对输入日期和理性检验,例如月份不能大于12,非闰年不得有2月29日,小月不得有4月31日
实验四数组
4.1实验类型:
验证型实验2学时
4.2实验目的
1、掌握一维数组和二维数组的定义、赋值和输入输出方法;
2、掌握字符数组和字符串的使用;
4.3知识点介绍
1、数组是有序数据的集合。
特点:
有序,元素必须是同一个类型,用下标标识每一个元素,数组在内存中占用一块连续的存储单元。
2、数组的定义:
定义时必须给出数组的大小(即数组元素的个数)。
数组使用时用下标标识特定的元素,注意使用时下标不要越界。
3、经常使用char类型的数组来处理字符和字符串。
字符数组和字符串数组的区别在于字符串数组有一个结束标志‘\0’.
4、常用的排序算法:
冒泡法和选择法。
4.4实验内容
题目1排序查找
用选择法对15个学生的成绩按从大到小的顺序排序,15个学生的成绩整数用scanf输入,如果输入的成绩不在[0,100]之间,则提示“输入错误”。
排序完成后,输入一个成绩,要求用折半查找法找出该成绩是该组中第几个元素的值(即第几名)。
如果该成绩不在数组中,则输出“无此成绩”。
[实验提示]
1、本题第一步首先对15个成绩排序,可使用冒泡法或选择法排序(冒泡排序算法见教材)。
选择法排序算法思想:
n原数组中选择最小的一个元素,把它和位于第一个位置的元素互换位置;然后,在剩下的n-1个元素中选择最小的一个元素,并把它和第一个位置的元素交换;不断重复这些过程,直到最后两个元素。
如:
设有10个元素a[0]~a[9],
第一轮:
将a[0]与a[1]~a[9]比较,若a[0]比a[1]~a[9]都小,则不进行交换,即无任何操作。
若a[1]~a[9]中有一个以上比a[0]小,则将其中最小的一个(假设为a[i])与a[0]交换,此时a[0]中存放了10个中的最小数。
第二轮将a[1]与a[2]~a[9]比较,将剩下的8个数中最小者a[i]与a[1]对换,此时a[1]中存放的是10个中第二小的数。
依此类推,共进行9轮比较,a[0]~a[9]中已按由大到小的顺序存放。
2、排序完成后,这15个成绩按由大到小的顺序排列,此时用折半查找法查找某一个成绩效率较高。
折半查找法算法思想:
假如有以按由小到大排好序的9个数,a[0]~a[8],其值分别为:
1357911131517
若想查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)相乘得到另一个距阵并将其打印出来。
提示:
X
=
其中
要求:
1、从键盘输入两个矩阵,并输出结果矩阵。
矩阵的输入输出要求行列对其。
2、把矩阵相承写成函数形式,在主函数中完成矩阵的输入输出。
[实验提示]
1、定义三个数组a[2][2],b[2][2],c[2][2]
2、注意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’
3)给字符串str1末尾添加‘\0’
2、函数原形strcat(char[],constchar[])使用时实参只需给出数组名,如strcat(str1,str2)使用时要确保str1数组不会溢出。
[测试数据]
自己选择一组数据输入。
[思考与扩展]
字符数组和字符串数组有什么联系或区别?
实验五函数
5.1实验类型:
验证型实验2学时
5.2实验目的
1、掌握函数声明、定义和使用的方法;
2、掌握函数递归调用的方法;
3、掌握全局变量、局部变量、静态局部变量的概念和使用方法;
4、掌握定义头文件的方法,学会建立和调试多文件程序;
5、学习函数重载的实现;
3.3.3知识点介绍
1、一个函数就是一个功能,在面向过程的结构化程序设计中,函数是程序的基本模块。
2、函数的定义:
类型 函数名(参数表){}。
3、函数调用过程:
程序先执行函数调用之前的语句,流程的控制转移到被调函数入口处,同时进行参数传递;执行被调函数种函数体的语句;流程返回调用函数的下一条指令处,将函数的返回值带回;接着执行主调函数中未执行的语句。
4、函数的嵌套调用:
被调函数中又调用另一个函数。
5、函数的递归调用:
一个函数直接或间接的调用自己,在实现递归时,再时间和空间上的开销比较大,但递归调用符合人们的思维,程序容易理解。
6、变量的作用域:
全局变量和局部变量
变量的生存期:
动态存储期,静态存储期
变量存储位置:
内存中的静态区,内存中的动态区。
寄存器存储。
3.3.4实验内容
题目1分析程序运行结果
输入下列程序,运行它,分析得到的结果。
要求:
1、阅读分析程序,给程序加上必要的注释
2、分析何以得出运行结果的原因
3、区分程序中那些是全局变量、局部变量、局部静态变量?
这些变量的差别是什么?
4、说明函数调用时实参和形参对应关系及值传递方式?
[实验提示]
运行时在程序中设置断点调试,观察各个变量值的变化以及函数的调用过程。
1、设置断点调试你的程序观察函数调用的执行流程。
具体做法是在函数调用语句处设置断点,再在该被调函数的函数体语句部分设置断点。
2、单步执行程序,观察程序的执行流程:
函数调用时实参和形参的结合情况;程序从main函数转移到被调函数代码执行的及返回的流程,注意观察形参变量值的变化及形参变量的生存期。
[测试数据]
改变main()函数中a的值令a=10,改变func()函数中b的值令staticintb=10;程序运行结果?
[思考与扩展]
1、将函数func()中的变量staticintb=10;改为intb,程序运行结果有什么变化。
2、如果将main()函数中定义变量的语句inta,b;移到程序第三行?
程序运行结果有没有变化,为什么。
题目2函数的递归调用和多文件结构
编写一个函数,求从n个不同的数中取r个数的所有选择的个数。
其个数值为:
其中:
n!
=n*(n-1)*(n-2)*...*1。
1、基本要求:
主程序中设计一个循环,不断从输入接收n和r的值,计算结果并输出,当用户输入00时,程序结束;
能检查输入数据的合法性,要求n>=1并且n>=r;
2、分别用递归和非递归两种方式完成程序设计;
3、多文件结构实现
将上面用非递归方式写成的程序改成用多文件结构表示。
要求将main()函数放在一个文件中,将另外两个函数放在另一个文件中,将函数原型说明放在一个头文件中。
建立一个项目,将这三个文件加到你的项目中,编译连接使你的程序正常运行。
[测试数据]:
输入:
53
输入:
1020
输入:
-14
输入:
503
输入:
00
[实验提示]
1、利用一个非递归函数fn(intn)计算n!
,利用另一个函数Cnr(intn,intr)计算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
[思考与扩展]
1、设置断点观察函数的递归调用和嵌套调用的执行流程。
2、递归函数的书写要点是什么?
3、在递归版本中,当n大到什么值时系统将发生栈溢出报错?
你觉得递归和非递归函数哪种好些?
,
4、多文件结构中头文件的作用是什么?
5、将程序划分为多个文件有什么好处?
1、对一种形式测试:
分别在有标识符和注释掉程序中的标识符定义两种情况下编译运行。
2、对第二种形式测试:
分别使表达式的值为0和非0两种情况下编译运行。
.
实验六指针
6.1实验类型:
验证型实验2学时
6.2实验目的
1、掌握指针的概念、学会定义和使用指针变量;
2、掌握引用型变量的概念、学会定义和使用引用型变量;
3、学习使用指针数组和指向数组的指针;
4、学习使用指向字符串的指针变量;
5、学习使用指针和引用给函数传递参数;
6.3知识点介绍
1、指针就是地址,一个变量的地址成为给变量的指针。
指针变量就是用来专门存放另一个变量的地址。
若果一个指针变量存放另一个变量的地址,我们就说指针变量指向该变量。
2、指针变量的类型是其指向变量或常量的数据类型,指针变量本身在内存中只占四个字节。
3、指针作为函数参数时不会改变实参指针变量的值,但可以改变实参所指向变量的值。
4、数组名代表数组的首地址,是一个指针常量。
可以用一个指针变量指向一个数组,通过该指针可以对数组任意操作。
5函数指针:
函数名代表函数函数的入口地址,可以定义指向函数的指针变量用来指向函数。
指针函数:
函数返回值是指针(地址)。
6、指针运算灵活,但容易出错。
7、变量的引用就是变量的别名。
引用作形参不是传值,而是传递别名,即形参是实参的别名,并没有为形参分配存储单元。
6.4实验内容
题目1程序分析
输入下列程序,运行它,分析得到的结果。
要求:
1、给本题代码加上适当的注释,编译调试,分析说明程序运行结果。
2、如果将swap函数改为如下形式,程序运行结果是什么?
分析说明。
voidswappionter(int*p1,int*p2)
{
int*temp;
temp=p1;
p1=p2;
p2=temp;
}
3、如果将swap函数改为如下形式,主函数中函数调用改为:
swap(iv1,iv2);
程序运行结果是什么?
分析说明。
voidswap(int&p1,int&p2)
{
inttemp;
temp=p1;
p1=p2;
p2=temp;
}
[实验提示]
1、注意区分指针的定义,指针的引用。
2、注意区分指针的值和指针指向对象的值。
[测试数据]
自己修改程序中部分代码,调试运行。
[思考与扩展]
1归纳说明普通变量作形参、指针作形参、引用作函数形参得区别。
题目2班级课程成绩计算
一个班有5名学生,每个学生修了五门课,1)求每个学生的平均成绩,并输出每个学生的学号,每门课程的成绩及平均直。
2)求某门课程的平均分