gpt4 book ai didi

c - 如何在此代码中复制数组并使用它

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:03 24 4
gpt4 key购买 nike

所以我有了这段代码,它根据用户输入随机生成一个整数数组,并将元素按升序和降序排列。但是,目前,代码只打印降序两次。因此,我想知道如何制作数组ascd的副本,并在组织降序的代码片段中使用该副本。我只是一个初学者,所以如果这是一个愚蠢的问题,我道歉,并感谢所有我能得到的指导。这是我的代码:

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
int main (){


int x;
printf("Enter the size of your array\n");//User is entering number of elements
scanf("%d", &x);
int ascd[x]; //Array
int c;
int d;
int e;
int kk = 0;
int temp;
int tempother;
int turtle;

for(c = 0; c<x; c++){//Randomly generating elements
srand(time(0));
ascd[kk] = (rand() %100) + 1;
}

for(c = 0; c<x; c++){ //Ascending order
for(d = 0; d<(x-c-1); d++){
if(ascd[d] > ascd[d+1]){
temp = ascd[d];
ascd[d] = ascd[d+1];
ascd[d+1] = temp;
}

}

}




for(turtle = 0; turtle<x; turtle++){//Descending order
for(e = 0; e<(x-turtle-1); e++){
if(ascd[e] < ascd[e+1]){
tempother = ascd[e];
ascd[e] = ascd[e+1];
ascd[e+1] = tempother;
}

}

}




printf("The ascending order is\n\n");
for(c = 0; c<x; c++){
printf("%d\n", ascd[c]);
}


printf("\n\nThe descending order is\n\n");
for(turtle = 0; turtle<x; turtle++){
printf("%d\n", ascd[turtle]);
}




}

最佳答案

还有一些额外的问题需要考虑。首先,总是,总是,验证用户输入。如果没有其他功能,使用scanf函数族,请确保成功执行了预期的转换次数。例如

int x = 0;
printf ("\n enter the number of elements for your array: ");
if (scanf ("%d", &x) != 1) { /* always validate user input */
fprintf (stderr, "error: invalid input, integer required.\n");
return 1;
}
int ascd[x], desc[x];

接下来,只需要为随机数生成器设置一次种子。将 srand (time (NULL));移出循环。
虽然不是必需的,但最好将VLA初始化为全零(或者一些数字,因为您不能提供初始化器),以消除在遍历数组时无意中读取未初始化值的可能性(在这种情况下,您可以考虑填充初始化,使这里的 memset可选,但你不会立即循环填写所有的案例。如果不立即填充数组,下面这样简单的操作就足够了。
memset (ascd, 0, x * sizeof *ascd); /* good idea to zero your VLA */

在填充数组之后,如果希望同时保留升序和降序排序,一个简单的 memcpy将复制数组。
for (int i = 0; i < x; i++)            /* x random values 1 - 100 */
ascd[i] = (rand () % 100) + 1;

memcpy (desc, ascd, x * sizeof *ascd); /* copy ascd to desc */

剩下的只是清理一下。抵制为代码中的每个值创建(变量next)的冲动。很快就不可读了。虽然我更喜欢C89声明,但是 for块中的C99/C11声明非常方便,例如:
for (int i = 0; i < x; i++)                    /* ascending order */
for (int j = 0; j < (x - i - 1); j++)
if (ascd[j] > ascd[j + 1]) {
int temp = ascd[j];
ascd[j] = ascd[j + 1];
ascd[j + 1] = temp;
}

把所有的部分放在一起,注意到 main()是类型 int的,因此会 return一个值,您可以按如下方式整理。你的风格完全取决于你,但目标应该是可读性。例如
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main (void) {

int x = 0;
printf ("\n enter the number of elements for your array: ");
if (scanf ("%d", &x) != 1) { /* always validate user input */
fprintf (stderr, "error: invalid input, integer required.\n");
return 1;
}
int ascd[x], desc[x];

srand (time (NULL)); /* you only need do this once */
memset (ascd, 0, x * sizeof *ascd); /* good idea to zero your VLA */

for (int i = 0; i < x; i++) /* x random values 1 - 100 */
ascd[i] = (rand () % 100) + 1;

memcpy (desc, ascd, x * sizeof *ascd); /* copy ascd to desc */

for (int i = 0; i < x; i++) /* ascending order */
for (int j = 0; j < (x - i - 1); j++)
if (ascd[j] > ascd[j + 1]) {
int temp = ascd[j];
ascd[j] = ascd[j + 1];
ascd[j + 1] = temp;
}

for (int i = 0; i < x; i++) /* descending order */
for (int j = 0; j < (x - i - 1); j++)
if (desc[j] < desc[j + 1]) {
int temp = desc[j];
desc[j] = desc[j + 1];
desc[j + 1] = temp;
}

printf ("\n the ascending order is\n\n");
for (int i = 0; i < x; i++) {
if (i && !(i % 10)) putchar ('\n');
printf (" %3d", ascd[i]);
}

printf ("\n\n the descending order is\n\n");
for (int i = 0; i < x; i++) {
if (i && !(i % 10)) putchar ('\n');
printf (" %3d", desc[i]);
}
putchar ('\n');

return 0;
}

示例使用/输出
$ ./bin/sort_copy

enter the number of elements for your array: 100

the ascending order is

1 1 4 4 5 5 7 8 8 9
10 13 16 16 17 20 22 22 22 23
24 24 25 27 29 29 33 35 35 35
37 38 40 41 41 41 41 42 44 45
46 48 48 48 49 50 53 54 56 57
58 59 61 61 63 64 65 65 66 66
67 68 68 70 71 73 74 74 74 75
76 80 80 80 80 82 84 84 85 85
85 85 86 88 88 89 89 90 91 91
91 92 92 93 93 93 96 99 100 100

the descending order is

100 100 99 96 93 93 93 92 92 91
91 91 90 89 89 88 88 86 85 85
85 85 84 84 82 80 80 80 80 76
75 74 74 74 73 71 70 68 68 67
66 66 65 65 64 63 61 61 59 58
57 56 54 53 50 49 48 48 48 46
45 44 42 41 41 41 41 40 38 37
35 35 35 33 29 29 27 25 24 24
23 22 22 22 20 17 16 16 13 10
9 8 8 7 5 5 4 4 1 1

仔细看一下,如果有什么问题请告诉我。
qsort排序
继续注释, qsort是一个优化的排序例程,它是C标准库(在 stdlib.h中)的一部分,是go to sort函数,而不管您必须排序的数据类型如何。通常捕获新C程序员的唯一要求是需要编写一个比较函数传递给 qsort,以便 qsort知道您希望如何对对象集合进行排序。 qsort将通过向编写的比较函数传递指向值的指针来比较两个元素。不管您在排序什么,比较的声明都是相同的,例如。
int compare (const void *a, const void *b);

你知道你在对整数值排序,所以你只需要写一个函数,如果 a > b,返回一个正值,如果它们相等,返回0,如果 b > a,最后返回一个负值。简单的方法,就是写
int compare (const void *a, const void *b) {
int x = *(int *)a;
int y = *(int *)b;
return x - y;
}

这满足了升序排序和降序排序的要求,但存在一个问题。如果 return y - x;x恰好是大正值和大负值,则 将超过一个整数的最大值(或最小值)(例如,溢出,因为结果不符合整数值)。
解决办法很简单。您可以执行相同的比较,但使用不等式的结果,例如返回 y进行升序比较,返回 x - y进行降序比较。(此方案适用于所有数值类型,您只需调整转换即可)。克服不平等。在上升的情况下,如果 (a > b) - (a < b),则返回 (a < b) - (a > b)(例如 a > b)。如果它们相等,则不等式返回 1return 1 - 0;),最后,如果 0,则返回值为 0 - 0a < b)。
当您可以继续显式声明 -10 - 1变量时,您通常会在比较中看到它与cast一起编写,从而完全消除了对 xy变量的需要,例如。
/* integer comparison ascending (prevents overflow) */
int cmpascd (const void *a, const void *b)
{
/* (a > b) - (a < b) */
return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b);
}

将这些部分放在一起,可以使用 x来编写同一个程序,而不是使用低效的嵌套循环(并将打印数组例程移动到它自己的函数中),如下所示,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define ROW 10

int cmpascd (const void *a, const void *b);
int cmpdesc (const void *a, const void *b);
void prnarr (int *a, int n, int row);

int main (void) {

int x = 0;
printf ("\n enter the number of elements for your array: ");
if (scanf ("%d", &x) != 1) { /* always validate user input */
fprintf (stderr, "error: invalid input, integer required.\n");
return 1;
}
int ascd[x], desc[x];

srand (time (NULL)); /* you only need do this once */
memset (ascd, 0, x * sizeof *ascd); /* good idea to zero your VLA */

for (int i = 0; i < x; i++) /* x random values 1 - 100 */
ascd[i] = (rand () % 100) + 1;

memcpy (desc, ascd, x * sizeof *ascd); /* copy ascd to desc */

qsort (ascd, x, sizeof *ascd, cmpascd); /* qsort ascending */
qsort (desc, x, sizeof *desc, cmpdesc); /* qsort descending */

printf ("\n the ascending order is\n\n");
prnarr (ascd, x, ROW);

printf ("\n\n the descending order is\n\n");
prnarr (desc, x, ROW);

putchar ('\n');

return 0;
}

/* integer comparison ascending (prevents overflow) */
int cmpascd (const void *a, const void *b)
{
/* (a > b) - (a < b) */
return (*(int *)a > *(int *)b) - (*(int *)a < *(int *)b);
}

/* integer comparison descending */
int cmpdesc (const void *a, const void *b)
{
/* (a < b) - (a > b) */
return (*(int *)a < *(int *)b) - (*(int *)a > *(int *)b);
}

void prnarr (int *a, int n, int row)
{
for (int i = 0; i < n; i++) {
printf (" %3d", a[i]);
if (i && !((i + 1) % row))
putchar ('\n');
}
}

和第一个答案一样,试一试,如果有任何问题请告诉我。(记住总是用最少的 y编译以启用大多数编译器警告——并在您认为代码可靠之前修复生成的任何警告——您不会遇到任何可以理解和安全忽略警告的情况)添加 qsort以查看几乎所有可以生成的警告。(如果你在Websters中查找pedantic,你会发现为什么这个名字是合适的)仅供参考,我用来编译代码的 -Wall -Wextra编译器字符串是:
$ gcc -Wall -Wextra -pedantic -std=c11 -Ofast -o bin/sort_copy sort_copy.c

关于c - 如何在此代码中复制数组并使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38342436/

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