输入十个数,将其中最小的数与第一个数进行对换,将最大的数与最后一个数进行对换。写出三个函数:1.输入10个数,2.进行对换处理,3.输出对换后的10个数。
#include<stdio.h>
int swap(int a[]){
int i,*min,*max,t;
min=&a[0];
max=&a[0];
for(i=1;i<10;i++)
{
if(*min>a[i]) {
t=*min;
a[i]=*min;
*min=t;
}
if(*max>a[i]) {
t=*max;
a[i]=*max;
*max=t;
}
}
for(i=0;i<10;i++)
{
if(*min==a[i]){
t=a[0];a[0]=a[i];a[i]=t;}
if(*max==a[i]) {
t=a[9];a[9]=a[i];a[i]=t;
}
}
}
int prn(int b[]){
int i;
for(i=0;i<10;i++)
printf("%d\t",b[i]);
}
void main()
{
int i,a[10];
printf("请输入十个数:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
swap(a);
prn(a);
return;
}
这是运行结果,程序应该怎么修改呢
首先,swap
函数的返回类型定义为 int
,但是在函数的末尾没有返回任何值。此外,prn
函数的返回类型也应该是 void
,因为它没有返回值。另外,main
函数的返回类型应该是 int
而不是 void
,这样可以通过返回一个整数值来指示程序的执行状态。
此外,swap
函数中的逻辑有误。在找到最小值和最大值后,应该交换指针 min
和 max
指向的元素,而不是将数组元素与 *min
和 *max
交换。另外,交换元素时,应该使用一个额外的变量来临时保存需要交换的元素值。
对于输入的数组 a
,找到最小值和最大值的方法也存在问题。首先,初始时应该将 min
和 max
分别指向数组的第一个元素 a[0]
。然后,在遍历数组时,应该将 *min
和 *max
分别与当前元素 a[i]
进行比较,而不是与 a[i]
进行比较。
最后,prn
函数应该在循环结束后添加一个换行符 \n
,以便每行输出一个数字。
以下是修正后的代码:
#include <stdio.h>
void swap(int a[]) {
int i, *min, *max, t;
min = &a[0];
max = &a[0];
for (i = 1; i < 10; i++) {
if (*min > a[i]) {
min = &a[i];
}
if (*max < a[i]) {
max = &a[i];
}
}
t = *min;
*min = a[0];
a[0] = t;
t = *max;
*max = a[9];
a[9] = t;
}
void prn(int b[]) {
int i;
for (i = 0; i < 10; i++) {
printf("%d\t", b[i]);
}
printf("\n");
}
int main() {
int i, a[10];
printf("请输入十个数:");
for (i = 0; i < 10; i++) {
scanf("%d", &a[i]);
}
swap(a);
prn(a);
return 0;
}
最小值 和 第一个数交换, 最大值 和 最后一个数交换, 你把 最大值 和 最小值的索引找到就行了
int swap(int a[]){
int i, minIndex, maxIndex,t;
minIndex=0;
maxIndex=0;
for(i=1;i<10;i++)
{
if(a[minIndex]>a[i]) {
minIndex = i;
}
if(a[maxIndex]<a[i]) {
maxIndex = i;
}
}
// 最小值 和 第一个数交换
t = a[0];
a[0] = a[minIndex];
a[minIndex] = t;
// 最大值 和 最后一个数交换
t = a[9];
a[9] = a[maxIndex];
a[maxIndex] = t;
}
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void input(int* p) {
for (int i = 0; i < 10; ++i, ++p) {
printf("请输入第%d个数的值\n", i + 1);
scanf("%d", p);
}
}
void print(int* p) {
for (int i = 0; i < 10; ++i, ++p) {
printf("%d ", *p);
}
printf("\n");
}
void fun(int* q) {
int* p = q;
int* minp = p;
int* maxp = p;
int temp;
for (int i = 1; i < 10; ++i, ++p) {
if (*maxp < *p) {
maxp = p;
}
if (*minp > *p) {
minp = p;
}
}
temp = *maxp;
*maxp = *p;
*p = temp;
temp = *minp;
*minp = *q;
*q = temp;
}
void main() {
int arr[10];
int* p = arr;
input(p);
print(p);
fun(p);
print(p);
system("pause");
}
改进方案: 在对换处理的函数void fun(int* q)
中存在错误,需要进行以下修改: 1. 修正交换最大值和最小值的位置,交换最大值与最后一个数,交换最小值与第一个数。 2. 修改交换操作时,应使用*maxp
和*minp
,而不是*p
。 代码部分如下:
void fun(int* q) {
int* p = q;
int* minp = p;
int* maxp = p;
int temp;
for (int i = 1; i < 10; ++i, ++p) {
if (*maxp < *p) {
maxp = p;
}
if (*minp > *p) {
minp = p;
}
}
temp = *maxp;
*maxp = *(q + 9);
*(q + 9) = temp;
temp = *minp;
*minp = *q;
*q = temp;
}
这样就可以正确地实现将最小和最大数字移到首尾的功能了。
题主代码修改如下,改动处见注释,供参考:
#include<stdio.h>
int swap(int a[]) {
int i, * min, * max, t;
min = &a[0];
max = &a[0];
for (i = 1; i < 10; i++)
{
if (*min > a[i]) {
min = &a[i];
//t = *min; 修改
//a[i] = *min;
//*min = t;
}
if (*max < a[i]) { //if (*max > a[i]) 修改
max = &a[i];
//t = *max; 修改
//a[i] = *max;
//*max = t;
}
}
//for (i = 0; i < 10; i++) 修改
//{
// if (*min == a[i]) {
t = a[0]; a[0] = *min; *min = t; //修改
// } 修改
// if (*max == a[i]) {
if (max == &a[0]) //修改
max = min;
t = a[9]; a[9] = *max; *max = t; //修改
// }
//}
return 0; //修改
}
int prn(int b[]) {
int i;
for (i = 0; i < 10; i++)
printf("%d ", b[i]); // 修改
return 0; //修改
}
void main()
{
int i, a[10];
printf("请输入十个数:");
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
swap(a);
prn(a);
return;
}