#include<stdlib.h>
#include<graphics.h>
#include <conio.h >
#include <stdio.h>
typedef struct m_Point //定义一个表示点坐标的结构
{
int x;
int y;
}m_Point;
typedef struct Elements
{
char m_Ele_Name[20]; //识别元素种类的标志
int Pen_Width; //当前笔宽,默认为一个像素
int color; //当前绘图颜色,默认为黑色
m_Point m_start; //点坐标、线起始点、矩形、封闭矩形左上角坐标
m_Point m_end; //线终点、矩形、封闭矩形右下角坐标
int m_radius; //圆或圆弧半径
int m_startangle; //圆弧左偏角
int m_endangle; //圆弧右偏角
Elements* next;
}Elements;
Elements *hang; //链表头结点
Elements *F_picked; //高亮选中时的标志
bool F_quit=false;//控制程序是否结束
char *fname; //文件名
bool F_print=false;
void fileopen()
{
Elements *p,*temp;
FILE *fp; //文件指针
//printf("请输入文件名:");
//scanf("%s",fname);
fname="F:\\Text_File\\mn";
fp=fopen(fname,"r");
if(fp==NULL)
{
printf("要打开的文件不存在,新建名为%s的文件\n",fname);//如果文件不存在或打开失败则新建一个文件
fp=fopen(fname,"w");
return;
}
printf("当前文本:%s\n",fname);
temp=(Elements*)malloc(sizeof(Elements));
p=hang;
while(fread(temp,sizeof(Elements),1,fp)) //将文件内容载入链表
{
temp->next=p->next;
p->next=temp;
p=temp;
temp=(Elements*)malloc(sizeof(Elements));
}
fclose(fp);
}
void save()
{
Elements *p;
FILE *fp; //文件指针
fp=fopen(fname,"w"); //再写入文件
p=hang->next;
while(p!=hang)
{
fwrite(p,sizeof(Elements),1,fp);
p=p->next;
}
fclose(fp);
}
void insert_node(Elements *p) //倒序插入一个节点
{
p->next=hang->next;
hang->next=p;
}
void List(Elements *head) //显示内容
{
int gdriver, gmode, i;
gdriver=DETECT;
initgraph(&gdriver, &gmode, "c:\\caic\\bgi");
setbkcolor(WHITE);
cleardevice();
setcolor(12);
Elements *p; //访问结点指针
p=head->next;
while (p!=hang)
{
if(F_picked==p) //判断是否是高亮选中的元素
{
setcolor(RED);
setlinestyle(0,0,3);
}
else
{
setcolor(NULL);
setlinestyle(0,0,1);
}
switch((p->m_Ele_Name[0]))
{
case '0':
break;
case '1':
putpixel(p->m_start.x,p->m_start.y,p->color);
break;
case '2':
line(p->m_start.x,p->m_start.y,p->m_end.x,p->m_end.y);
break;
case '3':
circle(p->m_start.x,p->m_start.y,p->m_radius);
break;
case '4':
arc(p->m_start.x,p->m_start.y,p->m_end.x,p->m_end.y,p->m_startangle,p->m_endangle);
break;
case '5':
rectangle(p->m_start.x,p->m_start.y,p->m_end.x,p->m_end.y);
break;
default:
break;
}
p=p->next;
}
getch();
closegraph();
}
Elements* picked_up()
{
Elements* p=hang->next;
char ch;
while(1)
{
F_picked=p; //将当前选中的节点指针传递给高亮选中标志
List(hang);
ch=getch();
if (ch=='y'||ch=='Y') //输入y时确定删除当前元素
return p;
if(ch=='n'||ch=='N') //输入n时高亮显示下一个元素
p=p->next;
}
}
void paint()
{
Elements* p,*temp;
char cmand=' ',ch;
printf("\n请选择要画的图形:\n");
ch=getch();
getchar();
cmand=ch;
p=hang;
temp=(Elements*)malloc(sizeof(Elements));
switch(cmand)
{
case 't':
case 'T':
insert_node(temp);
temp->m_Ele_Name[0]='1';
printf("请输入点的坐标:");
scanf("(%d,%d)",&(temp->m_start.x),&(temp->m_start.y));
break;
case 'l':
case 'L':
insert_node(temp);
temp->m_Ele_Name[0]='2';
printf("请输入直线两端点坐标:");
scanf("(%d,%d),(%d,%d)",&(temp->m_start.x),&(temp->m_start.y),&(temp->m_end.x),&(temp->m_end.y));
break;
case 'c':
case 'C':
insert_node(temp);
temp->m_Ele_Name[0]='3';
printf("请输入圆心坐标以及半径:");
scanf("(%d,%d),%d",&(temp->m_start.x),&(temp->m_start.y),&(temp->m_radius));
break;
case 'a':
case 'A':
insert_node(temp);
temp->m_Ele_Name[0]='4';
printf("请输入圆弧封闭矩形两端角:");
scanf("(%d,%d),(%d,%d)",&(temp->m_start.x),&(temp->m_start.y),&(temp->m_end.x),&(temp->m_end.y));
printf("请输入左偏角以及右偏角:");
scanf("%d,%d",&(temp->m_startangle),&(temp->m_endangle));
break;
case 'r':
case 'R':
insert_node(temp);
temp->m_Ele_Name[0]='5';
printf("请输入矩形两端角:");
scanf("(%d,%d),(%d,%d)",&(temp->m_start.x),&(temp->m_start.y),&(temp->m_end.x),&(temp->m_end.y));
break;
default:
printf("输入错误,请重新输入!");
}
}
void Del(Elements *h)
{
char ch;
Elements *p,*temp=h;
printf("请选择要删除的元素!");
p=picked_up();
printf("是否删除当前元素?(Y/N)");
ch=getch();
getchar();
if(ch=='n'||ch=='N')
{
printf("\n删除命令已取消!\n");
return;
}
else
{
while ((temp->next)!=p)
{
temp=temp->next;
}
temp->next=p->next;
free(p);
printf("\n该元素已成功删除!\n");
}
}
void quit()
{
char ch;
printf("是否保存文件?Y/N ");
ch=getchar();
if(ch=='y'||ch=='Y')
{
save();
F_quit=true;
}
}
void help()
{
printf("===========================================\n");
printf("| L 显示图像 |\n");
printf("| O 为打开或新建一个文件 |\n");
printf("| S 保存文件 |\n");
printf("| P 选择画图操作 |\n");
printf("| D 删除高亮显示的图形元素 |\n");
printf("| Q退出 |\n");
printf("===========================================\n");
}
void cmd()//命令选择
{
char cmand=' ',ch;
if(F_print==false)
printf("请输入命令(H显示帮助):\n");
ch=getchar();
while(ch!='\n')
{
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
{
cmand=ch;
break;
}
else
ch=getchar();
}
switch(cmand)
{
case 'L':
case 'l':
List(hang);
F_print=true;
break;
case 'D':
case 'd':
Del(hang);
F_print=true;
break;
case 'S':
case 's':
save();
F_print=true;
break;
case 'p':
case 'P':
paint();
F_print=true;
break;
case 'O':
case 'o':
fileopen();
F_print=true;
break;
case 'Q':
case 'q':
quit();
F_print=true;
break;
case 'H':
case 'h':
help();
F_print=true;
break;
case ' ':
F_print=false;
break;
default:printf("命令错误!");
}
}
int main()
{
hang=(Elements*)malloc(sizeof(Elements));//初始化一个头结点为空的链表
hang->m_Ele_Name[0]='0';
hang->next=hang;
while(F_quit==false)
cmd(); //执行操作
return 0;
}
- 1
- 2
前往页