实验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;
}

运行测试

task1_1运行测试

输入:(无)
输出:
 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;
}

运行测试

task1_2运行测试

输入:(无)
输出:
 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;
}

运行测试

task2运行测试

输入: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;
}

运行测试

task3运行测试

输入: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,也会输出“罗马不是一天毁灭的, 我们来建设吧”。

删除getchar后的实际输出

这一结论针对每次只输入一个回答字符再按回车的情形;若把 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;
}

运行测试

task4运行测试

输入:(无)
输出:
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;
}

运行测试

task5运行测试

输入: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;
}

运行测试

task6运行测试

输入: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() 会读取换行符。测试时同时选择正常数据、边界数据和不同大小写的回答,可以检查程序是否符合要求。

posted @ 2026-10-21 22:10  Eurydice  阅读(6)  评论(0)    收藏  举报