C 按照3条规则(奇数、偶数、排序)显示输出
我试图按照以下规范编写:C 按照3条规则(奇数、偶数、排序)显示输出,c,arrays,sorting,C,Arrays,Sorting,我试图按照以下规范编写: 我从用户那里读取了一个数组 开始时必须输入奇数 偶数必须位于数组的末尾 按奇数和偶数升序排序 这是我的代码: 更新代码 #include <stdio.h> #include <stdlib.h> int n; int j; int main(void){ scanf("%d", &n); int arr[n], aux[n], count = 0; for(int i = 0; i < n; i++){
#include <stdio.h>
#include <stdlib.h>
int n;
int j;
int main(void){
scanf("%d", &n);
int arr[n], aux[n], count = 0;
for(int i = 0; i < n; i++){
scanf("%d", &arr[i]);
}
for(int i = 0; i < n; i++){
if(arr[i] % 2 != 0){
aux[i] = arr[i];
count = i;
}
else
{
aux[n - j - 1] = arr[i];
j++;
}
}
for(int i = 0; i < count; i++){
if( aux[i] > aux[i+1])
{
aux[i] = aux[i] + aux[i+1];
aux[i+1] = aux[i] - aux[i+1];
aux[i] = aux[i] - aux[i+1];
}
}
for(int i = count; i < n; i++){
if( aux[i] > aux[i+1])
{
aux[i] = aux[i] + aux[i+1];
aux[i+1] = aux[i] - aux[i+1];
aux[i] = aux[i] - aux[i+1];
}
}
for(int i = 0; i < n; i++){
printf("%d ", aux[i]);
}
printf("\n");
return 0;
}
#包括
#包括
int n;
int j;
内部主(空){
scanf(“%d”和“&n”);
int arr[n],aux[n],计数=0;
对于(int i=0;i辅助[i+1])
{
辅助[i]=辅助[i]+辅助[i+1];
辅助[i+1]=辅助[i]-辅助[i+1];
aux[i]=aux[i]-aux[i+1];
}
}
for(int i=计数;i辅助[i+1])
{
辅助[i]=辅助[i]+辅助[i+1];
辅助[i+1]=辅助[i]-辅助[i+1];
aux[i]=aux[i]-aux[i+1];
}
}
对于(int i=0;i
但是,输出是错误的。例如,如果我输入数组的维度4
,数组的元素是4 3 2 1
,则输出是:3 2 1 4196848
,但我希望是1 3 2 4
。你能帮助我吗?
谢谢大家! 您有未定义的行为:
int main(){
int n, arr[n], aux[n] = {}, count = 0;
scanf("%d", &n);
您希望这些阵列的大小是多少?
n
在使用scanf
读取之前不会初始化
除此之外,您还应该为
main
提供一个有效的原型,因为您有未定义的行为:
int main(){
int n, arr[n], aux[n] = {}, count = 0;
scanf("%d", &n);
您希望这些阵列的大小是多少?
n
在使用scanf
读取之前不会初始化
此外,如果要动态初始化数组,则应该为
main
提供有效的原型,而不是使用malloc和指针
int main(){
int n, count = 0;
int *arr, *aux;
scanf("%d", &n);
arr = malloc(n*sizeof(int));
aux = malloc(n*sizeof(int));
如果要动态初始化数组,请改用malloc和指针
int main(){
int n, count = 0;
int *arr, *aux;
scanf("%d", &n);
arr = malloc(n*sizeof(int));
aux = malloc(n*sizeof(int));
整个程序以
main
的声明开头是错误的,C中的声明如下
int main( void )
在数组声明中使用具有不确定值的对象
int n, arr[n], aux[n] = {}, count = 0;
^^^ ^^^ ^^^
(此外,可变长度数组可能不会被初始化),并以三个循环结束,表示它们对某些内容进行排序,而实际上什么也不排序,并且尝试访问数组之外的内存
使用标准C函数qsort
可以轻松完成此任务
比如说
#include <stdio.h>
#include <stdlib.h>
int odd_even(const void *lhs, const void *rhs)
{
int a = *(const int *)lhs;
int b = *(const int *)rhs;
return (a % 2 == b % 2) ? (b < a) - (a < b) : b % 2 - a % 2;
}
int main(void)
{
size_t n = 1; // 1 is minimum acceptable array size
scanf( "%zu", &n );
int a[n];
for ( size_t i = 0; i < n; i++ ) scanf( "%d", &a[i] );
qsort(a, n, sizeof(int), odd_even);
for (size_t i = 0; i < n; i++) printf("%d ", a[i]);
putchar('\n');
return 0;
}
然后,将显示阵列输出
1 3 2 4
整个程序以
main
的声明开头是错误的,C中的声明如下
int main( void )
在数组声明中使用具有不确定值的对象
int n, arr[n], aux[n] = {}, count = 0;
^^^ ^^^ ^^^
(此外,可变长度数组可能不会被初始化),并以三个循环结束,表示它们对某些内容进行排序,而实际上什么也不排序,并且尝试访问数组之外的内存
使用标准C函数qsort
可以轻松完成此任务
比如说
#include <stdio.h>
#include <stdlib.h>
int odd_even(const void *lhs, const void *rhs)
{
int a = *(const int *)lhs;
int b = *(const int *)rhs;
return (a % 2 == b % 2) ? (b < a) - (a < b) : b % 2 - a % 2;
}
int main(void)
{
size_t n = 1; // 1 is minimum acceptable array size
scanf( "%zu", &n );
int a[n];
for ( size_t i = 0; i < n; i++ ) scanf( "%d", &a[i] );
qsort(a, n, sizeof(int), odd_even);
for (size_t i = 0; i < n; i++) printf("%d ", a[i]);
putchar('\n');
return 0;
}
然后,将显示阵列输出
1 3 2 4
像这样修复(对于当前代码)
#包括
//#包括//未使用的此
/*它不必是全局变量。
int n;
int j;
*/
内部主(空){
int n;
scanf(“%d”和“&n”);
int arr[n],aux[n],count_奇数=0;
对于(int i=0;iaux:[1,3,3],但您需要aux:[1,3,4]
//count=i;这是错误的。因为count应该是奇数元素的数量,所以它不仅仅是arr的索引。
aux[count_odd++]=arr[i];
}否则{
aux[偶_i--]=arr[i];
}
}
//(气泡)排序
//为每个回路确定一个元件的位置
//因此,在交换相邻元素的方法中,有必要进行双环。
//当N个元素时,外环可以是N-1倍。
//因为两个元素的位置是在最后一个循环中确定的。
//由于每个循环确定一个元素,
//内环可以一次减少每个外环的次数。
对于(int j=0,no=count_奇数;j辅助[i+1]){
/*由于A+B的结果可能溢出,因此不应使用这种方法。
辅助[i]=辅助[i]+辅助[i+1];
辅助[i+1]=辅助[i]-辅助[i+1];
aux[i]=aux[i]-aux[i+1];
*/
内部温度=辅助温度[i];
aux[i]=aux[i+1];
辅助[i+1]=温度;
}
}
}
//由于它执行相同的处理,因此最好将其概括为一个函数。
对于(int j=0,ne=n-count_奇数;j辅助[i+1]){
内部温度=辅助温度[i];
aux[i]=aux[i+1];
辅助[i+1]=温度;
}
}
}
对于(int i=0;i
像这样修复(对于当前代码)
#包括
//#包括//未使用的此
/*它不必是全局变量。
int n;
int j;
*/
内部主(空){
int n;
scanf(“%d”和“&n”);
int arr[n],aux[n],count_奇数=0;
对于(int i=0;iaux:[1,?,