欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

南京邮电大学C语言实验报告2v2

程序员文章站 2022-07-15 23:09:10
...

实验二:选择与循环结构编程

一、 实验目的和要求
(1)能正确选择使用if语句和switch语句实现选择结构的程序设计。
(2)正确使用while、for、do…while语句实现循环结构的程序设计。
(3)会利用循环嵌套实现较复杂的程序控制,理解循环嵌套程序的执行过程和条件的变化。
(4)利用vs 2010调试器跟踪、调试程序,会设置断点、单步跟踪,查看相应的变量或表达式的值,帮助理解循环、选择结构程序执行过程并能查找、修改逻辑错误。

二、实验环境(实验设备)
硬件: 微型计算机
软件: Windows 操作系统、Microsoft Visual Studio 2010

三、实验原理及内容
实验题目(1)【见实验教材实验二的题目6】:编程序exp2_6.c,读入3个double型变量a,b,c的值,用if语句判断它们能否构成三角形,如果能构成三角形又是构成的何种三角形(等边三角形、等腰三角形、直角三角形、等腰直角三角形、一般三角形)?输出各种情况下判断的结果。(建议参考实验指导教材的流程图4.20,先对a,b,c进行由小到大的排序可以简化代码)
实验解答:
① 源程序exp2_6.c的代码是:

#include<stdio.h>
#include<math.h>
int main()
{
	double a,b,c,t;
	printf("请输入三角形的三边长:");
	scanf("%lf,%lf,%lf",&a,&b,&c);    
	if(a>b)  
	{
		t=a;
		a=b;
		b=t;
	}
	if (a>c)
	{
		t=a;
		a=c;
		c=t;
	}
	if (b>c)
	{
		t=b;
		b=c;
		c=t;
	}
	if (a+b<=c)
		printf("不能构成三角形");
	else if (fabs(a*a+b*b-c*c)<1e-3)
		if (fabs(a-b)<1e-3)
				printf("这是个等腰直角三角形");
		else
				printf("这是个直角三角形");
	else if (fabs(a-b)<1e-3||fabs(b-c)<1e-3)
		if (fabs(a-c)<1e-3)
				printf("这是个等边三角形");
		else
			    printf("这是个等腰三角形");
	else
			printf("这是个一般三角形");
	printf("\n");
	return 0;
}

② 多次运行程序,输入不同的数据,得到不同结果,请填写下表
三个原始数据代表的情况 你所输入的三条边长 你程序的输出结果
能构成等边三角形 3,3,3 这是个等边三角形
能构成直角三角形 4,3,5 这是个直角三角形
能构成等腰直角三角形 1.414,1,1 这是个等腰直角三角形
能构成等腰三角形 3,3,4 这是个等腰三角形
能构成一般三角形 2,3,4 这是个一般三角形
不能构成三角形 1,1,2 不能构成三角形

实验题目(2)【见实验教材实验三的题目1】: 利用while、for、do…while循环语句计算求和问题:

实验解答:
① 求前1000项之和的源程序代码如下:

#include<stdio.h>
int main()
{
	double item,sum=0;
	int i,sign=1;
	double m=2,n=1;
	for(i=1;i<=1000;i++)//循环i从1到1000
	{
	    item=sign*m*1.0/n;//计算每一项的绝对值
	    sign=-sign;//改变每一项的正负
		m=m+n;//计算分子
		n=m-n;//计算分母
		sum+=item;//求和
	}
	printf("sum=%f\n",sum);//输出和
	return 0;
}

① 如果需要计算的项数并不是常量1000而是变量n(通过输入获得值),请在程序exp3_1.c的基础上做修改,修改后的源程序名为:exp3_1A.c,运行修改后的程序。请在下面表格中写出你所改动(包括增加、删除、修改)的语句(表第一行为示例)
原来在exp3_1.c中 操作说明 对应修改后在exp3_1A.c中
无 增加提示输入计算项数语句 printf(“请输入计算项数N:”);
无 增加输入计算项数的语句 scanf("%d",&N);
for(i=1;i<=1000;i++) 修改1000为N for(i=1;i<=N;i++)

② 运行以上程序,填写下表,观察运行结果
键盘输入的n值 屏幕输出的求和结果
2 sum=0.500000
8 sum=0.577683
13 sum=2.195954
14 sum=0.577921
15 sum=2.195956
16 sum=0.577922
19 sum=2.195956
20 sum=0.577922
199 sum=2.195956
200 sum=0.577922
  请自行任意输入超过16的任意奇数、偶数,观察求和结果,结合以上表格中的结果,你发现了什么规律?请观察该求和每项的特点,查阅资料,解释你所发现的规律。
我发现:
超过16的任意奇数求和结果趋于2.195956
超过16的任意偶数求和结果趋于0.577922
解释:
超过16的任意奇数、偶数求和超过了double型的精确程度。

实验题目(3)【见实验教材实验三的题目4】:编写程序exp3_4.c,先用一层循环判断从键盘读入的正整数x是否为质数,并输出判断结果。在此基础上改写,再加上外层循环,找出规定范围(a,b)内的所有质数,并按每行5个的格式输出。(这里a,b变量从键盘输入并且范围为:10≤a≤b≤1000)
实验解答:
写程序exp3_4.c实现从键盘上读入一个正整数x,判断是否为质数并输出判断结果,代码如下:

#include<stdio.h>
#include<math.h>
int main()
{
	int x,k,i;
	printf("请输入一个正整数x:");
	scanf("%d",&x);
	if(x<=0)
		printf("请输入一个正整数:");
	else if(x==1)
		printf("%d is not a prime.\n",x);
	else
	{
		k=(int)sqrt(x);
	    for(i=2;i<=k;i++)
			if(x%i==0)
				break;
		if(i>k)
			printf("%d is a prime,\n",x);
		else
			printf("%d is not a prime.\n",x);
	}
	return 0;
}

② 在程序exp3_4.c的基础上改写,加上外层循环,找出规定范围(a,b)内的所有质数,并按每行5个的格式输出,改写后的程序exp3_4A.c代码如下:
(提示:用于判断是否质数的变量x不再是读入的,而是作为循环控制变量,依次取规定范围(a,b)内的所有数,变量a,b的值从键盘输入,保证读入的a,b在[10,1000]范围内,并且a是下限b是上限,也就是说,应该符合的条件是:10<=a<=b<=1000,否则输入数据无效,提示用户重新输入a,b直到符合要求为止)

#include<stdio.h>
#include<math.h>
int main()
{
	int x,k,i,count=0,a,b;
	printf("请输入正整数a,b:");
	scanf("%d,%d",&a,&b);
	if(a<10||b>1000||a>b)
		printf("请输入a和b使得10<=a<=b<=1000!");
	else 
	     for(x=a+1;x<b;x++)
	     {
		   k=(int)sqrt(x);
	       for(i=2;i<=k;i++)
			   if(x%i==0)
				   break;
		   if(i>k)
		   {
			   count++;
			   printf("%5d",x);
			   if(count%5==0)
				   printf("\n");
		   }
	     }
		 printf("\n");
	return 0;
}

运行程序,按表格第一列分别输入a,b的值,填入对应的输出结果
键盘输入的a,b值 屏幕输出的结果
12 14 13
24 28
34 56 37 41 43 47 53
111 189 113 127 131 137 139
149 151 157 163 167
173 179 181

实验题目(4)【见实验教材实验三的题目6】:编程序exp3_6.c,利用循环嵌套输出一个菱形。
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
实验解答:
①请写出程序exp3_6.c的源代码并作适当注释:

#include<stdio.h>
int main()
{
	int i,j;
	for(i=1;i<=4;i++)//上三角控制行
	{
		for(j=1;j<=4-i;j++)//上三角控制每行空格
			printf(" ");
	    for(j=1;j<=1+2*(i-1);j++)//上三角控制每行*
			printf("*");
		printf("\n");
	}
    for(i=3;i>=1;i--)//下三角控制行
	{
		for(j=1;j<=4-i;j++)//下三角控制每行空格
			printf(" ");
	    for(j=1;j<=1+2*(i-1);j++)//下三角控制每行*
			printf("*");
		printf("\n");
	}
	return 0;
}

②尝试在上面程序的基础上作一定修改,分别输出:上三角形、下三角形、左一半三角形、右一半三角形,主要需要修改的语句是控制什么的语句?
输出上三角:删去下三角的语句
输出下三角:删去上三角的语句
输出左一半三角形:修改控制每行的语句
输出右一般三角形:修改控制每行空格和
的语句
③尝试修改程序,实现输出任意行的菱形,行数由输入决定,并检验你能输出多少行的图形?

#include<stdio.h>
int main()
{
	int i,j,n;
	printf("请输入菱形行数n:");
	scanf("%d",&n);
	for(i=1;i<=(n+1)/2;i++)//上三角控制行
	{
		for(j=1;j<=(n+1)/2-i;j++)//上三角控制每行空格
			printf(" ");
	    for(j=1;j<=1+2*(i-1);j++)//上三角控制每行*
			printf("*");
		printf("\n");
	}
    for(i=(n-1)/2;i>=1;i--)//下三角控制行
	{
		for(j=1;j<=(n+1)/2-i;j++)//下三角控制每行空格
			printf(" ");
	    for(j=1;j<=1+2*(i-1);j++)//下三角控制每行*
			printf("*");
		printf("\n");
	}
	return 0;
}

能输出167行且只能输出奇数行。

四、实验小结(包括问题和解决方法、心得体会、意见与建议、实验出错信息及解决方案等)
(一)实验中遇到的主要问题及解决方法

主要问题:

  1. exp2_6.c中,描述a=b时,没有在语句前写fabs,导致只能输出第一种情况。
  2. 总是忘记在输入语句中对变量取地址
  3. Exp3_6.c中,写下三角形时,输出的是正三角形
    解决方案:
  4. 经过查看书本提示,发现并解决了问题。
  5. 因为熟悉这种错误,所以很快发现并解决问题。
  6. 经过查看书本提示,深入思考,纠正了问题。

(二)实验心得

编写代码,还是要多加上机练习,及时发现并纠正问题,避免小问题,多询问,多搜索,多思考。切忌心浮气躁!

(三)意见与建议(没有可省略)

五、支撑毕业要求指标点
1.2-H掌握计算机软硬件相关工程基础知识,能将其用于分析计算机及应用领域的相关工程问题。
3.1-M掌握设计/开发复杂工程问题解决方案所需要的专业知识和开发工具。