下沙论坛

标题: C 语言的特点 [打印本页]

作者: 秋风舞落叶    时间: 2009-4-1 09:13
标题: C 语言的特点
C 语言发展如此迅速, 而且成为最受欢迎的语言之一, 主要因为它具有强大的
  j; b+ F6 y  |. T功能。许多著名的系统软件, DBASE PLUSDBASE 都是由C 语言编写的。
7 Z/ d2 a5 [9 v6 j0 K. i; Z( V/ H6 ^: i. J7 ~+ g6 e
C 语言加上一些汇编语言子程序, 就更能显示C 语言的优势了,% I) w: I; _6 u6 u( u
PC- DOS
( V) ]; }0 s7 w: n7 I' H5 S
/ r% e4 A* _6 F, DWORDSTAR等就是用这种方法编写的。归纳起来C 语言具有下列特点: ! N7 l4 s( y& P
! d" ~3 k) H5 |
1. C是中级语言2 b' }, A1 u+ [( h  S

4 B/ i5 f3 l. p+ x: Q( ?( c
! Y$ D( ?* Z$ I. L* Y7 Q& Y! o它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以象( s+ J9 `1 O6 L- J0 D, b

; m. h, y$ a* `/ l1 h  q0 M汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。1 n2 z  P" _" k
8 ]1 A* ]  b/ m+ p5 ~. j% Z

! [" k! s) W6 I! s1 k8 O; `2. C是结构式语言; O8 i. E* e- f( I5 \; V/ C
6 `! s/ C! }# f" r( T, `

0 a& P6 U9 z% Q% G  S结构式语言的显著特点是代码及数据的分隔化, 即程序的各个部分除了必要的
7 W" f7 K! {: P# R9 A% h
: G( [# U* W0 L. s% x# ?信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调: Q2 _$ ~) d* L, J
2 G0 s/ v2 D& a0 i; i
试。C 语言是以函数形式提供给用户的,1 j9 d8 @/ P$ i. O5 u
这些函数可方便的调用,9 L4 g. R) {9 f/ U: r
并具有多种循
8 S, a5 B3 U5 W9 j: }/ J3 ^  M& n. Q( [1 @, A* Y+ u7 q5 X
环、条件语句控制程序流向, 从而使程序完全结构化。
9 d1 ]* O8 Q& j% V: R$ ]8 C  S: f3 l. h& @4 T
/ S0 A7 |4 T/ C, z# p  w; B
3. C语言功能齐全
+ x, Y; T& t2 i; `# d5 U% h$ C5 G* v% y, y7 }
, j9 M# Q+ i  s4 T8 I2 ]
C 语言具有各种各样的数据类型, 并引入了指针概念, 可使程序效率更高。另
7 ]- @: `! Y2 G8 M) M
6 u& B' U6 f: aC 语言也具有强大的图形功能, 支持多种显示器和驱动器。而且计算功能、逻辑4 f8 j$ G/ E  x; t4 h7 p  L7 g
; R! W, F& A/ [. }) \  `; `3 u
判断功能也比较强大, 可以实现决策目的。
: ]; Z, X: S1 {5 w2 ?) L% B$ S+ B1 ~& D+ @. ?
3 ]* {2 l& E5 d0 z0 p2 a5 a
4. C语言适用范围大; ~4 X0 m1 q/ k! l2 S0 A

1 W3 q) R3 j  x. w# E% |9 l4 `" a" z, k* u9 \7 A% r" n, w: c  Y, }
C 语言还有一个突出的优点就是适合于多种操作系统, DOSUNIX,也适用于- G1 c' T# Z; I8 a3 [3 s) m2 E  [

! g0 C) Y" M5 H( D多种机型。
' ?. m' a* B, k4 A
, |: N; I6 Y: X* v' y/ u & B. V, l. y3 P: S
……………………………复制下面红色字段………………………………………" w2 ]" I% N; v+ [. K
% _7 D+ _3 G7 {5 j- V& c9 A8 c: r/ H

; a/ k6 A' J  l* [: E/*  这是简单的推箱子游戏,大家试试玩,谁有更好的Idea?     */
- b' R, B% L$ [! ^' _! }% l#include"stdio.h"  O, _0 A. `/ j0 Z# x
#include"bios.h"
( s6 S! F& X: L' k#define LEFT 751 o5 U+ O! U& L
#define RIGHT 77. Z* g+ u3 m2 E
#define UPPER 723 P6 P: g4 Q+ u' N# @
#define DOWN 80* J" S+ F4 \1 B( f# @
#define ESC 27, m$ \2 n" I1 k6 q, R8 |
struct Boxss        /*定义箱子结构体,其中包含坐标属性*/
1 {, \5 w. F& J9 f( {{
! ?. X. X' T+ X0 `) t& E/ F; sint x,y;. b$ _5 D# h* J" O, [( a* y* U. q
};
2 o( H' k9 o& n& L. O5 N8 eunion keyboard      /*定义读取键盘码的共用体类型*/
9 {! E3 q6 b8 ?+ j( |5 H# u' n{
# V! d% J; a6 f5 T& cunsigned int iKeyInfo;0 {$ N' l% {( {+ J' K/ C% ]+ {
char chKeyBit[2];
+ ?& Y: d, l7 ?: n- R- P; u0 g};
4 B. }; f; i+ P( L. B! E( S3 s: Xint fnGetKey(void)  /*定义读取键盘码的函数*/
% b& [# a. n# _' g; w  N+ ?{, k' m! d/ M3 k3 g" `
union keyboard uniKey1;    /*定义读取键盘码的共用体变量*/
' r, e0 B  G' n' ~3 \* l! C  S/ dwhile(bioskey(1)==0);      /*检测用户是否按键*/
) @' @/ U# |" n# funiKey1.iKeyInfo=bioskey(0);           /*读取按键信息*/
4 n$ ]$ k+ w) }; O( J0 Y4 l9 l! kreturn(uniKey1.chKeyBit[0]==0?uniKey1.chKeyBit[1]:uniKey1.chKeyBit[0]);  /*返回ASCII码或扩充码*/: M* D+ _8 [0 V; H9 ^- n; Q
}
% j& f; _) H8 c9 Fvoid main()4 T6 T( H4 |0 b8 ~
{
1 L5 C( B  V* xint iKey,x=11,y=6,tx=11,ty=6;       /*x,y为人物移动后坐标,tx,ty为人物移动前坐标*/
) b+ ]+ V3 T. ]struct Boxss Box[4];                /*定义箱子数量*/, |# |- _6 n  ^( l5 q8 D$ |
int chMap[10][10]={                 /*用二维数组定义地图*/3 u8 Z' X) [0 h" \* ~/ p
                  {0,0,0,0,0,0,0,0,0,0},          /*0表示墙1表示路2表示目标*/" d) f& S- T/ a- S+ a0 p
                  {0,1,0,0,0,0,1,1,1,0},5 h$ r2 U! `& Z+ R
                  {0,1,0,2,0,0,1,0,1,0},6 u- ~& a0 {7 b$ e
                  {0,1,0,1,0,0,1,0,1,0},( P, T5 P2 S: v. |0 |+ Q' `5 n5 j
                  {0,1,1,1,0,0,1,0,1,0},
2 M1 D" B" n' B) ^6 u( _                  {0,1,0,0,0,0,1,0,1,0},: Z9 N% K- V: B
                  {0,1,1,1,1,1,1,0,1,0},
* }4 Y( c) N+ r( R& u. S: N: n& n                  {0,1,0,1,0,0,0,0,2,0},
0 k8 k# B1 d* G$ H" _* G                  {0,2,0,1,1,1,1,2,0,0},
$ h% {5 \1 W+ D5 R$ |                  {0,0,0,0,0,0,0,0,0,0},3 e0 \" ]" d) Z; k2 E7 s
                  };& ?* Q% d# s2 d2 _0 b* L& v) S
int i,j;
3 d( v4 E7 L- T9 d, pBox[0].x=13;       /*定义箱子的坐标属性*/' y" L6 W0 K7 [4 E! Q# z- Y1 t9 M, U
Box[1].x=11;
7 I2 x& i. }5 X% T, R% r2 r' tBox[2].x=14;, Z/ {1 n% F! J8 K. m* {% V( l
Box[3].x=18;" @$ h( z; N- X. }4 w  r
Box[0].y=8;% s: z( J8 w# W( H& s& Q
Box[1].y=7;) e1 Y5 ~& T$ M7 W0 H
Box[2].y=13;& Q' q  J: ], Q3 l8 ~
Box[3].y=7;+ \. W) U! F8 E  \: e* B, t# G
  while(1)                 /*反复进行求移动的坐标运算*/
" b$ u' _+ v3 i* v1 Q  {, B- v  {7 u. k* f
  for(i=0;i<10;i++)       /*输出新地图(刷新地图)*/
$ S/ _: X7 ]' m1 V# X; a    {2 a1 |7 B1 X! m7 \
    gotoxy(10,5+i);: D* c9 }& @9 B0 a2 O* b: J" }
    for(j=0;j<10;j++)
& c/ Z9 I4 ?- \$ r0 q) j: E, i      {
$ }& R$ v& u0 X* b6 c, [2 n      if(chMap[j]==0)5 b. Q) I- H( z6 }8 ]9 h
        printf("#");) g8 e' O, t7 B8 U
      if(chMap[j]==1)' M5 K- \  s! x/ Q
        printf(" ");
' B  U, C- |; t' w$ J      if(chMap[j]==2), l  [( n+ t+ O) D
        printf("X");& m9 N* ^7 R# u: J' m
      }
# E1 j) Q$ l/ g7 C" T    }
& M. C# V7 S" B, ]( L5 s. R  j=0;                                       /*判断是否所有箱子都在目标坐标上*/5 i( Y0 U5 C: }
  for(i=0;i<4;i++)
7 }; u8 S2 r8 U% B1 u* E7 ~    if(chMap[Box.y-5][Box.x-10]==2)
) x' J6 f: {8 s  N    j++;: }, m4 i, W6 ^* M/ b' ~' Y
  if(j==4)                                   /*如果所有箱子都就位输出"YOU WIN!"退出*/
+ j* E9 J5 C4 t; n( S      {
& T( ^7 ^  m: T# V" K- `3 M4 n0 a      clrscr();  b" j1 \2 ^8 k
      printf("You Win!");6 o( z( U3 w: ^- e0 B
      break;1 X$ G/ c! t5 y# r& C# i
      }
: o. q/ s% q4 H2 r6 ^; G  for(i=0;i<4;i++)                           /*在起始(或移动后)的坐标输出箱子*/* k* _/ _5 a  L2 q
    {' q+ @+ N8 p% x( \% B
    gotoxy(Box.x,Box.y);
: b) L6 G" p1 A6 y5 B6 c0 P    printf("0");% z: v8 {: P' M$ S9 q
    }
: W6 |8 @& l, J/ @6 d! B4 i  gotoxy(x,y);                               /*在起始(或移动后)的坐标输出人*/
- ~/ G9 a' |0 `& O4 f  a# e  printf("*\b");
* K  y" a; ~5 Q7 J$ j  tx=x;                                      /*记录本次移动前的坐标*/
! x' x) E; [% d" }6 ?  M  ty=y;
) ?$ |6 l6 @$ A3 G; s2 @3 G8 k, Y8 T  iKey=fnGetKey();
1 A) }1 A1 h; J" L4 i# G8 B. \  if(iKey==LEFT&&chMap[y-5][x-1-10]!=0)      /*按读取的按键信息改变坐标如果改变的坐标和墙(0)重合则不改变*/
9 e2 w5 ]/ d' _' o% ]7 x! r# y    x--;7 d/ Z" G6 {# m& M6 [0 h
  if(iKey==RIGHT&&chMap[y-5][x+1-10]!=0)
/ g7 u# q) R" i  [    x++;
: p% l8 `  z  D$ B% j' Y& j0 M7 @  if(iKey==UPPER&&chMap[y-1-5][x-10]!=0)
4 I( W5 A+ I9 A: ?    y--;
; z# V) i; Q! G  if(iKey==DOWN&&chMap[y+1-5][x-10]!=0)
/ P8 Q2 Q) {1 B    y++;                                    /*输入ESC退出并输出"YOU LOST"*/1 K7 x8 S! q% [. o7 c$ X
  if(iKey==ESC)
3 o& B1 S* D" M8 s+ a, s  {
( d2 M; D: b, b% c0 S  clrscr();
& f6 _: y2 \4 R) x# [# ?. D3 C  printf("You Lost");0 P7 M# X; T* d( e# G
  break;
  M& M: L) J/ ?. B  }
$ N0 w: H) D4 ^7 ]$ W  for(i=0;i<4;i++)                          /*如果移动后的人的坐标与箱子坐标重合,则改变箱子坐标向前一格*/) J' X% r' w. i% W1 g) c
    if(Box.x==x&&Box.y==y). j0 g# w* I( y: r
      {" _( e. A# f8 a* W
      Box.x+=(x-tx);4 k% P- @! m+ _  B4 C
      Box.y+=(y-ty);# Z. Q3 w& d8 d( _$ B+ q
    if(chMap[Box.y-5][Box.x-10]==0)   /*如果移动后的箱子坐标会出现在墙上,则使箱子坐标和人坐标都返回移动前的值*/
" |. Z. L( |9 W( m      {
' ]3 t7 Q3 s, L+ h* G( X3 j      Box.x-=(x-tx);! f# M0 V! \7 [0 P& r: N
      Box.y-=(y-ty);  k& E5 E. Q; B6 V5 M
      x=tx;
2 y' b$ T. g# D$ K; f! b+ l      y=ty;
2 [: B- n' A: S7 X! s9 N4 k      }
' V) M3 Q% J) v: X: W9 ~      break;
% }5 @) t; m+ n+ W. K% @      }" w5 F3 g9 `/ ~% |/ Z
  clrscr();( n* K3 T1 a/ P9 O5 i! H& X8 X4 J1 y
  }
2 b: j4 G1 _+ m0 Q9 u: `6 Dgetch();+ J1 ]/ O. ~* q# z) j! l
}
/ ?! G: x- z! [& h
. ]% Y( G1 r/ i6 B& R

% [' _! w" R6 a; D  w* [ ( ^1 j/ a+ m: G8 b% o1 o( h4 o
………………………END(复制上面的红色字段)…………………………………………………




欢迎光临 下沙论坛 (http://bbs.xiasha.cn/) Powered by Discuz! X3.3