实验名称:顺序结构编程练习
一、实验目的和要求
(1)初识Microsoft Visual Studio 2010上机环境,学会建立工程、文件,学会编译、链接并运行程序,查找并修改简单的语法错。
(2)正确调用输入输出处理的函数scanf( )、printf( )、getchar( )、putchar( )进行数据的I/O,观察输出格式,掌握键盘输入方法。
(3)初步使用调试器跟踪程序,观察变量的值的变化情况。
二、实验环境(实验设备)
硬件: 微型计算机
软件: Windows 操作系统、Microsoft Visual Studio 2010
三、实验原理及内容
实验题目(1)
【见实验教材实验一的题目1】:在D盘上建立以自己学号命名的文件夹(例如:B07020518)(以后实验的所有文件存于此文件夹下);正确进入VS2010集成开发环境,建立一个单文件项目,项目名为:exp1_1,然后向该项目中以新建方式添加一个源文件,名为:exp1_1.c,完成:从键盘输入两个整数a和b,计算并输出他们的和sum、差difference、积product、商quotient和平均值ave(注意ave和商的定义类型)。
具体要求:
① 编辑、编译、连接并运行程序,观察运行结果。
② 观察exp1_1.obj、exp1_1.exe、exp1_1.c所在的文件夹。
③ 对变量quotient分别定义为int和double型,在printf函数中正确使用格式串,当读入的两个整数为4和5时,观察运行结果并分析原因,思考怎么使变量quotient更准确。
④ 对变量ave分别定义为int和double型,在printf函数中正确使用格式串,当读入的两个整数为4和5时,观察不同的运行结果并分析原因。
⑤ 单步跟踪程序(用F10键),观察每一步程序运行时各个变量的变化情况。
实验解答:
源程序代码如下:
(1)直接法:
#include<stdio.h>
int main()
{
int x, y, sum, difference, product;
double quotient, ave;
printf("Please input two integers:");
scanf_s("%d%d", &x, &y);
sum = x + y;
difference = x - y;
product = x * y;
quotient = x / (double)y;
ave = (x + y) / 2.0;
printf(" The sum is %d\n The difference is %d\n The product is %d\n The quotient is %f\n The average is %f\n", sum, difference, product, quotient, ave);
return 0;
}
(2)定义函数法:
#include<stdio.h>
int add(int a, int b)
{
return a + b;
}
int subtract(int a, int b)
{
return a - b;
}
int multiply(int a, int b)
{
return a * b;
}
double divide(double a, double b)
{
return a / b;
}
double average(double a, double b)
{
return (a + b) / 2;
}
int main()
{
int x, y,sum,difference,product;
double quotient, ave;
printf("Please input two integers:");
scanf_s("%d%d", &x, &y);
sum = add(x, y);
difference = subtract(x, y);
product = multiply(x, y);
quotient = divide(x, y);
ave = average(x, y);
printf(" The sum is %d\n The difference is %d\n The product is %d\n The quotient is %f\n The average is %f\n", sum, difference, product, quotient, ave);
return 0;
}
文件名 | 文件所在的完整路径(例如:d:\ttt\t1.c) |
exp1_1.c | E:\C_Test\Test1_code\exp1_1.c |
exp1_1.obj | E:\C_Test\Test1_code\Test1_code\x64\Debug\ exp1_1.obj |
exp1_1.exe | E:\C_Test\Test1_code\x64\Debug\ exp1_1.exe |
方法1:
quotient的类型 | 求解quotient的语句 | 输出quotient的格式串 | 屏幕输出的quotient值 |
int | quotient = x / y; | print("The quotient is %f\n",quotient) | 0.000000 |
double | quotient = x / (double)y; | print("The quotient is %f\n",quotient) | 0.666667 |
方法2:
quotient的类型 | 求解quotient的语句 | 输出quotient的格式串 | 屏幕输出的quotient值 |
int | int divide(int a, int b) { return a / b; } | print("The quotient is %f\n",quotient) | 0.000000 |
double | double divide(double a, double b) { return a / b; } | print("The quotient is %f\n",quotient) | 0.666667 |
运行结果的差异、原因以及保证结果正确的措施:
差异:当结果不是整数时,int类型屏幕输出值为0,而double有值
原因:int为整型,而double是实型双精度型
措施:将输出quotient的divide自定义函数ave的average自定义函数用double定义
方法1:
ave的类型 | 求解ave的语句 | 输ave的格式串 | 屏幕输出的ave值 |
int | ave = (x + y) / 2; | print("The average is %f\n",ave) | 0.000000 |
double | ave = (x + y) / 2.0; | print("The average is %f\n",ave) | 2.500000 |
方法2:
ave的类型 | 求解ave的语句 | 输ave的格式串 | 屏幕输出的ave值 |
int | int average(int a, int b) { return (a + b) / 2; } | print("The average is %f\n",ave) | 0.000000 |
double | double average(double a, double b) { return (a + b) / 2; } | print("The average is %f\n",ave) | 2.500000 |
运行结果的差异及原因:
差异:int类型屏幕输出值为0,double类型有屏幕输出值
原因:int为整型,而double是实型双精度型
实验题目(2)
【见实验教材实验一的题目3】:编程序exp1_3.c,实现两个整数a,b的交换,提示思考:我们在现实生活中,两杯水是怎么交换的。
实验解答:
源程序exp1_3.c的代码是:
#include<stdio.h>
int main()
{
int a, b, temp;
printf("Please input two integers ");
scanf_s("%d%d", &a, &b);
temp = a;
a = b;
b = temp;
printf("The result of the swap is %d %d\n", a, b);
return 0;
}
实验题目(3)
【见实验教材实验一的题目4】:编程序exp1_4.c,工厂给一圆柱体镀膜,每平方厘米造价10元,现从键盘上输入圆柱底面的半径radius(厘米)和圆柱的高height(厘米),求该圆柱体的表面积area(平方厘米)和所需费用,要求输出结果保留两位小数。
实验解答:
① 源程序exp1_4.c的代码是:
#include<stdio.h>
#define PI 3.14159
int main()
{
double r, h, s, w;
printf("Please input the radius and height of the cylinder\n ");
scanf_s("%lf%lf", &r, &h);
s = 2 * PI * r * (r + h);
w = 10 * s;
printf("The area is %f\n The cost is %f\n", s, w);
return 0;
}
②多次运行程序,根据下表第一列要求,输入不同的数据,请填写下表
输入数据的要求 | 你输入的数据 | 你程序的输出结果 |
半径和高均为正整数 | 2 3 | 62.831800 628.318000 |
半径和高均为正实型数 | 1.5 3.5 | 47.123850 471.238500 |
半径和高有一个为负数 | -1 2 | -6.283180 -62.831800 |
半径和高均为负数 | -2 -3 | 62.831800 628.318000 |
其他测试用例 | -2 3.3 | -16.336268 -163.362680 |
实验题目(4)
【见实验教材实验一的题目6】:编写程序exp1_6.c输入一个3位正整数,计算该数的逆序数,并输出。例如:输入789,输出987;
实验解答:源程序exp1_6.c的代码是:
#include<stdio.h>
int main()
{
int a, b, c, abc;
printf("Please input a three-digit number");
scanf_s("%d", &abc);
c = abc / 100, b = abc / 10 % 10, a = abc % 10;
printf("The number of inversions of this number=%d%d%d", a, b, c);
return 0;
}
四、实验小结(包括问题和解决方法、心得体会、意见与建议、实验出错信息及解决方案等)
(一)实验中遇到的主要问题及解决方法
1.容易忘记最后的printf(),多加练习后记住了
2.既用int又用double定义了变量x,y,调试时发现了问题
3.刚开始在源程序exp1_4.c的scanf_s函数中用的是%f,后在检查资料和结合mooc相关视频,修改为%lf
(二)实验心得
1.多加练习,反复尝试,得出满意的数据
2.通过一些网站、搜索引擎等手段,查询自己解决方法
3.学会将书本、mooc、CSDN有机结合使用
(三)意见与建议(没有可省略)