. w0 c: N% k* k- Y: ~( e+ H* |0 f ②if(条件) 1 J$ F' B7 \2 _ 2 J7 N( f1 [7 m4 b {分支1} + S3 N# p+ e* G( h+ e G" u
6 X! C1 b# n' L% Y2 [4 _* U
else F* {7 o- ]; X0 N. L: W: R/ K I" R1 y" f2 I% S {分支2} * j/ e/ @# U4 J! _8 o * `$ S X9 x! [( J7 z; q Y 这是典型的分支结构,如果条件成立,执行分支1,否则执行分支2,分支1和分支2都可以是1条或若干条语句构成。如:求ax^2+bx+c=0的根 * u9 F1 C" P3 m
4 x1 a; T+ z* Y$ y& `/ ] C 分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。其程序段如下: ; m7 r5 E: D4 U/ ?& C! X 6 t: e9 d+ S5 r: e d=b*b-4*a*c; $ o7 A( C7 D- z/ ^% d6 P k8 Y2 _6 ~9 W; X( n
if(d>=0) 1 q. ~# _" ^* [5 z4 N , r) K$ c( i/ Q/ K! @3 H( p2 o {x1=(-b+sqrt(d))/2a; 8 o" h8 g/ P" Z: h$ `
6 O! O/ p/ q# i9 q- E: i
x2=(-b-sqrt(d))/2a; " y/ _8 r; X4 }' q& C# E! c# p) A( F; X* y. x( M2 a
printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2); ; @4 V7 r) z$ \) t# H* ~0 Y B1 L6 I3 f
} 8 I) d- b1 W; W4 j2 k- t; z; w " v+ @4 ~# s2 f7 E2 A% G else 5 |$ r [3 F: {9 G
9 |; Y. W* M) {* E
{r=-b/(2*a); * r2 H! U( z; X/ Y
4 |6 S. s6 A9 o2 W% k2 u7 g
i =sqrt(-d)/(2*a); % }5 _: b( n4 ?7 B O& {! F( G3 n- h' H$ D/ A8 ? v- p
printf(“x1=%8.4f+%8.4fi\n”r, i); ) v$ G, O: F/ }# p9 g
& F4 [! D( u- ?( u3 {( S printf(“x2=%8.4f-%8.4fi\n”r,i) ( O v4 o8 m4 }( W& ^) F4 g+ L- i# x: R. c
} 8 b, l6 `- H# t5 v" V
% ?8 V& w0 V2 R/ `! [7 N
③嵌套分支语句:其语句格式为: % \ d. I- M1 v6 M9 [& C |0 d! n% F* l1 ^( [$ k. Y* d2 Z0 U5 t
if(条件1) {分支1}; , q6 G1 _% e' i8 w C- [& _0 G
' O( J; h @ o) ?+ y3 E else if(条件2) {分支2} $ _% t( H$ U. {; o6 x2 ~% l3 d1 E1 l/ N( ?
else if(条件3) {分支3} ; S% ^4 n G' U% W8 k0 A" q+ {$ B$ o W( C1 d# r# ^; H
…… 2 N0 x& t+ ^' ~: L
" x0 h. Q6 y) q6 m2 \* X. H else if(条件n) {分支n} 7 P! V2 V+ l) w8 v
0 {1 y# |% z7 L: n. K- A
else {分支n+1} 2 g, G% n1 S! P8 V
8 l2 c _" ?9 q+ C/ @0 Y0 v9 ^, @
嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。 # C1 `* ]! B4 w$ L/ f8 \
. h9 @. |0 D( }% t. o ④switch开关语句:该语句也是多分支选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else 语句,它的所有分支都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2分支,第3分支……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。 % A! t1 ?6 I7 y0 i
0 T p v- {* M( J! x3 k
(3)循环结构: : i" V6 |; Y1 o; d" s" \+ |& V8 C8 W7 P0 X2 E2 ]
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do ?Cwhile循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误,在学习中我们主要学习while、do…while、for三种循环。常用的三种循环结构学习的重点在于弄清它们相同与不同之处,以便在不同场合下使用,这就要清楚三种循环的格式和执行顺序,将每种循环的流程图理解透彻后就会明白如何替换使用,如把while循环的例题,用for语句重新编写一个程序,这样能更好地理解它们的作用。特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。 9 H2 U: d/ B. I; H* d6 \, ~' J
0 T7 a8 ]: T. ^: E2 ^ f( g
在学完这三个循环后,应明确它们的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while 循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while 循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。 ( O" M% L/ J, t2 O4 D1 q: n ' ^6 V9 n p1 z$ J8 l 顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。 " r# j/ k' V0 x, O; I
# m) `, R, J4 p; E% D5 B
(4)模块化程序结构 ! |& H9 @- j6 [& x% ~/ B- L4 V
. ?5 w& ~- i1 Y6 s: O. M. {% ] C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。 因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。 " P9 j) V* K' b( U [; w; A
; x) W5 ]' i8 ^+ l# k9 j) I
三.掌握一些简单的算法 4 J, F2 c; w* q9 Q) u$ O
8 Z" Y; c& I2 v* j
编程其实一大部分工作就是分析问题,找到解决问题的方法,再以相应的编程语言写出代码。这就要求掌握算法,根据我们的《C程序设计》教学大纲中,只要求我们掌握一些简单的算法,在掌握这些基本算法后,要完成对问题的分析就容易了。如两个数的交换、三个数的比较、选择法排序和冒泡法排序,这就要求我们要清楚这些算法的内在含义 % M0 L2 ~7 R' C* r5 W$ y3 u, o/ j
结语:当我们把握好上述几方面后,只要同学们能克服畏难、厌学、上课能专心听讲,做好练习与上机调试,其实C语言并不难学 ! V2 c+ X9 E: B) H8 w! B6 H, F
2 ~" B: M: I4 X* m% |( Q: ` C源程序的关键字--------------------------------------------------------------------------------------- % w3 F( e% I2 R' X( K' t" K5 e6 w. ]6 ?3 r; u" U: o
所谓关键字就是已被C语言本身使用, 不能作其它用途使用的字。例如关键字不能用作变量名、函数名等 " S; p& j% i; [( Z$ ] + e+ q T" ?4 e) s2 i/ K 由ANSI标准定义的C语言关键字共32个 : ; L, r E9 e5 ^6 E5 W j1 d+ B# X3 b! A3 \1 I% I+ ]
auto double int struct break else long switch 8 u5 x4 a: Y5 d
, \, w; ? l) h, O2 o! z/ T case enum register typedef char extern return union 1 k0 @; q5 n5 ?% [1 G4 d
; ]1 C7 Q: B: H const float short unsigned continue for signed void ' k, \( j3 {& p' G5 |0 f& X# u7 l6 V5 h2 ^$ F- Z
default goto sizeof volatile do if while static ?( l: u% a' u* D1 K: Q; Z9 V, Z6 ], l( Q* E3 Y
根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类。 @$ D( P1 h5 U! L' {1 J U
7 P$ J) k7 S. A2 Y, R: E) T2 F 1 数据类型关键字 . C7 I1 ]$ X9 }1 e. Z( h
5 e& ^! ~) e! l- J. ]
A基本数据类型(5个) ) B6 u& _( x& Q$ m/ V
1 ?0 J1 a+ j! M! V0 ^$ L, s char :字符型类型数据,属于整型数据的一种 , r" D$ x2 w3 q8 Y2 F. Q
: z/ V) e7 B( w# Z0 E
int :整型数据,通常为编译器指定的机器字长 9 v$ x% `; _6 ?, I " Y& m3 w& `8 o( ]+ a8 X float :单精度浮点型数据,属于浮点数据的一种 9 E: J* G2 ?. H( H9 D/ E 7 z+ C% e& w3 O' l double :双精度浮点型数据,属于浮点数据的一种 2 C9 I% p4 I) e1 S" F* I: T5 } 7 \$ S2 w2 O/ l D B 类型修饰关键字(4个) ( _7 e* H- A7 i' E ' u/ [; M- b2 A1 p, O& r% L2 ` short :修饰int,短整型数据,可省略被修饰的int。 , v, X9 w8 y) P, Z
- L \3 O3 B/ a- `% M
long :修饰int,长整形数据,可省略被修饰的int。 9 x$ u( m% L1 t; n1 G' K: H$ c! L$ P( d
signed :修饰整型数据,有符号数据类型 , |! h" |: W# {7 }/ U) n; [ ' @" E& z. m9 S$ ?% r$ x* F unsigned :修饰整型数据,无符号数据类型 7 L/ F/ y1 F: K9 e9 W/ d0 X1 I: U) \- R+ C8 W, `, B0 f: l
C 复杂类型关键字(5个) # T9 X( Y/ }- m+ O( p
! ^' J% H0 O* \+ ^0 y2 z struct :结构体声明 , V7 W: |$ i, ?# h; f' o; k- N * W% V0 M4 o0 Y/ |5 q union :共用体声明 ( G' d' i% E, e6 m% k
}- H/ k1 i! L5 t+ z
enum :枚举声明 * Q# h; a* e5 Q
; J/ ?" W! C2 J, s- X
typedef :声明类型别名 , N" F# S H9 V8 S% B0 }. E# ~) u! K
sizeof :得到特定类型或特定类型变量的大小 1 I8 W! m2 V+ ?- L4 U1 \9 e; o: s1 c3 H
D 存储级别关键字(6个) ! J) x* T$ J# X( x: I: ^3 d( ?' S/ n& }/ M( o9 v' E' N
auto :指定为自动变量,由编译器自动分配及释放。通常在栈上分配 + @6 \( w; `9 ]7 I- L9 S/ T# ?: @- \! Y
static :指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部 4 H! X' s2 W! Q6 M& \: N7 `2 L H
M' I, U( G1 E9 d, n( E% s register :指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数 5 U! X# Y0 y# m; e
{7 a" U( P8 L( D
extern :指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。 x- C. l" u6 h( T) p4 i: O
. N$ b4 I; h0 K. w; g- d const :与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变) . S2 x9 w$ A. S$ ^. z4 t% V1 i0 O/ Y M* H# P6 z5 {, e3 [
volatile :与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值 ; m* O& D! j; d3 B- E 1 J+ a$ _) C T9 Z# S: U9 O 2 流程控制关键字 6 E. x7 n) x& Y8 t- Z
7 Z6 N, O: \6 m2 ~ g
A 跳转结构(4个) $ a/ z$ G' P" L / F( ~9 E @; ~* R) w. [/ J return :用在函数体中,返回特定值(或者是void值,即不返回值) : h; K# s1 W& R4 v! J T) q% v
+ g7 S' t+ v9 { continue :结束当前循环,开始下一轮循环 ! V6 T& w5 |& u. P' m. I 2 N8 f- p- }6 A' Z6 G j% v' U break :跳出当前循环或switch结构 L* `* v% v v& ~4 _ ( Z8 S$ y& V/ G B- O goto :无条件跳转语句 9 u' M9 q; Y* c7 _6 t% {
7 s+ V9 j# }0 ]: L" d& s
B 分支结构(5个) : w9 ^, B3 B, ~( V! _# [4 G* G9 j : t' x* ^6 ]# `: G0 [; R if :条件语句 6 } K3 F2 E$ i+ E. I4 d5 P; ^0 F6 I& j
: N& F& n" \5 C! [4 @9 b9 t
else :条件语句否定分支(与if连用) - a2 Q8 q1 l% `, X- s! s
! ~, b+ [( |4 C8 t& t switch :开关语句(多重分支语句) % G5 M+ Q. B( G' V7 F) r. o$ C3 b0 F
: t8 e+ A i5 B: {0 F
case :开关语句中的分支标记 * K& r# S: D, |: k8 y+ i; A7 I
2 R5 }$ i3 C. {2 J$ j# e8 y1 d7 \
default :开关语句中的“其他”分治,可选。 ' U+ _# K6 I0 Q ) c5 Q$ c8 y: y# e% i' N C 循环结构(3个) ; M4 {- q: V$ d& B- @ ) a* S: h$ i9 E for :for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件 9 T2 O0 L8 C- w* S e
! C) }. P! h( y4 a1 b: L. u# w do :do循环结构,do 1 while(2); 的执行顺序是 1->2->1...循环,2为循环条件 $ z, h% f W( J" n3 o
% {' p$ m. S) Y5 C& S while :while循环结构,while(1) 2; 的执行顺序是1->2->1...循环,1为循环条件 F6 ]% d4 v" O' |7 f/ z: f2 J+ \! K9 q& _, W; _
以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。作者: fxbaobao 时间: 2009-10-16 08:23
这文章应该对新生有所帮助。2 j5 W0 q4 N. u7 a# H. S
楼主能有针对性的发贴非常好啊。 $ ^, Z' g# t( W2 c+ S- h不过,现在新生好像都还没有电脑吧。没见有你的同学来帮你顶贴哦作者: Photoby 时间: 2009-10-21 08:07
新生学得呢么快?学好了你们要帮我编程!!作者: chnzw520 时间: 2009-10-21 12:46