实验目的
- 会使用C语言程序开发环境(vs2010/devc++等),能熟练使用其编写、编译、运行、调试C程序
- 知道C程序结构和编码规范,能正确使用
- 能熟练使用C语言输入输出函数: scanf() , printf() , getchar() , putchar()
- 能灵活、组合使用基本数据类型、运算符和输入输出语句编程解决简单计算/应用问题
实验准备
实验前,请围绕以下内容复习教材第1-3章以下相关内容:
- 一个完整的c程序结构和书写规范
- C程序的编写、编译、运行、调试方法
- C语言中标识符命名规则、常量、变量;运算符、表达式及其混合计算规则
- C输入输出函数用法
实验内容
实验任务1
task1.1
//尝试编写程序task1.1.c,使得可以在垂直方向上打印出两个字符小人
SHOW CODE
#include<stdio.h>int main()
{printf(" o\n");printf("<H>\n");printf("I I\n");printf(" o\n");printf("<H>\n");printf("I I\n");return 0;
}
//预期效果如下图所示:
task1.2
//尝试编写程序task1.2.c,使得可以在水平方向上打印出两个字符小人。
SHOW CODE
#include<stdio.h>int main()
{
printf(" o o\n");
printf(" < H > < H >\n ");printf(" I I I I\n");
return 0;
}
//预期效果如图所示:
实验结论
- 给出在垂直方向上打印两个字符小人的c程序源代码task1_1.c,以及,运行结果截图
- 给出在水平方向上打印两个字符小人的c程序源代码task1_2.c,以及,运行结果截图
实验任务2
task2
//补充完整并能正确运行的c程序源代码task2.c,及,运行测试结果截图
SHOW CODE
#include<stdio.h>
int main()
{double a, b, c;// 输入三边边长scanf("%lf%lf%lf", &a, &b, &c);// 判断能否构成三角形if ((a + b > c) && (a + c > b) && (b + c > a))printf("能构成三角形\n");elseprintf("不能构成三角形\n");return 0;
}
//预测效果如图所示
注意:
1. line11的格式控制符%lf,是字母L的小写l, 不是数字1。
2. double类型的数据,在输入时必须使用格式符%lf, 输出时可以使用%f,也可以使用%lf
实验结论
- 补充完整并能正确运行的c程序源代码task2.c,及,运行测试结果截图
实验任务3
task3
//将程序task3.c补充完整。使得程序实现如下功能:只有当用户两次回答都是小写y或大写Y时,才会打印输出:罗马不是一天建成的, 继续保持哦!否则,会打印输出:罗马不是一天毁灭的, 我们来建设吧!
SHOW CODE
#include <stdio.h>
int main()
{char ans1, ans2; // 用于保存用户输入的答案printf("每次课前认真预习、课后及时复习了没?(输入y或Y表示有,输入n或N表示没有):");ans1 = getchar(); // 从键盘输入一个字符,赋值给ans1getchar(); // 吸收输入ans1后的换行符printf("\n动手敲代码实践了没?(输入y或Y表示敲了,输入n或N表示木有敲):");ans2 = getchar();// 判断用户回答ans1和ans2都是小写y或大写Yif ((ans1 == 'y' || ans1 == 'Y') && (ans2 == 'y' || ans2 == 'Y'))printf("\n罗马不是一天建成的,继续保持哦:\n");elseprintf("\n罗马不是一天毁灭的,我们来建设吧\n");return 0;
}
//预测效果如图所示
回答问题
- 当把源代码line9去掉后,重新编译运行,结果是什么样的?
- 用你所学的知识尝试分析造成这一结果的原因
getchar(); 这一行代码的作用是吸收输入缓冲区中的换行符
回答:
- 为什么要加这一行?
当用户在输入第一个字符( ans1 )后,会按下「回车键」确认输入。此时,输入的字符(比如 'y' )会被 getchar() 读取到 ans1 ,但「回车键」对应的换行符 \n 会留在输入缓冲区。
如果不加 getchar(); ,下一次执行 ans2 = getchar(); 时,程序会直接读取缓冲区中残留的 \n ,导致第二次输入被“跳过”(因为 \n 不是我们需要的 'y' / 'Y' / 'n' / 'N' )。 - 去掉这一行有什么影响?
假设去掉 getchar(); ,运行流程会变成:
- 第一次输入:用户输入 y 并回车 → ans1 得到 'y' ,缓冲区残留 \n 。
- 第二次提示“动手敲代码实践了没?...”时, ans2 = getchar(); 会直接读取缓冲区的 \n → ans2 变成 '\n' (不是有效输入)。
最终结果:程序会直接进入 else 分支,打印 “罗马不是一天毁灭的,我们来建设吧” ,但用户其实还没输入第二次的答案,体验和逻辑都出错。
故,getchar(); 是为了清理输入缓冲区的“残留换行”,保证第二次输入能正确被读取
实验结论
- 补充完整并能正确运行的c程序源代码task3.c,及,运行测试结果截图
- 回答问题
当把源代码line9去掉后,重新编译运行,结果是什么样的?
用你所学的知识尝试分析造成这一结果的原因。
实验任务4
task4
//在C开发环境下,输入如下代码
程序中line9和line15包含语法错误,找出并修改错误后,编译、运行程序,从键盘正确输入数据。
使得:
int型变量a1, a2, a3分别获得整数 1、2、3
char型变量c1, c2,c3分别获得字符'x' 'y' 'z'
double型变量x, y分别获得小数3.2和4.6
要求:只改动line9和line15两行代码的错误,其它行不要做任何改动
原代码:
SHOW CODE
#include <stdio.h>
int main()
{double x, y;char c1, c2, c3;int a1, a2, a3;// 读取整数scanf("%d%d%d", &a1, &a2, &a3);printf("a1 = %d, a2 = %d, a3 = %d\n", a1, a2, a3);// 读取字符(跳过空白字符)scanf(" %c %c %c", &c1, &c2, &c3);printf("c1 = %c, c2 = %c, c3 = %c\n", c1, c2, c3);// 读取浮点数(用逗号分隔)scanf("%lf,%lf", &x, &y);printf("x = %f, y = %f\n", x, y);return 0;
}
//预测效果如图所示
实验结论
- 给出修改错误后能正确运行的源码task4.c(以注释形式标注出错行)
- 运行程序后,按任务要求正确输入数据及运行结果截图
注意点:一定要输入英文逗号!!!
实验任务5
task5
//10亿秒(109s)约等于多少年?要求结果四舍五入取整。补足程序task5.c,完成计算,并打印输出。补足代码task5.c
SHOW CODE
#include <stdio.h>
#include <math.h>
int main()
{int year;// 计算一年的秒数:365天 * 24小时/天 * 60分钟/小时 * 60秒/分钟int seconds_in_year = 365 * 24 * 60 * 60;// 10亿秒long long total_seconds = 1000000000;// 计算年数并四舍五入year = (int)round((double)total_seconds / seconds_in_year);printf("10亿秒约等于%d年\n", year);return 0;
}
//预测效果如图所示
实验结论
- 补充完整并能正确运行的c程序源代码task5.c,及,运行测试结果截图
实验任务6
task6.1
//在c开发环境下,编写、编译、运行一个简单的算术运算程序,实现以下计算 y=x^365(X取值1.0,1.01,0.99)
SHOW CODE
#include <stdio.h>
#include <math.h>
int main()
{
double x, ans;
scanf("%lf", &x);
ans = pow(x, 365);
printf("%.2f的365次方: %.2f\n", x, ans);
return 0;
}
//预测效果如图所示
task6.2
//对task6.1.c作出优化(使用task6.1.c进行运算时,要分别运行程序3次。对task6.1稍做修改,借助循环,使得程序运行一次,就可以完成多次计算)
SHOW CODE
#include <stdio.h>
#include <math.h>
int main()
{
double x, ans;
while(scanf("%lf", &x) != EOF)
{
ans = pow(x, 365);
printf("%.2f的365次方: %.2f\n", x, ans);
printf("\n");
}
return 0;
}
//预测效果如图所示
实验结论
- 程序task6_2.c源代码,及,运行测试截图
- 编译、运行程序,分别输入1.0, 1.01, 0.99,观察运行结果。结束计算时,按下 Ctrl+Z 键。(要同时按下键盘上的Ctrl键和字母Z键;在visual studio中,需要按下 Ctrl+Z 键3次))。
说明:
- C语言中,常使用line8这样的用法,实现多组数据输入,直至用户按下 Ctrl+Z 终止输入,结束循环。
- double类型的变量,在输入时,格式控制符必须使用%lf(注意:修饰符是小写字母l,不是数字1)
实验任务7
task7
//编写一个简单的计算程序task7.c,实现摄氏度温度C与华氏度温度F的转换:F=9/5C+32
要求:
使用多组输入方式,支持运行一次程序能进行多次计算 (参考实验任务6的task6.2代码写法)
温度保留到小数点后两位
SHOW CODE
#include <stdio.h>
int main() {double C, F;// 多次输入,直到文件结束while (scanf("%lf", &C) != EOF) {F = 9.0 / 5 * C + 32;printf("%.2f\n", F);}return 0;
}
//预测效果如图所示
实验结论
- task7.c源代码,及,运行测试截图
实验任务8
task.8
//编写C程序task8.c,用海伦公式计算三角形面积。
海伦公式计算三角形面积计算式如下:
S=√p (p-a) (p-b) (p-c),其中p= (a+b+c)/2
要求:
从键盘输入三角形三边边长,在屏幕上打印输出面积(面积保留到小数点后3位)
使用多组输入方式,支持运行一次程序能进行多次计算 (参考实验任务6的task6_2.c代码写法)
注:假定输入的三角形三边边长都满足构成三角形的条件(不考虑输入数据不能构成三角形的情形)
SHOW CODE
#include <stdio.h>
#include <math.h>
int main()
{double a, b, c, s, area;// 多组输入,直到文件结束while (scanf("%lf %lf %lf", &a, &b, &c) != EOF) {// 计算半周长 ss = (a + b + c) / 2;// 海伦公式计算面积area = sqrt(s * (s - a) * (s - b) * (s - c));// 输出结果,保留三位小数printf("a = %.1f, b = %.1f, c = %.1f, area = %.3f\n", a, b, c, area);}return 0;
}
//预测效果如图所示
实验结论
- task8.c源代码,及,运行测试截图
实验总结
关键知识点总结
- 数据类型与输入输出
- 浮点型数据:使用 double 类型处理小数运算,其精度高于 float ,适合科学计算。
- 输入格式:对于 double 类型变量,必须使用 %lf 格式控制符。
- 输出格式化:使用 printf 的格式控制(如 %.2f 、 %.3f )控制小数位数。
- 多组输入实现
通过 while 循环结合 scanf 返回值实现多组输入:
while(scanf(%lf%lf%lf,&a,&b,%c)!=EOF{//处理每组输入}
这种方法允许用户连续输入数据,直到手动终止程序(如按 Ctrl + D 或 Ctrl + Z)
- 数学函数的使用
- 数学库:使用 <math.h> 头文件中的函数(如 sqrt 、 pow )
- 编译注意事项:在使用数学库时,需要添加 -lm 参数(仅限命令行编译)