不知道哪里错了

简.单 2019-05-23 02:47:29
D使用函数实现:输入10个整数,将其中最小的数与第一个数对换,把最大数与最后一个数对换 #include<stdio.h> void fun(int *p) { int max,min,i,j=0,k; max=min=*p; for(i=0;i<10;i++) { if(max<*(p+i))max=*(p+i);    j=i;}      k=*p;     *p=*(p+j);     *(p+j)=k; } void main() {int i,a[10]; printf("请输入10个整数\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); fun(a); for(i=0;i<10;i++) printf("%d ",a[i]); }
...全文
89 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
s_father 2019-05-23
  • 打赏
  • 举报
回复
我把程序重新写了一遍,希望能对你有帮助, 如果有错误希望各位大神多多指导
#define _CRT_SECURE_NO_WARNINGS   // vs2017 scanf函数编译不过,要加上该宏定义
#include<stdio.h>

/*D使用函数实现 : 输入10个整数,将其中最小的数与第一个数对换,把最大数与最后一个数对换*/

int FindMaxth(int* p, int length) {// 寻找最大值并返回其下标
int maxn = p[0], flag = 0;
for (int i = 1; i < length; i++) {
if (p[i] > maxn)
{
maxn = p[i];
flag = i;
}
}

return flag;

}

int FindMinth(int* p, int length) {// 寻找最小值并返回其下标
int mina = p[0], flag = 0;
for (int i = 1; i < length; i++) {
if (p[i] < mina)
{
mina = p[i];
flag = i;
}
}

return flag;

}

void swap(int m, int n, int* p) {// 元素位置交换
//int temp = p[m]; 等价与下面
//p[m] = p[n];
//p[n] = temp;

int temp = *(p + m);
*(p + m) = *(p + n);
*(p + n) = temp;
}

int main()
{
int i, a[10];
int m, n; // 用来接收最大值和最小值的额元素下标
printf("请输入10个整数\n");
for (i = 0; i < 10; i++) // 输入10个数组元素
scanf("%d", &a[i]);

m = FindMaxth(a, 10); // 寻找最大值并返回其下标
n = FindMinth(a, 10); // 寻找最小值并返回其下标

printf("%d %d\n", m, n);

if(m == 0 && n == 9) // m = 0, n = 9 只要最大值跟最小值交换就可以了 这个坑要小心了
swap(m,9, a);
else// 交换最大值和最后一个元素的位置
{
if (n != 0)
swap(n, 0, a); // 交换最小值和第一个元素的位置
if (m != 9)
swap(m, 9, a);
}
for (i = 0; i < 10; i++)
printf("%d ", a[i]);

return 0;
}
简.单 2019-05-23
  • 打赏
  • 举报
回复
引用 1 楼 terryqin2009的回复:
#include<stdio.h>
void fun(int *p)
{
	int max, min, i, j = 0, k;
	max = min = *p;
	for (i = 0; i < 10; i++)
	{
		if (max < *(p + i)) {
			max = *(p + i);
			j = i;//j记录最大值坐标
		}			
	}

	//交换最大值和最后一位
	k = *(p+9);
	*(p+9) = *(p + j);
	*(p + j) = k;

	for (i = 0; i < 10; i++)
	{
		if (min > *(p + i)) {
			min = *(p + i);
			j = i;//j记录最小值坐标
		}
	}

	//交换最小值和第一位
	k = *p;
	*p = *(p + j);
	*(p + j) = k;
}
void main()
{
	int i, a[10];
	printf("请输入10个整数\n");
	for (i = 0; i < 10; i++)
		scanf("%d", &a[i]);
	fun(a);
	for (i = 0; i < 10; i++)
		printf("%d ", a[i]);

	system("pause");
}
还是不行啊到底怎么回事
简.单 2019-05-23
  • 打赏
  • 举报
回复
引用 1 楼 terryqin2009的回复:
#include<stdio.h>
void fun(int *p)
{
	int max, min, i, j = 0, k;
	max = min = *p;
	for (i = 0; i < 10; i++)
	{
		if (max < *(p + i)) {
			max = *(p + i);
			j = i;//j记录最大值坐标
		}			
	}

	//交换最大值和最后一位
	k = *(p+9);
	*(p+9) = *(p + j);
	*(p + j) = k;

	for (i = 0; i < 10; i++)
	{
		if (min > *(p + i)) {
			min = *(p + i);
			j = i;//j记录最小值坐标
		}
	}

	//交换最小值和第一位
	k = *p;
	*p = *(p + j);
	*(p + j) = k;
}
void main()
{
	int i, a[10];
	printf("请输入10个整数\n");
	for (i = 0; i < 10; i++)
		scanf("%d", &a[i]);
	fun(a);
	for (i = 0; i < 10; i++)
		printf("%d ", a[i]);

	system("pause");
}
还是不行啊到底怎么回事
CaptainXue 2019-05-23
  • 打赏
  • 举报
回复
你的程序存在以下问题: 1、程序中j表示最大值的位置下标,题意要求和最后一个数将换,你怎么和第一个交换了呢? 应该改为:
k=*(p+9); //j表示最大值的下标,应该和最后一个数交换
*(p+9)=*(p+j);
*(p+j)=k;
2、程序中并没有实现把最小值和第一个数交换,也就是说你的程序并不完整 3、程序中有一个小优化,就是如果最小的数正好是第一个数,或者最大的数正好是最后一个数,就不需要交换 总的来说,你的程序逻辑上有一点点问题,可以看看这篇文章:https://blog.csdn.net/weixin_43956598/article/details/90049508 修改后逇代码如下:

#include<stdio.h>
void fun(int *p) {
	int max,min,i,j=0,k;
	int s=0;//存储最小值的下标
	max=min=*p;
	for(i=0; i<10; i++) {
		if(max<*(p+i)) { //修改max的值的同时,修改最大数的下标位置
			max=*(p+i);
			j=i;
		}
		if(min>*(p+i)) {
			min=*(p+i);
			s=i;
		}
	}
	if(j!=9) { //当最大数不是最后一个数才交换,程序的优化
		k=*(p+9); //j表示最大值的下标,应该和最后一个数交换
		*(p+9)=*(p+j);
		*(p+j)=k;
	}
	if(s!=0) { //当最小数不是第一个数才交换,程序的优化
		k=*p;//s表示最小值的下标,应该和第一个数交换
		*p=*(p+s);
		*(p+s)=k;
	}
}
int main() {
	int i,a[10];
	printf("请输入10个整数\n");
	for(i=0; i<10; i++)
		scanf("%d",&a[i]);
	fun(a);
	for(i=0; i<10; i++)
		printf("%d ",a[i]);
	return 0;
}
terryqin2009 2019-05-23
  • 打赏
  • 举报
回复
#include<stdio.h>
void fun(int *p)
{
	int max, min, i, j = 0, k;
	max = min = *p;
	for (i = 0; i < 10; i++)
	{
		if (max < *(p + i)) {
			max = *(p + i);
			j = i;//j记录最大值坐标
		}			
	}

	//交换最大值和最后一位
	k = *(p+9);
	*(p+9) = *(p + j);
	*(p + j) = k;

	for (i = 0; i < 10; i++)
	{
		if (min > *(p + i)) {
			min = *(p + i);
			j = i;//j记录最小值坐标
		}
	}

	//交换最小值和第一位
	k = *p;
	*p = *(p + j);
	*(p + j) = k;
}
void main()
{
	int i, a[10];
	printf("请输入10个整数\n");
	for (i = 0; i < 10; i++)
		scanf("%d", &a[i]);
	fun(a);
	for (i = 0; i < 10; i++)
		printf("%d ", a[i]);

	system("pause");
}

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧