10 、(本题10分)
将不多于10个的正整数输入到数组a[ ]中,以-1作为结束符, 要求数组的值按逆序重新存放并输出(不包含-1)。
输出语句必须是:
for(i=0;i<n;i++) printf("%d ",a[i]);
例如,输入: 8 6 5 4 1 -1
输出 1 4 5 6 8。
注意输入数据和输出数据的格式,且注意-1并不在逆序存放的范围内。
【作答结果】
#include<stdio.h>
void main()
{
int i,t,n=0;
int a[10];
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i!=-1;i++)
{
n++;
}
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
for(i=0;i<n;i++)
printf("%d",a[i]);
}
如果输入的数据不足10个,程序就不会往下执行,修改如下:
#include<stdio.h>
void main()
{
int i,t,n=0;
int a[10];
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
if(a[i]==-1)
break;
}
n=i;
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
for(i=0;i<n;i++)
printf("%d",a[i]);
}
#include<stdio.h>
void main()
{
int i,t,n=0;
int a[10];
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
if(a[i] == -1) break;
}
for(i=0;a[i]!=-1;i++)
{
n++;
}
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
把第二个for循环去掉即可,因为这个for循环导致超时了,因为起始i=0,然后每次循环后++依然是不等于-1的,因为是要等很久溢出后变成负数,再++很久之后才可能变成-1,但会超时很久,然后数组元素的个数n直接把i的值赋给它即可;
之后然后把获取输入那里修改为读入-1时停止获取输入即可,修改如下:
#include<stdio.h>
int main()
{
int i=0,t,n=0;
int a[10];
scanf("%d",&a[i]);
while(a[i]!=-1&&i<10)
{
i++;
scanf("%d",&a[i]);
}
// for(i=0 ;i!=-1;i++)
// {
// n++;
// printf("i=%d\n",i);
// }
n = i;
for(i=0;i<n/2;i++)
{
t=a[i];
a[i]=a[n-i-1];
a[n-i-1]=t;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
for(i=0;i!=-1;i++)
典型死循环
a[i]!=-1
第10行是死循环
第二个for循环不应该拿i去比较,应该是数组元素比较。
好好看看你的第二个循环,程序出得来吗
你这个for这样写,i != -1 永远都满足,死循环了
for(i=0;i!=-1;i++)
{
n++;
}
为啥i!=-1啊?i++啊,这得运行到i溢出才会结束啊
因为你在输入的时候没有判断 -1 还在等待你输入 所以超时
#include <stdio.h>
void main()
{
int i, t, n = 0;
int a[10];
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
if(a[i] == -1)
{
break;
}
}
n = i;
for (i = 0; i < n; i++)
printf("%d ", a[n - i - 1]);
printf("\n");
}
第一个for循环条件表达式有点问题,输入数据的时候要输满10个才停止
n-i-1-1
既然是逆序且数组长度固定了,为啥不从后往前插入?
for(i=8;i>=0;i--)
{
scanf("%d",&a[i]);
}
这样不行吗?还是说有其它限制(dog)