#include<stdio.h>
int a[10];
int main()
{
void s1(int *p);
void s2(int *p);
void s3(int *p);
int a[10];
int *p=a;
s1(p);
s2(p);
s3(p);
return 0;
}
void s1(int *p) //shuru
{
for(p=a;p<a+10;p++)
scanf("%d",p);
}
void s2(int *p)
{
int *max=a,*min=a,*t;
for(p=a;p<a+10;p++)
{
if(*min>*p)
min=p;
if(*max<*p)
max=p;
}
p=a;
t=p;
p=min;
min=t;
*t=*(p+9);
*(p+9)=*max;
*max=*t;
}
void s3(int *p)
{
for(p=a;p<a+10;p++)
printf("%d ",*p);
}
上面的程序在visual c++6.0上抛出的结果不对
有两个问题:
(1)你的S2函数是有问题的,当你输入的数组中,第一个数就是最大值时,你把第一个数跟最小值交换后,最大数的位置就变了。所以,你在交换前需要判断一下,输入的第一个数是否是数组的最大值。
(2)你定义了一个全局变量a,在main函数中又定义了一个局部变量a,在s1、s2、s3中,你即使用了局部变量也使用了全局变量的地址,导致数据处理混乱。需要把main中的int a[10]删掉。
修改后运行结果:
修改后的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int a[10];
int main()
{
void s1(int* p);
void s2(int* p);
void s3(int* p);
//int a[10]; //这里不需要
int* p = a;
s1(p);
s2(p);
s3(p);
return 0;
}
void s1(int* p) //shuru
{
for (p = a; p < a + 10; p++)
scanf("%d", p);
}
void s2(int* p)
{
int* max = a, * min = a;
int t1;
int* t = &t1;
for (p = a; p < a + 10; p++)
{
if (*min > *p)
min = p;
if (*max < *p)
max = p;
}
p = a;
if (max == p) //数组中的第一个数是最大数的情况
{
//先交换最小数
*t = *p; //*t保存a[0]
*p = *min; //a[0] 存入最小数
*min = *t; //t 存原来的a[0],此时*min就是最大值
//交换最大值跟最后一个位置
*t = *(p + 9);
*(p + 9) = *min;
*min = *t;
}
else
{
//先交换最小数
*t = *p;
*p = *min;
*min = *t;
//再交换最大数
*t = *(p + 9);
*(p + 9) = *max;
*max = *t;
}
}
void s3(int* p)
{
for (p = a; p < a + 10; p++)
printf("%d ", *p);
}
怎么个不对法?说详细一点
第3行有个全局a[10],第10行又定义个main函数中的a[10]。把第10行的a[10]定义删除
由于问题描述不够具体,无法确定是什么类型的错误,因此无法给出具体解决方案。建议提供更加详细的问题描述和源代码,或者进行调试和排查错误,查看程序各个部分的运行情况,找出可能的错误原因。
void s2(int *p)
{
int *max=a,*min=a,t;
for(p=a;p<a+10;p++)
{
if(*min>*p)
min=p;
if(*max<*p)
max=p;
}
p=a;
t=*p;
p=min;
*min=t;
t=*(p+9);
*(p+9)=*max;
*max=r;
}