关于C语言的问题,为什么 别的对的 输入 1 2 3 4 5 6 7 8 9 0 出现数不对呢

//1. 编写程序,输入10个整数,用指针法实现将最小的数与第1个数交换,最大的数与最后一个数交换。
#include<stdio.h>
int main()
{
int a[10],*p,*max,*min,i,t;
for(i=0;i<10;i++)
scanf("%d",&a[i]);
max=a;
min=a;
for(p=a;p<(a+10);p++){
if(*max<*p)
max=p;
if(*min>*p)
min=p;
}
if(*max==a[0]&&*min==a[9]){
t=a[0];
a[0]=a[9];
a[9]=t;}
else{
t=a[9];
a[9]=*max;
*max=t;
t=a[0];
a[0]=*min;
*min=t;}
for(i=0;i<10;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}
输入1 2 3 4 5 6 7 8 9 0
得出9 2 3 4 5 6 7 8 0 1

else{
t=a[9];
a[9]=*max;
*max=t;
t=a[0];
a[0]=*min;
*min=t;
}在此位置出错了
开始时min与max的位置如下图
1 2 3 4 5 6 7 8 9 0
| |
max min
第一次交换:max的值与最后一个值交换,max与min的地址不变,变的是值
1 2 3 4 5 6 7 8 0 9
| |
max min
第二次交换:min的值与第一个值交换,注意,此时min的值已经变为了9,所以交换后:
9 2 3 4 5 6 7 8 0 1
| |
max min
所以会出现这样的结果追问

那请问怎么改呢???

追答

#include
int main()
{
int a[10],*p,*max,*min,i,t;
for(i=0;i*p)
min=p;
}
if(*max==a[0]&&*min==a[9]){
t=a[0];
a[0]=a[9];
a[9]=t;}
else{
t=a[9];
a[9]=*max;
*max=t;
//在这里重新定位max与min的地址
if((a+9) == min){
min = max;
}
max=a+9;
//end
t=a[0];
a[0]=*min;
*min=t;}
for(i=0;i<10;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}

温馨提示:内容为网友见解,仅供参考
无其他回答

关于C语言的问题,为什么 别的对的 输入 1 2 3 4 5 6 7 8 9 0 出现数...
9 2 3 4 5 6 7 8 0 1 | | max min 所以会出现这样的结果

C语言 int a[ ]={0,1,2,3,4,5,6,7,8,9},*p=a,i; 0<=i<=9,对a数组元素...
C p[i] 是相当于a[i],这不是在获取元素a[i]的地址吗? 为什么C也正确??\/\/ p[i] 是相当于a[i]A 中为什么能用用p减a??a[p-a]什么意思?? \/\/p的值就是a,所以p-a的值为0,相当于a[0]D 是不是相当于*a[i], 因而不正确?? \/\/是的*(a+i)就是a[i],那么再*a...

C语言用for循环算1!+2!+3!+4!+5! 我的程序为什么不对?
很明显s的值一直在变大,而不是你想要的求!1,!2,!3,!4,!5后再相加,每次计算的时候s的值都是在累乘的,所以最后的结果肯定会偏大。include <stdio.h>int main(){ int i,j,sum=0,s=1; for(i=1;i<=5;i++) {s=1; \/\/每次循环前先让s的值为初始值for(j=1;j<=i;j...

为什么我用C语言算1+2+3+4+5+6+7+8+9+10……+1000结果却是-23788...
也就是short的两个字节已经存不下了,所以存入的数字就会储存错误,产生输出错误的答案。好了,上面说的是short,但是由于您的编译器中int就是指的short (现在一般的int都是4字节了,也就是您编译器中对应的long )。[摘自百度百科] int , C语言,C++,C#,Obj-c等共有的一种数据类型,范围[-2^31...

请问这段c语言。四则运算的程序为什么不对呢?
一、输入数据时,中间要输入逗号,比如:1,2,43(输入的时候别人还要知道43代表加,也就是说还要查ASCII码)二、执行除法时,结果不准,因为两个整数进行除法是进行的所谓“地板除”,只取整。建议代码改成如下:include <stdio.h> int main(void){ int a,b;char fu;printf("请输入运算式:")...

在c语言中, int a[][5] = {1,2,3,4,5,6,7,8} 是合法数组声明,那么
\/data\/data\/com.n0n3m4.droidc\/files\/temp.c:2:12: error: declaration of 'b' as multidimensional array must have bounds for all dimensions except the first int b[][][5] = {{1,2,3,4,5,6,7,8,9},{1,2,3,4,5,6}};^ ...

对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。 哪里...
输出格式错误: printf("逆序为%d",a[i]); 这样写的话会输出10句"逆序为",应该把这句话放在循环前 改正后代码,供参考 include<stdio.h> int main(){ int i,a[10];for(i=0;i<=9;i++)a[i]=i;printf("逆序为:");for(i=9;i>=0;i--)printf("%d,",a[i]);return 0;} ...

C语言变长数组问题求解
第一个问题, 这个就是3*4,不是3*5, 所以这里是打错了.第二个问题. varr没初始化, 所以不要管它的初始值 这个是随机的,同时也不重要.因为 varr的每个值都会在 varr[i][j]=i*j+j;这里赋值.rs=3, cs=10循环结束后 varr这个3*10数组就是 0 1 2 3 4 5 6 7 8 9 0 2 4 6 ...

C语言 int a[]={1,2,3,4,5,6,7,8,9}; 这样也行?``其含义代表什么` 中间...
这是定义了整形数组。这是将数组中一次赋值:a[0]=1,a[1]=2···,a[8]=9。a[],代表了整形数组。 [] 这个括号里可以有值也可以没有,因为后边大括号里已经有了,所以一般 [] 中不放值。

...1 2 3 4 5 6 7 8 9 输入指定列号: 0 输出结果: 12?
define COL 4 define ROW 4 int main(){ int array[ROW][COL]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};int pos;for(int i = 0;i<ROW;i++){ for(int j = 0; j<COL;j++){ printf("%d\\t",array[i][j]);} printf("\\n");} printf("请输入指定列:");scan...

相似回答
大家正在搜