代码之家  ›  专栏  ›  技术社区  ›  Keegan Husom

在C中输入、拆分和排序

  •  0
  • Keegan Husom  · 技术社区  · 7 年前

    我是一个Python程序员。我女朋友正在上C班。这让我很沮丧,我在网上找不到这么简单的东西,也找不到。我们直奔主题吧。我有一个简单的python程序,我需要帮助来翻译成c。

    lst = input("Enter a list of numbers with a space in between each number\n")
    
    newList = lst.split(" ")
    
    #selection sort has been pre defined
    x = newList.selectSort()
    print(x)
    

    抱歉,这是我的电话。

    她的任务不仅仅是这个。它添加了多个共同工作的函数。我只需要知道这是如何工作的,以便把整个程序拉在一起。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Sudarshan    7 年前

    首先,您必须定义 number of item 在列表中,然后您可以 input 他们。 然后,您必须将它们存储在 array 然后做 sorting 手动处理。

    我已经完成了排序过程,但没有定义 function .如果要使用函数,只需传递数组并返回已排序的数组。

    #include <stdio.h>
    
    int main()
    {
       int n, c, d, position, swap;
    
       printf("Enter number of elements\n");
       scanf("%d", &n);
       int array[n];
       printf("Enter %d integers\n", n);
    
       for ( c = 0 ; c < n ; c++ )
          scanf("%d", &array[c]);
    
       for ( c = 0 ; c < ( n - 1 ) ; c++ )
       {
          position = c;
    
          for ( d = c + 1 ; d < n ; d++ )
          {
             if ( array[position] > array[d] )
                position = d;
          }
          if ( position != c )
          {
             swap = array[c];
             array[c] = array[position];
             array[position] = swap;
          }
       }
    
       printf("Sorted list in ascending order:\n");
    
       for ( c = 0 ; c < n ; c++ )
          printf("%d\n", array[c]);
    
       return 0;
    }
    
        2
  •  1
  •   Joy Allen    7 年前
    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    #include <string.h>
    
    // Macro for sorting
    #define sort(name, data_set, len, comparator, inverse) \
        name##_sort(data_set, len, comparator, inverse)
    
    #define SORT_DEFINE(name, data_type) \
    \
        /* Sort data set
               @data_set   data set to sort
               @len        length of data set
               @comparator comparator to compare two elements, return positive value when first element is bigger
               @inverse    whether the result should be inversed
             */\
        void name##_sort(data_type *data_set, int len, int (*comparator)(data_type, data_type), bool inverse) \
        { \
            int i; \
            int j; \
            bool change = true; \
            int ret; \
            data_type tmp; \
    \
            for (i = 0; change && i < len - 1; i++) \
            { \
                change  = false; \
                for (j = 0; j < len - 1 - i; j++) \
                { \
                    ret = comparator(data_set[j], data_set[j + 1]); \
                    if ((!inverse && ret > 0) || (inverse && ret < 0)) \
                    { \
                        change = true; \
                        tmp = data_set[j]; \
                        data_set[j] = data_set[j + 1]; \
                        data_set[j + 1] = tmp; \
                    } \
                } \
            } \
        }
    
    /*  Split string
        @content origin string content
        @delim   delimiter for splitting
        @psize   pointer pointing at the variable to store token size
        @return  tokens after splitting
     */
    const char **split(char *content, const char *delim, int *psize)
    {
        char *token;
        const char **tokens;
        int capacity;
        int size = 0;
    
        token = strtok(content, delim);
        if (!token)
        {
            return NULL;
        }
    
        // Initialize tokens
        tokens = malloc(sizeof(char *) * 64);
        if (!tokens)
        {
            exit(-1);
        }
        capacity = 64;
    
        tokens[size++] = token;
    
        while ((token = strtok(NULL, delim)))
        {
            if (size >= capacity)
            {
                tokens = realloc(tokens, sizeof(char *) * capacity * 2);
                if (!tokens)
                {
                    exit(-1);
                }
                capacity *= 2;
            }
            tokens[size++] = token;
        }
    
        *psize = size;
    
        return tokens;
    }
    
    // Define sort function for data_type = const char *
    SORT_DEFINE(str, const char *);
    
    // Define sort function for data_type = int
    SORT_DEFINE(int, int)
    
    int intcmp(int v1, int v2)
    {
        return v1 - v2;
    }
    
    int main(int argc, char *argv[])
    {
        char buff[128];
        const char **tokens;
        int size;
        int i;
        int *ints;
    
        // Get input from stdin
        fgets(buff, 128, stdin);
    
        // Split string
        tokens = split(buff, " \t\n", &size);
    
        ints = malloc(sizeof(int) * size);
    
        // Sort strings [min -> max]
        sort(str, tokens, size, strcmp, false);
    
        // Print strings and transfer them to integers
        for (i = 0; i < size; i++)
        {
            printf("[%02d]: <%s>\n", i, tokens[i]);
            ints[i] = atoi(tokens[i]);
        }   
    
        // Sort integers [max -> min]
        sort(int, ints, size, intcmp, true);
    
        // Print integers
        for (i = 0; i < size; i++)
        {
            printf("[%02d]: <%d>\n", i, ints[i]);
        }
    
        free(ints);
    
        free(tokens);
    
        return 0;
    }
    

    使用宏 SORT_DEFINE() ,请 sort() 和函数 split() 做你自己的工作。这个 main() 函数只是演示如何使用它们。