通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。

通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。
通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。

下列给定程序中,函数fun的功能是:通过某种方式实现两个变量值的交换,规定不允许增加语句和表达式。例如变量a中的值原为8,b中的值原为3,程序运行后a中的值为3,b中的值为8。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:

#include

#include

#include

int fun(int *x,int y)

{

int t;

/*************found**************/

t=x;x=y;

/*************found**************/

return(y);

}

void main()

{int a=3,b=8;

system("CLS");

printf("%d %d\n ",a,b);

b=fun(&a,b);

printf("%d %d\n ",a,b);

}

(1)错误:t=x;x=y; 正确:t=*x;*x=y;

(2)错误:return(y) ; 正确:return (t);

C语言试题:数据类型、运算符与表达式

3 数据类型、运算符与表达式 一、单项选择题 1、以下选项中,不正确的 C 语言浮点型常量是( C )。 A. 160. B. 0.12 C. 2e4.2 D. 0.0 分析:e 后面的指数必须为整数。 2、以下选项中,( D )是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" 分析:在C 语言中,’a ’表示字符常量,”a ”表示字符串。 3、 在 C 语言中,字符型数据在计算机内存中,以字符的(C )形式存储。 A.原码 B.反码 C. ASCII 码 D. BCD 码 分析:将一个字符常量放入一个字符变量中,实际上并不是将字符本身放到内存单元中,而是将字符的对应的ASCII 码放到储存单元中。 4、若x 、i 、j 和k 都是int 型变量,则计算下面表达式后,x 的值是( C )。 x=(i=4,j=16,k=32) A. 4 B. 16 C.32 D.52 分析:(i=4,j=16,k=32)的值为最后一个表达式的值,即为32,所以x=32. 5、算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B )。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 分析:算术运算符包括加法运算“+”符减法运算“-”符乘法运算符“*”以及除法运算符“/”,赋值运算符包括“=、+=、-=、*=、/=、……”,关系运算符包括“<、<=、>、>=”。 6、若有代数式bc ae 3 ,则不正确的C 语言表达式是( C )。 A.a/b/c*e*3 B. 3*a*e/b/c C.3*a*e/b*c D. a*e/c/b*3 分析:C 选项表达的是3ace/b 。 7、表达式!x||a==b 等效于( D )。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) 分析:由符优先级先后顺序在!x||a==b 中应先算“||”再算“!”,最后算“==”。选项B 不影响运算顺序。 8、设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是( A )。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 分析:先算括号里面的,a 不大于b ,则m=0,c 不大于d ,则n=0. 9、 设有语句 int a=3;,则执行了语句 a+=a-=a*=a;后,变量 a 的值是( B )。 A. 3 B. 0 C. 9 D. -12 分析:从后往前算,a*=a 即a=a*a ,a=9;然后a-=a=9,a=a-9,=0;a+=0,a=a+a=0. 10、在以下一组运算符中,优先级最低的运算符是( D )。

3表达式和语句

一、表达式 前面已经提到过表达式,相信大家对表达式也有了一个初步的认识,它是由常量、变量、运算符组合(到以后讲函数时,函数也可以是组成表达式的元素),计算以后返回一个结果值。表达式的结束标志是分号(;),C语言中所有的语句和声明都是用分号结束,在分号出现之前,语句是不完整的。 例如: 1+2; Counter/3+5; Height*Width; 表达式本身什么事情都不做,只是返回结果值。在程序不对返回的结果值做任何操作的情况下,返回的结果值不起任何作用,表达式的作用有两点,一个是放在赋值语句的右边,另一个是作为函数的参数(以后再介绍)。 表达式返回的结果值是有类型的。表达式隐含的数据类型取决于组成表达式的变量和常量的类型。因此,表达式的返回值有可能是某种大小的整型,或者是某精度的浮点型,或者是某种指针类型。 这里面就有类型转化的问题了,在前面说整型运算的时候也提到过。类型转化的原则是从低级向高级自动转化(除非人为的加以控制)。计算的转换顺序基本是这样的: 字符型-->整型-->长整型-->浮点型-->单精度型-->双精度型 就是当字符型和整型在一起运算时,结果为整型,如果整型和浮点型在一起运算,所得的结果就是浮点型,如果有双精度型参与运算,那么答案就是双精度型了。 强制转换是这样的,在类型说明符的两边加上括号,就把后面的变量转换成所要的类型了。如: (int) a; (float) b; 第一个式子是把a转换成整型,如果原先有小数部分,则舍去。 第二个式子是把b转换成浮点型,如果原先是整数,则在后面补0。 每一个表达式的返回值都具有逻辑特性。如果返回值为非0,则该表达式返回值为真,否则为假。这种逻辑特性可以用在程序流程控制语句中。 有时表达式也不参加运算,如: if(a||b) ………… 5>3?a++:b++; 当a为真时,b就不参加运算了,因为不管b如何,条件总是真。 二、语句 (一)、赋值语句 其实这个问题,在讲赋值运算符的时候已经讲了一些了。 Amount=1+2; Total=Counter/3+5; Area=Height*Width; 也许你会发现,这些赋值语句很象代数方程,在某些情况下,我们的确可以这样理解,但有时它们是不一样的。看下面: Num=Num+1; 这显然不是一个等式。

运算符与表达式练习题附答案

1. 以下运算符中优先级最高的是()。 A.&&B.+ C.!= D.?: 2.能正确表示逻辑关系:“a≥10或a≤0”的C语言表达式是()。 A.a>=10 or a<=0 B.a>=10| a<=0 C.a>=10 && a<=0 D.a>=10||a<=0 3. C语言中运算对象必需是整型的运算符是()。(A)+ (B)/ (C)% (D)* 4. 已知int i;float f;正确的表达式是()。 A)(int f)%i B) int(f)%i C) int(f % i) D) (int)f % i 5. 下列程序的输出结果是()。 void main( ) { int a=7,b=5; printf("%d\n",b=b%a); } (A)0 (B)1 (C)5 (D)不确定值6. 若有定义:int a=8,b=5,c;,执行语句c=a/b+0.4;

后,c的值为()。 (A)1.4 (B)1 (C)2.0 (D)2 7. 已知x=4.5,y=2.5,求表达式(x+y)/2+(int)y%(int)x的值()。 A) 3 B) 5 C) 3.5 D) 5.5 8. 已知各变量的类型如下 int i=8,k,a,b; unsigned long w=5; double x=1.42,y=5.2; 则以下符合C语言语法的表达式是()。 (A)a+=a-=(b=4)*(a=3)(B)a=a*3+2 (C)x%(-3)(D)y=float(i) 9. 已知int a,b;执行语句a=(b=3*2,b*4),a+6;后变量a的值为()。 A) 6 B) 12 C) 24 D)30 10. 若有以下程序 main() { int k=2,i=2,m; m=(k+=i*=k);

If引导条件状语从句的详细用法解答

If引导条件状语从句的详细用法解答 引导条件状语从句最常用的连词是if,常见的if条件状语从句表示在某条件下,某事很可能发生,条件是可能存在的,主句中某种情况发生的概率也是很高的。如: If you ask him,he will help you.如果你请他帮忙,他会帮你的。 If you fail in the exam,you will let him down.如果你考试不及格,你会让他失望的。 If you have finished the homework,you can go home.如果你作业做完了就可以回家了。 另外,if从句还表示不可实现的条件或根本不可能存在的条件,也就是一种虚拟的条件或假设。从句多用一般过去时或过去完成时,表示对现在或过去的一种假设。如: If I were you,I would invite him to the party.如果我是你,我会邀请他参加聚会。 I would have arrived much earlier if I had not been caught in the traffic.要不是交通堵塞,我本会来得早一些。 另外你还要注意if 条件句的时态搭配 1.if从句用一般现在时,主句用一般将来时 If he runs he’ll get there in time. 如果他用跑的,他就会及时赶到那儿。 The cat will scratch you if you pull her tail. 如果你拉猫的尾巴,它就会抓你。2.if从句用一般现在时,主句用may/might/can If the fog gets thicker the plane may/might be diverted. 如果雾在大一些,飞机可能就会改在别的机场降落。 If it stops snowing we can go out. 如果雪停了,我们就可以出去。 3.if从句用一般现在时,主句用must/should If you want to lose weight you must/should eat less bread. 如果你想减肥,你必须少吃面包。 4.if从句用一般现在时,主句用一般现在时 If you heat ice it turns to water. (也可用will turn)如果把冰加热,它就会化成水。5.if从句用现在进行时,主句用一般将来时 If you are looking for Peter you’ll find him upstairs. 如果你是在找彼得,上楼就会找到他。 6.if从句用现在完成时,主句用一般将来时 If you have finished dinner I’ll ask the waiter for the bill. 如果你吃完了,我就叫服务生来算账 注意: 学习" if " 引导的条件状语从句的用法,现在总结一下: if 条件句不一般,几个要点记心间; 条件句,放在前,逗号要放句中间。 条件句表可能,主句多用将来时; 条件句表事实,主句常用现在时。

《c语言程序设计》--4种“交换算法”介绍。

第 1 页 共 2 页 算法 交换 在很多问题的解决中都需要使用到交换这个方法,比如排序时,需要将两个变量的值互换等等。交换是指将两个变量的值进行互换。假设有整型变量a 和b ,分别存储整数2和6,如图01-01所示。要将变量a 和b 交换就意味着交换变量a 和变量b 中的值,使得变量a 存放变量b 交换前的值,而变量b 存放变量a 交换前的值,如图01-02所示。 图01-01 图01-02 语句“a=b; b=a;”是不能实现变量a 、b 交换的,只可能使得a 、b 最终都存放变量b 的值(大家可以编程试一试)。其原因是赋值操作具有覆盖性,执行a=b ;语句后,a 原来的值已经被覆盖了,此时a 最新的值就是b 的值,再实现b=a ;时,b 的值就是a 最新的值,也就是b 的值。 一、 中间变量法 要实现交换,最基本、最通用的方法是中间变量法。该方法的基本思路是定义第三个变量t ,用于暂时保存两个变量中的某一个变量的原值。具体实现代码如下: t = a; a = b; b = t; 交换过程请大家自己仿照图01-01自己给出。注意每一个变量画一个方框, 每执行一步后,改变被赋值变量的值。 【注意事项】 此处,中间变量t 可以暂存变量 a 的值也可以暂存变量 b 的值,不过一旦对变量t 的赋值语句确定后,后面两个赋值语句的顺序不是任意的。赋值顺序的记忆可总结为“t 中暂存的变量先被赋值”。即t = a; a = b; b = t;或者t = b; b = a; a = t;。

二、算术加减法 对于数值型数据还可以采用算术加减法来实现交换,其基本思想是以a获得b的值,以b获得a的值作为目标,进行加减运算,从而完成交换。具体实现可用如下代码: a = a+b; b = a-b; a = a-b; 三、思考与练习 1. 请编写程序验证“交换”算法。 2. 请编写程序验证“交换”算法,要求“交换”算法使用函数来实现。 3. 请大家思考一下,使用算术加减法实现的“交换”算法有什么限制? 4. 请大家思考一下,我们能不能使用乘除法来实现“交换”算法?如果可 以,那么具体代码如何来编写呢?使用乘除法来实现“交换”算法,有 什么限制呢? 5. 拓展 两个变量(一般为整型或字符型)的交换还可以使用“异或”运算符。 具体步骤如下: int a,b; a=a^b; b=a^b; a=a^b;

(完整word版)C语言运算符与表达式的练习题答案

C语言运算符与表达式的练习题 单项选择题 (1)以下选项中,正确的 C 语言整型常量是(D)。 A. 32L B. 510000 C. -1.00 D. 567 (2)以下选项中,(D)是不正确的 C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3)字符串的结束标志是(C)。 A. 0 B. '0' C. '\0' D. "0" (4)算术运算符、赋值运算符和关系运算符的运算优先级按从高到低依次为(B)。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运算、赋值运算 C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (5)逻辑运算符中,运算优先级按从高到低依次为(D)。 A. && ! || B. || && ! C. && || ! D. ! && || (6)表达式!x||a==b 等效于(D)。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (7)设整型变量 m,n,a,b,c,d 均为1,执行 (m=a>b)&&(n=c>d)后, m,n 的值是(A)。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 *(8)设有语句 int a=3;,则执行了语句 a+=a-=a*=a; 后,变量 a 的值是(B)。 A. 3 B. 0 C. 9 D. -12 (9)在以下一组运算符中,优先级最低的运算符是(D)。 A. * B. != C. + D. = (10)设整型变量 i 值为2,表达式(++i)+(++i)+(++i)的结果是(B,上机13)。 A. 6 B. 12 C. 15 D. 表达式出错 (11)若已定义 x 和 y为double 类型,则表达式的值是(D)。

if条件状语从句练习及答案

if_条件状语从句的时态练习及答案_初中习题集 I.单项选择 1.If you _____ to the party, you’ll have a great time. a. will go b. went c. go d. going 2.It will be a long time ____ peter _____ his work. a. since, has finished b. after, finishes c. when, will finish d. before, finishes. 3. what will father _____ us from Japan? a. take b. bring c. carry d. make 4. Weifang is famous ______ kites a. for b. to c. on d. with 5.I____ her the answer if she ____me. a. can tell, will ask b. will tell, will ask c. would tell, ask d. will tell, asks 6. – what are you going to do tomorrow? --we’ll go to the library tomorrow if it ___. a. isn’t rain b. rain c. won’t rain d. doesn’t rain 7.—Do you know when he will come back tomorrow? --sorry, I don’t know. when he ____ back, I’ll tell you. a. comes b. will come c. come d. may come 8. what will you do if you _____ to the old folk’s home visit? a. go b. went c.going d. will go

运筹学题(交二)

第一章 1,(决策变量)(目标函数)及(约束条件)构成。称为三个要素, 2解决问题的目标函数是多个决策变量的线性函数,通常是求(最大值)或(最小值) 3一般地,假设线性规划数学模型中,有m个约束,有n个决策变量xj, j=1,2…,n,目标函数的变量系数用cj表示, cj称为(价值系数)。 约束条件的变量系数用aij表示,aij称为(工艺系数)。约束条件右端的常数用bi表示, bi称为(资源限量)。 4线性规划的解的四种形式:(有唯一最优解),(有无界解),(有多重解),(无可行解)。 5线性规划问题的标准型的形式,下列选项表述不正确的是(C)A.目标函数求最大值(有时求最小值) B.约束条件都为等式方程; C.变量xj为正数。 D.常数bi都大于或等于零; 6凸集的几何特征:(连接凸集中任意两点的线段仍在此集合内)。7.单纯形法求解时一定要将数学模型化为(标准型)。 8.当确定某一矩阵为基矩阵时,则基矩阵对应的列向量称为(基向量),其余列向量称为(非基向量) 9.对某一确定的基B,令非基变量等于零,利用式AX=b 解出基变量,则这组解称为基B的(基本解)

10.若线性规划可行解K非空,则K是(凸集). 11.线性规划的可行解集合K的点X是极点的充要条件为(X是基本可行解). 12.在单纯形方法中,求初始基可行解,列出初始单纯形表,求出检验数。其中(基变量)的检验数必为零; 13.在用单纯形法计算过程中,若存在一个σk >0,σk所对应的变量xk的系数列向量Pk 0,则该线性规划问题(没有有限最优解)。 14.单纯形计算方法中,是先找换出变量,还是先找换入变量? 答,先找换入变量。 15.进行旋转运算是指:在确定了换入变量和换出变量后,要把换入变量所对应的系数列向量变成(单位向量) 第二章 1.在互为对偶的一对原问题与对偶问题中,不管原问题是求极大或极小,原问题可行解目标函数值一定不超过其对偶问题尅星界的目标函数值。(错) 2.任何线性规划问题具有唯一的对偶问题(对) 3.若原问题可行且另一个问题不可行,则原问题(A) A.有无界解 B.有可行解 C.可能有可行解也可能没有 4.简述单纯形法与对偶单纯形法的区别 5.简述求原问题的对偶问题的方法 6.两个线性规划互为对偶式时,则原问题的目标值不超过对偶问题的

if条件状语从句中虚拟语气

if条件状语从句中的虚拟语气 一、if条件状语从句中虚拟语气的判断判断是真实条件句还是非真实条件句。 只有在非真实条件句中才使用虚拟语气。通过句子意思,看假设的条件是否能够实现, 能够实现是真实条件句,不能使用虚拟语气; 假设的条件不能实现则是非真实条件句,要用虚拟语气。 1. “后退一步法”后退一步法是指在准确地判断了该句与哪一事实相反后,按虚拟语气的后退一步法处理从句谓语动词的时态。即:在非真实条件状语从句中,谓语动词按正常情况“后退一步”。也就是: ①与过去事实相反,在从句中用过去完成时形式表示。 ②与现在事实相反,在从句中用过去一般时形式表示。 ③与将来事实可能相反,在从句中用过去将来时形式表示。主句中则用情态动词would, should, could 等加一个与从句一致的动词形式。 例:⑴、If I had come her yesterday, I would have seen him. ⑵、If I were a teacher, I would be strict with my students. ⑶、If it should snow tomorrow, they couldn't go out. 2、注意事项: ①if条件句中如有were, should, had,可以省去if,并使用倒装语序。 ②在现代英语中if条件状与从句中的谓语动词如果是be其过去形式一般用were。 二、虚拟语气在if 引导的条件句中的用法: 1. If it weren’t for your help, we would get into trouble. 如果没有你们的帮助,我们就会陷入困境。(而事实上得到了你们的帮助) 2.If the weather were fine, I would go there. 如果天气好,我去那儿。(事实天气不好) 3.If I were you, I would read it again. 如果我是你的话,我再读一遍。(事实上我不是你) 4.If time permitted, I would write it again. 如果时间允许的话,我再写一遍。(事实上时间不允许) 5.If it weren’t snowing, we wouldn’t stay in the house. 要是现在不下雪的话,我们就不会待在屋里。(事实上现在下雪) 6.What would I do if I were in your place?要是我处于你地位我会怎么办?(事实上我不在你的位置上) 7.If he hurried, he could catch the first bus. 他要是快点能够赶上头班公共汽车。(可是他不着急) 8. If I were you, I should buy it. (从句用过去式动词were,主句用动词原形buy) 9. If I had time, I would study French. (如果有时间,我会学习法文。)(从句用过去式动词had,主句用动词原形study) 10. If she knew English, she would not ask me for help. (如果她懂英文,她就不必要我帮了。)(从句用过去式动词knew, 主句用动词原形ask) 注意:如果动作在进行中,主句要用:"主语+ would be + 进行式动词+ ……" 14. If they were here, he would be speaking to them now. (从句用过去式动词were, 主句用would be speaking)

两个变量交换值

不使用第三方变量交换两个变量的值(c#)2009-07-22 16:47这需要进行位操作,必较麻烦的, 在学习程序语言和进行程序设计的时候,交换两个变量的值是经常要使用的。通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下: int a,b; a=10; b=15; int t; t=a; a=b; b=t; 这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。 上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!这里我们可以用三种算法来实现:1)算术运算;2)指针地址操作;3)位运算。 1)算术运算 简单来说,就是通过普通的+和-运算来实现。代码如下: int a,b; a=10;b=12; a=b-a; //a=2;b=12 b=b-a; //a=2;b=10 a=b+a; //a=10;b=10 通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯标准算法之后。 它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。 具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法) 2)指针地址操作 因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单元的地址。所以理论上可以通过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。即: int *a,*b; //假设 *a=new int(10); *b=new int(20); //&a=0x00001000h,&b=0x00001200h a=(int*)(b-a); //&a=0x00000200h,&b=0x00001200h b=(int*)(b-a); //&a=0x00000200h,&b=0x00001000h a=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h 通过以上运算a、b的地址真的已经完成了交换,且a指向了原先b指向的值,b指向原先a 指向的值了吗?上面的代码可以通过编译,但是执行结果却令人匪夷所思!原因何在? 首先必须了解,操作系统把内存分为几个区域:系统代码/数据区、应用程序代码/数据区、

复习题2(算法部份)

第1章计算机和算法 1.使用计算机解题的步骤,以下描述正确的是:_____。 A.正确理解题意→设计正确算法→寻找解题方法→编写程序→调试运行 B.正确理解题意→寻找解题方法→设计正确算法→编写程序→调试运行 C.正确理解题意→寻找解题方法→设计正确算法→调试运行→编写程序 D.正确理解题意→寻找解题方法→设计正确算法→编写程序→调试运行 答案:B 2.计算机是一种按照设计好的程序,快速、自动地进行计算的电子设备,计算机开始计算之前,必须把解决某个问题的程序存贮在计算机的_____中。 A.硬盘B.软盘C.内存D.CPU 答案:C 3.计算机程序由以下两部分即:_____组成。 A.执行部分和数据部分 B.数据部分和程序部分 C.指令部分和数据部分 D.程序部分和指令部分 答案:C 4.计算机程序由一系列指令构成,每条指令要求计算机执行_____动作。 A.一组B.二个C.一个D.一个以上 答案:C 5.计算机程序由指令部分和数据部分组成,其中数据部分用来存储_____。 A.计算所需的原始数据和计算的中间结果,不能存储计算的最终结果 B.计算所需的原始数据,不能存储计算的中间结果和计算的最终结果 C.计算的中间结果和计算的最终结果,不能存储计算所需的原始数据 D.计算所需的原始数据、计算的中间结果或最终结果 答案:D 6.人们在设计计算机程序时,_____。 A.只要考虑“数据的存贮”而不要考虑“计算的过程” B.不要考虑“数据的存贮”而只要考虑“计算的过程” C.必须同时考虑“数据的存贮”和“计算的过程” D.以上答案都错 答案:C 7.设计计算机程序时,要考虑“计算的过程”,其含义是在对解决问题的方法进行步骤化时,_____。 A.只要指出“动作”而不必指出“动作的次序” B.不必指出“动作”而只要指出“动作的次序” C.必须同时指出“动作”和“动作的次序” D.以上说法都正确 答案:C 8.算法的特征是:有穷性、_____、能行性、有0个或多个输入和有一个或多个输出。 A.稳定性B.确定性C.正常性D.快速性 答案:B

变量交换的几种常见方法

变量交换的几种常见方法 前几天发现了一个问题:有人告诉我,要进行变量交换,就必须引入第三变量! 假设我们要交换a和b变量的值,如果写成 int a=5,b=10; a=b; b=a; 那么结果就是两个都是10,理由不言而喻。 所以就应该引入第三变量,在a的值被覆盖之前就把a的值保留好。int a=5,b=10,tmp; tmp=a; a=b; b=tmp; 这样,就要引入了第三个变量,然而,我们能不能不引入第三变量来实现变量交换呢? 答案自然是肯定的,首先我们可以这样设想,如果a的值被覆盖了,那么就没法知道b应该放什么值了, 所以,我们要保留a的值,因此我们可以把a和b的值合起来,放在a里,再把合起来的值分开,分别放到b和a中:

int a=5,b=10; a=a+b; //a=15,b=10 b=a-b; //a=15,b=5 a=a-b; //a=10,b=5 但是这样做有一个缺陷,假设它运行在vc6环境中,那么int的大小是4 Bytes,所以int变量所存放的最大值是2^31-1即2147483647,如果我们令a的值为2147483000,b的值为1000000000,那么a和b 相加就越界了。 事实上,从实际的运行统计上看,我们发现要交换的两个变量,是同号的概率很大,而且,他们之间相减,越界的情况也很少,因此我们可以把上面的加减法互换,这样使得程序出错的概率减少: int a=5,b=10; a-=b; //a=-5,b=10 b+=a; //a=15,b=5 a+=b; //a=10,b=5 通过以上运算,a和b中的值就进行了交换。表面上看起来很简单,但是不容易想到,尤其是在习惯引入第三变量的算法之后。 它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。 具体过程:第一句“a-=b”求出ab两点的距离,并且将其保存在a 中;第二句“b+=a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a+=b”求出b到原点

第3章表达式与运算符测试

C语言第3章《运算符与表达式》测试题 一、选择题(每题2分,共50分) 1、表达式“2,4,6,8”的值为() A.2 B.4 C.6 D.8 2、以下程序的输出结果是() main() {int a=12,b=0x12; printf(“%d%d\n”,--a,++b); } A.12 12 B.12 18 C.11 10 D.11 19 3、设x和y都是int型变量,则执行表达式“x=(y=4,z=16),k=32”后,x的值为() A.4 B.16 C.32 D、52 4、设x为int型变量,执行语句“x=’A’;x*=2+2;”后,的值为() A.65 B.260 C.132 D.语句错误 5、若有语句“int a=5;a++*2;”则表达式“a++*2”的值为() A.7 B.12 C.5 D.10 6、设x和y为int型变量,表达式“x+=y;y=x-y;x-=y;”的功能是() A.把x和y按从小到大排列 B.把x和y按从大到小排列 C.无确定结果 D.交换x和y的值 7、下面程序的输出结果是() main() {int x=’\23’; printf(“%d\n”--x); } A.19 B.18 C.23 D.24 8、若变量f已定义为float型, i为int 型,则下面()表达式(或语句)能够实现将f的数值保留小数点后两位,第3位进行四舍五入的运算。 A.f=(f*100+0.5)/100.0 B.i=f*100+0.5,f=i/100.0; C.f=(int)(f*100+0.5)/100 D.f=(f/100+0.5)*100.0 9、下面表达式正确的是() A. a+b=5 B.56=a11 C.5.6+6.2%3.1 D.a=5,b=6,c=7 10、若t为double型变量,执行逗号表达式“t=(x=0,x+5),t++;”的输出结果是()

表达式与语句

表达式与语句 前面已经提到过表达式,相信大家对表达式也有了一个初步的认识,它是由常量、变量、运算符组合(到以后讲函数时,函数也可以是组成表达式的元素),计算以后返回一个结果值。表达式的结束标志是分号(;),C语言中所有的语句和声明都是用分号结束,在分号出现之前,语句是不完整的。例如: 1+2; Counter/3+5; Height*Width; 表达式本身什么事情都不做,只是返回结果值。在程序不对返回的结果值做任何操作的情况下,返回的结果值不起任何作用,表达式的作用有两点,一个是放在赋值语句的右边,另一个是作为函数的参数(以后再介绍)。 表达式返回的结果值是有类型的。表达式隐含的数据类型取决于组成表达式的变量和常量的类型。因此,表达式的返回值有可能是某种大小的整型,或者是某精度的浮点型,或者是某种指针类型。 这里面就有类型转化的问题了,在前面说整型运算的时候也提到过。类型转化的原则是从低级向高级自动转化(除非人为的加以控制)。计算的转换顺序基本是这样的:

字符型-->整型-->长整型-->浮点型-->单精度型-->双精度型 就是当字符型和整型在一起运算时,结果为整型,如果整型和浮点型在一起运算,所得的结果就是浮点型,如果有双精度型参与运算,那么答案就是双精度型了。 强制转换是这样的,在类型说明符的两边加上括号,就把后面的变量转换成所要的类型了。如: (int) a; (float) b; 第一个式子是把a转换成整型,如果原先有小数部分,则舍去。 第二个式子是把b转换成浮点型,如果原先是整数,则在后面补0。 每一个表达式的返回值都具有逻辑特性。如果返回值为非0,则该表达式返回值为真,否则为假。这种逻辑特性可以用在程序流程控制语句中。 有时表达式也不参加运算,如: if(a||b) ………… 5>3?a++:b++; 当a为真时,b就不参加运算了,因为不管b如何,条件总是真。 二、语句 (一)、赋值语句

交换两个变量值

//【习3.1】交换两个变量值问题讨论。 public class Swap { // ①不能实现交换两个变量值的方法 public static void swap(int x, int y) { int temp = x; x = y; y = temp; } public static void swap(Object x, Object y) //不行 { Object temp = x; //两个对象之间的赋值是引用赋值,传递的是引用,即变量的地址 x = y; //改变形式参数x的引用,而未能改变实际参数的值, y = temp; //相当于改变了指针的值,而未改变通过指针指向的变量值 } //交换了,但改变的值没有带回 // ②能够交换两个数组元素值 public static void swap(int[] table, int i, int j) // 交换数组中下标为i、j的元素 { if (table != null && i >= 0 && i < table.length && j >= 0 && j < table.length && i != j) // 判断i、j是否越界 { int temp = table[j]; table[j] = table[i]; table[i] = temp; } } public static void swap(Object[] table, int i, int j) //交换数组中下标为i、j的元素 { if (table != null && i >= 0 && i < table.length && j >= 0 && j < table.length && i != j) //判断i、j是否越界 {

C语言运算符与表达式的练习题

C语言运算符与表达式的练习题 (作业写到纸质作业本上,在规定时间内交给助教批阅,不要 再网上提交) 一、单项选择题 (1) 以下选项中,正确的C 语言整型常量是。 A. 32L B. 510000 C. -1.00 D. 567 (2) 以下选项中,是不正确的C 语言字符型常量。 A. 'a' B. '\x41' C. '\101' D. "a" (3) 在C 语言中,字符型数据在计算机内存中,以字符 的形式存储。 A. 原码 B. 反码 C. ASCII 码 D. BCD码 (4) 字符串的结束标志是。 A. 0 B. '0' C. '\0' D. "0" (5) 算术运算符、赋值运算符和关系运算符的运算优先级按 从高到低依次为。 A. 算术运算、赋值运算、关系运算 B. 算术运算、关系运 算、赋值运算

C. 关系运算、赋值运算、算术运算 D. 关系运算、算术运算、赋值运算 (6) 逻辑运算符中,运算优先级按从高到低依次为。 A. &&,!,|| B. ||,&&,! C. &&,||,! D. !,&&,|| (7) 表达式!x||a==b 等效于。 A. !((x||a)==b) B. !(x||y)==b C. !(x||(a==b)) D. (!x)||(a==b) (8) 设整型变量m,n,a,b,c,d 均为1,执行(m=a>b)&&(n=c>d)后, m,n 的值是。 A. 0,0 B. 0,1 C. 1,0 D. 1,1 (9) int b=0,x=1;执行语句if(x++) b=x+1; 后,x,b 的值依次为。 A. 2,3 B. 2,0 C. 3,0 D. 3,2 (10) 设有语句int a=3;,则执行了语句a+=a-=a*=a; 后,变量 a 的值是。 A. 3 B. 0 C. 9 D. -12 (11) 在以下一组运算符中,优先级最低的运算符是。 A. * B. != C. + D. =

if引导的条件状语从句知识点及练习题

if引导的条件状语从句 (一)定义 if引导的句子在复合句中表示条件,假如if从句的动作发生,主句的动作就(不)会发生,因此称为条件状语从句。 (二)位置 if 引导的条件状语从句位置灵活,可直接放在主句后面,也可以放在句首。放在句首时,从句后面要用逗号和主句隔开。 ① If I have enough money, I will travel around the world. ② I will travel around the world if I have enough money. (三)用法 ① Work hard, and you?ll pass the exam easily. 努力学习,你将很容易通过考试。 →If you work hard, you?ll pass the exam easily. ② Hurry up, or you?ll miss the train. 快点儿,否则你就赶不上火车了。 →If you don?t hurry up, you?ll miss the train. (3)当主句含有情态动词时,if引导的条件状语从句通常用一般现在时。 We must study hard if we want to pass the final exam. 如果想通过期末考试,我们必须努力学习。 (4)用含介词with或without的介词短语转换。 ① If you help me, I'll finish my job soon. →With your help, I'll finish my job soon. 如果你帮我,我将很快完成我的工作。 ② If there is no water, fish can?t live. → Fish can?t l ive without water. 离开水,鱼不能生存。 (四)if引导的条件状语从句与if引导的宾语从句的区别 if引导宾语从句时表示“是否”,位于及物动词之后; if引导的条件状语从句时表示“假如,如果”,位于句首或句中。 ①I don't know if he will come tomorrow. ②If he comes, I'll call you. 练习 一、选择题 1. _____ you don't go to bed earlier, you will feel tired in the morning. A. Unless B. If C. Though D. Until 2. Why not look up the new word in a dictionary _____ you don't know it? A. if B. that C. though D. whether 3. Talk to your teacher and you will get help _____ you have a problem. A. unless B. if. C. until D. so 4. I won't go to tomorrow's party _____ I'm invited. A. if B. unless C. when 5. The children will climb the hill if it _____ tomorrow.

交换两个变量的值,不使用第三个变量的方法及实现

交换两个变量的值,不使用第三个变量的方法及实现: 附录中有C/C++代码: 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换。代码如下: int a,b; a=10; b=15; int t; t=a; a=b; b=t; 这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用。在实际软件开发当中,此算法简单明了,不会产生歧义,便于程序员之间的交流,一般情况下碰到交换变量值的问题,都应采用此算法(以下称为标准算法)。 上面的算法最大的缺点就是需要借助一个临时变量。那么不借助临时变量可以实现交换吗?答案是肯定的!这里我们可以用以下几种算法来实现:1)算术运算;2)指针地址操作;3)位运算;4)栈实现。 1)算术运算 int a,b; a=10;b=12; a=b-a; //a=2;b=12 b=b-a; //a=2;b=10 a=b+a; //a=12;b=10 它的原理是:把a、b看做数轴上的点,围绕两点间的距离来进行计算。 具体过程:第一句“a=b-a”求出ab两点的距离,并且将其保存在a中;第二句“b=b-a”求出a到原点的距离(b到原点的距离与ab两点距离之差),并且将其保存在b中;第三句“a=b+a”求出b到原点的距离(a 到原点距离与ab两点距离之和),并且将其保存在a中。完成交换。 此算法与标准算法相比,多了三个计算的过程,但是没有借助临时变量。(以下称为算术算法)除了使用加、减法外,还可以使用乘、除法实现,实现代码如下: //if a=10;b=12; a=a*b; //a=120;b=12 b=a/b; //a=120;b=10 a=a/b; //a=12;b=10 缺点:是只能用于数字类型,字符串之类的就不可以了。a+b有可能溢出(超出int的范围),溢出是相对的,+了溢出了,-回来不就好了,所以溢出不溢出没关系,就是不安全。 2)指针地址操作 因为对地址的操作实际上进行的是整数运算,比如:两个地址相减得到一个整数,表示两个变量在内存中的储存位置隔了多少个字节;地址和一个整数相加即“a+10”表示以a为基地址的在a后10个a类数据单 元的地址。所以理论上可以通过和算术算法类似的运算来完成地址的交换,从而达到交换变量的目的。即:int *a,*b; //假设 *a=new int(10); *b=new int(20); //&a=0x00001000h,&b=0x00001200h a=(int*)(b-a); //&a=0x00000200h,&b=0x00001200h

相关文档
最新文档