将数据分配给数组

时间:2017-10-25 07:25:02

标签: c arrays

所以我必须创建一个程序,首先询问用户他将输入多少个数字(最多20个)。在该用户输入他的号码之后: 例如(输入):

  

9

     

1 2 3 4 5 6 7 8 9

程序必须打印这些数字,将它们分配给静态数组,然后从最大到最小输入和排序。 例如(输出):

  

之前:1 2 3 4 5 6 7 8 9

     

之后:9 8 7 6 5 4 3 2 1

我知道如何做第二部分的程序。但是,我无法弄清楚如何将这些数字分配给数组,而他们的输入方式是这样的: 1 2 3 ......

这是我在你输入数字时想出的,但最多只能输入10个数字:

int main()
{
    int i, j, t;
    int num[10];
    scanf("%d", &num[0]);
    scanf("%d", &num[1]);
    scanf("%d", &num[2]);
    scanf("%d", &num[3]);
    scanf("%d", &num[4]);
    scanf("%d", &num[5]);
    scanf("%d", &num[6]);
    scanf("%d", &num[7]);
    scanf("%d", &num[8]);
    scanf("%d", &num[9]);
    int pos[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    for(j=0; j<10; j++)
    {
        for(i=0; i<9-j; i++)
        if(pos[i]<pos[i+1])
        {
            t = pos[i];
            pos[i] = pos[i+1];
            pos[i+1] = t;
        }

    }

    for(i=0; i<10;i++){
        printf("%d", num[pos[i]]);
        if(i!=9)
            printf("\t");
    }



    return 0;
}

2 个答案:

答案 0 :(得分:0)

以下是解决方案:

#include <stdio.h>

int main()
{
    int arraySize = 0;
    printf("How big array do you want?\n");
    scanf("%d", &arraySize);

    int array[arraySize];

    printf("Please enter %d digits separated by space:\n", arraySize);

    int i = 0;        
    while (i < arraySize && scanf("%d", &array[i++]) == 1)
         /*empty loop*/;

    for(int i = 0; i < arraySize; i++){
         printf("%d, ", array[i]);
    }
}

为了获得用空格分隔的用户输入,我使用了这篇文章中的解决方案: Putting numbers separated by a space into an array

答案 1 :(得分:0)

如果您知道要输入的最大整数数,那么就不需要为数组动态分配存储,除非最大数量太大以至于冒着 StackOverflow (这是编译器)的风险依赖,但通常您可以至少满足250000个整数,请参阅C/C++ maximum stack size of program

除非你处理那么多(你不是,你在说20),而不是动态分配存储,只需声明一个常量并声明一个整数数组常数,例如

#include <stdio.h>

#define MAXI 20     /* if you need a constant, define one */

int main (void) {

    int n = 0, 
        array[MAXI] = {0};
    ...

现在,array存储了MAXI20)个整数。您还在代码顶部声明了一个方便的常量,因此如果您需要调整接受的整数数,只需更改一个数字,而不是通过所有声明和循环限制来进行更改。

您要做的最重要的事情是验证所有用户输入。这意味着验证用户输入了有效数据,程序成功地将输入转换为您可以在代码中使用的值,并且..值在适当的范围内。你为每一个输入做这个。例如,从用户获取整数:

    printf ("how many numbers (up to %d)?: ", MAXI);
    /* validate ALL user input, including range of input */
    if (scanf ("%d", &n) != 1 || n < 1 || n > MAXI) {
        fprintf (stderr, "error: invalid input 'n'.\n");
        return 1;
    }

通过检查scanf的返回,您验证用户输入的一个整数,并成功转换为int并放入变量n。接下来,您必须验证它是否在您的程序将采用的值范围内(例如1->MAXI否定值超过20的条目将导致未定义的行为,因此请确保该值在适当的范围内。(0只会让您的程序弄巧成拙)

接下来,获取值并将它们存储在数组中。 (你只是做同样的事情n次,所以使用一个循环!只要输入正常整数范围内的值,你也可以省去范围检查)

    for (int i = 0; i < n; i++) {   /* read/validate 'n' integers */
        printf ("array[%2d]: ", i);
        if (scanf ("%d", &array[i]) != 1) {
            fprintf (stderr, "error: invalid input 'array[%d]'.\n", i);
            return 1;
        }
    }

(提示用户提醒他们您期望的价值也很不错,例如"array[1]: "等。)

除了输出您的阵列之外,您的排序是您需要做的最后一件事。 C提供qsort作为标准排序例程。它比你(或我)在我们头脑中写下的任何东西都更有效率和更好的测试 - 在所有真实情况下使用它。

也就是说,编写自己的类型并没有错,这是一种很好的做法。 (对于20或更少的值,它也一样快)。但是,使用一个功能!如果您的代码的某些部分可以多次使用,请编写一个函数来帮助您的代码更易于维护(并且更容易阅读)。你可以简单地写一个冒泡:

void bubblesort (int *arr, int size)
{
    int i, j, tmp;

    for (i = 0; i < size; i++) {
        for(j = 0; j < (size-1) - i; j++) {
            if( arr[j] < arr[j+1] ) {   /* change to > for ascending */
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

完全放弃,你可以做类似以下的事情:

#include <stdio.h>

#define MAXI 20     /* if you need a constant, define one */

void bubblesort (int *arr, int size)
{
    int i, j, tmp;

    for (i = 0; i < size; i++) {
        for(j = 0; j < (size-1) - i; j++) {
            if( arr[j] < arr[j+1] ) {   /* change to > for ascending */
                tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}

int main (void) {

    int n = 0, 
        array[MAXI] = {0};

    printf ("how many numbers (up to %d)?: ", MAXI);
    /* validate ALL user input, including range of input */
    if (scanf ("%d", &n) != 1 || n < 1 || n > MAXI) {
        fprintf (stderr, "error: invalid input 'n'.\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {   /* read/validate 'n' integers */
        printf ("array[%2d]: ", i);
        if (scanf ("%d", &array[i]) != 1) {
            fprintf (stderr, "error: invalid input 'array[%d]'.\n", i);
            return 1;
        }
    }

    printf ("before:");             /* output before: ... */
    for (int i = 0; i < n; i++)
        printf (" %d", array[i]);
    putchar ('\n');

    bubblesort (array, n);          /* sort your array */

    printf ("after :");             /* output after: ... */
    for (int i = 0; i < n; i++)
        printf (" %d", array[i]);
    putchar ('\n');

    return 0;
}

示例使用/输出

$ /bin/arrayinput
how many numbers (up to 20)?: 5
array[ 0]: 1
array[ 1]: 2
array[ 2]: 3
array[ 3]: 4
array[ 4]: 5
before: 1 2 3 4 5
after : 5 4 3 2 1

仔细看看,如果您有其他问题,请告诉我。