《程序设计基础(C语言)》实验指导书
实验课程名称:程序设计基础
英文名称: Foundation of computer programming 实验指导教师:刘小明
学时:6
适用专业:机电一体化专业专科
实验1 循环结构程序设计
一、实验目的
1. 熟悉用while语句,do-while语句和for语句实现循环的方法。
2. 掌握在程序设计中用循环和数组结构的方法实现各种算法(如穷举、迭代、递推等)。
3. 熟悉break语句和continue语句用法的不同之处。
二、实验内容
【1】打印出所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和正好等于该数本身。例如:153是一个“水仙花数”,因为153=13+53+33。
解题思路:根据题目要求只要分别求出一个三位数的个位、十位、百位上的数字,然后判断是否满足(某一三位数a=a的百位的立方+a的十位的立方+a的个位的立方)这个公式,满足这个三位数就是“水仙花数”。
#include <stdio.h>
void main ()
{
int a, b, c, n;
for(n = 100; n < 1000; n++) { a = n / 100; b = n / 10 – a * 10; c = n % 10; if (n == a*a*a + b*b*b + c*c*c) printf(“%5d”, n);
}
}
输入并执行该程序,观察输出结果。
【2】以下程序,输出下三角形状的乘法九九表。
#include <stdio.h>
void main ()
int i, j; printf ("%3c |", ' '); /* 打印表头行首 */ for (i = 1; i <= 9; i++) /* 打印表头 */ printf ("%3d", i); printf ("\n"); for (i = 0; i < 32; i++) printf ("%c", '-'); printf ("%c", '\n'); for (i = 1; i <= 9; i++) /* 循环体执行一次,打印一行 */ { printf ("%3d |", i); /* 打印行首 */ for (j = 1; j <= i; j++) /* 循环体执行一次,打印一个数据 */ printf ("%3d", i * j); printf ("\n"); /* 每行尾换行 */ }
}
输入并执行该程序,观察输出结果,试着修改程序打印上三角形状的乘法九九表。
三、选做题(至少选一题)
1. 编写程序,用循环和数组计算1+2+...+n的值。
2. 李先生岁数的平方与他的夫人的岁数之和是1053,而他的夫人的岁数的平方与他
的岁数之和是873,请编写程序计算李先生及其夫人的岁数各是多少。(32,29)
3. 输入一行字符,分别统计出其中的英文字母、空格、数字和其它字符的个数。 222
实验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)
程序如下:
#include <stdio.h>
int age (int n)
if (n == 1) return 10; else return age (n - 1) + 2;
}
void main ()
{
printf ("age: %d\n", age (5));
}
输出结果?
【2】反向输出一个整数(非数值问题)
非数值问题的分析无法象数值问题那样能得出一个初值和递归函数式,但思路是相同的。
分析方法:
①简化问题:设要输出的正整数只有一位,则“反向输出”问题可简化为输出一位整数。 ②对大于10的正整数,逻辑上可分为两部分:个位上的数字和个位以前的全部数字。将个位以前的全部数字看成一个整体,则为了反向输出这个大于10的正整数,可按以下步骤:
a、输出个位上的数字;
b、将个位除外的其他数字作为一个新的整数,重复a步骤的操作。
其中b问题只是对原问题在规模上进行了缩小——递归。
所以,可将反向输出一个正整数的算法归纳为:
if (n为一位整数)
输出n;
else
{
输出n的个位数字;
对剩余数字组成的新整数重复“反向输出”操作;
}
程序如下:
#include <stdio.h>
void printn (int x) /*反向输出整数x*/
{
if (x >= 0 && x<= 9) /*若x为一位整数*/
printf ("%d", x); /*则输出整数x*/ else /*否则*/ { printf ("%d", x % 10); /*输出x的个位数字*/ printn (x / 10); /*将x中除个位数字外的全部数字形成新的x后,继续递归操作*/
}
}
void main ()
{
int n;
scanf ("%d", &n);
if (n < 0) { } printn (n); printf ("\n"); n = -n; putchar ('-');
}
执行:Input n=12345
结果:?
执行:Input n=-12479
结果:?
【讨论】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
的位数不确定,可以是任意的整数。