南京邮电大学C语言实验(二)选择与循环结构编程(仅参考)

本文详细介绍了实验内容,包括使用if和switch语句实现选择结构,各种循环结构的应用,如while、for和do...while,以及循环嵌套的处理。实验涉及三角形判定、质数检测、循环求和和菱形输出,同时探讨了调试技巧和实验中的常见问题及解决方案。
摘要由CSDN通过智能技术生成

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

一、实验目的和要求

(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>
#define ABC 1E-2
int main()
{
    double a, b, c,t;
    printf("Please enter three edges of a triangle:");
    scanf_s("%lf%lf%lf", &a, &b, &c);
    if (a > b)
    {
        t = a;
        a = b;
        b = t;
    }
    if (b > c)
    {
        t = b;
        b = c;
        c = t;
    }
    if (a > c)
    {
        t = a;
        a = c;
        c = t;
    }
    if (a > 0 && b > 0 && c > 0 && a + b > c)
    {
        if (fabs(a * a + b * b - c * c) < ABC)
        {
             if (fabs(a - b) < ABC)
             {
                 printf("等腰直角三角形\n");
             }
             else
                 printf("直角三角形\n");
        }
        else
        {
             if (fabs(a - b) < ABC || fabs(b - c) < ABC)
             {
                 if (fabs(a - c) < ABC)
                 {
                     printf("等边三角形\n");
                 }
                 else
                     printf("等腰三角形\n");
             }
             else
                 printf("一般三角形\n");
        }
    }
    else
        printf("Error input!\n");
    return 0;
}

②多次运行程序,输入不同的数据,得到不同结果,请填写下表:

三个原始数据代表的情况

你所输入的三条边长

你程序的输出结果

能构成等边三角形

3 3 3

等边三角形

能构成直角三角形

3 4 5

直角三角形

能构成等腰直角三角形

1 1 1.414

等腰直角三角形

能构成等腰三角形

3 3 5

等腰三角形

能构成一般三角形

3 4 6

一般三角形

不能构成三角形

2 2 4

Error input!

实验题目(2)

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

实验解答:

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

int main()
{
    double item, sum = 0, m = 2, n = 1;
    int i=1, sign = 1;
    while (i <= 1000)
    {
        item = sign * m / n;
             sum += item;
             m = m + n;
             n = m - n;
             sign = -sign;
             i++;
    }
    printf("Sum=%f\n", sum);
    return 0;
}

② 如果需要计算的项数并不是常量1000而是变量n(通过输入获得值),请在程序exp3_1.c的基础上做修改,修改后的源程序名为:exp3_1A.c,运行修改后的程序。请在下面表格中写出你所改动(包括增加、删除、修改)的语句(表第一行为示例)

原来在exp3_1.c

操作说明

对应修改后在exp3_1A.c

int i=1,

定义变量N

int i=1,N,

添加输入函数

scanf_s("%d", &N);

while (i <= 1000)

改变while后表达式

while (i<=N)

③运行以上程序,填写下表,观察运行结果

键盘输入的n值

屏幕输出的求和结果

2

0.500000

8

0.577683

13

2.195954

14

0.577921

15

2.195956

16

0.577922

19

2.195956

20

0.577922

199

2.195956

200

0.577922

实验题目(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 n, i, k;
	do
	{
		printf("Enter a positive integer:");
		scanf_s("%d", &n);
	} while (n <= 0);
	if (n == 1)
	{
		printf("%d is not a prime.\n", n);
	}
	else
	{
		k = (int)sqrt(n);
		for (i = 2; i <= k; i++)
		{
			if (n % i == 0)
				break;
		}
		if (i > k)
		{
			printf("%d is  a prime.\n", n);
		}
		else
		{
			printf("%d is not a prime.\n", n);;
		}
	}
	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 a, b,c,i,j,k;
    do
    {   printf("Enter two numbers as ranges:");
        scanf_s("%d%d", &a, &b);
    } while (a > b || a < 10 || b>1000);
    c = 0;
    for (i = a; i <= b; i++)
    {
        k = (int)sqrt(i * 1.0);
        for(j=2;j<=k;j++)
             if (i % j == 0)
             break;
        if (j > k)
        {
             c++;
             printf("%d\t", i);
             if(c%5==0)
                 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 <= 9 - (3 * i - 3); j++)  //内层循环:控制空格数
        {
             printf(" ");                        //输出空格        
        }
        for (j = 1; j <= 2 * i - 1; j++)        //内层循环:控制星号数
        {
             printf("*  ");                      //输出星号
        }
        printf("\n");                          //输出回车
    }
    for (i = 3; i >= 1; i--)                   //外层循环:控制行数
    {
        for (j = 1; j <= 12-3*i; j++)          //内层循环:控制空格数
        {
             printf(" ");                       //输出空格
        }
        for (j = 1; j <= 2*i-1; j++)           //内层循环:控制星号数
        {
             printf("*  ");                     //输出星号
        }
        printf("\n");                          //输出回车
    }
return 0;
}

②尝试在上面程序的基础上作一定修改,分别输出:上三角形、下三角形、左一半三角形、右一半三角形,主要需要修改的语句是控制什么的语句?

上三角形:外层循环for语句,控制行数

下三角形:外层循环for语句,控制行数

左一半三角形:内层循环for语句,控制星号数

右一半三角形:内层循环for语句,控制空格数和星号数

③尝试修改程序,实现输出任意行的菱形,行数由输入决定。

#include<stdio.h>
int main()
{
    int i, j,n;
    printf("输入菱形的行数");
    scanf_s("%d", &n);
    if (n % 2 == 0)
    {
        for (i = 1; i <= n/2; i++)                   
        {
             for (j = 1; j <= 3 * ((n - 1) / 2) - (3 * i - 3); j++)
             {
                 printf(" ");                                
             }
             for (j = 1; j <= 2 * i - 1; j++)       
             {
                 printf("*  ");                     
             }
             printf("\n");                         
        }
        for (i = n/2; i >= 1; i--)                  
        {
             for (j = 1; j <= 3 * ((n + 1) / 2) -3*i; j++)
             {
                 printf(" ");                      
             }
             for (j = 1; j <= 2*i-1; j++)          
             {
                 printf("*  ");                    
             }
             printf("\n");                         
        }
    }
    else
    {
        for (i = 1; i <= (n+1)/2; i++)
        {
             for (j = 1; j <= 3*((n-1)/2) - (3 * i - 3); j++)
             {
                 printf(" ");
             }
             for (j = 1; j <= 2 * i - 1; j++)
             {
                 printf("*  ");
             }
             printf("\n");
        }
        for (i = (n-1)/2; i >= 1; i--)
        {
             for (j = 1; j <= 3*((n+1)/2) - 3 * i; j++)
             {
                 printf(" ");
             }
             for (j = 1; j <= 2 * i - 1; j++)
             {
                 printf("*  ");
             }
             printf("\n");
        }
    }
    return 0;
}

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

(一)实验中遇到的主要问题及解决方法

1.问题:实验题目(1)在测试等腰直角三角形时,由于定义的比较值ABC过小,使得1 1 1.414该组数据被判断为等腰三角形

解决方法:调整ABC的值,使其适当扩大

2.问题:实验题目(2)在输入数据达到一定值后发现出现重复现象

解决办法:向老师询问,得知由于此后数值相差较小,精度不够而无法显示

3.问题:实验题目(3)在对程序进一步修改时,不知如何下手

解决办法:分析老师给出的示例以及进一步研读题目后,发现解决策略

4.问题:实验题目(4)一开始运行结果并不对称,后在修改时,发现输入数值大于7出现同样情况

解决办法:在草稿纸上通过对应关系计算出应输入的表达式,修改程序。

(二)实验心得

此次实验比上一次要进步很多,对于他人的依赖减少,自己解决问题变得多了起来,同时也通过此次实验,对选择结构和循环结构有了更深的理解,运用也更加熟练

(三)意见与建议(没有可省略)
  • 31
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲤鱼Louis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值