a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 89|回复: 3

[C语言] 2011年计算机等级考试二级C辅导实例编程(15)

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
C语言编写键盘画图程序  笔者在开发县级电网调度自动化系统的过程中,碰到一个要绘制电力系统一次接线图的问题。由于电力系统一次接线图比较复杂,图上有一些特殊的符号,象变压器符号、开关符号等等,用一般的编程方法来绘制比较困难,因此,笔者用C语言开发了一个手工绘制电力系统一次接线图的键盘绘图程序,使用该程序绘制的一次接线图符合用户需求,效果良好。
( x, p2 n9 ?) G- G  使用方法0 `; D( R! @: R$ Q+ }/ q4 J$ b8 I
  程序中定义了几个特殊键:
& T1 K2 N8 i2 G% A/ H  "V”:画笔提起
3 s( ^$ v. |3 F& g  "W”:开始画图
6 i% z& ?' k6 ?4 S) f  "R”:开始擦图
) v+ B) G5 I; Y3 @  "S”:当前图形存入文件! w, [5 B' i* l4 w) k5 z( s
  "E”:调出已有文件1 i+ P: D+ H# G" l, c1 D- \
  "C”:画圆
; s. k* `  a( P1 R: g' ]7 O) K  程序一运行,屏幕上出现一个黄色的边框来设定画图的区域,区域中间出现提起的画笔符号 ,当按下“W”键时,画笔符号变为 ,此时可移动方向键(上、下、左、右、左上、左下、右上、右下)来画图;当按下“R”键时,画笔符号变为 ,此时可移动方向键来擦图;在画图过程中,按下“C”键,可画出一个半径为20个象素点的圆;当结束画图时,按下“S”键,将画好的图形存盘;按下“E”键可调出已有的图形进行编辑。
9 S; |" I7 f3 ~" v: ?9 V  源程序清单9 R+ X3 D2 w% C- y) b8 d6 c
  # include "graphics.h"
% Z: |7 N* y% E- ]) i3 y  # include "stdio.h"
# s2 W* h% O2 v  # include "fcntl.h"9 h, t1 z, ^" _7 _* Z3 H
  # include "stdlib.h"9 U7 S* `9 Z( \+ C$ s, @
  main()0 b: {& K0 `5 ]) g/ j& U
  void save(),load();2 j0 R. P8 B6 u* @% t
  void *wg,*rg,*vg,*fy;5 x% I  O% o6 J1 }' i6 I2 G
  int driver,mode;
, ~7 P. ]! E5 ^& q  |  int c=RED;  b* W( K0 H& z8 z! ?; l: Z& a
  int x=320,y=225;
1 G( A6 F1 c3 j6 r6 k! Z  int x1,y1,x2,y2;4 M2 h% |0 @: o5 p9 u' k
  int k,k1,k2;2 P1 M$ g$ M" m$ x5 P# G8 _& R
  /* initialize grapher */
' x5 K! r+ Z' N# v  detectgraph(&driver,&mode);
7 X* y5 Z  s  `2 p& Q. Z( x/ y, I  initgraph(&driver,&mode,"c:\tc");
% u2 [. H. a( |# }: G# a+ C" A  /* write the pen */
2 X- _& j: R# c) M& s  E3 O% k0 S  bar(200,10,206,16);6 u( o7 H5 _+ o0 b9 J4 j8 U1 ~
  line(203,7,200,10);
7 f! J2 y/ m# o  I5 W% l  line(203,7,206,10);. G3 d" E9 |6 W
  line(243,7,240,16);. R6 M$ l* Q1 P  ^) H
  line(243,7,246,16);
" r* _+ y$ E% I+ A' X  line(283,7,280,10);
  ], x8 Q; a" c1 V" c  line(283,7,286,10);* ]; g4 S& h1 N3 P- |) i) S! m
  line(283,7,283,16);
回复

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:09 | 显示全部楼层

2011年计算机等级考试二级C辅导实例编程(15)

 /* save the pen */  wg=malloc(imagesize(200,7,206,16));, w# R# u" W; \! G, p, O
  rg=malloc(imagesize(240,7,246,16));
$ \& Z: W6 `  n  vg=malloc(imagesize(280,7,286,16));
1 U) W: v' j3 {( Q0 X( L1 W; M8 y# s  fy=malloc(imagesize(200,7,206,16));
4 I0 [- Q' u* V& v9 b9 _' E0 ~  getimage(200,7,206,16,wg);
: [- f0 O4 f4 l9 W  getimage(240,7,246,16,rg);- a+ x7 X/ @+ g6 t6 E' r
  getimage(280,7,286,16,vg);
6 f' m) N# e/ {$ M' s" Y  cleardevice();
$ K- B0 V5 @! f  /* write the box */
% c9 O& ]0 A: O( @  setcolor(YELLOW);
5 K! U3 q1 t) w# p  rectangle(4,19,637,447);& l. L7 V  G  ~3 \$ N
  x1=x-3;
. E3 X2 q# Y& U, k3 B, q& d; `$ @5 u3 F  y1=y+1;. K% t; F8 t# D+ |! h
  x2=x+3;
/ D" L8 c" }5 B8 I; Z2 y5 u  y2=y+10;$ s3 H: e, E6 S! s; G! y- y
  getimage(x1,y1,x2,y2,fy);
% ]; `$ a" ]/ H  putimage(x1,y1,vg,XOR_PUT);1 F% x, h' _4 c% ?8 |0 k
  /* receive the command */
' H& s5 _1 I& [3 m3 T5 o7 m9 f  for (;;)0 f' K5 u3 a2 d6 f1 Y
  while (bioskey(1)==0);
" P4 H7 h2 l: v  R+ L  k=bioskey(0);$ C) J( A, {5 s4 w/ }8 g3 c! u
  putimage(x1,y1,fy,AND_PUT);" f+ ?  ~+ G: V$ o
  if (((k&0x00ff)|0x00)==0)+ R- K& ~" `2 M) T
  k1=k&0xff?0:k>>8; /* k1 is the specialkey value */, Z/ _+ g1 C; r2 V3 F/ o8 z
  else
6 t4 S7 I  f, B* ?1 @" u7 r  k2=k&0x00ff; /* k2 is the non-specialkey value */# E1 U9 [! R+ |0 ^) W! i
  if (((k&0x00ff)|0x00)==0) /* Special key */: q6 j2 S+ a  m& V! S, X# ]
  switch(k1)9 y# P) C2 W* \, l, R% A+ H
  case 45:( c  K, E/ v$ {! r0 S& P/ b
  restorecrtmode();
* Y& j& Y) q0 u# H5 V0 o7 i- N  exit(0);
# H1 h7 {3 ~5 F  case 72:+ i* `  l" [/ `1 F" u/ F- h& n
  if (y>20)% l5 X% r6 v# O0 x$ M1 r: t
  y=y-1;: z9 I' q. u. F; N; M0 S# w' u
  break;- L9 C; o7 D; m! V; V4 h* T
  case 75:
. l% K. c* A. Z  if (x>5)
& u- M2 a( D4 Z3 @9 B  x=x-1;. Y& l( T0 n1 p( U
  break;! Q) q: i. ]  C  f6 b5 V" z
  case 77:6 i$ t5 q$ ~) E' e9 E3 D

5 U& `4 ]0 q6 r# ]! ]$ c  if (x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:10 | 显示全部楼层

2011年计算机等级考试二级C辅导实例编程(15)

 y=y+1;  break;- u8 e9 }: V( j) z9 m) o! x" t9 v) H
  case 71:% r& u! K* x) E0 v  \8 B
  if ((x>5)&&(y>20))8 V+ D$ V; B  l, [
  x=x-1;9 P; I' p- T) S0 B5 T2 ?4 |
  y=y-1;
2 V2 L, D7 z/ \9 f8 L- C/ @  break;
4 V0 e' u( K& i" [: T  case 79:) y' `, @$ l" v  x# I2 V

/ s5 {& b6 w( j1 T, K  if ((x>5)&&(y
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:11 | 显示全部楼层

2011年计算机等级考试二级C辅导实例编程(15)

  break;  o, m3 o& \7 g' w2 N0 r# m
  case 99: /*'c'*/' R4 H/ y& ?5 b6 w
  case 67: /*'C'*/  `* A' |( a( v
  setcolor(RED);
8 z1 g% \; s9 D& z' x* s) o) d: \3 q. }" h  circle(x,y,20);
/ S3 y  o+ R- N: \5 r0 `. L. _% w  break;+ s: b$ Y# D9 b8 s8 w6 t3 ^# w5 i
  default:continue;
$ E- ~& t) P' ?2 V% C5 m  /* function for screen picture save
4 ?% L0 k8 @' b2 l  */3 d' w- Z+ \5 ?& o8 U
  void save(char *fname)" H$ j' P! L2 I' a0 ]$ @8 P
  FILE *fp;
7 K' d' G! x/ ?  int i;
: S. I' `! A7 c5 ]3 M  register long j;( B' d5 S% d) L, Q- V' Z: W. z
  char far *ptr;
: r4 e/ e/ h' O, c7 ]  fp=fopen(fname,"wb");" P0 W8 m9 C) G6 Y- G& w, |0 [
6 ^1 \3 Z- h4 B+ |: _' N
  for(i=0;i
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 19:41 , Processed in 0.188520 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表