求教一道C语言题目
输入一个正整数n(1 <n≤10),再输入n个整数,将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。
【输入形式】
从键盘输入一个正整数n和n个整数。
【输入输出样例1】(下划线部分表示输入)
Input n:5
Input 5 integers:8 2 5 1 4
After swapped: 1 2 5 4 8 (每个输出数据间有一个空格)
我的答案:
#include<stdio.h>
int main(void)
{
int n,i,j,index1,index2,temp1,temp2;
printf("Input n: ");
scanf("%d",&n);
int a[n];
printf("Input 5 integers: ");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
index1=0;
for(i=1;i<n;i++){
if(a[i]<a[index1])
index1=i;}
index2=0;
for(j=1;j<n;j++){
if(a[i]>a[index2])
index2=i;}
temp1=a[0];
a[index1]=a[0];
a[index1]=temp1;
temp2=a[n-1];
a[index2]=a[n-1];
a[index2]=temp2;
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
求教哪里出错了? 展开
c语言中声明数组时,一定要显式的指明数组长度,所以数组长度是个常数,int a[n]这种声明法是明显错误的。你可以看到,n最大值是10,那么直接声明一个int a[10]就可以了。
另外,你的交换算法也还有问题,修改如下,//注释并且修改:
#include<stdio.h>
int main(void)
{
int n,i,j,index1,index2,temp1,temp2,a[10]; //直接声明a[10]
printf("Input n: ");
scanf("%d",&n);
//int a[n];
printf("Input 5 integers: ");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
index1=0;
for(i=1;i<n;i++)
{
if(a[i]<a[index1])
index1=i;
}
//放这来交换同时,交换你写错了
temp1=a[0];
a[0]=a[index1];//a[index1]=a[0];
a[index1]=temp1;
index2=0;
for(j=1;j<n;j++)
{
if(a[j]>a[index2]) //这儿应该是j a[i]>a[index2]
index2=j;//这儿应该是j index2=i;
}
//
temp2=a[n-1];
a[n-1]=a[index2];//a[index2]=a[n-1];
a[index2]=temp2;
printf("After swapped:");//加一句
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}
int main()
{
int n,i,j,index1,index2,temp1,temp2;
printf("Input n: ");
scanf("%d",&n);
int a[n];
printf("Input 5 integers: ");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
index1=0;
for(i=1;i<n;i++){
if(a[i]<a[index1])
index1=i;}
temp1=a[0];
a[0]=a[index1]; // 这里有修改,你原本的代码写反了
a[index1]=temp1;
index2=0;
for(i=1;i<n;i++){ // 这里有修改,你原本的代码把i写成了j
if(a[i]>a[index2])
index2=i;}
temp2=a[n-1];
a[n-1]=a[index2]; // 这里有修改,你原本的代码写反了
a[index2]=temp2;
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
return 0;
}
另外,在计算出哪个元素是最小值时,就应该立刻和第一个元素进行互换,而不能在互换前去搜索最大值,因为有可能第一个元素就是最大值。