【问题标题】:How to work with functions and outputs C如何使用函数和输出 C
【发布时间】:2017-11-18 10:18:48
【问题描述】:

我想输入 4 个数字并显示可能的最大数字。有人可以帮我吗?我尝试了多种不同的方法,所以不要想知道为什么会有这么多库。 提前致谢

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>           //pow
    #include <limits.h>         //char max
    #include <ctype.h>          //


int sort_alg(const void *a, const void *b)
{
    char ab[32], ba[32];
    sprintf(ab, "%d%d", *(int*)a, *(int*)b);
    sprintf(ba, "%d%d", *(int*)b, *(int*)a);
    return strcmp(ba, ab);
}

void max_numb(int *a, int len)
{
    int i;
    qsort(a, len, sizeof(int), sort_alg); 
    for (i = 0; i < len; i++)
        printf("%d", a[i]);
    putchar('\n');
}

int main(void)
{
  int numbers[4];
  for(int count = 0; count < 4; count++)
  {
      scanf("%d", &numbers[count]);
      printf("%d", numbers);
  }

    max_numb(numbers, sizeof(numbers)/sizeof(numbers[0]));

    return 0;
}

【问题讨论】:

  • printf("%d", numbers);更改为printf("%d\n", numbers[count])
  • 关于这一点:printf("%d", numbers); numbers 是一个由 4 个整数组成的数组,所以这一行应该类似于:printf( "%d", numbers[ count ] );
  • 在调用任何scanf() 系列函数时,始终检查返回值(而不是参数值)以确保操作成功。在当前场景下,建议:if( 1 != scanf("%d", &amp;numbers[count]) ) { fprintf( stderr, "scanf failed\n" ); exit( EXIT_FAILURE ); }
  • 发布的代码包含一些“神奇”数字。 “魔术”数字是没有基础的数字。 IE。 4.“神奇”数字使代码更难理解、调试等。建议使用enum 语句或#define 语句为“神奇”数字赋予有意义的名称,然后在整个代码中使用这些有意义的名称.
  • 变量(和参数)名称应指示contentusage(或更好,两者兼有)。像a 这样的参数名称是没有意义的,即使在当前上下文中也是如此。

标签: c arrays function sorting


【解决方案1】:

你为什么不尝试一些算法。选择最大值非常容易。您不必对其进行排序 试试这个:

int max(int a[],int len)
{
  int max=a[0];
  for(int i=0;i<len;i++)
  {
    if(max<a[i])
      max=a[i];
  }
  return max;
}

抱歉,如果我误解了您的问题。我按标题回答。

【讨论】:

  • 抱歉,我正在尝试获得任何给定数字的最大组合数字:1、2、99、919 将是 9991921。
【解决方案2】:

如果打印输入的最大数字是您的唯一目的,则无需任何排序算法即可完成。在获取输入时,只需使用一个存储迄今为止输入的最大数字的变量,如果输入任何大于 ma​​xim 的新值,则更新该变量

代码

int main() {
    int numbers[4];
    int maxim = -99999; //any small that you can assue to be minimimum
    for(int count = 0; count < 4; count++) {
        scanf("%d", &numbers[count]);
        printf("%d ", numbers[count]);
        if(numbers[count] > maxim) {
            maxim = numbers[count];
        }
    }
    printf("\n") ;
    printf("Maximum Value : %d\n", maxim) ;
    return 0;
}

抱歉,如果我误解了您的问题。

【讨论】:

  • 抱歉,我正在尝试获得任何给定数字的最大组合数字:1、2、99、919 将是 9991921。
【解决方案3】:

以下建议的代码:

  1. 执行所需的功能。
  2. 干净编译
  3. 记录包含每个头文件的原因
  4. 正确检查系统功能中的错误

警告:不检查所有输入的数字是否都是正数 ( >= 0 )

请注意,建议的代码未能提示用户输入每个值,因此用户将看到一个空白终端,光标闪烁(并想知道该怎么做)所以代码应该提示用户输入每个数字。

现在,建议的代码

#include <stdio.h>          // scanf(), fprintf(), printf(), putchar(), sprintf()
#include <stdlib.h>         // exit(), EXIT_FAILURE
#include <string.h>         // strcmp()

#define MAX_NUMBERS 4

// prototypes
int sort_alg(const void *a, const void *b);
void max_numb( int Numbers[] );


int main( void )
{
    int numbers[ MAX_NUMBERS ];

    for( int count = 0; count < MAX_NUMBERS; count++ )
    {
        if( 1 != scanf("%d", &numbers[count]) )
        {
            fprintf( stderr, "scanf for number: %d failed\n", count+1 );
            exit( EXIT_FAILURE );
        }

        // implied else, scanf successful

        printf( " %d", numbers[ count ] );  // leading space for formatting
    }

    max_numb( numbers );

    return 0;
}


int sort_alg(const void *a, const void *b)
{
    char ab[32], ba[32];
    sprintf(ab, "%d%d", *(int*)a, *(int*)b);
    sprintf(ba, "%d%d", *(int*)b, *(int*)a);
    return strcmp(ba, ab);
}


void max_numb( int Numbers[] )
{
    qsort( Numbers, MAX_NUMBERS, sizeof(int), sort_alg);

    putchar( '\n' );  // so output from 'max_numb()' will be on a new line
    for (int i = 0; i < MAX_NUMBERS; i++)
        printf( "%d", Numbers[i] );

    putchar( '\n' );
}

建议的代码输出的典型运行:

1 2 3 4
1 2 3 4
4321

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 2020-12-12
    • 2022-11-21
    • 2017-03-22
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多