gpt4 book ai didi

c - 如何在 printf 语句中设置条件?

转载 作者:太空狗 更新时间:2023-10-29 15:54:06 25 4
gpt4 key购买 nike

我有一个家庭作业,我必须创建一个 C 程序,将 5 个数字从小到大排序。我知道如何使用函数和 if 轻松对此进行编程语句(使用 >=<= )。

但是,问题是我只能使用 printfscanf , 所以我必须计算所有 >=<=printf里面.而且我不允许使用三元运算符。

我已经尝试了很长时间。所以我试着只对 3 个数字进行排序,我什至无法通过对最小数字的排序。它一直在打印 1 .

// This printf is just trying to figure out the smallest number from 3 numbers provided but it keeps printing 1.
printf("The ascending order of the numbers are: %d ",
(
(num1 <= num2 && num1 <= num3) || // Checking if num1 is the smallest
(num2 <= num1 && num2 <= num3) || // Checking if num2 is the smallest
(num3 <= num2 && num3 <= num1) // Checking if num3 is the smallest
));

我想到的一个可能的解决方案是添加 ((num1 + num2 + num3) -1)因为如果其中一个语句为真(例如,如果 num2 是最小的,它将打印 1 因为 1 表示为真)。如果为假,则打印 0 .所以我可以在技术上添加这样的陈述 -1 .所以如果num2的说法是真的,我可以做到+ num2 - 1 .

最佳答案

第 1 轮:三个不同值中的最小值

请注意,如果条件的计算结果为假,则结果为 0 ;如果为真,1 .所以你可以使用一个技巧(只要乘法和加法也不是被禁止的)——对于问题中所示的三个不同的值:

printf("The smallest number is: %d ",
(num1 * (num1 <= num2 && num1 <= num3) +
num2 * (num2 <= num1 && num2 <= num3) +
num3 * (num3 <= num1 && num3 <= num2)));

如果两个值相同且都是较小的值,就会出现问题。

第 2 轮:至少五个不同的值

如果您需要处理 5 个值,那么(如评论中所述)单调多于困难。

printf("The smallest number is: %d ",
(num1 * (num1 <= num2 && num1 <= num3 && num1 <= num4 && num1 <= num5) +
num2 * (num2 <= num1 && num2 <= num3 && num2 <= num4 && num2 <= num5) +
num3 * (num3 <= num1 && num3 <= num2 && num3 <= num4 && num3 <= num5) +
num4 * (num4 <= num1 && num4 <= num2 && num4 <= num3 && num4 <= num5) +
num5 * (num5 <= num1 && num5 <= num2 && num5 <= num3 && num5 <= num4)));

这只是为了找到最小值;将它用于其他每个案例很快就会变得荒谬。事实上,整个练习相当愚蠢,但它在某些类(class)中也相当典型。

第 3 步:三个值中的最小值不一定不同

经过一番思考,我认为你可以处理 2 或 3 个数字(这基本上是 user3386109comment 中所说的)。

#include <stdio.h>

static void print_smallest(int num1, int num2, int num3)
{
printf("The smallest number of (%d, %d, %d) is %d\n",
num1, num2, num3,
(num1 * (num1 <= num2 && num1 <= num3) +
num2 * (num2 < num1 && num2 <= num3) +
num3 * (num3 < num1 && num3 < num2)));
}

int main(void)
{
for (int i = 1; i < 4; i++)
{
for (int j = 1; j < 4; j++)
{
for (int k = 1; k < 4; k++)
print_smallest(i, j, k);
}
}
return 0;
}

输出:

The smallest number of (1, 1, 1) is 1
The smallest number of (1, 1, 2) is 1
The smallest number of (1, 1, 3) is 1
The smallest number of (1, 2, 1) is 1
The smallest number of (1, 2, 2) is 1
The smallest number of (1, 2, 3) is 1
The smallest number of (1, 3, 1) is 1
The smallest number of (1, 3, 2) is 1
The smallest number of (1, 3, 3) is 1
The smallest number of (2, 1, 1) is 1
The smallest number of (2, 1, 2) is 1
The smallest number of (2, 1, 3) is 1
The smallest number of (2, 2, 1) is 1
The smallest number of (2, 2, 2) is 2
The smallest number of (2, 2, 3) is 2
The smallest number of (2, 3, 1) is 1
The smallest number of (2, 3, 2) is 2
The smallest number of (2, 3, 3) is 2
The smallest number of (3, 1, 1) is 1
The smallest number of (3, 1, 2) is 1
The smallest number of (3, 1, 3) is 1
The smallest number of (3, 2, 1) is 1
The smallest number of (3, 2, 2) is 2
The smallest number of (3, 2, 3) is 2
The smallest number of (3, 3, 1) is 1
The smallest number of (3, 3, 2) is 2
The smallest number of (3, 3, 3) is 3

第 4 步:三个值的排序顺序不一定不同

计算最大值而不是最小值是微不足道的;只需使用 >代替 <自始至终。结果证明计算中位数更难。我怀疑有比这更好的方法,但至少这是有效的。请注意减去的项 - 忽略它,当三个值相同时,中值翻倍。

#include <stdio.h>

static void print_smallest(int num1, int num2, int num3)
{
printf("The sorted order of (%2d, %2d, %2d) is (%2d, %2d, %2d)\n",
num1, num2, num3,

(num1 * (num1 <= num2 && num1 <= num3) + /* Min1 */
num2 * (num2 < num1 && num2 <= num3) + /* Min2 */
num3 * (num3 < num1 && num3 < num2)), /* Min3 */

(num1 * (num1 >= num2 && num1 <= num3) + /* Med1 */
num2 * (num2 > num1 && num2 <= num3) + /* Med2 */
num3 * (num3 > num1 && num3 < num2) - /* Med3 */
num1 * (num1 == num2 && num1 == num3) + /* Med4 */
num1 * (num1 <= num2 && num1 >= num3) + /* Med5 */
num2 * (num2 < num1 && num2 >= num3) + /* Med6 */
num3 * (num3 < num1 && num3 > num2)), /* Med7 */

(num1 * (num1 >= num2 && num1 >= num3) + /* Max1 */
num2 * (num2 > num1 && num2 >= num3) + /* Max2 */
num3 * (num3 > num1 && num3 > num2)) /* Max3 */
);
}

int main(void)
{
int lo = -7; // +1, -2
int hi = +6; // +4, +4
int jp = +6; // +1, +2
for (int i = lo; i < hi; i += jp)
{
for (int j = lo; j < hi; j += jp)
{
for (int k = lo; k < hi; k += jp)
print_smallest(i, j, k);
}
}
return 0;
}

输出:

The sorted order of (-7, -7, -7) is (-7, -7, -7)
The sorted order of (-7, -7, -1) is (-7, -7, -1)
The sorted order of (-7, -7, 5) is (-7, -7, 5)
The sorted order of (-7, -1, -7) is (-7, -7, -1)
The sorted order of (-7, -1, -1) is (-7, -1, -1)
The sorted order of (-7, -1, 5) is (-7, -1, 5)
The sorted order of (-7, 5, -7) is (-7, -7, 5)
The sorted order of (-7, 5, -1) is (-7, -1, 5)
The sorted order of (-7, 5, 5) is (-7, 5, 5)
The sorted order of (-1, -7, -7) is (-7, -7, -1)
The sorted order of (-1, -7, -1) is (-7, -1, -1)
The sorted order of (-1, -7, 5) is (-7, -1, 5)
The sorted order of (-1, -1, -7) is (-7, -1, -1)
The sorted order of (-1, -1, -1) is (-1, -1, -1)
The sorted order of (-1, -1, 5) is (-1, -1, 5)
The sorted order of (-1, 5, -7) is (-7, -1, 5)
The sorted order of (-1, 5, -1) is (-1, -1, 5)
The sorted order of (-1, 5, 5) is (-1, 5, 5)
The sorted order of ( 5, -7, -7) is (-7, -7, 5)
The sorted order of ( 5, -7, -1) is (-7, -1, 5)
The sorted order of ( 5, -7, 5) is (-7, 5, 5)
The sorted order of ( 5, -1, -7) is (-7, -1, 5)
The sorted order of ( 5, -1, -1) is (-1, -1, 5)
The sorted order of ( 5, -1, 5) is (-1, 5, 5)
The sorted order of ( 5, 5, -7) is (-7, 5, 5)
The sorted order of ( 5, 5, -1) is (-1, 5, 5)
The sorted order of ( 5, 5, 5) is ( 5, 5, 5)

第 5 步:三个值的排序顺序,无循环或函数

和以前一样,第 4 遍中的代码对三个数字在其相对位置的所有组合进行了全面测试。如果您需要读取三个数字然后对它们进行排序(并且不允许使用循环或除 main()scanf()printf() 以外的函数,就这样吧——您可以移植 printf()在您读取三个值后立即声明到您的 main() 中:

#include <stdio.h>

int main(void)
{
int num1, num2, num3;

if (scanf("%d%d%d", &num1, &num2, &num3) != 3)
{
fprintf(stderr, "failed to read 3 integers\n");
return 1;
}

printf("The sorted order of (%2d, %2d, %2d) is (%2d, %2d, %2d)\n",
num1, num2, num3,

(num1 * (num1 <= num2 && num1 <= num3) + /* Min1 */
num2 * (num2 < num1 && num2 <= num3) + /* Min2 */
num3 * (num3 < num1 && num3 < num2)), /* Min3 */

(num1 * (num1 >= num2 && num1 <= num3) + /* Med1 */
num2 * (num2 > num1 && num2 <= num3) + /* Med2 */
num3 * (num3 > num1 && num3 < num2) - /* Med3 */
num1 * (num1 == num2 && num1 == num3) + /* Med4 */
num1 * (num1 <= num2 && num1 >= num3) + /* Med5 */
num2 * (num2 < num1 && num2 >= num3) + /* Med6 */
num3 * (num3 < num1 && num3 > num2)), /* Med7 */

(num1 * (num1 >= num2 && num1 >= num3) + /* Max1 */
num2 * (num2 > num1 && num2 >= num3) + /* Max2 */
num3 * (num3 > num1 && num3 > num2)) /* Max3 */
);

return 0;
}

使用随机数生成器(程序名称 sort3-53)进行测试会产生:

$ for i in $(range 0 9); do random -n 3 10 99 | sort3-53; done
The sorted order of (66, 62, 70) is (62, 66, 70)
The sorted order of (43, 99, 23) is (23, 43, 99)
The sorted order of (20, 46, 66) is (20, 46, 66)
The sorted order of (87, 82, 19) is (19, 82, 87)
The sorted order of (63, 29, 62) is (29, 62, 63)
The sorted order of (40, 66, 15) is (15, 40, 66)
The sorted order of (17, 13, 58) is (13, 17, 58)
The sorted order of (84, 50, 11) is (11, 50, 84)
The sorted order of (60, 86, 54) is (54, 60, 86)
The sorted order of (37, 33, 96) is (33, 37, 96)
$

你或许可以使用 seq我在哪里使用 range .我不确定是否有类似于 random 的标准 PRNG 程序我使用(并写过)。显示的调用生成 3 个介于 10 和 99 之间的随机数。

应该怎么做?

这里的整个过程是荒谬的——但那是因为对可以使用的技术施加了条件。如果您需要对三个或更多数字进行排序,请将它们放在一个数组中,对数组进行排序,然后打印数组。如果做不到这一点,您应该交换值以找到排序顺序;它将大大减少所需的比较次数,并且没有乘法。

关于c - 如何在 printf 语句中设置条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49290953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com