所以我必须创建一个程序,首先询问用户他将输入多少个数字(最多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;
}
答案 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
存储了MAXI
(20
)个整数。您还在代码顶部声明了一个方便的常量,因此如果您需要调整接受的整数数,只需更改一个数字,而不是通过所有声明和循环限制来进行更改。
您要做的最重要的事情是验证所有用户输入。这意味着验证用户输入了有效数据,程序成功地将输入转换为您可以在代码中使用的值,并且..值在适当的范围内。你为每一个输入做这个。例如,从用户获取整数:
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
仔细看看,如果您有其他问题,请告诉我。