数组的输出
我就是有点搞不懂那数组什么时候输出坐标,什么时候又输出数组里的数字。
#include <stdio.h>
#Include <math.h>
main()
{
int a[101]={1,1},i;
for(i=2;i<=sqrt(100);i++)
if(a[i]==0)
for(j=i+1;j<=100;j+=i)
{
a[j]=1;
}
for(i=0;i<=100;i++)
{
if(a[i]==0) printf("%5d",i);
}
printf("\n");
}
这个为什么输出坐标,而我们使用函数调用的时候返回的值又是数组里的函数?
你是说的下标吧?数组里面只有元素没有什么函数啊,你说的是元素吧?元素和下标的区别:例如有一个数组a,那么a【1】就是代表a数组里面的第一个元素,二那个中括号里面的1就是下标;
决定你要输出的是什么的需要看题目的要求,这道题是用筛法求取质数,所以数组里面的元素就只可能有0和1,所以将数组里面的元素作为if后面的条件作为判断是否是质数,将它们的下标作为要输出的目标,使满足if条件后的下标也就是质数进行输出;
另外程序段也是有问题的:
修改如下:
#include <stdio.h>
#include <math.h>
main()
{
int a[101]={1,1},i,j;
for(i=2;i<=sqrt(100);i++)
if(a[i]==0)
for(j=i+i;j<=100;j+=i)
{
a[j]=1;
}
for(i=0;i<=100;i++)
{
if(a[i]==0) printf("%5d",i);
}
printf("\n");
}
回复 水根:因为输出的是数组的坐标,决定输出是坐标的是这个语句: if(a[i]==0) printf("%5d",i);
决定输出坐标的关键是 if(a[i]==0) printf("%5d",i);就是那个i,如果将它改为a【i】就变成了输出的是元素了
对了,还有就是有一点我还是没弄懂。
int fun(int a[],int n)
{
int i=0,j=0;
a[j]=a[i];
i++;j++;
for(;i<n;i++)
{
if(a[j-1]!=a[i])
{
a[j]=a[i];j++;
}
}
return j;
}
main()
{
int a[30]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},n=20;
fun(a,n);
for(i=0;i<n;i++)printf("%3d",a[i]);
}
我想请问一下这个j的返回值到底是一个数组还是一个坐标?
回复 水根:那是因为主函数的printf("%3d",a[i]);红色部分是数组啊;
如果你想问为啥a数组变化了的话,那是因为这个函数调用时按地址传递,所以不需要返回数组也可以改变数组里面的值;
而且你这个源程序有错,而且不完整;
回复 水根:节选里面也有语法错误,主函数里面i变量没有定义,而且调用函数返回值在主函数中也没有得到体现,等于不要返回值一样的,由于这个调用函数是按地址传递,所以在调用函数中对数组元素进行的操作改变了主函数里面数组的值;所以这个函数输出的a数组是经过调用函数改变的那个数组
形参和实参之间的传递分为按地址传递:特点是形参的改变会导致实参也跟着改变;通常形参是指针或者数组的就是按地址传递;
按值传递;除开按地址传递其他的都是按值传递,特点是在形参的改变不影响实参;
能理解?
#include <stdio.h>
#define N 80
int fun(int a[], int n)
{
int i=0,j=0;
a[j]=a[i];
i++;j++;
for(;i<n;i++)
{
if(a[j-1]!=a[i])
{
a[j]=a[i];j++;
}
}
return j;
}
main()
{ int a[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;void NONO ();
printf("The original data :\n");
for(i=0; i<n; i++)printf("%3d",a[i]);
n=fun(a,n);
printf("\n\nThe data after deleted :\n");
for(i=0;i<n;i++)printf("%3d",a[i]); printf("\n\n");
NONO();
}
void NONO ()
{/* 请在此函数内打开文件,输入测试数据,调用 fun 函数,输出数据,关闭文件。 */
FILE *rf, *wf; int a[N], n, i, j ;
rf = fopen("in.dat","r") ;
wf = fopen("out.dat","w") ;
for(i = 0 ; i < 5 ; i++) {
fscanf(rf, "%d", &n) ;
for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
n = fun(a, n) ;
for(j = 0 ; j < n ; j++) fprintf(wf, "%4d", a[j]) ;
fprintf(wf, "\n") ;
}
fclose(rf) ; fclose(wf) ;
}
这是那道题的原题,是编程题,我做完了后就是搞不懂返回的j到底是什么才拿来请教的。
回复 水根:不存在,只要你再回去看一遍应该会理解的,其实函数调用最重要的部分就是刚刚给你讲的那些,记住就可以了,很多同学都经常搞不懂的,慢慢来吧,时间很多的,努力吧,嘿嘿
回复 水根:主函数里面调用函数的语句就是n=fun(a,n);这个语句的意思就是将返回值赋值给n,也就等同于n=j;这样说能理解了么?
返回值就是将主函数中调用函数语句中的调用函数用返回值替代;
回复 水根:学这个加上复习时间是很多的,我当时学这个就差不多一个月而已,所以不用担心时间,赶时间学的东西都记不住,慢慢学,一定要理解,加油吧,不用谢,嘿嘿