通 知
各位老师:
本学期非计算机专业《C语言程序设计基础》课实验报告要求: 1. 统一用《武汉科技大学实验报告》本写。(和上学期05级用过的一样) 2. 本学期交三次实验报告。
① 循环结构程序设计。 ② 函数。 ③ 指针。
要求学生在完成以下实验报告,参考《C语言程序设计课程实践指导》中的要求认真完成。
实验1 循环结构程序设计
一、实验目的
1. 熟悉用while语句,do-while语句和for语句实现循环的方法。
2. 掌握在程序设计中用循环的方法实现各种算法(如穷举、迭代、递推等)。 3. 熟悉break语句和continue语句用法的不同之处。 二、实验内容
【例1】 打印出所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和正好等于该数本身。例如:153是一个“水仙花数”,因为153=13+53+33。
解题思路:根据题目要求只要分别求出一个三位数的个位、十位、百位上的数字,
然后判断是否满足(某一三位数a=a的百位的立方+a的十位的立方+a的个位的立方)这个公式,满足这个三位数就是“水仙花数”。 main( )
{ int a, b, c ,n ;
for(n=100 ; n<1000 ;n++) { a=n/100 ;
b=n/10-a*10 ; c=n ;
if(a*100+b*10+c==a*a*a+b*b*b+c*c*c)
printf(“]” , n) ;
} }
运行结果:
水仙花数是:153 370 371 407
【例2】以下程序,输出下三角形状的乘法九九表。
#include
for (i=1;i<=9;i++) /* 打印表头*/ printf(\printf(\ for (i=0;i<=50;i++)
printf(\ printf(\
for (i=1;i<=9;i++) /* 循环体执行一次,打印一行*/ { for (j=1;j<=i;j++)
printf(\ /* 循环体执行一次,打印一个数据*/ printf(\ /* 每行尾换行*/ }
printf(\}
输入并执行该程序,观察输出结果,试着修改程序打印上三角形状的乘法九九表。
三、编程序并上机调试运行。
1.编写程序,分别用while循环、for循环和do_while循环计算12+22+...+n2的值。比较三个程序在循环控制上的特点。
2. 李先生岁数的平方与他的夫人的岁数之和是1053,而他的夫人的岁数的平方与他的岁数之和是873,请编写程序计算李先生及其夫人的岁数各是多少。
3. 输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。 要求:写出以上操作的主要步骤、使用的命令及实验小结
实验2 函数
一实验目的
1掌握定义函数的方法;
2掌握函数实参与形参的对应关系以及“值传递”的方式; 3掌握函数的嵌套调用和递归调用的方法;
4掌握全局变量和局部变量,动态变量和静态变量的概念和使用方法; 二、实验内容
【例1】:有5个人,第5个人说他比第4个人大2岁,第4个人说他对第3个人大2岁,第3个人说他对第2个人大2岁,第2个人说他比第1个人大2岁,第1个人说他10岁。求第5个人多少岁。
分析: 10 (n=1) age(n)=
age(n-1)+2 (n>1) 程序如下: main() {clrscr();
printf(\}
age(int n) { int c;
if (n==1) c=10; else c=age(n-1)+2; return c; } 结果:18
【例2】反向输出一个整数(非数值问题)
非数值问题的分析无法象数值问题那样能得出一个初值和递归函数式,但思路是相同的。 分析方法:
①简化问题:设要输出的正整数只有一位,则“反向输出”问题可简化为输出一位整数。 ②对大于10的正整数,逻辑上可分为两部分:个位上的数字和个位以前的全部数字。将个位以前的全部数字看成一个整体,则为了反向输出这个大于10的正整数,可按以下步骤: a、输出个位上的数字;
b、将个位除外的其他数字作为一个新的整数,重复a步骤的操作。 其中b问题只是对原问题在规模上进行了缩小——递归。 所以,可将反向输出一个正整数的算法归纳为:
if (n为一位整数)
输出n; else
{ 输出n的个位数字;
对剩余数字组成的新整数重复“反向输出”操作; } 程序如下: #include
void main() { void printn(int x); int n;
printf(\ scanf(\ if (n<0)
{n=-n;putchar('-');} printn(n); }
void printn(int x) /*反向输出整数x*/ {if (x>=0&&x<=9) /*若x为一位整数*/ printf(\ /*则输出整数x*/ else /*否则*/
{printf(\ /*输出x的个位数字*/
printn(x/10); /*将x中除个位数字外的全部数字形成新的x后,继续递归操作*/ } }
执行:Input n=12345 结果:54321
执行:Input n=-12479 结果:-97421
【讨论】Input n=123456 -6167
为什么:123456710=1 1110 0010 0100 00002
int类型的数实际只能存入16位,即1110 0010 0100 00002
第
1位为符号位,其余各位取反后再加1,得原码1001 1101 1100 0000 (真值-761610)
三、编程序并上机调试运行。
(1)写一个判别素数的函数,在主函数输人一个整数,输出是否素数的信息。
本程序应当准备以下测试数据:17、34、2、l、0。分别输人数据,运行程序并检查结果是否正确。
(2)用一个函数来实现将一行字符串中最长的单词输出。此行字符串从主函数传递给该函数。 (3)用递归法将一个整数n转换成字符串。例如,输入483,应输出字符串“483”。n的位数不确定,可以是任意的整数。
(4) 编写程序,计算下面公式并输出结果。
Cmn?n!
(n?m)!m!要求:(1)编写一个函数计算n!
(2)编写主函数,由键盘输入n和m,调用(1)中的函数完成计算。
(3)输入n和m要给出提示,并检查n和m的合理性,不合理的输入应输出错误信息,并不再进行计算。
(4)运行程序并计算
C、85C、72C1、8C7、7C08。
要求:写出以上操作的主要步骤、使用的命令及实验小结
实验三 指针
实验目的 1、 了解指针参数的特殊性。
2、 掌握函数、指针、数组的用法。 实验要求 1 .复习指针的定义与使用方法。复习函数指针和指针数组的使用方法。 2 .编写程序,运行程序并记录运行结果。 实验内容
1 、想使指针变量 pt1 指向 a 和 b 中的大者, pt2 指向小者,以下程序能否实现此目的?
swap(int *p1,int *p2) {
int *p;
p=p1;p1=p2;p2=p; }
main() {
int a,b;
scanf(“%d,%d”,&a,&b);