三个值的中值

2024-01-08

我正在尝试编写一个 C 程序,它接受 3 个值作为函数参数并返回中位数。该程序运行得很好 - 直到我意识到它不能使用相同的值两次或更多次。 例如,如果输入是 1,2,3 - 我得到 2,正确的中位数,但如果输入是 1,2,1 或 1,1,1 ..循环从头开始重复。我认为我的逻辑是正确的但我一定犯了一些小错误。

我的尝试:

int median(int firstInt,int secondInt, int thirdInt) {

   if (secondInt>firstInt && secondInt>thirdInt || 
      thirdInt>firstInt && firstInt>secondInt) {
      printf("The median value is %d\n", firstInt);
   }
   if (firstInt>secondInt && secondInt>thirdInt || 
      thirdInt>secondInt && secondInt>firstInt) {
      printf("The median value is %d\n", secondInt);
   }
   if (firstInt>thirdInt && thirdInt>secondInt || 
      secondInt>thirdInt && thirdInt>firstInt) {
      printf("The median value is %d\n", thirdInt);
   }
}

void main() {

   int count = 100; 
   int firstInt,secondInt,thirdInt;

   while(count--) 
   {

      printf("Enter first Integer : "); 
      scanf("%d", &firstInt); 
      printf("Enter second Integer : "); 
      scanf("%d", &secondInt); 
      printf("Enter third Integer : ");
      scanf("%d", &thirdInt); 
      median(firstInt, secondInt, thirdInt); //calling

   }
}

Input : 1,2,1
Output :Enter first integer : // WHY is this happening?

The first你应该做的就是决定你的函数的用途。它的签名和名称表明它应该是return中位数,但实际上是代码prints它(并且,如果它只是打印它,它可能应该有一个void返回类型)。

打印可能最好留给调用者,让函数只计算并返回中值。这使得它成为一个更加通用的函数。

无论如何,这是使用>而不是>=这导致了你的问题,因为两个或多个数字相同的数据集往往不会导致任何结果if陈述属实。

一个“更干净”的解决方案(在我看来)就是依次涵盖所有六种可能性:

int median (int a, int b, int c) {
    if ((a <= b) && (b <= c)) return b;  // a b c
    if ((a <= c) && (c <= b)) return c;  // a c b
    if ((b <= a) && (a <= c)) return a;  // b a c
    if ((b <= c) && (c <= a)) return c;  // b c a
    if ((c <= a) && (a <= b)) return a;  // c a b
    return b;                            // c b a
}

请注意,我已经使用过<=在这里,只是因为它使条件与注释中显示的序列更加紧密地结合在一起。重要的是使用包含比较运算符,无论>= or <=,而不是像这样的专有的>.

您甚至可以重构比较,使代码更具可读性,例如:

static int is_ordered(int x, int y, int z) {
    return (x <= y) && (y <= z);
}
int median (int a, int b, int c) {
    if (is_ordered(a, b, c)) return b;
    if (is_ordered(a, c, b)) return c;
    if (is_ordered(b, a, c)) return a;
    if (is_ordered(b, c, a)) return c;
    if (is_ordered(c, a, b)) return a;
    return b;                          // Only one left is c, b, a.
}

我最初不会担心这里涉及的额外函数调用,除非你想多次调用它,many每秒次数。即使如此,您可能会发现编译器足够聪明,可以内联该函数。我的一般建议是首先优化可读性,then仅当性能成为问题时才担心它。


当然,还有另一种选择(几乎总是有)。

由于只有三个值,因此对它们进行排序并返回中间的值是一件简单的事情。它不必是复杂的排序,因为您只需使用由几个条件创建的展开的冒泡排序即可。执行此操作的代码如下所示:

int median (int a, int b, int c) {
    // Unrolled bubble sort, then return middle one.

    if (a > b) { int t = a; a = b; b = t; }
    if (b > c) { int t = b; b = c; c = t; }
    if (a > b) { int t = a; a = b; b = t; }

    return b;
}

就我个人而言,我认为这不如之前的代码那么可读,但是,如果您喜欢它,它肯定是有用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三个值的中值 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • Rx 中是否有与 Task.ContinueWith 运算符等效的操作?

    Rx 中是否有与 Task ContinueWith 运算符等效的操作 我正在将 Rx 与 Silverlight 一起使用 我正在使用 FromAsyncPattern 方法进行两个 Web 服务调用 并且我想这样做同步地 var o1
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 如何使用 Mongodb C# 驱动程序连接多个集合

    我需要将 3 个集合与多个集合合并在一起 lookup我在 C 驱动程序中尝试过 它允许我 lookup用户采集但无法执行秒 lookup用于设置集合 有人可以帮忙吗 db Transactions aggregate lookup fro
  • 等待线程完成

    private void button1 Click object sender EventArgs e for int i 0 i lt 15 i Thread nova new Thread Method nova Start list
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 如何在 C# 中调整图像大小同时保持高质量?

    我从这里找到了一篇关于图像处理的文章 http www switchonthecode com tutorials csharp tutorial image editing saving cropping and resizing htt
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • 有浏览器实现了 DOM3 EventListenerList 吗?

    早在 2010 年 3 月 答案就是 不 浏览器事件监听器列表实现 https stackoverflow com questions 2424737 browser eventlistenerlist implementation 我想知
  • Python 相当于 LINQ All 函数?

    测试集合中的所有元素是否满足条件的惯用 Python 方法是什么 这 NET All method http msdn microsoft com en us library bb548541 aspxC 很好地填补了这个空白 有一个明显的
  • 在错误的位置包含标题 Laravel 4

    我试图首先包含 header blade php 然后包含内容 但它包含错误的方式 include site components header yield content include site components footer 渲染
  • Android 4.0 模拟器无法启动

    当尝试创建并启动 Android 4 0 模拟器时 我获得了 Android 模拟器皮肤 但操作系统似乎无法启动 我已从 Android SDK 管理器安装了 ARM EABI v7 软件包 尝试创建模拟器 但收到有关缺少 userdata
  • 正则表达式匹配不相等或不反转的数字组

    我在这里指的是这个问题的后续 正则表达式匹配两个不相等的数字 https stackoverflow com questions 5257685 regular expression to match two numbers that ar
  • Swift 3 / iOS 10 / TodayExtension - UserDefaults 始终返回 nil

    这是我在这个网站上的第一个问题 我有一个无法解决的问题 我正在开发一个带有 Today 扩展的简单笔记应用程序 我在 Swift 2 2 和 iOS 9 中没有遇到任何问题 问题只出现在 iOS 10 上的 Swift 2 3 和 Swif
  • 从 Python 访问 COM 方法

    我有一个旧的 Windows DLL 没有源代码 它实现了实用函数表 几年前 计划将其转换为 COM 对象 以便实现 IUnknown 接口 为了使用这个 DLL 有一个头文件 简化的 interface IFunctions public
  • 在编写 C 代码时如何优雅地利用 REV 和 RBIT 等 ARM 指令?

    我正在编写可以为 Arm Cortex M3 微控制器编译的 C 代码 该微控制器支持多种有用的指令 可有效操作寄存器中的位 包括 REV RBIT SXT 在编写C代码时 如果我需要那些特定的功能 如何利用这些指令 例如 我怎样才能完成这
  • Django:标记为已读“通知”

    我正在做一个学校项目 现在任何用户都可以提出问题 为了在任何用户提出问题时通知所有用户 我创建了一个新应用程序 并在提出问题时通过简单的 视图 通知他们 但这还只是普通的通知 用户打开 通知 选项卡后 如何将它们标记为已读 就像在社交网络上
  • 如何从浏览器读取客户端的机器/计算机名称?

    如何从浏览器读取客户端的机器 计算机名称 是否可以使用 JavaScript 和 或 ASP NET 您 有时 可以使用 IE 来完成此操作 因为我已经在只有 IE 的 Intranet 上的内部应用程序中完成了此操作 请尝试以下操作 fu
  • 按字符串选择列时,Dplyr 的 tbl_df 会出现意外行为

    通常 当以编程方式使用 dplyr 时 我希望通过名称选择列 其中列名称作为字符串存储在某个变量中 我注意到尝试使用 dplyr 执行此操作通常会导致意外结果 这似乎是由于 tbl df 的处理方式造成的 以下是一些示例 regular d
  • 如何将一个函数作为参数传递给另一个函数

    我想将一个函数作为参数传递给另一个函数 例如 void myFunction boolean coondition void function if condition function 在 Java 8 中这可能吗 不 你不能传递方法 但
  • 从c# 连接到oracle

    我正在尝试从 C 连接 Oracle 11g 我已关注 此链接 定义了连接别名 如下所示 moviess DESCRIPTION ADDRESS PROTOCOL TCP HOST localhost PORT 1521 CONNECT D
  • Entity Framework 4.1 Fluent API 中具有联接表和可选关系的一对多

    再次使用无法更改的旧数据库 并使用 Entity Framework 4 1 和 Fluent API 仅读取数据 public class Client Key public int ClientID get set public str
  • 如何 Dockerize Windows 应用程序

    我有一个 Windows 应用程序 我想将其容器化 它是一个 Windows 桌面应用程序 不是 Web 应用程序 我做了一些搜索 发现关于容器化桌面应用程序的信息很少 我想要容器化的应用程序在 WindowsServerCore 上运行良
  • Angular4 更改 md 按钮的波纹颜色

    我使用 Material for Angular4 在网页中创建了一个 md 按钮 有没有办法改变波纹效果的颜色并使其变为白色 我还可以更改其他波纹属性 例如波纹效果的持续时间吗 事实证明 为了更改波纹属性 应该在 mat ripple t
  • BehaviourSubject 初始值不适用于 share()

    share 运算符应用于BehaviorSubject BehaviourSubject 有初始值 目标是创建单个共享订阅 但是当BehaviorSubject有初始值时 这种共享订阅似乎不起作用 得到意想不到的结果 代码如下所示 let
  • 使用我自己的实体而不是 POCO 实体

    我正在使用实体框架 我可以使用自己的实体来代替 POCO 实体吗 我可以使用任何实体 或者实体名称和成员有任何限制吗 如果实体的成员与字段的名称不同 如何在 db 字段与实体的成员本身之间映射 UPDATE我已经拥有数据库广告一个大型项目
  • 将函数放入对象中与对其进行原型设计之间有什么区别?

    向对象添加函数和将函数原型化到对象上有什么区别 原型设计允许对象 模型调用自身吗 函数对象 通常用于对一组函数进行 命名空间 以便一个容器对象具有许多方法而不是许多全局函数 这样做的好处是保持代码组件按对象 可能还有对象层次结构 进行分类或
  • 三个值的中值

    我正在尝试编写一个 C 程序 它接受 3 个值作为函数参数并返回中位数 该程序运行得很好 直到我意识到它不能使用相同的值两次或更多次 例如 如果输入是 1 2 3 我得到 2 正确的中位数 但如果输入是 1 2 1 或 1 1 1 循环从头