c语言程序设计……
#include<stdio.h>
int i=0;
int workover(int i)
{
i=(i%i)*((i*i)/(2*i)+4);
printf("f=%d\n",i);
return i;
}
int reset(int i)
{
i=i<2?5:0;
return i;
}
void main()
{
int i=5;
reset(i/2);printf("a=%d\n",i);
reset(i=i/2);printf("b=%d\n",i);
reset(i/2);printf("c=%d\n",i);
workover(i);printf("d=%d\n",i);
}
1,请问是怎么做的?求具体分析过程……
2,如果程序顺序如下为什么有编译报错?
#include<stdio.h>
int i=0;
void main()
{
int i=5;
reset(i/2);printf("a=%d\n",i);
reset(i=i/2);printf("b=%d\n",i);
reset(i/2);printf("c=%d\n",i);
workover(i);printf("d=%d\n",i);
}
int workover(int i)
{
i=(i%i)*((i*i)/(2*i)+4);
printf("f=%d\n",i);
return i;
}
int reset(int i)
{
i=i<2?5:0;
return i;
}
答案:首先,第二个问题,电脑运行程序时是从前往后依次运行,所以当第二种顺序时,程序运行到第6行就会出错,因为reset()这一函数在之前没有定义,电脑无法识别。第一种顺序时,虽然程序运行时只与main函数有关,但是main函数内调用的函数reset()在之前已经定义,电脑已经识别,所以不会报错了。另外,printf函数虽然没有定义,但是其包含在头文件stdio.h中,相当于是系统自己定义的函数,方便用户使用的,所以不用定义了,但是缺少头文件时,就相当于没有定义了,系统自然就报错了。
再来回答第一个问题,
workover函数中主要是这一运算: i=(i%i)*((i*i)/(2*i)+4);
其中%是整除取余,(i%i)也就是说i整除i之后的余数,很明显余数为零,所以这个运算始终为零,取值与i无关(i不等于零),f输出的值始终为零。
reset函数中则是这一运算: i=i<2?5:0;
i=是赋值了,i<2?5:0的意思就是当i<2成立时值为5,不成立时为0。这一行就是说,当i<2时将i赋值为5,当i>=2时将i赋值为0。
然而main函数虽然引用了这两个函数,而且参数的名字始终是i,但是实际上main函数里定义的i与reset和workover函数里的参数i并不是一回事,参数改为其他任意字母都是可以的,并不特指i。在reset函数的最后返回了i值,但是并没有赋值到main函数的i里去,所以i的值其实一直是5;但是有一行是reset(i=i/2); 这与 reset(i/2); 是不一样的,前者对i进行了重新赋值,在这之后i=5/2=2(因为int型只取整数部分)了;后者只是参数值是i的一半罢了,在函数之外,i的值并没有改变。
所以再来解答一下这个程序:
reset(i/2); i=5,函数返回值是0(没什么用)
printf("a=%d\n",i); i=5,输出a=5,若是上一行改为i=reset(i/2);则i=0了
reset(i=i/2); i=2,函数返回值是0
printf("b=%d\n",i); i=2,输出b=2,上一行中先对i进行了赋值,然后用新的i值作为参数运算
reset(i/2); i=2,函数返回值是0
printf("c=%d\n",i); i=2,输出c=2
workover(i); i=2,函数返回值是0,输出f=0
printf("d=%d\n",i); i=2,输出d=2
其他:时间不多,回答你第二个问题:函数的使用必须先定义或者声明,int reset(int i);int workover(int i);加在你使用之前,声明一下就好了!!!!第一个嘛,带入值,一步一步计算呗,你就清楚了····· 这道题主要考察了变量的作用域,在子程序中定义的变量,它的作用域就是在定义它的那个块中~
#include<stdio.h>
int i=0; //定义了全局变量i
int workover(int i)
{
i=(i%i)*((i*i)/(2*i)+4);
printf("f=%d\n",i);
return i;
}
int reset(int i)
{
i=i<2?5:0;
return i;
}
void main()
{
int i=5;
reset(i/2);printf("a=%d\n",i);//将i/2=2传给RESET函数中定义的形参变量i,计算后返回值,不过此时没有变量来接受这个返回值。对子程序中的i所进行的运算并没有对全局变量i产生影响,所以i值保持不变,为5,a=5
reset(i=i/2);printf("b=%d\n",i);//首先将i/2的值赋给i,再将i值传递给形参,同理,子程序的操作并未对i值产生作用,i保持2不变,b=2
reset(i/2);printf("c=%d\n",i);//同理c=2
workover(i);printf("d=%d\n",i);//将i=2传给子程序workover ,因为i%i=0所以 i=(i%i)*((i*i)/(2*i)+4)=0;在子程序中输出f=0,返回到主程序后,因为没有对主程序i进行操作,所以i=2,d=2.
下面程序报错是因为没有在调用子程序之前声明子程序,如果在main之前加上声明语句:
int reset(int i);int workover(int i);则程序可以正确运行~~
}
如果还有问题,可以HI我~~ 问题1:
函数的形参不能改变实参的值,
所以第一次执行 reset(i/2); i的值没有变,所以输出 a=5;
第二次执行 reset(i=i/2); 相当于 i=i/2,reset(i);所以输出 b=2;此时i已经变成2了.
第三次执行reset(i /2),i的值的已经是2,所以输出 c=2;
当执行 workover(i)时 i%i等于0,所以 f=0;
i的值依然没有变,所以还是 d=2.
问题2:
函数在使用前,一定要先定义,或者声明,才能使用! #define SWAP(a,b) t=b;b=a;a=t; //预先定义一个带有两个参数的SWAP()函数
{ float x,y,t; //声明三个浮点型变量
printf("Enter two number (x,y): "); //在屏幕上显示“Enter two number (x,y): ”
scanf("%f,%f",&x,&y); //等待用户输入两个浮点型变量,&x为x变量的内存地址
SWAP(x,y); //调用SWAP()函数,实参为刚才输入的浮点型变量
printf("\n\nExchanged:x=%f,y=%f",x,y); //输出两个回车换行,“Exchanged:”,X,Y的值
getch(); //等待,按任意键继续
}
上一个:C语言输出三角形
下一个:C语言求众数的问题