C语言100例,C++100例
### C语言100例,C++100例——经典、实用、趣味程序设计编程百例精解 #### 绘制余弦曲线 **问题分析与算法设计** 本例通过在屏幕上绘制余弦曲线(0~360度),利用字符“*”来表示曲线上的点,展示了如何克服不使用数组的限制来实现这一目标。核心在于利用余弦函数的左右对称性以及屏幕的行方向和列方向来定位每个点。 - **关键概念**: 余弦函数的左右对称性 - **主要步骤**: - 定义屏幕的行方向为 x 轴,列方向为 y 轴。 - 计算0~180度时的坐标 m,然后利用对称性计算出180~360度的坐标 62 - m。 - 使用反余弦函数 `acos` 来确定坐标之间的关系。 - 在每行中一次输出两个“*”,一个在左侧,一个在右侧。 **程序代码分析** ```c #include<stdio.h> #include<math.h> int main() { double y; int x, m; for(y = 1; y >= -1; y -= 0.1) { /* y 为列方向,从 1 减少到 -1 */ m = acos(y) * 10; /* 计算出 y 对应的弧度 m,乘以 10 为图形放大倍数 */ for(x = 1; x < m; x++) printf(""); printf("*"); /* 控制打印左侧的 * 号 */ for(; x < 62 - m; x++) printf(""); printf("*\n"); /* 控制打印同一行中对称的右侧 * 号 */ } return 0; } ``` **思考题解答** - 如何实现用“*”显示 0~360 度的 sin(x) 曲线? - 采用类似的方法,但使用正弦函数 `sin` 替换 `cos`,并调整计算公式即可。 - 如何实现 cos(x) 曲线与直线 f(x) 的迭加图形? - 需要在计算余弦曲线的同时,也计算直线的坐标,并根据两者的位置关系决定输出哪个符号。 #### 绘制余弦曲线和直线 **问题分析与算法设计** 此例增加了绘制直线的功能,并与余弦曲线进行叠加。通过计算两个图形在同一行中的位置,决定打印哪种符号或两者的交点符号。 - **关键概念**: - 余弦函数的左右对称性。 - 直线的方程。 - 图形叠加时的逻辑判断。 - **主要步骤**: - 分别计算余弦曲线和直线在同一行的坐标。 - 根据坐标关系决定打印哪个符号。 **程序代码分析** ```c #include<stdio.h> #include<math.h> int main() { double y; int x, m, n, yy; for(yy = 0; yy <= 20; yy++) { /* 对于第一个 y 坐标进行计算并在一行中打印图形 */ y = 0.1 * yy; /* y:屏幕行方向坐标 */ m = acos(1 - y) * 10; /* m: cos(x) 曲线上 y 点对应的屏幕列坐标 */ n = 45 * (y - 1) + 31; /* n: 直线上 y 点对应的列坐标 */ for(x = 0; x <= 62; x++) { /* x: 屏幕列方向坐标 */ if(x == m && x == n) printf("+"); /* 直线与 cos(x) 相交时打印“+” */ else if(x == n) printf("+"); /* 打印不相交时的直线图形 */ else if(x == m || x == 62 - m) printf("*"); /* 打印不相交时的 cos(x) 图形 */ else printf(" "); /* 其它情况打印空格 */ } printf("\n"); } return 0; } ``` **思考题解答** - 如何实现 sin(x) 曲线与 cos(x) 曲线图形的同时显示? - 通过分别计算两个函数的坐标,并按照相似的逻辑判断是否打印相应的符号即可实现。 #### 绘制圆 **问题分析与算法设计** 本例通过绘制一个空心的圆,进一步加深了对图形绘制的理解。利用圆的标准方程 `R*R = X*X + Y*Y` 来计算圆上每一点的位置。 - **关键概念**: 圆的标准方程 - **主要步骤**: - 使用圆的方程计算每行的坐标 m。 - 输出圆的左侧、空心部分和右侧。 **程序代码分析** ```c #include<stdio.h> #include<math.h> int main() { double y; int x, m; for(y = 10; y >= -10; y--) { m = 2.5 * sqrt(100 - y * y); /* 计算行 y 对应的列坐标 m,2.5 是屏幕纵横比调节系数 */ for(x = 1; x < 30 - m; x++) printf(""); /* 图形左侧空白控制 */ printf("*"); /* 圆的左侧 */ for(; x < 30 + m; x++) printf(""); /* 图形的空心部分控制 */ printf("*\n"); /* 圆的右侧 */ } return 0; } ``` **思考题解答** - 实现函数 y = x^2 的图形与圆的图形叠加显示 - 可以先计算每个图形的坐标,然后根据坐标决定打印哪种符号。 #### 歌星大奖赛 **问题分析与算法设计** 此例模拟了歌星大奖赛的评分系统,通过去除一个最高分和一个最低分后的平均分来计算最终得分。核心在于理解排序和求平均值的过程。 - **关键概念**: 排序算法和平均数计算 - **主要步骤**: - 输入所有评委的分数。 - 对分数进行排序。 - 计算去掉最高分和最低分后的平均分。 **程序代码分析** 示例代码未给出,但可参考以下步骤: 1. 定义一个数组存储评委的分数。 2. 使用循环输入分数。 3. 使用排序算法对数组进行排序。 4. 计算去掉最高分和最低分后的平均分。 **思考题解答** - 实现上述功能的具体代码设计。 - 可以使用简单的冒泡排序算法对分数进行排序,然后计算平均分。 - 示例代码如下: ```c #include<stdio.h> int main() { int scores[10]; int sum = 0; float average; for(int i = 0; i < 10; i++) { printf("请输入第 %d 个评委的分数:", i + 1); scanf("%d", &scores[i]); } // 冒泡排序 for(int i = 0; i < 9; i++) { for(int j = 0; j < 9 - i; j++) { if(scores[j] > scores[j + 1]) { int temp = scores[j]; scores[j] = scores[j + 1]; scores[j + 1] = temp; } } } // 去掉最高分和最低分后计算平均分 for(int i = 1; i < 9; i++) { sum += scores[i]; } average = (float)sum / 8; printf("最终得分: %.2f\n", average); return 0; } ``` 以上四个例子涵盖了图形绘制和数据处理的基本方法,不仅能够帮助初学者掌握 C/C++ 编程的基本技巧,还能提高解决实际问题的能力。
剩余63页未读,继续阅读
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 连接ESP32手表来做验证20241223-140953.pcapng
- 小偏差线性化模型,航空发动机线性化,非线性系统线性化,求解线性系统具体参数,最小二乘拟合 MATLAB Simulink 航空发动机,非线性,线性,非线性系统,线性系统,最小二乘,拟合,小偏差,系统辨
- 好用的Linux终端管理工具,支持自定义多行脚本命令,密码保存、断链续接,SFTP等功能
- Qt源码ModbusTCP 主机客户端通信程序 基于QT5 QWidget, 实现ModbusTCP 主机客户端通信,支持以下功能: 1、支持断线重连 2、通过INI文件配置自定义服务器I
- Linux下TurboVNC+VirtualGL 使用GPU卡vglrun glxgears
- QGroundControl-installer.exe
- Linux下TurboVNC+VirtualGL 使用GPU卡vglrun glxgears
- 台球检测40-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 颜色拾取器 for Windows
- 数字按键3.2考试代码