EDUCBA-C---图形编程笔记-全-
EDUCBA C++ 图形编程笔记(全)
001:使用图形编程在C++中创建销售图表 📊
在本节课中,我们将学习一个非常有趣的主题:如何在C++中绘制图表,包括条形图、饼图和折线图。
实际上,C++并非面向应用的语言,它是一种中级语言。但你可以通过使用图形命令在C++中绘制折线图、条形图和饼图。我们将要开发与销售管理相关的图表,其难度级别为中级。
项目概述
要完成这个项目,你必须具备以下技能:你必须具备C++命令的基础知识,即C++的基本语法;然后是C++图形命令。C++中的图形命令与基本语法级别的命令不同,你需要了解像素在屏幕上的排列方式。屏幕由许多小像素点组成,这些像素点会被颜色点亮。了解单个像素在屏幕上的排列方式,以及这对绘制条形图等图表有何帮助,是非常重要的。
你还应该具备销售的基本知识,因为我们将要创建对销售部分有帮助的图表。此外,坐标系的知识也是必需的,即基本的坐标系:X轴和Y轴,以及像素在此坐标系中的排列方式。
项目目标
项目目标是:参与者必须能够在大学级别或行业级别的项目中实现高级C++概念。然后,绘制条形图、饼图和折线图。学习如何在C++中输入数据,即输入命令和数据输入,并使用笛卡尔坐标系绘制图表。
你将学到什么
从这个项目中,你将学到如何在C++图形编程中使用笛卡尔坐标系。我之前提到过,笛卡尔坐标系描述了像素的排列方式,通常是X轴和Y轴,以及我们如何利用它来绘制图表。我们将用简单的C++语言进行实际编码。此外,你还将了解销售管理中使用的不同图表类型,并学习构建绘制条形图、饼图和折线图的逻辑。
先决条件
先决条件是:你应该具备C++的基础知识、销售管理的基础知识以及笛卡尔坐标系的知识。
目标学生
目标学生是:具备C++基础知识的学生、正在学习C++的学生以及C++图形开发者。
你将获得的技能
完成这个项目后,你将拥有以下技能:开发条形图、饼图和折线图逻辑的实时经验;学习如何在C++程序中输入数据;能够使用C++图形命令;能够构建在C++中绘制条形图、饼图和折线图的逻辑;并能够绘制这些图表。此外,你还能获得销售管理中使用的不同图表的知识。


考虑一个销售管理系统。在公司里,公司希望提升其销售额。因此,公司需要绘制去年、今年以及前几年的对比图表。在公司仪表板上,对比分析总是必需的,这样高层管理人员可以非常容易地看到他们的销售情况是上升还是下降。因此,这些图表在销售管理系统中非常重要,可以用条形图、饼图或折线图的格式来表示。


我们将以此为例。作为案例研究的一部分,将涵盖以下场景:我已经告诉过你,数据输入屏幕用于输入销售数据,选择图表类型后,将显示条形图、饼图或折线图的屏幕,三种图表类型将显示三个屏幕。
开始编码
我们将开始编码来绘制条形图。你需要有Turbo C++的IDE,或者你也可以使用Visual C++。我使用的是Turbo C++。你需要打开这个IDE环境。
你可以从这里开始,点击“新建文件”,然后按照我的解释输入代码。这是一个我已经写好的程序,我将逐步向你解释,你可以同时在你的空白文件中编写,并直接使用这个程序。
首先,你需要添加C++的内置库。C++会提供这些库,以便你可以直接使用。这些命令写在头文件中。如果你在这里查看,这些是printf命令的帮助文件。我使用了printf,所以需要包含这些头文件。
以下是使用的头文件:graphics.h、conio.h、dos.h、stdio.h、stdlib.h、string.h 和 stream.h。这是使用的语法:#include 后跟你的头文件,你可以这样输入和使用它。然后是 void main(),花括号打开,圆括号打开和关闭,然后花括号打开。这是C++的主要语法。
这里我使用的变量是:N1996、N1997、N1998 和 N1999,以及变量 i。我将这些用作整型变量。我们将输入这些数据,即前几年(1996、1997、1998、1999)的销售数据。


要输入数据,你需要使用 scanf 命令。scanf 命令的头文件是 stdio.h,我们已经包含了这个文件。
printf 命令,我们将写入“输入1996年的销售数据”,然后使用 scanf。%d 是语法,d 用于输入整数;如果是字符串,则需要使用 %s。这是一个数字,所以我使用了这个语法。scanf 的语法是:圆括号打开,引号内是 %d,引号关闭,逗号,然后是变量 &N1996,圆括号关闭,分号。这是 scanf 的语法。
printf 的语法是:圆括号打开,然后是字符串,圆括号关闭,分号。这是 printf 的语法。请记住,这是整个程序中我们将使用的语法。
所以,printf 输入1996年的销售数据,scanf 使用 %d 和 &N1996。然后,输入1997年的数据,语法与之前类似。我们在这里使用了它。然后 scanf,圆括号打开,%d,然后我们将输入第二年的数据,即1997年的数据。& 符号是语法,这是一个变量,这是 & 符号和输入 N1996 的语法。
这里我们所做的是输入了 N1997 年的数据。然后 printf,语法与之前类似。printf 输入1998年的销售数据。然后,scanf。然后是第三个变量,1998年的变量。scanf 使用 %d,然后输入1998年的变量。然后,printf 输入1999年的销售数据。并使用 scanf 输入1999年的数据。
现在,我们所做的是输入了销售数据。如果你以某个公司为例,该公司四年的总销售额,我们将在同一图表上进行比较,这样管理层可以非常容易地检查销售额是下降还是上升。
到目前为止,我们所做的是输入了销售数据,即我们已经完成了销售数据的输入。
总结

本节课中,我们一起学习了在C++中使用图形编程创建销售图表的基础知识。我们了解了项目的目标、所需的先决条件以及你将获得的技能。我们还开始了实际的编码过程,学习了如何输入销售数据,并理解了基本的C++语法和图形命令。在接下来的课程中,我们将继续构建图表的绘制逻辑并完成图表的显示。
002:绘制条形图(第二部分)
在本节课中,我们将学习如何在C++图形模式下绘制条形图。我们将从理解屏幕像素坐标系统开始,然后初始化图形模式,最后使用图形库函数绘制坐标轴和条形图。
概述:像素坐标与图形模式
上一节我们介绍了如何获取销售数据。本节中,我们来看看如何在屏幕上绘制条形图。首先需要理解C++图形编程中的像素坐标系统。
这是一个完整的屏幕。像素计数从左上角的 (0, 0) 开始。坐标向下和向右递增。例如,从 (0,0) 到 (1,0),(2,0) 等等。当用户输入销售数据时,我们会找出最大值和最小值。然后,我们可以设定一个像素值(例如300或100)作为最大值,并据此计算比例来决定条形的高度。或者,也可以直接根据数据在屏幕上绘制。
像素是屏幕上微小的点。通过图形命令用不同颜色高亮这些点,就能形成图像。在图形模式下操作,需要关注像素的排列方式和构建绘图逻辑。
初始化图形模式
目前我们处于文本模式。在文本模式下,输入字符会显示在屏幕上。但图形模式不同,它工作在像素级别,无法直接输入文本字符。为了进入图形模式,需要使用专门的图形命令。
以下是初始化图形模式所需的函数和变量。
首先,使用 initgraph 函数来初始化图形模式。该函数会自动检测计算机使用的图形驱动程序和桌面模式,并据此初始化。
我们需要先声明一些变量。变量名可以自定义,例如我使用了 gd(图形驱动器)、gm(图形模式)和 errorcode(错误代码)。这些变量的意义稍后会解释。


cleardevice() 命令用于清除屏幕。
DETECT 是C++中的保留字,用于自动检测图形驱动器。
initgraph(&gd, &gm, “C:\\turboc3\\BGI”); 用于初始化图形。这里的路径指向存储 BGI 驱动文件(如 EGAVGA.BGI)的目录。注意,路径中使用双反斜杠 \\,因为单反斜杠在C++中会被解释为转义字符,导致错误。
grapresult() 函数用于获取图形初始化的结果。
errorcode 变量用于存储可能出现的错误代码。语法是:errorcode = graphresult();。
如果存在错误(errorcode != grOk),则使用 printf(“Graphics error: %s\n”, grapherrormsg(errorcode)); 来打印错误信息。grapherrormsg 函数能从错误代码中提取对应的错误信息。

初始化图形模式后,使用 cleardevice() 清屏,并为用户打印提示信息:outtextxy(10, 10, “Program to draw a bar chart in C graphics”);。执行 initgraph 后,程序就进入了图形模式。



绘制坐标轴
现在,我们处于图形模式中。接下来需要绘制条形图的坐标轴。
我们需要绘制一条水平线作为X轴和一条垂直线作为Y轴。这里使用 line 命令,其函数原型定义在 graphics.h 头文件中。
line 命令的语法是:line(int x1, int y1, int x2, int y2);。其中 (x1, y1) 是线条起点的坐标,(x2, y2) 是线条终点的坐标。这基于笛卡尔坐标系。
例如,绘制Y轴的命令可能是:line(100, 400, 100, 60);。
绘制X轴的命令可能是:line(100, 400, 500, 400);。
这样就绘制出了基本的X轴和Y轴。

绘制条形图
到目前为止,我们已经完成了以下步骤:
- 包含必要的头文件(库)。
- 在屏幕上输入销售数据。
- 解释了屏幕像素排列方式。
- 使用
initgraph方法初始化了图形模式。 - 使用了清屏命令。
- 绘制了X轴和Y轴。



现在,我们将使用 bar 命令在屏幕上绘制条形图。
我使用了整数变量 barAdd 和 textP。
计算 barAdd 的公式是:barAdd = 399 - varAdd * 1996;。
这里 varAdd 是一个浮点变量,因为计算可能需要小数,所以不能使用整型数据类型。
399 是一个参考点。我们用它减去 varAdd * 1996 的结果。
varAdd 代表条形左上角的Y坐标。这是什么意思呢?请看 bar 命令。
bar 命令的语法是:bar(int left, int top, int right, int bottom);。
这些参数中,(left, top) 是矩形左上角的坐标,(right, bottom) 是矩形右下角的坐标。这些坐标的单位都是像素。

C++的优点在于,你可以通过点击获取命令的帮助信息。例如,bar(50, 50, 150, 400) 会绘制一个条形。其中 (50, 50) 是条形的左上角,(150, 400) 是条形的右下角。

为什么使用 399 呢?因为像素坐标从 (0,0) 开始。为了绘制条形,你需要从整个图形区域的高度中减去这个值,以获得实际的有效坐标。在标准的笛卡尔坐标系中,零点在左下角。但在C++图形模式中,零点在左上角。因此,我们需要用 399 减去计算出的值来绘制条形。

我还使用了 textP = barAdd - 20;。如果你想在条形顶部显示文本,就需要计算文本的像素位置。因此,我设置了文本坐标 textP 为 barAdd - 20。然后,你可以使用 outtextxy(150, textP, text); 在屏幕上绘制文本。


总结一下当前的步骤:
barAdd = 399 - varAdd * 1996;textP = barAdd - 20;setfillstyle(SOLID_FILL, RED);:这个函数设置填充模式和颜色。SOLID_FILL表示实心填充,RED是C++中表示红色的保留字,像素将用红色高亮。bar(150, barAdd, 200, 399);:这是主要的bar命令,用于在屏幕上绘制一个矩形(即条形)。outtextxy(150, textP, text);:outtextxy函数在图形模式的视口中显示字符串。其语法是outtextxy(int x, int y, char *textstring);,其中(x, y)是文本字符串的坐标。itoa()命令:这是一个变量转换命令,将整数转换为字符串。在图形模式下,不能直接显示整数文本,必须将其转换为字符串,因为outtextxy需要的textstring参数是字符数组(字符串)类型。

总结



本节课中,我们一起学习了在C++图形模式下绘制条形图的核心步骤。我们从理解像素坐标系开始,然后初始化了图形模式,绘制了X轴和Y轴,最后详细讲解了使用 bar 命令绘制条形、使用 setfillstyle 设置样式以及使用 outtextxy 添加文本标签的过程。关键是要注意图形坐标原点在左上角,这与数学中的笛卡尔坐标系不同,在计算位置时需要转换。
003:条形图第四部分 📊

在本节课中,我们将学习如何使用C++的图形编程功能,根据用户输入的数据,绘制一个包含多个年份销售数据的条形图。我们将重点讲解如何将整数数据转换为字符串进行显示,以及如何为不同年份的条形设置不同的颜色。

概述
上一节我们介绍了如何绘制单个条形并设置其样式。本节中,我们将继续完善程序,为多个年份(1996, 1997, 1998, 1999)的销售数据分别绘制条形,并为每个条形添加对应的年份标签和数值标签。核心在于使用 itoa 函数进行数据转换,并使用 outtextxy 函数在图形界面上显示文本。
核心概念:itoa 函数
itoa 函数用于将整数(int)转换为字符串(字符数组)。其语法如下:
char* itoa(int value, char* str, int base);
value: 要转换的整数值。str: 指向存储结果字符串的字符数组的指针。base: 转换所使用的基数,必须在2到36之间(包含)。对于十进制数,我们使用10。
如果 value 是负数且基数 base 为10,转换后的字符串第一个字符将是负号(-)。通过这个函数,我们可以将销售数据(整数)转换为字符串,然后使用 outtextxy 命令将其显示在图形屏幕上。
绘制1997年条形图
现在,我们来看看如何为1997年的数据绘制条形图。方法与1996年类似,但会使用不同的颜色和位置。
以下是绘制1997年条形图的步骤:
- 计算条形高度:
bar_add = 399 - (sales_1997 * 2);。这里sales_1997是用户输入的1997年销售额。乘数2是一个缩放因子,用于在图形视口中更好地显示条形。 - 计算文本位置:
text_pix = bar_add - 20;。将文本显示位置设置在条形顶部上方20像素处,确保标签清晰可见。 - 设置填充样式和颜色:
setfillstyle(SOLID_FILL, GREEN);。这里我们使用绿色填充条形,以区别于1996年的红色。 - 绘制条形:
bar(225, bar_add, 275, 399);。此命令绘制一个矩形。(225, bar_add)是条形左上角的坐标。(275, 399)是条形右下角的坐标。- 条形宽度固定为
275 - 225 = 50像素。 - 条形高度由
399 - bar_add动态决定,取决于销售数据。
- 显示年份标签:
outtextxy(225, 440, "1997");在坐标(225, 440)处显示文本“1997”。 - 显示销售数据标签:
- 首先将整数
sales_1997转换为字符串:itoa(sales_1997, text, 10);。 - 然后在条形上方显示该字符串:
outtextxy(225, text_pix, text);。
- 首先将整数
绘制1998年与1999年条形图
遵循相同的模式,我们可以继续为1998年和1999年的数据绘制条形图。主要变化是条形在X轴上的起始位置依次右移,以及使用不同的颜色。
以下是后续年份的实现要点:
-
1998年条形图:
- 条形左上角X坐标:
300 - 使用颜色:
BLUE - 绘制命令:
bar(300, bar_add, 350, 399);(条形宽度仍为50像素) - 标签位置相应调整。
- 条形左上角X坐标:
-
1999年条形图:
- 条形左上角X坐标:
375 - 使用颜色:
YELLOW - 绘制命令:
bar(375, bar_add, 425, 399); - 标签位置相应调整。
- 条形左上角X坐标:
每个年份的条形高度都通过公式 bar_add = 399 - (sales_year * 2); 独立计算,其中 sales_year 是对应年份的销售数据。
程序运行与结果展示
在代码的最后,我们使用 getch(); 函数等待用户按键,以便观察生成的图形窗口。
现在,我们将运行完整的程序。程序会提示用户依次输入1996至1999四个年份的销售数据。例如,我们输入:60, 80, 100, 120。

程序运行后,将在图形模式下显示一个条形图。X轴下方标有年份(1996, 1997, 1998, 1999),每个条形上方显示其对应的销售数据。条形使用不同的颜色(红、绿、蓝、黄)区分,直观地比较了这四年间的销售情况。


生成的条形图清晰地展示了输入数据(60, 80, 100, 120)对应的条形高度递增趋势。



总结
本节课中我们一起学习了如何使用C++图形库创建多数据系列的条形图。我们掌握了以下几个关键点:
- 使用
bar()函数绘制矩形条形。 - 使用
setfillstyle()函数为不同的条形设置不同的颜色。 - 使用
itoa()函数将整型销售数据转换为字符串。 - 使用
outtextxy()函数在图形屏幕上精确位置显示文本标签(年份和数值)。 - 通过计算动态确定条形的高度和位置,从而将用户输入的数据可视化。


通过本课程,你已经能够编写一个完整的C++程序,它接收用户输入,并生成一个具有多组数据、颜色区分和清晰标签的销售条形图。
004:绘制饼图 🥧

在本节课中,我们将学习如何使用C++的图形编程功能来绘制一个饼图。之前我们已经学习了如何绘制柱状图并输入销售数据,本节将重点介绍饼图的绘制原理和实现步骤。
概述
饼图是一种圆形图表,用于展示各部分数据占总体的比例。我们将通过C++图形库中的特定函数,将四个年份的销售数据可视化为一个饼图。
图形初始化
与绘制柱状图类似,我们首先需要初始化图形模式。以下是初始化图形系统的基本代码结构。

#include <graphics.h>
#include <stdio.h>
#include <conio.h>
int main() {
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "C:\\TC\\BGI");
errorcode = graphresult();
if (errorcode != grOk) {
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}
// ... 后续绘图代码
getch();
closegraph();
return 0;
}

这段代码的作用是检测并初始化图形驱动器,如果初始化失败则输出错误信息并退出。
数据输入
在绘制图表前,我们需要从用户那里获取四个年份的销售数据。以下是使用printf和scanf函数在文本模式下输入数据的示例。
int n1996, n1997, n1998, n1999;
printf("Enter the sales data for year 1996: ");
scanf("%d", &n1996);
printf("Enter the sales data for year 1997: ");
scanf("%d", &n1997);
printf("Enter the sales data for year 1998: ");
scanf("%d", &n1998);
printf("Enter the sales data for year 1999: ");
scanf("%d", &n1999);



饼图绘制逻辑
饼图的核心是将数据值转换为圆上的角度。一个完整的圆是360度。每个数据部分所占的角度由其值在总和中的比例决定。
我们首先计算所有数据的总和(max),然后确定单位数据值对应的角度(one_ps)。
int max = n1996 + n1997 + n1998 + n1999;
float one_ps = 360.0 / max;
接着,我们计算每个年份数据段的起始角度和结束角度。第一个数据段(1996年)的起始角度为0。
int st1996 = 0;
int en1996 = one_ps * n1996;

int st1997 = en1996;
int en1997 = st1997 + (one_ps * n1997);

int st1998 = en1997;
int en1998 = st1998 + (one_ps * n1998);

int st1999 = en1998;
int en1999 = st1999 + (one_ps * n1999);
使用 pieslice 函数绘图
pieslice 函数用于绘制饼图的一个扇形切片。其语法如下:
pieslice(x, y, stangle, endangle, radius)
其中,(x, y) 是圆心坐标,stangle 和 endangle 是扇形的起始和结束角度(以度为单位),radius 是半径。
以下是绘制四个年份数据扇形的代码。我们为每个扇形设置了不同的填充颜色。
// 设置填充样式和颜色,并绘制扇形
setfillstyle(SOLID_FILL, YELLOW);
pieslice(320, 240, st1996, en1996, 100);
setfillstyle(SOLID_FILL, BROWN);
pieslice(320, 240, st1997, en1997, 100);
setfillstyle(SOLID_FILL, BLUE);
pieslice(320, 240, st1998, en1998, 100);


setfillstyle(SOLID_FILL, GREEN);
pieslice(320, 240, st1999, en1999, 100);


完整代码示例
将以上所有部分组合起来,就得到了绘制销售数据饼图的完整程序。运行程序后,输入四个数据(例如80, 120, 60, 100),即可在图形窗口中看到对应的饼图。

总结


本节课我们一起学习了在C++中使用图形编程绘制饼图的方法。我们回顾了图形模式的初始化、数据的文本输入、将数据转换为角度的逻辑,以及使用 pieslice 函数绘制彩色扇形切片的具体步骤。通过本教程,你应该能够理解饼图的基本原理并动手实现一个简单的销售数据饼图。

浙公网安备 33010602011771号