C语言程序设计-2 程序的灵魂—算法

【例 2.1】求 1×2×3×4×5。
最原始方法:
步骤 1:先求 1×2,得到结果 2。
步骤 2:将步骤 1 得到的乘积 2 乘以 3,得到结果 6。
步骤 3:将 6 再乘以 4,得 24。
步骤 4:将 24 再乘以 5,得 120。
这样的算法虽然正确,但太繁。
改进的算法:
S1: 使 t=1
S2: 使 i=2
S3: 使 t×i, 乘积仍然放在在变量 t 中,可表示为 t×i→t
S4: 使 i 的值+1,即 i+1→i
S5: 如果 i≤5, 返回重新执行步骤 S3 以及其后的 S4 和 S5;否则,算法结束。
如果计算 100!只需将 S5:若 i≤5 改成 i≤100 即可。
如果该求 1×3×5×7×9×11,算法也只需做很少的改动:
S1: 1→t
S2: 3→i
S3: t×i→t
S4: i+2→t
S5:若 i≤11, 返回 S3,否则,结束。
该算法不仅正确,而且是计算机较好的算法,因为计算机是高速运算的自动机器,实现循环
轻而易举。
思考:若将 S5 写成:S5:若 i<11, 返回 S3;否则,结束。

#include <math.h>
#include <stdio.h>int main()
{int t = 1;int i = 3;// 求 1×2×3×4×5 的// while (i <= 5) {//     t *= i;//     i += 1;// }// 求 100! (1×2×...×100) 的变种// while (i <= 100)// {//     t *= i;//     i += 1;// }// 计算1×3×5×7×9×11的乘积:while (i <= 11){t *= i;i += 2;}printf("乘积结果是: %d\n", t);return 0;
}

【例 2.2】有 50 个学生,要求将他们之中成绩在 80 分以上者打印出来。
如果,n表示学生学号,ni表示第个学生学号;g表示学生成绩,gi表示第个学生成绩;
则算法可表示如下:
S1: 1→i
S2: 如果gi≥80,则打印ni和gi,否则不打印
S3: i+1→i
S4:若 i≤50, 返回 S2,否则,结束。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// #include "../../tools/tools/String/array_to_string.h"#define NUM_STUDENTS 50int main() {int student_ids[NUM_STUDENTS];int scores[NUM_STUDENTS];int i;int arr[] = {1, 2, 3, 4, 5};// 初始化随机数种子srand(time(NULL));// 填充学生学号,这里简单从1到50for (i = 0; i < NUM_STUDENTS; i++) {student_ids[i] = i + 1;}// int size = sizeof(student_ids) / sizeof(student_ids[0]);// char* str = array_to_string(student_ids, size);// 生成随机成绩(例如,介于0到100之间)for (i = 0; i < NUM_STUDENTS; i++) {scores[i] = rand() % 101; // %101 保证范围在0-100}// 打印80分以上的学生信息printf("成绩80分以上的学生信息:\n");for (i = 0; i < NUM_STUDENTS; i++) {if (scores[i] >= 80) {printf("学生学号: %d, 成绩: %d\n", student_ids[i], scores[i]);}}return 0;
}

【例 2.3】判定 2000 — 2500 年中的每一年是否闰年,将结果输出。
润年的条件:

1. 能被 4 整除,但不能被 100 整除的年份;
2. 能被 100 整除,又能被 400 整除的年份;
设 y 为被检测的年份,则算法可表示如下:
S1: 2000→y
S2:若 y 不能被 4 整除,则输出 y“不是闰年”,然后转到 S6
S3:若 y 能被 4 整除,不能被 100 整除,则输出 y“是闰年”,然后转到 S6
S4:若 y 能被 100 整除,又能被 400 整除,输出 y“是闰年” 否则输出 y“不是闰年”,
然后转到 S6
S5:输出 y“不是闰年”。
S6:y+1→y
S7:当 y≤2500 时, 返回 S2 继续执行,否则,结束。

在这里插入图片描述

int main() {int y = 2000; // S1: 初始化年份为2000while (y <= 2500) { // S7: 当y小于等于2500时循环执行// S2: 判断能否被4整除if (y % 4 != 0) {printf("%d不是闰年\n", y); // 输出不是闰年} else {// S3: 能被4整除,继续判断能否被100整除if (y % 100 != 0) {printf("%d是闰年\n", y); // 输出是闰年} else {// S4: 能被100整除,再判断能否被400整除if (y % 400 == 0) {printf("%d是闰年\n", y); // 输出是闰年} else {printf("%d不是闰年\n", y); // 否则,不是闰年}}}y++; // S6: 年份加1,准备检查下一年}return 0;
}

【例 2.4】求 100
1 - 1/2 - 1/3 + … + 1/100
算法可表示如下:
S1: sigh=1
S2: sum=1
S3: deno=2
S4: sigh=(-1)×sigh
S5: term= sigh×(1/deno )
S6: term=sum+term
S7: deno= deno +1
S8:若 deno≤100,返回 S4;否则,结束。

    double sum = 1.0;  // S1: 初始化总和为1.0,首项为1int sign = -1;     // S2: 初始化符号变量,首项后开始为负int deno = 2;      // S3: 初始化分母为2,从第二项1/2开始printf("计算过程:\n");// S4-S8: 循环计算直到分母达到101(包括1/100这一项)while (deno <= 100) {double term = (double)sign / deno; // S5: 计算当前项,并考虑符号// 更清晰地展示计算过程,但需注意浮点数精度限制printf("Step %2d: Term = %+.10lf (as fraction ~ %+.10lf/%d)\n", deno-1, term, sign, deno);sum += term;                     // S6: 累加到总和sign *= -1;                      // S7: 反转符号,准备计算下一项deno++;                         // S8: 分母递增}// 输出结果printf("\n计算结果为: %.10lf\n", sum);return 0;

【例 2.5】对一个大于或等于 3 的正整数,判断它是不是一个素数。
算法可表示如下:
S1: 输入 n 的值
S2: i=2
S3: n 被 i 除,得余数 r
S4:如果 r=0,表示 n 能被 i 整除,则打印 n“不是素数”,算法结束;否则执行 S5
S5: i+1→i
S6:如果 i≤n-1,返回 S3;否则打印 n“是素数”;然后算法结束。
改进:
S6:如果i≤ n ,返回S3;否则打印n“是素数”;然后算法结束。

int main() {int n, i = 2;printf("请输入一个大于或等于3的正整数: ");scanf("%d", &n);// 算法实现if (n < 3) {printf("%d 不符合输入要求(应大于或等于3的正整数)。\n", n);} else if (n == 3) {printf("%d 是素数。\n", n);} else if (n % 2 == 0) {printf("%d 不是素数。\n", n);} else {// 从3开始检查到n本身,步长为2,因为偶数已排除for (; i <= n; i += 2) {if (n % i == 0) {printf("%d 不是素数。\n", n);return 0; // 一旦发现有因子,直接结束}}}printf("%d 是素数。\n", n);return 0;}

流程图表示算法,直观形象,易于理解。
在这里插入图片描述
【例 2.6】将例 2.1 求 5!的算用流程图表示。
在这里插入图片描述
【例 2.7】将例 2.2 的算用流程图表示。
在这里插入图片描述
【例 2.8】将例 2.3 判定闰年的算用流程图表示。
在这里插入图片描述

将例 2.4 求 1-1/2+1/3-1/4+1/99-1/100
的算用流程图表示。
一个流程图包括:

1. 表示相应操作的框;
2. 带箭头的流程线;
3. 框内外必要的文字说明。

在这里插入图片描述

我们的任务是用计算机解题,就是用计算机实现算法;
用计算机语言表示算法必须严格遵循所用语言的语法规则。
【例 2.20】求 1×2×3×4×5 用 C 语言表示。

main()
{int i, t;t = 1;i = 2;while (i <= 5){t = t * i;i = i + 1;}printf(% d”, t);
}

【例 2.21】求级数的值。

main()
{int sigh = 1;float deno = 2.0, sum = 1.0, term;while (deno <= 100){sigh = -sigh;term = sigh / deno;sum = sum + term;deno = deno + 1;}printf("% f", sum);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/32320.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

荒野大镖客2启动找不到emp.dll的7个修复方法,轻松解决dll丢失的办法

一、emp.dll文件丢失的常见原因 安装或更新问题&#xff1a;在软件或游戏的安装过程中&#xff0c;可能由于安装程序未能正确复制文件到目标目录&#xff0c;或在更新过程中文件被意外覆盖或删除&#xff0c;导致emp.dll文件丢失。 安全软件误删&#xff1a;某些安全软件可能…

自动控制原理出射角计算

背景&#xff1a;突然发现自己出射角不会算 被减数是零点到极点的角度&#xff0c;减数是极点到极点的角度

关于Windows系统下redis的闪退问题。

一、问题分析 首先&#xff0c;有这个问题的一般是如下操作&#xff1a; 1、在运行项目时发现无法连接到redis服务器&#xff0c; 2、进入Redis安装目录(如图)——>鼠标双击打开redis-server.exe&#xff0c;然后闪退&#xff0c; 3、运行redis-cli时提示&#xff1a;“由…

使用ESP32和Flask框架实现温湿度数据监测系统

项目概述 在这个项目中&#xff0c;我们将使用ESP32微控制器读取温湿度传感器的数据&#xff0c;并将这些数据通过HTTP请求传输到基于Flask框架的服务器。Flask是一个轻量级的Python Web框架&#xff0c;非常适合快速开发和部署Web应用。通过这个项目&#xff0c;我们不仅可以了…

【Unity】RPG2D龙城纷争(三)角色、角色数据集

更新日期&#xff1a;2024年6月18日。 项目源码&#xff1a;第五章发布&#xff08;正式开始游戏逻辑的章节&#xff09; 索引 简介角色数据集&#xff08;RoleDataSet&#xff09;一、定义角色数据集类二、角色基础数据&#xff08;公共数据&#xff09; 角色&#xff08;Role…

最优化第六讲练习题

使用牛顿法 def f(vec):x1,x2vec[0],vec[1]return x1*x1/22*x2*x2def first_order(vec):x1,x2vec[0],vec[1]return np.array((x1,4*x2))x0np.array((2,1)) #初始点 secnp.array([[1,0],[0,4]]) #二阶导 try:invnp.linalg.inv(sec) except:print("矩阵不存在逆矩阵")…

基于YOLOv5的交通标志检测的设计与实现

简介 在智能交通系统中,交通标志的准确检测与识别对提高道路安全和交通效率至关重要。为了实现这一目标,我们开发了一种基于YOLOv5目标检测模型的交通标志检测系统。本报告将详细介绍该系统的实际应用与实现,包括系统架构、功能实现、使用说明、检测示例、数据集获取与介绍…

Rocky Linux archive下载地址

Index of /vault/rocky/https://dl.rockylinux.org/vault/rocky/

2024年安全员-A证证考试题库及安全员-A证试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年安全员-A证证考试题库及安全员-A证试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人员上岗证考试大纲随机出的…

ArcGIS arcpy代码工具——批量要素裁剪栅格影像

系列文章目录 ArcGIS arcpy代码工具——批量对MXD文件的页面布局设置修改 ArcGIS arcpy代码工具——数据驱动工具批量导出MXD文档并同步导出图片 ArcGIS arcpy代码工具——将要素属性表字段及要素截图插入word模板 ArcGIS arcpy代码工具——定制属性表字段输出表格 ArcGIS arc…

C++ 79 之 自己写异常类

#include <iostream> #include <string> using namespace std;class MyOutOfRange : public exception{ // 选中exception右键 转到定义 复制一份 virtual const char* what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW 进行函数重写 public: string m_msg;M…

计算机毕设JAVA——学习考试管理系统(基于SpringBoot+Vue前后端分离的项目)

学习考试管理系统 概要系统架构技术运行环境系统功能项目演示图片 概要 网络上许多计算机毕设项目开发前端界面设计复杂、不美观&#xff0c;而且功能结构十分单一&#xff0c;存在很多雷同的项目&#xff1a;页面基本上就是套用固定模板&#xff0c;换个颜色、改个文字&#…

实战电商大数据项目搭建||电商大数据采集||电商API接口

我会提供给你大概1亿条真实的互联网用户上网数据&#xff0c;至于来源&#xff0c;我先不告诉你&#xff0c;绝对是你在网络上无法找到的宝贵数据源。 此外&#xff0c;还会给你提供一个基于当前数据特点而设计的大数据处理方案。 当然&#xff0c;为了防止用户的隐私部分被泄露…

如何提升外链网站的收录率?

要提高外链网站的收录率&#xff0c;要明确的一点是&#xff0c;被收录的外链才能发挥最大的作用&#xff0c;因此&#xff0c;提升收录率是首要任务。一个有效的方法是使用GPC爬虫池&#xff0c;这样可以大幅度提高谷歌蜘蛛对众多外链网站页面的抓取频率 通过GPC爬虫池的引导…

【LeetCode热题 100】螺旋矩阵

leetcode原地址&#xff1a;https://leetcode.cn/problems/spiral-matrix/description 描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8…

使用Scala爬取安居客房产信息并存入CSV文件

使用Scala爬取安居客房产信息并存入CSV文件 本篇博客中&#xff0c;我们将介绍如何使用Scala语言编写一个简单的程序&#xff0c;来爬取安居客&#xff08;Anjuke&#xff09;网站上的房产信息&#xff0c;并将这些信息存储到CSV文件中。这个示例将涵盖HTTP请求、HTML解析、数…

00 - matlab m_map地学绘图工具安装及简单使用教程

00 - matlab m_map地学绘图工具安装及简单使用教程 0. 引言1. m_map工具的获取及配置过程2. 绘图示例3. 结语 0. 引言 m_map是MATLAB中的一个绘图工具包&#xff0c;用于绘制地图和地理数据。它提供了一系列函数&#xff0c;可以用来绘制地理投影、添加地理特征、绘制等值线图等…

「漏洞复现」真内控国产化开发平台 preview 任意文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

[SAP ABAP] 运算符与操作符

1.算数运算符 算术运算符描述加法-减法*乘法/除法MOD取余 示例1 输出结果: 输出结果: 2.比较运算符 比较运算符描述示例 等于 A B A EQ B <> 不等于 A <> B A NE B >大于 A > B A GT B <小于 A < B A LT B >大于或等于 A > B A GE B <小…