当前位置: 首页 > news >正文

experiment 1

实验目的

  1. 会使用C语言程序开发环境(vs2010/devc++等),能熟练使用其编写、编译、运行、调试C程序
  2. 知道C程序结构和编码规范,能正确使用
  3. 能熟练使用C语言输入输出函数: scanf() , printf() , getchar() , putchar()
  4. 能灵活、组合使用基本数据类型、运算符和输入输出语句编程解决简单计算/应用问题

实验准备

实验前,请围绕以下内容复习教材第1-3章以下相关内容:

  1. 一个完整的c程序结构和书写规范
  2. C程序的编写、编译、运行、调试方法
  3. C语言中标识符命名规则、常量、变量;运算符、表达式及其混合计算规则
  4. 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;
}

//预期效果如下图所示:

屏幕截图 2025-09-27 182947

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

//预期效果如图所示:

屏幕截图 2025-09-27 191809

实验结论

  • 给出在垂直方向上打印两个字符小人的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;
}

//预测效果如图所示
屏幕截图 2025-09-27 201624
注意:
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;
}

//预测效果如图所示
屏幕截图 01
屏幕截图 02
屏幕截图03
屏幕截图 04
回答问题

  • 当把源代码line9去掉后,重新编译运行,结果是什么样的?
  • 用你所学的知识尝试分析造成这一结果的原因
    getchar();  这一行代码的作用是吸收输入缓冲区中的换行符
    回答:
  1. 为什么要加这一行?
    当用户在输入第一个字符( ans1 )后,会按下「回车键」确认输入。此时,输入的字符(比如  'y' )会被  getchar()  读取到  ans1 ,但「回车键」对应的换行符  \n  会留在输入缓冲区。
    如果不加  getchar(); ,下一次执行  ans2 = getchar();  时,程序会直接读取缓冲区中残留的  \n ,导致第二次输入被“跳过”(因为  \n  不是我们需要的  'y' / 'Y' / 'n' / 'N' )。
  2. 去掉这一行有什么影响?
    假设去掉  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两行代码的错误,其它行不要做任何改动
原代码:

屏幕截图 2025-09-27 205140

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

//预测效果如图所示
屏幕截图 2025-09-27 210659

实验结论

  • 给出修改错误后能正确运行的源码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;
}

//预测效果如图所示
屏幕截图 2025-09-27 211551

实验结论

  • 补充完整并能正确运行的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;
}

//预测效果如图所示

屏幕截图 2025-09-28 092024
屏幕截图 2025-09-28 092104
屏幕截图 2025-09-28 092133

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

//预测效果如图所示

image

实验结论

  • 程序task6_2.c源代码,及,运行测试截图
  • 编译、运行程序,分别输入1.0, 1.01, 0.99,观察运行结果。结束计算时,按下 Ctrl+Z 键。(要同时按下键盘上的Ctrl键和字母Z键;在visual studio中,需要按下 Ctrl+Z 键3次))。
    说明:
  1. C语言中,常使用line8这样的用法,实现多组数据输入,直至用户按下 Ctrl+Z 终止输入,结束循环。
  2. 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;
}

//预测效果如图所示

image

实验结论

  • 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;
}

//预测效果如图所示

image

实验结论

  • task8.c源代码,及,运行测试截图

实验总结

关键知识点总结

  1. 数据类型与输入输出
  • 浮点型数据:使用  double  类型处理小数运算,其精度高于  float ,适合科学计算。
  • 输入格式:对于  double  类型变量,必须使用  %lf  格式控制符。
  • 输出格式化:使用  printf  的格式控制(如  %.2f 、 %.3f )控制小数位数。
  1. 多组输入实现

通过  while  循环结合  scanf  返回值实现多组输入:
while(scanf(%lf%lf%lf,&a,&b,%c)!=EOF{//处理每组输入}

这种方法允许用户连续输入数据,直到手动终止程序(如按  Ctrl + D 或  Ctrl + Z)

  1. 数学函数的使用
  • 数学库:使用  <math.h>  头文件中的函数(如  sqrt 、 pow )
  • 编译注意事项:在使用数学库时,需要添加  -lm  参数(仅限命令行编译)
http://www.hskmm.com/?act=detail&tid=19783

相关文章:

  • 图领域的METIS算法介绍 - zhang
  • CANOpen safety SRDO相关问题总结
  • Prometheus源码专题【左扬精讲】—— 监控系统 Prometheus 3.4.0 源码解析:head_wal.go 的 WAL 写入策略与缓存管理源码解读
  • 电子通信词汇中英文对照
  • 平衡树
  • 完整教程:【有源码】基于Hadoop+Spark的AI就业影响数据分析与可视化系统-AI驱动下的就业市场变迁数据分析与可视化研究-基于大数据的AI就业趋势分析可视化平台
  • Tomcat中启用h3的方法是什么
  • k8s-Namespace
  • 国产化Excel开发组件Spire.XLS教程:C# 写入 Excel ,轻松将数据导出到工作表
  • 牛客刷题-Day6
  • 数字化转型浪潮下:10款主流项目管理工具横向测评与选型指南
  • 借助Aspose.Email,使用 Python 将 EML 转换为 MHTML
  • python+springboot+django/flask的医院食堂订餐系统 菜单发布 在线订餐 餐品管理与订单统计系统 - 教程
  • 计算机网络学习笔记 - 浪矢
  • 数据结构以及LeetCode常用方法 - 浪矢
  • App Store 上架完整流程解析,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 测试与苹果审核经验
  • 使用 Zig 编写英文数字验证码识别工具
  • 数数学习笔记
  • 6 个替代 Microsoft Access 的开源数据库工具推荐
  • 20250626_黔西南网信杯_wireshark
  • Ubuntu STA+AP 开机自启完整方案
  • PDE和CFD的区别?
  • Gitee:中国开发者生态的基石与数字化转型的加速器
  • 20号胶
  • MQTT协议
  • 完整教程:带你了解STM32:TIM定时器(第四部分)
  • 邮件怎么发送超大附件的实用解决方案
  • 告别无效对话:五个让AI输出质量提升10倍的提示词框架
  • 题解:CF2006E Iriss Full Binary Tree
  • CMakeLists.txt用法参考