学校计算机科学元素周期表

(控制卡)
(献给国际化学元素周期表年)
(最新添加时间为8年2019月XNUMX日。添加列表紧接在删减下方)

学校计算机科学元素周期表
(门捷列夫的花, )

我记得我们经过了那只鸭子。这是三门课:地理、自然科学和俄语。在科学课上,我们研究了一只鸭子,它有什么翅膀,有什么腿,它是如何游泳的,等等。在地理课上,同一只鸭子被当作地球上的居民来研究:有必要在地图上显示它住在哪里和不住在哪里。塞拉菲玛·彼得罗夫娜 (Serafima Petrovna) 用俄语教我们写“u-t-k-a”,并读了一些有关布雷姆鸭子的内容。顺便告诉我们,德语中的鸭子是这样的,法语中的鸭子是这样的。我认为这在当时被称为“复杂方法”。一般来说,一切都是“顺便”发生的。

维尼亚明·卡维林, 两位队长

在上面的引文中,Veniamin Kaverin 巧妙地展示了复杂教学方法的缺点,但是,在某些(可能非常罕见)情况下,这种方法的要素是合理的。其中一个例子是学校计算机科学课程中 D.I. 门捷列夫的元素周期表。元素周期表典型动作的软件自动化任务对于刚开始学习化学的小学生来说是很清楚的,并且分为许多典型的化学问题。同时,在计算机科学的框架内,这个任务使我们能够以简单的形式演示控制卡的方法,这可以归因于图形编程,广义上理解为使用图形元素进行编程。

(8 年 2019 月 XNUMX 日补充:
附录 1:化学计算器的工作原理
附录2:过滤器任务示例)

让我们从基本任务开始。在最简单的情况下,元素周期表应以窗口形式显示在屏幕上,其中每个单元格中都有元素的化学名称:H - 氢、He - 氦等。如果鼠标光标指向某个单元格,则该元素的名称及其编号将显示在表单上的特殊字段中。如果用户按下 LMB,则该所选元素的名称和编号将在表单的另一个字段中指示。

学校计算机科学元素周期表

该问题可以使用任何通用语言来解决。我们将采用简单的旧版 Delpi-7,它几乎每个人都可以理解。但在使用 PL 编程之前,我们先画两张图,例如在 Photoshop 中。首先,让我们以我们希望在程序中看到的形式绘制元素周期表。将结果保存在图形文件中 表01.bmp.

学校计算机科学元素周期表

对于第二张图,我们使用第一张图。我们将使用 RGB 颜色模型中的独特颜色依次填充表格单元格(清除所有图形)。 R 和 G 始终为 0,B=1(氢)、2(氦)等。这张图将是我们的控制卡,我们将其保存在名为 表2.bmp.

学校计算机科学元素周期表

Photoshop中图形编程的第一阶段已经完成。让我们继续在 Delpi-7 IDE 中进行图形 GUI 编程。为此,打开一个新项目,在主窗体上放置一个对话框按钮(表Dlg),其中将进行表的操作。接下来我们使用表单 表Dlg.

在表单上放置一个类组件 图像。我们得到 Image1。请注意,一般来说,对于大型项目,会自动生成以下形式的名称 图像N哪里 N 可以达到几十个或更多——这不是最好的编程风格,应该给出更有意义的名称。但在我们的小项目中, N 不会超过2,您可以将其保留为生成状态。

至物业 Image1.图片 上传文件 表01.bmp。 我们创造 Image2 并在那里加载我们的控制卡 表2.bmp。在本例中,我们使文件变小并且对用户不可见,如表单左下角所示。我们添加了额外的控制元素,其目的是显而易见的。 Delpi-7 IDE 中图形GUI 编程的第二阶段已完成。

学校计算机科学元素周期表

让我们进入第三阶段——在 Delpi-7 IDE 中编写代码。该模块仅包含五个事件处理程序:表单创建(表单创建)、光标移动 Image1 (Image1鼠标移动),在单元格上单击 LMB(图片1点击)并使用“确定”按钮退出对话框(OK按钮点击) 或取消 (取消按钮单击)。这些处理程序的标头是使用 IDE 以标准方式生成的。

模块源码:

unit tableUnit;
// Периодическая таблица химических элементов Д.И.Менделеева
//
// third112
// https://habr.com/ru/users/third112/
//
// Оглавление
// 1) создание формы
// 2) работа с таблицей: указание и выбор
// 3) выход из диалога

interface

uses Windows, SysUtils, Classes, Graphics, Forms, Controls, StdCtrls, 
  Buttons, ExtCtrls;

const
 size = 104; // число элементов
 
type
 TtableDlg = class(TForm)
    OKBtn: TButton;
    CancelBtn: TButton;
    Bevel1: TBevel;
    Image1: TImage;  //таблица химических элементов
    Label1: TLabel;
    Image2: TImage;  //управляющая карта
    Label2: TLabel;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject); // создание формы
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);                        // указание клетки
    procedure Image1Click(Sender: TObject); // выбор клетки
    procedure OKBtnClick(Sender: TObject);  // OK
    procedure CancelBtnClick(Sender: TObject); // Cancel
  private
    { Private declarations }
    TableSymbols : array [1..size] of string [2]; // массив обозначений элементов
  public
    { Public declarations }
    selectedElement : string; // выбранный элемент
    currNo : integer;         // текущий номер элемента
  end;

var
  tableDlg: TtableDlg;

implementation

{$R *.dfm}

const
PeriodicTableStr1=
'HHeLiBeBCNOFNeNaMgAlSiPSClArKCaScTiVCrMnFeCoNiCuZnGaGeAsSeBrKrRbSrYZrNbMoTcRuRhPdAgCdInSnSbTeIXeCsBaLa';
PeriodicTableStr2='CePrNdPmSmEuGdTbDyHoErTmYbLu';
PeriodicTableStr3='HfTaWReOsIrPtAuHgTlPbBiPoAtRnFrRaAc';
PeriodicTableStr4='ThPaUNpPuAmCmBkCfEsFmMdNoLrKu ';

// создание формы  ==================================================

procedure TtableDlg.FormCreate(Sender: TObject);
// создание формы
var
  s : string;
  i,j : integer;
begin
  currNo := 0;
// инициализация массива обозначений элементов:
  s := PeriodicTableStr1+ PeriodicTableStr2+PeriodicTableStr3+PeriodicTableStr4;
  j := 1;
  for i :=1 to size do
   begin
     TableSymbols [i] := s[j];
     inc (j);
     if s [j] in ['a'..'z'] then
      begin
        TableSymbols [i] := TableSymbols [i]+ s [j];
        inc (j);
      end; // if s [j] in
   end; // for i :=1
end; // FormCreate ____________________________________________________

// работа с таблицей: указание и выбор =========================================

procedure TtableDlg.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
// указание клетки
var
  sl : integer;
begin
  sl := GetBValue(Image2.Canvas.Pixels [x,y]);
  if sl in [1..size] then
   begin
    Label1.Caption := intToStr (sl)+ ' '+TableSymbols [sl];
    currNo := sl;
   end
  else
    Label1.Caption := 'Select element:';
end; // Image1MouseMove   ____________________________________________________

procedure TtableDlg.Image1Click(Sender: TObject);
begin
  if currNo <> 0 then
   begin
    selectedElement := TableSymbols [currNo];
    Label2.Caption := intToStr (currNo)+ ' '+selectedElement+ ' selected';
    Edit1.Text := selectedElement;
   end;
end; // Image1Click  ____________________________________________________

// выход из диалога  ==================================================

procedure TtableDlg.OKBtnClick(Sender: TObject);
begin
    selectedElement := Edit1.Text;
    hide;
end;  // OKBtnClick ____________________________________________________

procedure TtableDlg.CancelBtnClick(Sender: TObject);
begin
  hide;
end;  // CancelBtnClick ____________________________________________________

end.

在我们的版本中,我们采用了包含 104 个元素的表(常数 尺寸)。显然这个尺寸可以增加。元素名称(化学符号)写入数组 表格符号。然而,出于源代码紧凑的原因,似乎建议将这些符号的序列以字符串常量的形式编写 周期表Str1,..., 周期表Str4这样,当创建表单时,程序本身会将这些名称分散在数组的元素中。每个元素名称由一个或两个拉丁字母组成,第一个字母大写,第二个(如果有)小写。这个简单的规则是在加载数组时实现的。因此,可以以没有空格的简洁方式来书写符号序列。将序列分成四个部分(常数 周期表Str1,..., 周期表Str4)是出于方便阅读源码的考虑,因为太长的线可能无法完全适合屏幕。

当鼠标光标移到 Image1 处理程序 Image1鼠标移动 该事件确定控制卡像素的蓝色分量的值 Image2 为当前光标坐标。按施工 Image2 如果光标位于单元格内,则该值等于元素编号;如果在边界上则为零,在其他情况下为 255。该程序执行的其余操作很简单,不需要解释。

除了上面提到的风格编程技术之外,值得注意的是注释风格。严格来说,所讨论的代码是如此之小和简单,以至于注释似乎不是特别必要。然而,添加它们也是出于方法上的原因——短代码使我们能够更清楚地得出一些一般性结论。在所提供的代码中声明了一个类(表Dlg)。此类的方法可以交换,这不会以任何方式影响程序的功能,但可能会影响其可读性。例如,想象一下序列:

OKBtnClick, Image1MouseMove, FormCreate, Image1Click, CancelBtnClick.

它可能不是很明显,但会变得更难以阅读和理解。如果该部分中的方法不是五个,而是数十倍 履行 它们的顺序与类描述中的顺序完全不同,那么混乱只会增加。因此,尽管严格证明很难甚至不可能,但我们可以希望引入额外的顺序来提高代码的可读性。通过对执行相关任务的几种方法进行逻辑分组,可以促进这种附加顺序。每个组都应该有一个标题,例如:

// работа с таблицей: указание и выбор

这些标题应复制到模块的开头并格式化为目录。在某些模块相当长的情况下,此类目录提供了额外的导航选项。同样,在一个方法、过程或函数的长主体中,值得首先标记该主体的结尾:

end; // FormCreate

其次,在带有程序括号 begin - end 的分支语句中,标记右括号所指的语句:

      end; // if s [j] in
   end; // for i :=1
end; // FormCreate

要突出显示组标题和方法体的末尾,您可以添加比大多数语句更长的行,例如分别包含字符“=”和“_”。
再次,我们需要预约:我们的例子太简单了。当一个方法的代码无法在一个屏幕上显示时,可能很难理解连续六端进行代码更改。在一些旧的编译器中,例如,Pascal 8000 for OS IBM 360/370,这样的服务列打印在列表的左侧

B5
…
E5

这意味着 E5 行的右括号对应于 B5 行的左括号。

当然,编程风格是一个很有争议的问题,所以这里表达的想法仅供思考。对于两个相当有经验的程序员来说,他们在多年的工作中已经发展并习惯了不同的风格,要达成一致是非常困难的。对于一个正在学习编程、还没有时间找到自己风格的学生来说,这是另一回事。我认为在这种情况下,老师至少应该向学生传达这样一个简单但不明显的想法:程序的成功很大程度上取决于源代码的编写风格。学生可能不会遵循推荐的风格,但至少让他思考是否需要“额外”的动作来改进源代码的设计。

回到元素周期表上的基本问题:进一步的发展可以朝不同的方向发展。其中一个方向可供参考:当您将鼠标光标悬停在表格单元格上时,会出现一个信息窗口,其中包含有关指定元素的附加信息。进一步的发展是过滤器。例如,根据安装情况,信息窗口将仅包含:最重要的物理和化学信息、发现历史信息、自然界分布信息、最重要化合物列表(包括该元素)、生理特性、外语名称等。 e. 记住本文开头的 Kaverin 的“鸭子”,我们可以说,随着程序的开发,我们将获得自然科学方面的完整训练综合体:除了计算机之外科学、物理和化学——生物学、经济地理学、科学史甚至外语。

但本地数据库并不是限制。该程序自然地连接到互联网。当您选择一个元素时,该链接将被激活,并且有关该元素的维基百科文章将在 Web 浏览器窗口中打开。如您所知,维基百科不是权威来源。您可以设置权威来源的链接,例如化学百科全书、TSB、摘要期刊、在搜索引擎中对该元素的排序查询等。那。学生将能够完成关于 DBMS 和互联网主题的简单但有意义的作业。

除了对单个元素进行查询之外,您还可以创建一些功能,例如,用不同的颜色标记表中满足特定条件的单元格。例如,金属和非金属。或者由当地化工厂倾倒到水体中的细胞。

您还可以实现笔记本整理器的功能。例如,在表中突出显示考试中包含的要素。然后突出显示学生在准备考试时学习/重复的内容。

例如,这是典型的学校化学问题之一:

给予 10 克粉笔。需要多少盐酸才能溶解所有这些粉笔?

为了解决这个问题,有必要写下化学式。反应并代入系数,计算出碳酸钙和氯化氢的分子量,然后组合并求解比例。基于我们的基本程序的计算器可以计算并求解。确实,您仍然需要考虑到酸的摄入量必须合理过量且浓度合理,但这是化学,而不是计算机科学。
附录 1:化学计算器的工作原理我们以上面的粉笔和“大杂烩”问题为例来分析一下计算器的操作。让我们从反应开始:

CaCO3 + 2HCl = CaCl2 + H2O

由此我们可以看出,我们需要以下元素的原子量:钙 (Ca)、碳 (C)、氧 (O)、氢 (H) 和氯 (Cl)。在最简单的情况下,我们可以将这些权重写入一个一维数组,定义为

AtomicMass : array [1..size] of real;

其中数组索引对应于元素编号。有关表单可用空间的更多信息 表Dlg 放置两个字段。在第一个字段中最初写的是:“给出第一个试剂”,在第二个字段中写的是“第二个试剂是找到x”。让我们来表示字段 试剂1, 试剂2 分别。从以下计算器示例中可以清楚地看出该程序的其他添加内容。

我们在电脑键盘上输入:10 g。在字段中的铭文 试剂1 变化:“第一种试剂给予 10 克。”现在我们输入该试剂的分子式,计算器将在您输入时计算并显示其分子量。

单击带有 Ca 符号的表格单元格上的 LMB。田野上的铭文 试剂1 更改:“第一个试剂 Ca 40.078 给出 10 g。”

单击带有符号 C 的表格单元格上的 LMB。字段中的铭文 试剂1 更改:“第一个试剂 CaC 52.089 给出 10 g。”那些。计算器将钙和碳的原子量相加。

单击带有符号 O 的表格单元格上的 LMB。字段中的铭文 试剂1 更改:“第一个试剂 CaCO 68.088 给出 10 g。”计算器将氧的原子量添加到总和中。

单击带有符号 O 的表格单元格上的 LMB。字段中的铭文 试剂1 更改:“第一个试剂 CaCO2 84.087 给出 10 g。”计算器再次将氧的原子量添加到总和中。

单击带有符号 O 的表格单元格上的 LMB。字段中的铭文 试剂1 更改:“第一个试剂 CaCO3 100.086 给出 10 克。”计算器再次将氧的原子量添加到总和中。

按计算机键盘上的 Enter 键。第一种试剂导入完成,切换至现场 试剂2。请注意,在此示例中我们提供了最小版本。如果需要,您可以轻松组织相同类型原子的乘数,例如,在输入铬公式 (K2Cr2O7) 时,您不必在氧电池上连续单击七次。

单击带有符号 H 的表格单元格上的 LMB。字段中的铭文 试剂2 更改:“第二试剂 H 1.008 找到 x。”

单击带有 Cl 符号的表格单元格上的 LMB。田野上的铭文 试剂2 更改:“第二试剂 HCl 36.458 找到 x。”计算器将氢和氯的原子量相加。在上述反应方程式中,氯化氢前面的系数为 2。因此,单击字段上的 LMB 试剂2。分子量加倍(按两次等时增加三倍)。田野上的铭文 试剂2 更改:“第二试剂 2HCl 72.916 找到 x。”

按计算机键盘上的 Enter 键。第二个试剂录入完成,计算器根据比例求出x

学校计算机科学元素周期表

这就是我们需要找到的。

注意1。 所得比例的含义:溶解100.086 Da 粉笔需要 72.916 Da 酸,要溶解 10 克粉笔,需要 x 酸。

注意2。 类似问题集锦:

Khomchenko I. G.,化学问题和练习集,2009 年(8-11 年级)。
Khomchenko G. P.,Khomchenko I. G.,大学申请者化学问题集,2019。

注意3。 为了简化任务,您可以简化初始版本中公式的输入,只需将元素符号添加到公式行的末尾即可。那么碳酸钙的化学式为:
碳酸钙
但化学老师不太可能喜欢这样的录音。做出正确的输入并不难 - 为此,您需要添加一个数组:

formula : array [1..size] of integer;

其中索引是化学元素的编号,该索引处的值是原子的数量(最初数组的所有元素都重置为零)。应考虑化学中采用的化学式中原子的书写顺序。例如,也很少有人会喜欢O3CaC。让我们把责任转移给用户。制作数组:

 formulaOrder : array [1..size] of integer; // можно взять покороче

其中我们根据化学元素在公式中出现的索引写下该化学元素的编号。添加一个原子 当前编号 代入公式:

if formula [currNo]=0 then //этот атом встретился первый раз
 begin
 orderIndex := orderIndex+1;//в начале ввода формулы orderIndex=0
 formulaOrder [orderIndex] :=  currNo;
 end;
formula [currNo]:=formula [currNo]+1;

将公式写到一行:

s := ''; // пустая строка для формулы
for i:=1 to  orderIndex do // для всех хим.символов в формуле 
 begin
 s:=s+TableSymbols [ formulaOrder[i]];// добавляем хим.символ
 if formula [formulaOrder[i]]<>1 then //добавляем кол-во атомов
  s:=s+ intToStr(formula [formulaOrder[i]]);
 end;

注意4。 提供从键盘输入试剂配方的能力是有意义的。在这种情况下,您将需要实现一个简单的解析器。

值得一提的是:

如今,该表已有数百个版本,科学家们也在不断提供新的选择。 (维基百科)

学生可以通过实施已经提出的选项之一或尝试制作自己的原创选项来展示他们在这个方向上的聪明才智。这似乎是计算机科学课程中最无用的方向。然而,在本文中实现的元素周期表形式中,一些学生可能看不到控制卡相对于使用标准按钮的替代解决方案的特殊优势 TButton的。表格的螺旋形状(其中单元格具有不同形状)将更清楚地展示此处提出的解决方案的优点。

学校计算机科学元素周期表
(西奥多·本菲 (Theodore Benfey) 的替代元素系统, )

我们还要补充一点,最近在 Habré 上发表的文章中描述了一些当前存在的元素周期表计算机程序 文章.

附录 2:过滤器任务示例例如,使用过滤器可以解决以下任务:

1)在表中选择所有中世纪已知的元素。

2) 找出发现周期律时已知的所有元素。

3) 找出炼金术士认为是金属的七种元素。

4) 选择在正常条件下(n.s.)处于气态的所有元素。

5) 选择编号为液态的所有元素。

6) 选择编号为固态的所有元素。

7) 选择在正常条件下能长期暴露在空气中而无明显变化的所有元件。

8) 选择所有能溶于盐酸的金属。

9) 选择所有溶于硫酸的金属。

10) 选择所有加热时可溶于硫酸的金属。

11) 选择所有溶于硝酸的金属。

12) 隔离所有在环境条件下与水剧烈反应的金属。

13) 选择所有金属。

14) 识别自然界中广泛存在的元素。

15) 识别自然界中以游离态存在的元素。

16) 确定在人体和动物体内发挥最重要作用的元素。

17) 选择日常生活中广泛使用的元素(自由形式或组合形式)。

18) 识别工作中最危险且需要特殊措施和防护设备的元件。

19) 确定对环境构成最大威胁的游离形式或化合物形式的元素。

20)选择贵金属。

21)识别比贵金属更昂贵的元素。

笔记

1)提供多个过滤器是有意义的。例如,如果您打开过滤器来解决问题 1(中世纪已知的所有元素)和 20(贵金属),那么含有中世纪已知的贵金属的单元格将突出显示(例如,按颜色)(例如,钯金将不会突出显示,于1803年开放)。

2)确保多个过滤器以这样的模式运行是有意义的:每个过滤器选择具有自己颜色的单元格,但不会完全删除另一个过滤器的选择(单元格的一部分为一种颜色,一部分为另一种颜色)。然后,在前面的示例中,中世纪发现的集合交集的元素和贵金属,以及仅属于第一集合和仅属于第二集合的元素将可见。那些。中世纪未知的贵金属,以及中世纪已知但不贵金属的元素。

3)应用过滤器后才有意义,以确保获得的结果可以进行其他工作。例如,选择了中世纪已知的元素后,用户在所选元素上单击 LMB 并转到有关该元素的维基百科文章。

4) 为用户提供通过单击所选表格单元格上的 LMB 来取消选择的能力是有意义的。例如,删除已查看的项目。

5) 确保所选单元格的列表保存在文件中并且加载此类文件时自动选择单元格是有意义的。这将使用户有机会从工作中休息一下。

我们使用了静态的、预先确定的控制图,但是有许多重要的任务可以使用随着程序运行而变化的动态控制图。一个例子是图形编辑器,其中用户使用鼠标来指示窗口中顶点的位置并在它们之间绘制边。要删除顶点或边,用户必须指向它。但是,如果指向用圆圈标记的顶点很容易,那么指向用细线绘制的边就会更困难。控制图在这里会有所帮助,其中顶点和边占据比可见图中更广泛的邻域。

与这种复杂训练方法相关的一个有趣的附带问题是:这种方法可用于训练人工智能吗?

来源: habr.com

添加评论