|
  
- UID
- 133
- 帖子
- 51
- 精华
- 1
- 积分
- 186
- 金币
- 55
- 威望
- 2
- 贡献
- 0

|
C语言程序设计初步
使用getchar函数还应注意几个问题:
5 h" K: A) n1 Y2 U$ x- G" v1.getchar函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。
" U4 @! P4 ?: c0 a0 O9 \2.使用本函数前必须包含文件“stdio.h”。 0 O A$ ?& p" B" V+ ?% C; r2 W
3.在TC屏幕下运行含本函数程序时,将退出TC 屏幕进入用户屏幕等待用户输入。输入完毕再返回TC屏幕。6 g( \3 q3 Y2 a+ L3 v! o9 `
void main(){# |7 R8 W% t( j8 T. r& n2 u3 J
char a,b,c;- T% k/ F, ^- R/ s5 H7 c
printf("input character a,b,c\n");
0 G# T$ Q, B6 S, Gscanf("%c %c %c",&a,&b,&c);
# R+ ^; E1 Z9 N4 w0 w0 lprintf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);! B& _4 I+ F8 `! O2 h' M+ Y6 l
}
0 m" E I+ }$ N输入三个小写字母% ^+ h6 z* p: z
输出其ASCII码和对应的大写字母。 5 b. h$ @ ]: O4 w# k3 {; u5 D& F
void main(){! D; p. i0 z$ {9 S
int a;& {/ ~: P6 d# o+ ^1 K* R
long b;8 }1 `, F% T; L( d0 o; ]
float f;
+ [1 z' ?5 e7 Y( K# H0 Ldouble d;: q4 p" v- f# D, J
char c;% p- K3 m3 e2 H' b- w
printf("%d,%d,%d,%d,%d",sizeof(a),sizeof(b),sizeof(f)5 u3 Y2 U: w/ x8 n1 d4 [" k( y+ D
,sizeof(d),sizeof(c));2 @+ q6 ]! }7 a1 @1 e+ V
}) H5 y. g8 X: w
输出各种数据类型的字节长度。
- C8 A& a/ q$ Q分支结构程序
! f9 b6 y5 |# V% Y7 g: I2 Z, z+ H' Z% X& U: q* p5 n# s
关系运算符和表达式7 n6 L( f- j) C; V5 k
- Q( o" O* E6 N. `- i- ?在程序中经常需要比较两个量的大小关系, 以决定程序下一步的工作。比较两个量的运算符称为关系运算符。 在C语言中有以下关系运算符:
0 R! o8 I/ f+ u+ L< 小于1 O+ _+ v" y: Y2 N3 s1 V/ v1 j; C2 y
<= 小于或等于
' q1 H9 n7 h4 k! [" Z: b2 ]+ }: m> 大于
0 c `( m K1 U! Y5 `5 N" {>= 大于或等于
$ F6 {1 H$ a7 o1 m, _: f6 }== 等于4 S S& b p- ^
!= 不等于 0 F- z) \' h5 a7 N
关系运算符都是双目运算符,其结合性均为左结合。 关系运算符的优先级低于算术运算符,高于赋值运算符。 在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=,==和!=的优先级相同。* V7 O$ M2 d5 n J
关系表达式
7 e* S# |1 I4 u" i5 n! E关系表达式的一般形式为: 表达式 关系运算符 表达式 例如:a+b>c-d,x>3/2,'a'+1<c,-i-5*j==k+1;都是合法的关系表达式。由于表达式也可以又是关系表达式。 因此也允许出现嵌套的情况,例如:a>(b>c),a!=(c==d)等。关系表达式的值是“真”和“假”,用“1”和“0”表示。+ K2 b9 Z6 j) \; [3 p
如: 5>0的值为“真”,即为1。(a=3)>(b=5)由于3>5不成立,故其值为假,即为0。
' C/ Z, j; C6 j2 U! k* bvoid main(){
. w; C6 {/ y" }char c='k';5 s( r `! v9 N4 G C% ?
int i=1,j=2,k=3;' @! V0 W- \6 A! m
float x=3e+5,y=0.85;( e! ^- n% b. {' j: ], t8 S% |
printf("%d,%d\n",'a'+5<c,-i-2*j>=k+1);) ^8 y; g' m/ Y" v$ J
printf("%d,%d\n",1<j<5,x-5.25<=x+y);9 A% |: Q# X. w& Q8 I0 X( d
printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);5 T$ v% b+ x: ~* m( p' l: W }6 A
}
8 m2 W T- s4 B7 nchar c='k';
, Y2 _. A# s" b; v7 u q3 E3 X# V) Aint i=1,j=2,k=3;) B1 x2 T6 }2 g w1 w# ^
float x=3e+5,y=0.85;6 h2 R2 B9 B, [! @& O5 m7 J% Q
printf("%d,%d\n",'a'+5<c,-i-2*j>=k+1);
0 @. k2 |0 s1 Y) Kprintf("%d,%d\n",1<j<5,x-5.25<=x+y);
0 c5 \# x* V0 o+ vprintf("%d,%d\n",i+j+k==-2*j,k==j==i+5); : e& Y) g! I- ]$ y" ^
在本例中求出了各种关系运算符的值。 字符变量是以它对应的ASCII码参与运算的。对于含多个关系运算符的表达式,如k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。- @9 B+ F! v4 r* `8 D
+ q, V( W: r( M, [
逻辑运算符和表达式
3 e4 W( X. m7 a5 ?6 s* P3 B s0 w* r5 e2 \) V# C: ?: a
逻辑运算符C语言中提供了三种逻辑运算符 && 与运算 || 或运算 ! 非运算 与运算符&&和或运算符||均为双目运算符。具有左结合性。 非
# P. b7 C6 E Z3 q9 @+ ?% P运算符!为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:
, B+ s# t% J5 l8 u2 v1 }0 P2 f: z按照运算符的优先顺序可以得出:( }6 k" _/ U" p0 T2 I1 M5 S
a>b && c>d等价于(a>b) && (c>d)5 X: E5 i1 i0 }/ A* Z: L \! C
!b==c||d<a等价于((!b)==c)||(d<a)
% `0 [* a- ?7 B4 p6 |a+b>c && x+y<b等价于((a+b)>c) && ((x+y)<b)
7 W' O( q, H' w) s8 n; M逻辑运算的值% q, D% L9 ?! F6 A: q2 l |
逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下:
" Y7 Q/ V }! k7 H# q0 ] h( M1.与运算&&参与运算的两个量都为真时,结果才为真,否则为假。例如,5>0 && 4>2,由于5>0为真,4>2也为真,相与的结果也为真。
4 l; `% F" U* ]/ |& I2.或运算||参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:5>0||5>8,由于5>0为真,相或的结果也就为真
5 x" H$ o* s' I# T. U' w3.非运算!参与运算量为真时,结果为假;参与运算量为假时,结果为真。
* J2 j" O( A( [$ S: w! S例如:!(5>0)的结果为假。
5 O% A3 b! [7 Y" C, r% y& w虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。 但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:由于5和3均为非“0”因此5&&3的值为“真”,即为1。$ ^: U% @. r+ Q. q! r; w2 k
又如:5||0的值为“真”,即为1。0 A" t; l& x" c r
逻辑表达式逻辑表达式的一般形式为: 表达式 逻辑运算符 表达式 其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:(a&&b)&&c根据逻辑运算符的左结合性,上式也可写为: a&&b&&c 逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。
) H- W n5 f* R/ Bvoid main(){
. n9 C& a" @! G# Z2 S) M! U# echar c='k';
7 H8 G# ]1 n* z* Wint i=1,j=2,k=3;% R* B5 f+ F8 G/ D- F
float x=3e+5,y=0.85;7 X1 W. h4 r* o: j7 V" M: q
printf("%d,%d\n",!x*!y,!!!x);
. F* l2 h1 h! W% \+ z, k7 N: q; tprintf("%d,%d\n",x||i&&j-3,i<j&&x<y);9 B% d2 ?* m8 V) Q$ l% r
printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);2 x2 a" ?% P( q1 i9 y' c
}
/ `+ f% n: V' e" b- S0 m本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x|| i && j-3式,先计算j-3的值为非0,再求i && j-3的逻辑值为1,故x||i&&j-3的逻辑值为 1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故表达式的值为1,0相与,最后为0,对i==5&&c&&(j=8)式,由于i==5为假,即值为0, 该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ y||i+j+k 由于x+y的值为非0,故整个或表达式的值为1。! m: j& M2 }% l( x
K7 `/ |/ h+ r6 Q3 P. P
if语句& p% u. _) s" H s2 r
" g! u U5 l& B4 a! T/ e; N用if语句可以构成分支结构。它根据给定的条件进行判断, 以决定执行某个分支程序段。C语言的if语句有三种基本形式。+ f7 K, b" j$ r* T/ ^
1 |, E2 S4 V5 R( X
1.第一种形式为基本形式 if(表达式) 语句; 其语义是:如果表达式的值为真,则执行其后的语句, 否则不执行该语句。其过程可表示为下图
: o- j# h) o# Y$ F8 Q% S5 nvoid main(){- _7 V1 I% [$ I0 {( x q, _
int a,b,max;
7 u; @+ |8 s, T! [. yprintf("\n input two numbers: ");$ _% |8 v) I' y1 ]- W; ~3 n+ i3 ]
scanf("%d%d",&a,&b);
8 | y9 {- E) p& }* l3 P t8 Smax=a;
, W/ C7 b: ~" Cif (max<b) max=b;& G5 t# I8 |/ R
printf("max=%d",max);. `0 X( b/ Q( G, Z5 w' Q+ X
}( [* C* E8 ^/ R& S) |7 P2 o6 y
输入两个整数,输出其中的大数。
3 D. y3 m& O8 |7 u% n+ Mscanf("%d%d",&a,&b);7 {3 o. A" d& \
max=a;- [5 d6 h4 ^- D/ \- T8 @5 ^
if (max<b) max=b;
0 C% g; K" {8 B' i8 F) Mprintf("max=%d",max);
* }4 M2 Z0 {; i1 [# g z5 Y S8 m7 ], C) Z0 ~, K, H/ y
本例程序中,输入两个数a,b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。9 `" k, u9 G/ @) c% z
2.第二种形式为if-else形式 . J/ c3 F- M1 j/ ]) u5 A A2 C, v
if(表达式) : u4 r$ A8 P0 R+ S9 t5 @
语句1; $ y; l5 E# y. o f) t; e% M
else
8 C! C! C8 G: O% Z7 F语句2;% g6 i4 w b& W; \+ T: D
其语义是:如果表达式的值为真,则执行语句1,否则执行语句2 。
# T/ ^: I, ?+ R! A$ p( j- _void main(){
9 ]) \4 K6 v$ e* m# T0 b: Nint a, b;! ?! _+ [1 }) q+ v, O# M% a4 s" S
printf("input two numbers: ");( W) F' Y! L4 [& j$ e; Z& ^
scanf("%d%d",&a,&b);
" r- e8 y3 A' G& P. l' k7 M7 gif(a>b)( s1 b/ W/ x: X7 _2 v- Y
printf("max=%d\n",a);
& O' U; d8 \! ^ }, helse2 ?9 X) g: s. K+ w5 M
printf("max=%d\n",b);3 `2 u7 j% _; J' _- a3 D& `
}
1 H% p. P O+ g7 X7 k- A! N' H+ h输入两个整数,输出其中的大数。改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b.' y" A3 X0 [! {
3.第三种形式为if-else-if形式 p$ [& }% G7 }# p0 k
前二种形式的if语句一般都用于两个分支的情况。 当有多个分支选择时,可采用if-else-if语句,其一般形式为:
; E9 c! D. Z3 @5 s. qif(表达式1) 6 ~2 g; L% o9 ]6 i/ T0 c, Y% x' ?, ?
语句1; + J, R N* @- k2 X5 @
else if(表达式2) : M; Y- q4 [' s6 [+ f/ U S
语句2;
& u' |- N6 y0 t" h3 o! O6 |" z; Melse if(表达式3) 4 ?0 u4 |! W- [# Q
语句3;
& A9 y% R8 u8 |& @ V" A q1 w… q+ y% @" l3 g) |. J0 X% q. L
else if(表达式m) & l* O" L# t/ J' l+ {
语句m; 7 r9 R& s z, S8 }% Z$ _( s
else
2 v4 s5 M0 U3 N# a D- [& ^语句n; . m. d& V+ _: I: ?% P: _
其语义是:依次判断表达式的值,当出现某个值为真时, 则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n 。 然后继续执行后续程序。 if-else-if语句的执行过程如图3—3所示。: Q9 |0 u- G9 g. s( S# J8 Y
#include"stdio.h"
2 @. r) e& q; q3 g# M: U* mvoid main(){& m9 P9 f0 f) ?4 `2 q& U
char c;. C) L' t# r: D0 q& A& ~# s3 p! Q
printf("input a character: ");
5 y! t/ A% J& [+ |: nc=getchar();
7 v1 i% g5 g9 E5 Tif(c<32), G% a) g" e5 p8 `5 d, x
printf("This is a control character\n");8 T, N* M1 F4 G, h* N, G5 E
else if(c>='0'&&c<='9')
6 B7 n* J0 A0 Z7 Tprintf("This is a digit\n");
8 A- n0 u1 x+ [# E( Helse if(c>='A'&&c<='Z')
0 Y1 @, p5 _ S7 b( w- K+ mprintf("This is a capital letter\n");7 O! q( J( l: Y
else if(c>='a'&&c<='z')) h" m8 a, s; C4 z! x( w
printf("This is a small letter\n");
, n0 g8 ~3 F/ P$ G9 T" t9 T$ Lelse5 V& {$ K# M! O% M- ]& Q
printf("This is an other character\n");
* x0 }6 W5 c+ a}
" q! S1 I* Y4 f! u5 i" J本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。 在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。 这是一个多分支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“g”,输出显示它为小写字符。 |
|