[英]How to swap array elements on C language and integrate it to code?
我在更改数组并将它们集成到我的代码中时遇到问题,任务是
”给定一个n阶实方矩阵,找出位于矩阵阴影部分的元素的值中的最小值并交换它们。
”
我弄清楚了代码的前半部分,但我无法用第二部分弄清楚,那就是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#define N 5
int main ()
{
int a[N][N], min, i, j;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
a[i][j] = rand () % 10;
}
printf ("n\n The generated matrix has the form");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf ("%d ", a[i][j]);
printf ("\n");
}
min = a[0][N - 1];
for (i = 0; i < N; i++) {
for (j = N / 2; j < N; j++)
if ((j + i) > N && (i <= j) && (min > a[i][j]))
min = a[i][j];
}
printf ("n\n Minimum element in the shaded area");
printf ("\n\n min_element=%d ", min);
getch ();
}
你的逻辑有点混乱。 您必须在调用rand()
之前通过调用srand()
为随机数生成器设置种子,例如
#include <time.h>
...
int main (void) {
int a[N][N], min = INT_MAX, i, j;
srand (time(NULL)); /* seed random number generator */
(注意: min
如何初始化为INT_MAX
)
您可以在单个循环中填充和输出原始数组。 请注意, % 10
在所有象限中定期导致0
,对于更大范围的值,请使用% 100
,例如
/* fill elements with random values 0-99, output array */
puts ("\nThe generated matrix has the form:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
a[i][j] = rand () % 100;
printf (" %2d", a[i][j]);
}
putchar ('\n');
}
(注意:不要使用printf ("\\n");
输出单个字符'\\n'
,这就是putchar('\\n');
的用途——尽管一个好的编译器会为你做优化)
您可以在单个循环中比较上下三角形中的值,例如:
for (i = 0; i < N - i; i++) { /* loop rows 0 - N-i-1 */
for (j = i; j < N - i; j++) { /* loop cols i - N-i-1 */
if (a[i][j] < min) /* test upper value */
min = a[i][j];
if (a[N-i-1][j] < min) /* test lower value */
min = a[N-i-1][j];
}
}
你只需要一个printf
来输出结果,不管你是不是喜欢这样:
printf ("\nMinimum element in the shaded area\n\n min_element = %d\n", min);
或喜欢
printf ("\nMinimum element in the shaded area\n\n"
" min_element = %d\n", min);
最后不要使用conio.h
和getch();
保持终端窗口打开。 conio.h
是一个 100% 不可移植的古老 DOS 头文件。 只需使用标准<stdio.h>
提供的getchar()
。
把它放在一起,你将有:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
#define N 5
int main (void) {
int a[N][N], min = INT_MAX, i, j;
srand (time(NULL)); /* seed random number generator */
/* fill elements with random values 0-99, output array */
puts ("\nThe generated matrix has the form:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
a[i][j] = rand () % 100;
printf (" %2d", a[i][j]);
}
putchar ('\n');
}
for (i = 0; i < N - i; i++) { /* loop rows 0 - N-i-1 */
for (j = i; j < N - i; j++) { /* loop cols i - N-i-1 */
if (a[i][j] < min) /* test upper value */
min = a[i][j];
if (a[N-i-1][j] < min) /* test lower value */
min = a[N-i-1][j];
}
}
printf ("\nMinimum element in the shaded area\n\n min_element = %d\n", min);
}
示例使用/输出
$ ./bin/array_upper_lower_triangle
The generated matrix has the form:
20 79 30 60 89
2 5 38 15 33
64 63 52 93 38
77 89 54 38 89
25 15 87 43 53
Minimum element in the shaded area
min_element = 5
编辑——从上/下三角形交换最小值
看到您的评论后,您也很明显想要交换上下三角形中的最小元素。 为此,您需要保留单独的最小值,例如min_upper
和min_lower
以及它们出现的数组索引,例如iu, ju
(用于i
& j
upper)和il
, jl
用于lower。
然后在每个中找到最小值后,您可以交换它们。 变化将是:
int a[N][N], min, min_upper=INT_MAX, min_lower=INT_MAX, i, j, iu, ju, il, jl;
...
for (i = 0; i < N - i; i++) { /* loop rows 0 - N-i */
for (j = i; j < N - i; j++) { /* loop cols i - N-i-1 */
if (a[i][j] < min_upper) { /* test upper value */
min_upper = a[i][j];
iu = i, ju = j;
}
if (a[N-i-1][j] < min_lower) { /* test lower value */
min_lower = a[N-i-1][j];
il = N-i-1, jl = j;
}
}
}
i = a[iu][ju]; /* swap uppwer/lower triangle minimum values */
a[iu][ju] = a[il][jl];
a[il][jl] = i;
(注意: i
用作交换中的临时变量,因为它在循环之间可用)
交换的完整示例是:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
#define N 5
int main (void) {
int a[N][N], min, min_upper=INT_MAX, min_lower=INT_MAX, i, j, iu, ju, il, jl;
srand (time(NULL)); /* seed random number generator */
/* fill elements with random values 0-99, output array */
puts ("\nThe generated matrix has the form:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
a[i][j] = rand () % 100;
printf (" %2d", a[i][j]);
}
putchar ('\n');
}
for (i = 0; i < N - i; i++) { /* loop rows 0 - N-i */
for (j = i; j < N - i; j++) { /* loop cols i - N-i-1 */
if (a[i][j] < min_upper) { /* test upper value */
min_upper = a[i][j];
iu = i, ju = j;
}
if (a[N-i-1][j] < min_lower) { /* test lower value */
min_lower = a[N-i-1][j];
il = N-i-1, jl = j;
}
}
}
i = a[iu][ju]; /* swap uppwer/lower triangle minimum values */
a[iu][ju] = a[il][jl];
a[il][jl] = i;
printf ("\nmin_upper : %d\nmin_lower : %d\n", min_upper, min_lower);
puts("\nSwapped min from upper/lower triangles:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf (" %2d", a[i][j]);
putchar ('\n');
}
min = min_upper < min_lower ? min_upper : min_lower;
printf ("\nMinimum element in the shaded area\n\n min_element = %d\n", min);
}
示例使用/输出
$ ./bin/array_upper_lower_triangle_swap
The generated matrix has the form:
31 52 50 21 40
48 63 65 15 48
77 70 69 90 18
56 22 36 71 14
13 14 53 26 32
min_upper : 15
min_lower : 13
Swapped min from upper/lower triangles:
31 52 50 21 40
48 63 65 13 48
77 70 69 90 18
56 22 36 71 14
15 14 53 26 32
Minimum element in the shaded area
min_element = 13
希望这能满足您的所有要求。 如果您需要更多帮助,请直接询问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.