64,685
社区成员
发帖
与我相关
我的任务
分享
#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;
}
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;
}
#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");
}