我的作业是:编写一个获取整数数组的函数。自N * 2 = the size
以来数组的N = how many couples you will scan
。该阵列包括数组。我需要打印复数索引上的数字按升序排列的数字。
示例:
Input: 4, -6, 2, 10, 3, 0, 1, 9
Ouput: 1, 9, 2, 10, 3, 0, 4, -6
With N = 4.
如果我设置N = 4
,它只允许我扫描4个数字,而不是8个。为什么会这样?它甚至会在第4个扫描号码后打印出奇怪的数字。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, sz1, sz2;
int i, j, cs, cs2;
printf("Enter the value of n:\n");
scanf("%d", &n);
int array[2*n];
printf("Enter the numbers in the array:\n");
for(i=0; i<2*n; i++)
{
scanf("%d", &array[i]);
i++;
}
for(i=0; i<2*n; i++)
{
for(j=i+1; j<2*n; j++)
{
if(array[i]>array[j] && i%2==0 )
{
cs=array[i];
array[i]=array[j];
array[j]=cs;
cs2=array[i+1];
array[i+1]=array[j+1];
array[j+1]=cs2;
}
}
}
for(i=0; i<n*2; i++)
printf("%d %d\n", array[i], array[i]);
return 0;
}
答案 0 :(得分:1)
在第一个循环结束时,您不应该i++
,因为您已经在for
子句中执行了此操作。按照你正在做的方式,在每个循环中,i
增加两次,给你一半的循环。
此外,当您尝试从数组中读取时,未设置其他所有元素,因此它可能包含垃圾数据。
答案 1 :(得分:1)
我们初学者应该互相帮助。:)
这些循环
for(i=0; i<2*n; i++)
{
for(j=i+1; j<2*n; j++)
{
if(array[i]>array[j] && i%2==0 )
{
cs=array[i];
array[i]=array[j];
array[j]=cs;
cs2=array[i+1];
array[i+1]=array[j+1];
array[j+1]=cs2;
}
}
}
即使您遵循 @Federico klez Culloca 的建议,也没有意义。
考虑n
等于1的情况。当您的示范阵列出现时
4 -6 // 2 10 3 0 1 9
-6 2 // 4 10 3 0 1 9
至少尝试访问数组之外的内存。
如果我已正确理解了赋值,那么您可以使用标题qsort
中声明的标准C函数<stdlib.h>
,而不是编写自己的冒泡排序实现,如演示程序中所示。
#include <stdio.h>
#include <stdlib.h>
int cmp_pair(const void *p, const void *q)
{
const int *lhs = (const int *)p;
const int *rhs = (const int *)q;
return (*rhs < *lhs) - (*lhs < *rhs);
}
int main( void )
{
const size_t n = 4;
int a[2 * n] = { 4, -6, 2, 10, 3, 0, 1, 9 };
for (size_t i = 0; i < 2 * n; i++) printf("%d ", a[i]);
putchar('\n');
qsort(a, n, sizeof(int[2]), cmp_pair);
for (size_t i = 0; i < 2 * n; i++) printf("%d ", a[i]);
putchar('\n');
}
程序输出
4 -6 2 10 3 0 1 9
1 9 2 10 3 0 4 -6
或者如果要使用冒泡排序的实现,那么循环可以看起来像在此演示程序中显示的那样
#include <stdio.h>
int main( void )
{
const size_t n = 4;
int a[2 * n] = { 4, -6, 2, 10, 3, 0, 1, 9 };
for (size_t i = 0; i < 2 * n; i++) printf("%d ", a[i]);
putchar('\n');
for ( size_t m = n, last = n; !( m < 2 ); m = last )
{
for ( size_t i = last = 1; i < m ; i++ )
{
if ( a[2 *i] < a[2 * ( i - 1)] )
{
int tmp[2] = { a[2 * i], a[2 * i + 1] };
a[2 * i] = a[2 * (i - 1)];
a[2 * i + 1] = a[2 * (i - 1) + 1];
a[2 * (i - 1)] = tmp[0];
a[2 * (i - 1) + 1] = tmp[1];
last = i;
}
}
}
for (size_t i = 0; i < 2 * n; i++) printf("%d ", a[i]);
putchar('\n');
}
输出与上面显示的相同。
4 -6 2 10 3 0 1 9
1 9 2 10 3 0 4 -6
您需要自己编写的是编写输入变量n
的值的代码,并使用值填充数组。
答案 2 :(得分:0)
这是一种可能的解决方案尝试。我使用结构来包含数字对。我还从main()调用了我的函数。
#include<stdio.h>
typedef struct pairs{
int numA;
int numB;
}num_pair;
num_pair* create_num_pair_array(num_pair*, int);
void sort_pairs(num_pair*, int);
void print_num_pairs(num_pair*, int);
int main()
{
int n;
printf("Enter the number of pairs, n:\n");
scanf("%d", &n);
num_pair array[n];
create_num_pair_array(array, n);
sort_pairs(array, n);
print_num_pairs(array, n);
return 0;
}
num_pair* create_num_pair_array(num_pair* array, int arr_size)
{
int i;
printf("Enter the number pairs:\n");
for(i = 0; i < arr_size; i++){
printf("Enter first number for number pair %d: ", i+1);
scanf("%d", &array[i].numA);
printf("Enter second number for number pair %d: ", i+1);
scanf("%d", &array[i].numB);
}
return array;
}
void sort_pairs(num_pair* array, int arr_size)
{
int i, j;
num_pair temp;
temp.numA = 0;
temp.numB = 0;
for(i = 0; i < (arr_size - 1); i++){
for(j = 0; j < arr_size - i - 1; j++){
if(array[j].numA > array[j+1].numA){
temp.numA = array[j].numA;
temp.numB = array[j].numB;
array[j] = array[j+1];
array[j+1].numA = temp.numA;
array[j+1].numB = temp.numB;
}
}
}
}
void print_num_pairs(num_pair* array, int arr_size)
{
int i;
for(i = 0; i < arr_size; i++){
printf("%d %d\n", array[i].numA, array[i].numB);
}
}