IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 最小生成树-graphics动画设计 -> 正文阅读

[C++知识库]最小生成树-graphics动画设计

系列文章目录

1. 最小生成树三种方法的代码实现

2.最小生成树-graphics.h动画设计


目录

系列文章目录

前言

一、graphics.h是什么

二、使用步骤

1.创建项目

2.创建框架

3.具体函数使用方法

1)图形

2)字符

3)连线

4)其他函数

4.整体代码显示

5.注意说明

总结


前言

做数据结构的课设,选的课题为最小生成树,因为常规代码太简单了,工作量不够,就想着能不能用C语言做一个最小生成树的普利姆算法和克鲁斯卡尔算法的动画形态,上网查过资料后,发现网上对这一部分的讲解简直太少了,所以就打算出一期详细的介绍一下。


一、graphics.h是什么

想做动画首先要知道graphics.h这个库,那这个是什么呢,是TC的针对DOS下的一个C语言图形库,如果要用的话应该用TC的编译器来编译,VC++环境有其它的针对Windows的图形库。本文使用Dev-Cpp6.2.1版本。在C语言的编译软件中,感觉这一版的颜色配置很棒,把百度网盘里的连接和提取码附上。

链接:https://pan.baidu.com/s/1meDOyafrzjLdgyKesdE0JA?
提取码:39ld

二、使用步骤

1.创建项目

打开dev,新建项目


先点击Multimedia,然后点击第二个Graphics.h库,选择C++语言,然后自己设定名称和项目文件夹,点击确定。会发现它的main.cpp文件里面本来就有一段代码,运行后会发现旋转五角星的图案(如下图所示),说明环境设置成功,接下来就可以写自己想写的代码了!

?2.创建框架

首先要知道的是这个库跟一般的C/C++里面的函数基本上不太一样,下面的网站里对里面的库函数有详细的介绍。库函数目录 (xege.org)

按照下面的代码,先设置标题,窗口大小,暂停是为了让窗口停留住,不然就会一闪而过。这样一个简单的窗口就完成了。

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();                //暂停 
	return 0;
}

3.具体函数使用方法

本文介绍的函数仅为此次课设所用到的函数,具体的其他的函数可以参考此网站:库函数目录 (xege.org)

1)图形

以圆形为例,其他的图形可参考上面的库函数链接

circle(100,100,10): 第一个参数为横坐标,第二个为纵坐标,第三个参数为圆的直径

fillellipse(200,100,10,10): 第一个参数为横坐标,第二个为纵坐标,第三个为横向直径,第四个为纵向直径,若第三个和第四个数值不相等则为椭圆。

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();
	setcolor(EGERGB(255, 255, 255)); //设置画图的  线为白色 
	setfillcolor(EGERGB(255, 255, 0));   //涂色为黄色 
	circle(100, 100, 10);   //空心圆   
	fillellipse(200, 100, 10, 10);   //实心圆 
	getch();
	return 0;
}

所得的图形如下图所示:

2)字符

字符和字符串输出不饿能直接使用scanf(),而应该用outtextxy函数代替

outtextxy(100,100,'A'): 第一个参数为横坐标,第二个为纵坐标,A为字符。

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();
	setcolor(EGERGB(255, 255, 255)); //设置画图的  线为白色 
	setfillcolor(EGERGB(255, 255, 0));   //涂色为黄色 
	circle(100, 100, 10);   //空心圆 
	outtextxy(100,100,'A');    //字符 
	getch(); 
	fillellipse(200, 100, 10, 10);   //实心圆 
	outtextxy(200,100,'1');   //字符 
	getch();
	char z[] = "The diagram has been generated!";    //字符串
	outtextxy(240, 400, z);    //字符串表示
	getch(); 
	return 0;
}

?所得的图形如下:

?3)连线

line(100,100,200,100): 第一个参数为线段起始点横坐标,第二个为七十点的纵坐标,第三个为结束点的横坐标,第四个为结束点的纵坐标。

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();
	setcolor(EGERGB(255, 255, 255)); //设置画图的  线为白色 
	setfillcolor(EGERGB(255, 255, 0));   //涂色为黄色 
	circle(100, 100, 10);   //空心圆 
	outtextxy(100,100,'A');    //字符 
	getch(); 
	fillellipse(200, 100, 10, 10);   //实心圆 
	outtextxy(200,100,'1');   //字符 
	getch();
	line(100, 100, 200, 100);   //连线
	getch();
	char z[] = "The diagram has been generated!";
	outtextxy(240, 400, z);
	getch(); 
	return 0;
}

?4)其他函数

sprintf(s, "%d", w[i]);? ? //将w[i]中的值以整形数的形式存入到s变量上。

clearviewport();? ? ? //清屏?

4.整体代码显示

这是整体的代码展示,其中数据是从文件中获取的,graphics.txt文件格式如下,

第一行书写顶点个数

第二行两个为一组,分别书写每个顶点的横纵坐标

第三行三个为一组,分别书写线段从第几个顶点到第几个顶点,以及两顶点之间的权值

?tree1.txt和tree.1txt文件的格式如下:

两个为一组,分别书写从第几个顶点到第几个顶点。

?整体的代码如下所示:

#include <graphics.h>
#include <math.h>
#include <stdio.h>

int main() {
	int i;
	int t, k = 65, m, n; //t为顶点数   边数
	char tem;	  //换行符  空格
	int x[60], y[60]; //横坐标   纵坐标
	int a[60], b[60], w[60];
	int a1[60], b1[60];
	int a2[60], b2[60];
	char c[60];  //顶点字符
	char s[20];   //权值输出
	setcaption("Tree-1");  //标题
	initgraph( 640, 480 );  //窗口大小
	getch();
	setcolor(EGERGB(255, 255, 255)); //设置画图线为白色 
	setfillcolor(EGERGB(255, 255, 255));

	FILE *fp, *fp1, *fp2;
	fp = fopen("C:\\Users\\86151\\Desktop\\SmallestTree\\graphics.txt", "r");

	//顶点数
	fscanf(fp, "%d", &t);
	fscanf(fp, "%c", &tem);    //跳过换行符

	//字符
	for (i = 1; i <= t; i++) {
		c[i] = k;
		k++;
	}

	for (i = 1; i <= t; i++) {
		//图横坐标
		fscanf(fp, "%3d", &x[i]);
		fscanf(fp, "%c", &tem);
		//图纵坐标
		fscanf(fp, "%3d", &y[i]);
		fscanf(fp, "%c", &tem);    //跳过换行符
	}
	i = 1;
	while (!feof(fp)) {
		//连接关系的第一个
		fscanf(fp, "%2d", &a[i]);
		fscanf(fp, "%c", &tem);
		//连接关系的第二个
		fscanf(fp, "%2d", &b[i]);
		fscanf(fp, "%c", &tem);
		//树权值
		fscanf(fp, "%2d", &w[i]);
		fscanf(fp, "%c", &tem);
		i++;
	}
	m = i - 1; //边的总数
	getch();
	//顶点
	circle(x[1], y[1], 10); //圆圈
	outtextxy(x[1], y[1], c[1]); //顶点字符
	getch();
	for (i = 2; i <= t; i++) {
		circle(x[i], y[i], 10);
		outtextxy(x[i], y[i], c[i]);
		getch();
	}

	//连线
	for (i = 1; i <= m; i++) {
		line(x[a[i]], y[a[i]], x[b[i]], y[b[i]]);
		getch();
	}

	//权值
	for (i = 1; i <= m; i++) {
		sprintf(s, "%d", w[i]);
		outtextxy((x[a[i]] + x[b[i]]) / 2, (y[a[i]] + y[b[i]]) / 2, s);
		getch();
	}
	char z[] = "The diagram has been generated!";
	outtextxy(240, 400, z);
	getch();
	
	
	
	/*最小生成树-prim----------------------------------------------------------------------*/
	fp1 = fopen("C:\\Users\\86151\\Desktop\\SmallestTree\\tree1.txt", "r");
	setcolor(EGERGB(153,51,250)); //设置画图线为紫色
	setfillcolor(EGERGB(153,51,250));
	i = 1;
	while (!feof(fp1)) {
		//连接关系的第一个
		fscanf(fp1, "%2d", &a1[i]);
		fscanf(fp1, "%c", &tem);
		//连接关系的第二个
		fscanf(fp1, "%2d", &b1[i]);
		fscanf(fp1, "%c", &tem);
		i++;
	}
	n = i - 1;

	//顶点
	getch();
	for (i = 1; i <= n; i++) {
		fillellipse(x[a1[i]], y[a1[i]], 10, 10); //圆圈
		getch();
		fillellipse(x[b1[i]], y[b1[i]], 10, 10);
		getch();
		line(x[a1[i]], y[a1[i]], x[b1[i]], y[b1[i]]);
		getch();
	}
	char u[] = "The prim-minimum spanning tree has been generated!";
	outtextxy(220, 400, u);
	getch();
	clearviewport();   //清屏 
	getch();
	
	
	
	
	
	
	fp2 = fopen("C:\\Users\\86151\\Desktop\\SmallestTree\\tree2.txt", "r");
	setcolor(EGERGB(255, 255, 255)); //设置画图线为白色 
	setfillcolor(EGERGB(255, 255, 255));
	//顶点
	circle(x[1], y[1], 10); //圆圈
	outtextxy(x[1], y[1], c[1]); //顶点字符
	for (i = 2; i <= t; i++) {
		circle(x[i], y[i], 10);
		outtextxy(x[i], y[i], c[i]);
	}
	//连线
	for (i = 1; i <= m; i++) {
		line(x[a[i]], y[a[i]], x[b[i]], y[b[i]]);
	}
	//权值
	for (i = 1; i <= m; i++) {
		sprintf(s, "%d", w[i]);
		outtextxy((x[a[i]] + x[b[i]]) / 2, (y[a[i]] + y[b[i]]) / 2, s);
	}
	getch();



	/*最小生成树-kelusi--------------------------------------------------------------*/
	setcolor(EGERGB(30,144,255)); 
	setfillcolor(EGERGB(30,144,255));
	i = 1;
	while (!feof(fp2)) {
		//连接关系的第一个
		fscanf(fp2, "%2d", &a2[i]);
		fscanf(fp2, "%c", &tem);
		//连接关系的第二个
		fscanf(fp2, "%2d", &b2[i]) ;
		fscanf(fp2, "%c", &tem);
		i++;
	}
	m = i - 1;
		getch();
		for (i = 1; i <= m; i++) {
			line(x[a2[i]], y[a2[i]], x[b2[i]], y[b2[i]]);
			getch();
			fillellipse(x[a2[i]], y[a2[i]], 10, 10); //圆圈
			getch();
			fillellipse(x[b2[i]], y[b2[i]], 10, 10);
			getch();	
		}
		char v[] = "The krusal-minimum spanning tree has been generated!";
		outtextxy(220, 400, v);
		getch();

	fclose(fp);
	fclose(fp1);
	fclose(fp2);
	return 0;
}

?结果如图所示:其中普利姆算法和克鲁斯卡尔算法有顺序体现。

??

?5.注意说明

1) getch()函数在此为暂停函数,与字符串里面的getch()函数不兼容,所以在此库里面不能使用include <string.h>头文件,否则会报错。

2)本篇文章所使用的代码是上一篇文章代码的延续,其中所使用的文件在上一篇代码中已经生成,如果是先运行的上一篇文章《最小生成树三种方法的代码实现》,则文件格式是匹配的,不用再修改文件格式,如果是单独运行的这篇文章的代码,需要自行设置文件格式。

总结

以上就是C语言当中graphics.h库具体的操作了,希望能够帮助到大家!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:14:33  更:2021-08-10 13:15:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 18:30:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码