写在前面:
一轮循环就同时确定最大最小值位置并进行最终互换:
这道题的陷阱在于:
在进行最终位互换时,代码编写中先写最小值确定最终位(即先互换首位置),此时拿最小值打头的序列去测试正确,但用最大值打头的序列(如:10 5 6 8 4 3 1 2 9 7)去测试则错误;相反,先编写最大值确定最终位(即先换尾位置),拿最大值打头的序列去测试正确,拿最小值打头的序列去测试则错误。


当然,也可以“钻空子”,下述代码(先进行最大值确定最终位)是可以通过系统测试的,但对于10 9 8 7 6 5 4 3 2 1 ,仍会输出 10 9 8 7 6 5 4 3 2 1:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[10];
  5. scanf("%d",&a[0]);
  6. int Maxnum=0,Minnum=0;
  7. for(int i=1; i<10; i++)
  8. {
  9. scanf("%d",&a[i]);
  10. if(a[i]>a[Maxnum])
  11. Maxnum=i;
  12. else if(a[i]<a[Minnum])
  13. Minnum=i;
  14. }
  15. int temp;
  16. temp=a[9];
  17. a[9]=a[Maxnum];
  18. a[Maxnum]=temp;
  19. temp=a[0];
  20. a[0]=a[Minnum];
  21. a[Minnum]=temp;
  22. for(int i=0; i<10; i++)
  23. printf("%d ",a[i]);
  24. return 0;
  25. }

但对于要深究并完善自己代码的同学们,在明白了上述可以通过测试的“正确”代码的错误之处的前提下,会发现“真·正确”的代码离我们仅一步之遥:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a[10];
  5. scanf("%d",&a[0]);
  6. int Maxnum=0,Minnum=0;
  7. for(int i=1;i<10;i++){
  8. scanf("%d",&a[i]);
  9. if(a[i]>a[Maxnum])
  10. Maxnum=i;
  11. else if(a[i]<a[Minnum])
  12. Minnum=i;
  13. }
  14. int temp;
  15. temp=a[0];
  16. a[0]=a[Minnum];
  17. a[Minnum]=temp;
  18. if(Maxnum==0) //针对初始时首元素即为最大的情况
  19. Maxnum=Minnum; //追溯前一步被最小值换走的“真·最大值”的真实位置,并赋予Maxnum
  20. temp=a[9];
  21. a[9]=a[Maxnum];
  22. a[Maxnum]=temp;
  23. for(int i=0;i<10;i++)
  24. printf("%d ",a[i]);
  25. return 0;
  26. }

PS:在进行完最小值换到首位置(这是前提)后进行判定,if判定是为了追溯被Minnum所指元素换走的“真·最大值”。
若在判定前先进行的是最大值确定最终位,那if判定时就要追溯被Maxnum所指元素换走的“真·最小值”,之后才能进行最小值确定最终位。


另贴出c指针代码:

  1. #include <stdio.h>
  2. void creat(int *head);
  3. void spsort(int *head);
  4. void put(int *head);
  5. int main()
  6. {
  7. int a[10];
  8. creat(a);
  9. spsort(a);
  10. put(a);
  11. return 0;
  12. }
  13. void creat(int *head)
  14. {
  15. int *p=head;
  16. for(int i=0; i<10; i++)
  17. scanf("%d",(p++));
  18. }
  19. void spsort(int *head)
  20. {
  21. int *Maxnum=head,*Minnum=head,*p=head,temp;
  22. for(int i=1; i<10; i++)
  23. if(p[i]>*Maxnum)
  24. Maxnum=&p[i];
  25. else if(p[i]<*Minnum)
  26. Minnum=&p[i];
  27. temp=*Minnum;
  28. *Minnum=p[0];
  29. p[0]=temp;
  30. if(Maxnum==head) Maxnum=Minnum;
  31. temp=*Maxnum;
  32. *Maxnum=p[9];
  33. p[9]=temp;
  34. }
  35. void put(int *head)
  36. {
  37. int *p=head;
  38. for(int i=0; i<10; i++)
  39. printf("%d ",*(p++));
  40. }

当然,如果仅仅是要通过系统测试,前述第一段代码已足够。

点赞(0)
 

9.7 分

32 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 21 条评论

菜狗小白 1年前 回复TA
@菜狗小白 return 0; }
菜狗小白 1年前 回复TA
#include <stdio.h>
#include <string.h>
#define N 1000
#define n 10
void swap(int *a,int *b)
{
	int t;
	t=*a;
	*a=*b;
	*b=t;
}
int *Handle(int *arr)//处理函数
{
	int min=arr[0],max=arr[0],item1,item2;
	for(int i=0;i<n;i++){
		if(arr[i]<=min){
			min=arr[i];
			item1=i;
		}
		if(arr[i]>=max){
			max=arr[i];
			item2=i;
		}
	}
	swap(&arr[0],&arr[item1]);
	swap(&arr[9],&arr[item2]);
	return arr;
}
void OutPut(int *arr)//输出函数
{
	for(int i=0;i<n;i++){
		printf("%d ",arr[i]);
	}
}
int main(void)
{
	int arr[N];
	for(int i=0;i<n;i++){
		scanf("%d",&arr[i]);
	}
	int *arr2=Handle(arr);
	OutPut(arr);
火人内莉 1年前 回复TA
@重生之我是菜逼 不是说要用函数吗?
重生之我是菜逼 1年前 回复TA
#include<stdio.h>
int main()
{
    int a[10]={0};
    int i;
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
    int min=0, max = 0;
    for (i=0; i < 10; i++)
    {
        if (a [i] > a[i+1]&&a[i]>=a[max])
            max = i;
    }
    if (a[9] > a[max])
    	max = 9;
    for (i = 9; i >=0; i--)
	if (a[i] < a[i - 1]&&a[i]<=a[min])
            min = i; 
    if (a[0]<a[min])
    	min=0;
    int temp_min, temp_max;
    temp_min = a[0];
    a[0] = a[min];
    a[min] = temp_min;
    if(max != 0){
    temp_max = a[9];
    a[9] = a[max];
    a[max] = temp_max;
    }
    else{
        temp
Travis 1年前 回复TA
else if (arr[i] == max)
        {
            tmp = arr[9];
            arr[9] = max;
            arr[i] = tmp;
        }
    }
}

void Output(int arr[])
{
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main()
{
    int arr[10] = { 0 };
    Input(arr);
    Order(arr);
    Output(arr);
    return 0;
}
Travis 1年前 回复TA
void Input(int arr[])
{
    int i = 0;
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &arr[i]);
    }
}

void Order(int arr[])
{
    int i = 0;
    int tmp = 0;
    int min = arr[0];
    int max = arr[0];
    for (i = 0; i < 10; i++)
    {
        if (min > arr[i])
        {
            min = arr[i];
        }
    }
    for (i = 0; i < 10; i++)
    {
        if (max <  arr[i])
        {
            max = arr[i];
        }
    }
    for (i = 0; i < 10; i++)
    {
        if (arr[i] == min)
        {
            tmp = arr[0];
            arr[0] = min;
            arr[i] = tmp;
        }
1111Jane 1年前 回复TA
#include<stdio.h>
int main(){
	int i,a[10],tmp,max,min;
	for(i=0;i<10;i++){
	  scanf("%d",&a[i]);
	}
	min=0;
	max=9;
	for(i=1;i<10;i++){
		if(a[min]>a[i]){
			min=i;
		}
}
    for(i=8;i>0;i--){
    	if(a[i]>a[max]){
			max=i;
	}
	}
    tmp=a[0];a[0]=a[min];a[min]=tmp;
    tmp=a[9];a[9]=a[max];a[max]=tmp;
	for(i=0;i<10;i++){
		printf("%d ",a[i]);
	}
}
为什么结果错误家人们
林歌 2年前 回复TA
#include<stdio.h>

int enter(int *pstr)
{
	int *q=pstr;
	for(int i=0;i<10;++i)
	{
	scanf("%d", (q++));
	}
 } 
 int work(int *pstr)
 {
 	int *max=pstr,*min=pstr,*p=pstr,temp;
	for(int i=1;i<10;++i)
	{
	if(*max<p[i])
	   max=&p[i];
	else if(*min>p[i])
	   min=&p[i];
	}
	temp=*min;
	*min=p[0];
	p[0]=temp;
	temp=*max;
	*max=p[9];
	p[9]=temp;
	for(int i=1;i<8;++i)
	{
		for(int j=i+1;j<9;++j)
	{
		if(*(p+i)>*(p+j))
		{
			temp=p[i];
			p[i]=p[j];
			p[j]=temp;
		}
	}
    }
 }
 int put(int *pstr)
 {
 	int *p=pstr;
 	for(int i=0;i<10;++i)
 	printf("%d ", (*p++));
 }
 int main(void)
 {
 	int str[10];
2019052280 2年前 回复TA
@小王同学 因为循环里没有同级的其他语句,if...else在逻辑上算一句
小王同学 2年前 回复TA
指针代码中,为什么for后面没有大括号{}?编译能通过也没报错