实验1:C语言简单程序编写
实验1:C语言简单程序编写
编译环境:Visual Studio 2022 的 Microsoft C 编译器。运行截图使用本机运行结果查看器启动各题的可执行程序,显示实际输入和标准输出。
四、实验结论
1. 实验任务1
task1_1.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
printf(" O \n");
printf("<H>\n");
printf("I I\n");
printf(" O \n");
printf("<H>\n");
printf("I I\n");
return 0;
}
运行测试

输入:(无)
输出:
O
<H>
I I
O
<H>
I I
task1_2.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
printf(" O O \n");
printf("<H> <H>\n");
printf("I I I I\n");
return 0;
}
运行测试

输入:(无)
输出:
O O
<H> <H>
I I I I
分析与结论
通过 \n 换行可以控制字符小人的垂直位置;在同一行中加入空格,可以控制两个小人的水平间距。
2. 实验任务2
task2.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double a, b, c;
scanf("%lf%lf%lf", &a, &b, &c);
// 任意两边之和都必须大于第三边。
if (a + b > c && a + c > b && b + c > a)
printf("能构成三角形\n");
else
printf("不能构成三角形\n");
return 0;
}
运行测试

输入:3 4 5
输出:
能构成三角形
输入:2 2 2
输出:
能构成三角形
输入:1 1 2
输出:
不能构成三角形
输入:-1 2 2
输出:
不能构成三角形
输入:0 1 1
输出:
不能构成三角形
分析与结论
三个不等式通过逻辑与 && 连接,只有任意两边之和都大于第三边时才能构成三角形。两边之和等于第三边时不能构成三角形。
3. 实验任务3
task3.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char ans1, ans2;
printf("每次课及时预习/复习了没? (是-输入y或Y, 否-输入n或N) : ");
ans1 = getchar();
getchar(); // 读取第一次输入后留下的换行符。
printf("\n动手敲代码实践了没? (是-输入y或Y, 否-输入n或N) : ");
ans2 = getchar();
if ((ans1 == 'y' || ans1 == 'Y') && (ans2 == 'y' || ans2 == 'Y'))
printf("\n罗马不是一天建成的, 继续保持哦:)\n");
else
printf("\n罗马不是一天毁灭的, 我们来建设吧\n");
return 0;
}
运行测试

输入:y
y
输出:
每次课及时预习/复习了没? (是-输入y或Y, 否-输入n或N) :
动手敲代码实践了没? (是-输入y或Y, 否-输入n或N) :
罗马不是一天建成的, 继续保持哦:)
输入:y
Y
输出:
每次课及时预习/复习了没? (是-输入y或Y, 否-输入n或N) :
动手敲代码实践了没? (是-输入y或Y, 否-输入n或N) :
罗马不是一天建成的, 继续保持哦:)
输入:Y
y
输出:
每次课及时预习/复习了没? (是-输入y或Y, 否-输入n或N) :
动手敲代码实践了没? (是-输入y或Y, 否-输入n或N) :
罗马不是一天建成的, 继续保持哦:)
输入:Y
Y
输出:
每次课及时预习/复习了没? (是-输入y或Y, 否-输入n或N) :
动手敲代码实践了没? (是-输入y或Y, 否-输入n或N) :
罗马不是一天建成的, 继续保持哦:)
输入:y
n
输出:
每次课及时预习/复习了没? (是-输入y或Y, 否-输入n或N) :
动手敲代码实践了没? (是-输入y或Y, 否-输入n或N) :
罗马不是一天毁灭的, 我们来建设吧
输入:n
y
输出:
每次课及时预习/复习了没? (是-输入y或Y, 否-输入n或N) :
动手敲代码实践了没? (是-输入y或Y, 否-输入n或N) :
罗马不是一天毁灭的, 我们来建设吧
分析与结论
每次回答用 || 判断是否为小写 y 或大写 Y,两次回答之间再用 && 连接。只有两次回答均为肯定时才输出“继续保持”。
去掉两次输入之间的 getchar() 后会怎样?
保留该语句时,第一次输入 y 并按回车后,ans1 读入 y,中间的 getchar() 读取缓冲区里留下的换行符,第二次输入可以正常读入 ans2。
删去该语句后,按通常“一次回答一行”的方式输入,第二次 getchar() 会直接读取第一次输入留下的 \n,不会等待第二次回答。因此即使本来打算两次都输入 y,也会输出“罗马不是一天毁灭的, 我们来建设吧”。

这一结论针对每次只输入一个回答字符再按回车的情形;若把 yy 连续放在同一行,读取情况会不同。原程序中间的 getchar() 只读取一个字符,并不是清空整个输入缓冲区。
4. 实验任务4
task4.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
int year;
// 按一年365天计算;使用浮点除法,再四舍五入。
year = (int)round(1000000000.0 / (365.0 * 24 * 60 * 60));
printf("10亿秒约等于%d年\n", year);
return 0;
}
运行测试

输入:(无)
输出:
10亿秒约等于32年
分析与结论
按一年365天计算,10亿秒对应约31.709792年,使用 round() 四舍五入后为32年。计算中使用浮点常量,避免先进行整数除法而丢失小数部分。
5. 实验任务5
task5.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
double c, f;
scanf("%lf", &c);
f = 9.0 / 5.0 * c + 32;
printf("摄氏度c = %.2f时, 华氏温度f = %.2f\n", c, f);
return 0;
}
运行测试

输入:0
输出:
摄氏度c = 0.00时, 华氏温度f = 32.00
输入:37
输出:
摄氏度c = 37.00时, 华氏温度f = 98.60
输入:-40
输出:
摄氏度c = -40.00时, 华氏温度f = -40.00
分析与结论
根据公式 F = 9.0 / 5.0 * C + 32 进行换算。不能写成 9 / 5,因为两个整数相除的结果为1。%.2f 使输出保留两位小数。测试使用0、37和-40摄氏度,与题目示例不同。
6. 实验任务6
task6.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(void)
{
double a, b, c, s, area;
// 按题目约定,输入的三边能够构成三角形。
scanf("%lf%lf%lf", &a, &b, &c);
s = (a + b + c) / 2.0;
area = sqrt(s * (s - a) * (s - b) * (s - c));
printf("三角形面积 = %.3f\n", area);
return 0;
}
运行测试

输入:5 5 6
输出:
三角形面积 = 12.000
输入:6 8 10
输出:
三角形面积 = 24.000
输入:2.5 2.5 3
输出:
三角形面积 = 3.000
分析与结论
先求半周长 s = (a + b + c) / 2.0,再用 sqrt(s * (s - a) * (s - b) * (s - c)) 计算面积。sqrt() 需要包含 <math.h>,%.3f 使面积保留三位小数。按题目约定,只考虑能够构成三角形的输入。测试使用5、5、6及6、8、10等边长。
五、实验总结
本次实验涉及顺序执行、条件判断、字符输入及数学公式计算。需要注意:scanf() 读取 double 时使用 %lf,变量前加 &;逻辑与和逻辑或需要根据条件正确组合;整数除法与浮点除法的结果不同;getchar() 会读取换行符。测试时同时选择正常数据、边界数据和不同大小写的回答,可以检查程序是否符合要求。

浙公网安备 33010602011771号