问题描述
#include <stdio.h>
#include <stdlib.h>
void minimaxi(int t[],int bs,int bi,int *ma,int *mi){
int j;
*ma=bi; *mi=bi;
for(j=bi;j<=bs;j++){
if (t[j]<t[*mi]) { *mi=j;} ;
}
for(j=bi;j<=bs;j++){
if (t[j]>t[*ma]) { *ma=j;} ;
}
}
void permut(int *x,int *y){
*x=*x+*y;
*y=*x-*y;
*x=*x-*y;
}
void triminmax(int t[],int n){
int bi,bs,mx,mn;
bs=n-1;
bi=0;
do {
minimaxi(t,bi,&mx,&mn);
permut(&t[mx],&t[bs]);
permut(&t[mn],&t[bi]);
bs=bs-1;
bi++;
} while(bs>=bi);
}
int main()
{
int t[100],n,i,z;
printf("give the table length \n");
scanf("%d",&n);
z=n;
for(i=0;i<n;i++){
printf("enter T[%d]\n",i);
scanf("%d",t+i);
}
triminmax(t,n);
for(i=0;i<z;i++){
printf("%d\n",t[i]);
}
return 0;
}
目的是创建一个使用以下内容组织表格的程序: 首先找到案例 0 和案例 n-1(最后一种情况)之间的最大值和最小值 然后将最大值与案例 n-1 交换,将最小值与案例 0 交换 然后查找 1 和 n-2 之间的最大值和最小值,并将它们与 1 和 n-2 交换 它一直持续到桌子被整理好 问题是当我在编译完所有发现的随机数后打印预期的有组织的表格时
解决方法
您的代码有两个问题:
-
您正在为 permut 函数传递地址,因此有可能两次传递相同的地址,因此这种情况下的值等于 0
-
并且有可能在最后一种情况下最小的数字,所以包含最大数字的情况与其切换,然后最大的数字被发送到第一种情况。 所以这是您的代码的修订版,并进行了其他小修复:
#include <stdio.h> #include <stdlib.h> void permut(int *x,int *y) { *x=*x+*y; *y=*x-*y; *x=*x-*y; } void minimaxi(int t[],int bs,int bi,int *ma,int *mi) { int j; *ma=bi; *mi=bi; for(j=bi;j<=bs;j++) { if (t[j]<=t[*mi]) *mi=j; } if (*mi!=bi) permut(&(t[*mi]),&(t[bi])); for(j=bi;j<=bs;j++) { if (t[j]>t[*ma]) *ma=j; } if (*ma!=bs) permut(&(t[*ma]),&(t[bs])); } void triminmax(int t[],int n) { int bi,bs,mx,mn; bs=n-1; bi=0; do { minimaxi(t,bi,&mx,&mn); bs=bs-1; bi++; } while(bs>=bi); } int main() { int *t,n,i,z; t=malloc(100*sizeof(int)); printf("give the table length \n"); scanf("%d",&n); z=n; for(i=0;i<n;i++) { printf("enter T[%d]\n",i); scanf("%d",t+i); } triminmax(t,n); for(i=0;i<z;i++) { printf("%d\n",t[i]); } return 0; }