从java读取控制台输入入两个整数,求这两个整数的和,这两个整数在内存中的地址以及在内存

下次自动登录
现在的位置:
& 综合 & 正文
例7.2 输入两个整数,要求输出其中值较大者。要求用函数来找到大数。
?解题思路:
(1)函数名应是见名知意,今定名为max
(2)由于给定的两个数是整数,返回主调函数的值(即较大数)应该是整型
(3)max函数应当有两个参数,以便从主函数接收两个整数,因此参数的类型应当是整型
在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生函数调用时,函数max的形参被临时分配内存单元。
?调用结束,形参单元被释放
?实参单元仍保留并维持原值,没有改变
?如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值
?通常,希望通过函数调用使主调函数能得到一个确定的值,这就是函数值(函数的返回值)
(1)函数的返回值是通过函数中的return语句获得的。
一个函数中可以有一个以上的return语句,执行到哪一个return语句,哪一个就起作用,return语句后面的括号可以不要
#include &stdio.h&
int main()
{ int max(int x,int y);
int a,b,c;
printf("please enter two integer numbers:");
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("max is %d\n",c);
int max(int x,int y)
// 定义max函数
// 定义临时变量
z=x&y?x:y;
// 把x和y中大者赋给z
return(z);
// 把z作为max函数的伦值带回main函数
&&&&推荐文章:
【上篇】【下篇】在学习程序语言和进行程序设计的时候,交换两个变量的值是经常要使用的,各公司笔试也经常遇到。
方法1:标准法
通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。
代码如下:&
&这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。
上面的算法最大的缺点就是需要借助一个临时变量。
方法2:&算术运算法
&简单来说,就是通过普通的+和-运算来实现。
代码如下:&&&&&&&&&&&&&&&& i=i+j; & & & & & & & & j=i-j; & & & & & & & & i=i-j; 方法3: 位运算&
通过异或运算也能实现变量的交换,这也许是最为神奇的。
代码如下:i^=j; j^=i; i^=j; 此算法能够实现是由异或运算的特点决定的,通过异或运算能够使数据中的某些位翻转,其他位不变。
与自己异或
这意味着任意一个数与任意一个给定数异或后再与自己异或一次,结果就交换了。
方法4:指针地址法
指针地址操作&因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即&a+10&表示以a为基地址的在a后10个a类数据单元的地址。所以理论上可以通过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。即:&
int *a,*b;
&*a=new int(10);&
*b=new int(20);//&a=0xh,&b=0xh
&a=(int*)(b-a);//&a=0xh,&b=0xh
&b=(int*)(b-a); //&a=0xh,&b=0xh&
a=(int*)(b+int(a)); //&a=0xh,&b=0xh&
通过以上运算a、b的地址真的已经完成了交换,且a指向了原先b指向的值,b指向原先a指向的值了吗?上面的代码可以通过编译,但是执行结果却令人匪夷所思!原因何在?
&首先必须了解,操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、堆栈区、全局数据区等等。
在编译源程序时,常量、全局变量等都放入全局数据区,局部变量、动态变量则放入堆栈区。这样当算法执行到&a=(int*)(b-a)&时,a的值并不是0xh,而是要加上变量a所在内存区的基地址,实际的结果是:0x008f0200h,其中0x008f即为基地址,0200即为a在该内存区的位移。它是由编译器自动添加的。因此导致以后的地址计算均不正确,使得a,b指向所在区的其他内存单元。再次,地址运算不能出现负数,即当a的地址大于b的地址时,b-a&0,系统自动采用补码的形式表示负的位移,由此会产生错误,导致与前面同样的结果。&有办法解决吗?当然!以下是改进的算法:
  a=(int*)(b-a);&
  b=(int*)(b-(int(a)&0x0000ffff));
&  a=(int*)(b+(int(a)&0x0000ffff));
&  b=(int*)(a-b);&
  a=(int*)(a-(int(b)&0x0000ffff));&
  b=(int*)(a+(int(b)&0x0000ffff));&
算法做的最大改进就是采用位运算中的与运算&int(a)&0x0000ffff&,因为地址中高16位为段地址,后16位为位移地址,将它和0x0000ffff进行与运算后,段地址被屏蔽,只保留位移地址。这样就原始算法吻合,从而得到正确的结果。&此算法同样没有使用第三变量就完成了值的交换,与算术算法比较它显得不好理解,但是它有它的优点即在交换很大的数据类型时,它的执行速度比算术算法快。因为它交换的时地址,而变量值在内存中是没有移动过的。
阅读(...) 评论()Java机试题_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Java机试题
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 java在控制台输入 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信