门捷列夫的学校信息学表

(控制卡)
(专用于国际年的化学元素周期表)
(最新的补充是在2019年4月8日进行的。补充的清单就在削减之列)

图片
门捷列夫的花来源

我记得我们通过了鸭子。 这是一次三个课程:地理,自然科学和俄语。 在自然科学课中,鸭子被当作鸭子来研究,它有什么翅膀,什么腿,如何游泳等等。 在地理课程中,研究了同一只鸭子作为地球上的居民:有必要在地图上显示它的栖息地和不存在的地方。 塞拉菲玛·彼得罗夫娜(Serafima Petrovna)用俄语教我们写“ u-t-k-a”,并从布雷姆(Brem)那里读到一些有关鸭子的东西。 顺便说一句,她告诉我们,鸭在德国一般,鸭在法国一般。 看来它当时被称为“复杂方法”。 总的来说,一切都是顺其自然。

本杰明·卡夫林Benjamin Caverin) ,两名船长

在引用的引用中,本杰明·卡维林(Benjamin Kaverin)巧妙地展示了集成教学法的缺点,但是在某些(也许非常罕见)的情况下,这种方法的要素是合理的。 一个这样的例子是学校计算机科学课上的D.I. Mendeleev的周期表。 具有周期表的典型动作的程序自动化任务对于开始学习化学的学童是有说明性的,并且被划分为许多典型的化学问题。 同时,在计算机科学的框架内,该任务使我们能够以简单的形式演示控制卡的方法,该方法可以归因于图形编程,在广义上,该术语被理解为使用图形元素进行编程。

(2019年4月13日增加了:
附录3:化学测验
附录4:在一个程序中集成多个任务
2019年4月8日增加:
附录1:化学计算器的工作原理
附录2:过滤器的示例任务

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

图片

该问题可以在任何通用PL上解决。 我们将使用一个简单的旧Delpi-7,几乎每个人都可以理解。 但是在使用YP编程之前,我们将绘制两张图片,例如在Photoshop中。 首先,让我们在程序中绘制元素周期表。 将结果保存在图形文件table01.bmp中

图片

对于第二张图片,我们使用第一张。 我们将在RGB颜色模型中始终用唯一的颜色填充清除所有图形的表格单元。 R和G始终为0,氢代表B = 1,氦气代表2, 依此类推 。该数字将作为我们的控制卡,我们将其保存在文件table2.bmp下

图片

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

我们将TImage类的组件放在窗体上。 获取Image1 。 请注意,通常,对于大型项目,自动生成的ImageN类型的名称( 最好N可以达到几十个或更多)不是最佳的编程风格,应提供更有意义的名称。 但是在我们的小项目中, N不会超过2,您可以将其保留为生成状态。

Image1.Picture属性中加载文件table01.bmp 。 创建Image2并在其中加载我们的控制卡table2.bmp 。 在这种情况下,我们使组件较小并且对用户不可见,如表单的左下角所示。 添加其他控件,其目的显而易见。 在Delpi-7 IDE中完成GUI图形化编程的第二阶段。

图片

我们进入第三阶段-在IDE Delpi-7中编写代码。 该模块仅包含五个事件处理程序:创建表单( FormCreate ),沿Image1Image1MouseMove )移动光标,LMB单击单元格( Image1Click )并使用确定( OKBtnClick )或取消( CancelBtnClick按钮退出对话框。 这些处理程序的标头是使用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个元素(恒定大小 )。 显然,此大小可以增加。 元素名称(化学符号)被写入TableSymbols数组。 但是,出于源代码紧凑的原因,似乎建议以字符串常量PeriodicTableStr1 ,..., PeriodicTableStr4的形式写下这些表示法的序列,以便在创建表格时,程序将这些表示法按数组元素进行分散。 元素的每个名称都包含一个或两个拉丁字母,第一个字母为大写,第二个(如果有)为小写。 加载数组时将实现此简单规则。 因此,可以以简洁的方式写出符号序列而没有空格。 将序列分解为四个部分(常量PeriodicTableStr1 ,..., PeriodicTableStr4 )是由于考虑了读取源代码的便利性,因为 太长的线可能无法完全适合屏幕。

当鼠标光标移到Image1上时,此事件的Image1MouseMove处理程序确定当前光标坐标的Image2控件映射的像素颜色的蓝色分量的值。 通过Image2的构造,如果光标位于单元格内,则此值等于元素的编号; 如果在边界处则为0,在其他情况下为255。 该程序执行的其余操作是微不足道的,不需要解释。

除了上面提到的编程风格技巧外,还应注意注释的风格。 严格来说,所审查的代码是如此之小和简单,以至于注释看起来并不是特别有用。 但是,添加了它们,包括出于方法论的原因-短代码使您可以更清楚地得出一些一般性结论。 在提交的代码中,声明了一个类( TtableDlg )。 此类的方法可以互换,这不会影响程序的功能,但可能会影响其可读性。 例如,想象一个序列:

 OKBtnClick, Image1MouseMove, FormCreate, Image1Click, CancelBtnClick. 

它可能不是很引人注目,但是阅读和理解会变得有点困难。 如果没有五种方法,而是数十种方法,并且在实现部分中它们的顺序与类描述中的顺序完全不同,那么混乱只会增加。 因此,尽管很难严格证明甚至可能无法证明,但希望引入附加顺序可以提高代码的可读性。 通过对执行相似任务的几种方法进行逻辑分组,可以促进这种附加顺序。 每个组应有一个标题,例如:

 //   :    

这些标头应复制到模块顶部,并格式化为目录。 在某些模块足够长的情况下,此类目录可提供其他导航功能。 同样,在一个方法,过程或函数的较长主体中,首先值得标记该主体的结尾:

 end; // FormCreate 

其次,在以程序括弧开头-结束的分叉语句中,标记结束括号所引用的语句:

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

为了突出显示组的标题和方法主体的末端,您可以添加超出大多数运算符长度并且由例如分别由字符“ =”和“ _”组成的行。
同样,我们需要保留:我们有一个简单的例子。 而且,当方法代码无法显示在一个屏幕上时,很难找出连续六个末端进行代码更改的方法。 在某些较旧的编译器中,例如,用于OS IBM 360/370的Pascal 8000,该表格的服务列打印在左侧的列表中。

 B5 … E5 

这意味着E5行上的关闭程序括号与B5行上的打开括号相对应。

当然,编程风格是一个非常有争议的问题,因此,此处表达的思想只应考虑信息。 对于多年经验丰富且习惯了不同风格的两位经验丰富的程序员来说,工作非常困难。 另一件事是让学生编程还没有时间找到自己的风格的学生。 我认为在这种情况下,老师至少应该向学生传达这样一个简单但不明显的想法,即程序的成功很大程度上取决于其源代码的编写方式。 学生可能不会遵循推荐的样式,但至少应考虑是否需要采取“额外”措施来改进源代码的设计。

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

但是本地数据库不是限制。 该程序自然会连接到Internet。 选择一个元素后,将触发一个链接,并在Web浏览器窗口中打开有关该元素的Wikipedia文章。 如您所知,维基百科不是权威来源。 您可以设置指向权威来源的链接,例如化学百科全书,TSB,摘要期刊,此元素在搜索引擎中的订单查询等。 T.O. 学生将能够执行有关DBMS和Internet主题的简单但内容丰富的任务。

除了查询单个元素外,您还可以创建一个函数,该函数将用不同的颜色标记表中与特定条件相对应的单元格。 例如,金属和非金属。 或由当地化工厂排放到池塘中的细胞。

您还可以实现笔记本管理器的功能。 例如,在表格中突出显示考试中包含的元素。 然后突出显示学生为准备考试而研究/重复的内容。

例如,这里是学校化学的典型任务之一:

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

为了解决这个问题,您需要编写一个chem。 反应并在其中放置系数,计算碳酸钙和氯化氢的分子量,然后组成并求解比例。 基于我们的基本程序的计算器将能够计算和求解。 的确,仍然有必要考虑到必须以合理的过量和合理的浓度摄入酸,但这是化学而不是计算机科学。
附录1:化学计算器的工作原理
让我们以粉笔和大杂烩的上述问题为例来分析计算器的工作。 让我们从反应开始:

CaCO 3 + 2HCl = CaCl 2 + H 2 O

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

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


其中数组的索引对应于元素的编号。 我们还将两个字段放在表格tableDlg的可用空间上。 在第一个字段中最初写为:“给出了第一个试剂”,在第二个字段中是:“第二个试剂将找到x”。 分别表示字段agent1agent2 。 从计算器的以下示例中可以清楚地看到该程序的其他附加功能。

我们在计算机键盘上键入: 10g。agent1字段中的题词更改为:“给第一种试剂10 g”。 现在我们输入该试剂的公式,计算器将在您键入时读取并显示其分子量。

单击带有符号Ca的表格单元格上的LMB。 试剂1字段中的标题更改:“第一种试剂Ca 40.078的剂量为10 g。”

单击表格单元格上带有符号C的LMB。试剂1字段中的题词更改为:“给第一个试剂CaC 52.089 10 g”。 即 计算器添加了钙和碳的原子量。

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

单击表格单元格上带有O符号的LMB, agent1字段中的题词将更改为:“给第一个试剂CaCO2 84.087分配10 g”。 计算器再次将氧的原子量加到总和上。

单击表格单元格上带有O符号的LMB, agent1字段中的题词将更改为:“给第一个试剂CaCO3 100.086分配10 g”。 计算器再次将氧的原子量加到总和上。

按计算机键盘上的Enter。 第一种试剂的输入完成,并切换到agent2字段。 请注意,在此示例中,我们介绍了最低版本。 如果愿意,您可以轻松地组织相同类型的原子的倍增器,例如,当您输入色峰公式(K 2 Cr 2 O 7 )时,不必连续七次按下氧气电池。

在表的单元格上单击带有字母 H的LMB。试剂2字段中的题词将更改:“查找第二个试剂H 1.008 x”。

单击表格单元格上带有符号Cl的LMB。 试剂2字段中的标题更改:“第二试剂HCl 36.458查找x”。 计算器加上了氢和氯的原子量。 在上述反应方程式中,氯化氢的系数为2。因此,请单击“ agent2”字段上的LMB。 分子量增加一倍(两次按三下等)。 试剂2字段中的标题更改:“第二种试剂2HCl 72.916 find x”。

按计算机键盘上的Enter。 第二种试剂的输入完成,计算器从比例中找到x

x/72.916=10/100.086


需要找到哪个。

注释1.所获得比例的含义:要溶解100.086 Da的粉笔,需要72.916 Da的酸,而要溶解10 g的粉笔,则需要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; //    

在这里,我们根据化学式中化学元素的出现指数写出化学元素的数量。 在公式中添加currNo原子:
 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 Benfei的另一种元素系统来源

我们还补充说,最近在哈布雷(Habré)上发表的一篇文章中描述了元素周期表中当前存在的许多计算机程序。

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

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

2)选择发现《周期性法》时已知的所有元素。

3)突出炼金术士认为金属的七个元素。

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

5)选择在nu处于液态的所有元素

6)选择所有处于固态的固态元素。

7)选择所有可以长时间存在的元素,n.o不会有明显变化。

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

9)选择所有在n.a下可溶于硫酸的金属。

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

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

12)选择所有在水中常会与水剧烈反应的金属。

13)选择所有金属。

14)突出自然界中普遍存在的要素。

15)突出自然界中处于自由状态的元素。

16)突出在人体和动物中起关键作用的元素。

17)突出日常生活中广泛使用的元素(以游离形式或化合物形式)。

18)确定工作最危险并需要采取特殊措施和防护设备的元件。

19)突出以自由形式或化合物形式对环境构成最大威胁的元素。

20)突出贵金属。

21)突出比贵金属更贵的物品。

注意事项

1)确保多个过滤器的运行是有意义的。 例如,如果打开过滤器以解决问题1(中世纪已知的所有元素)和问题20(贵重金属),则带有中世纪已知贵重金属的电池(例如带有颜色的单元)将突出显示(例如,钯不突出显示)于1803年发现)。

2)确保以确保每个滤镜以其颜色突出显示单元格的方式确保多个滤镜的操作是有意义的,但并不能完全消除对另一个滤镜的选择(单元格的一部分采用一种颜色,另一种采用另一种颜色)。 然后,在先前示例的情况下,将看到中世纪的开放集合与贵金属的交集的元素,以及仅属于第一和第二集合的元素的交集。 即 中世纪未知的贵金属和中世纪已知的元素,但不是贵金属。

3)应用过滤器后,可以为结果提供其他工作的可能性。 例如,通过突出显示中世纪已知的元素,用户单击所选元素上的LMB,然后输入有关该元素的Wikipedia文章。

4)通过单击选定表单元格上的LMB,使用户能够取消选择是有意义的。 例如,删除已查看的项目。

5)维护文件中选定单元格的列表并通过自动选择单元格来加载此类文件是有意义的。 这将使用户有机会下班休息。

附录3:化学测验
与乘法表不同,小学生并没有被迫记住周期表,但是对化学感兴趣的那些人在学习化学表时以某种方式记住了几乎整个表。 可以通过了解周期法的本质来确保这一点:例如,为什么惰性气体占据了最右边的色谱柱,而卤素占据了附近的色谱柱。 知道一系列相同卤素的正确顺序有助于了解其化学性质。 因此,如果一个学生记住了元素周期表的大部分内容,则表明他对化学有很好的了解。 因此,以测验的形式竞争以测试这种可选的但可取的知识是有意义的。

在表格tableDlg的可用空间中, 我们放置了组件“一个元素的选择列表”。 此列表按字母顺序包含所有化学元素的名称。 在表中,我们清除所有单元格。 测验参与者必须选择LMB表单元以及该单元中应该在列表中的元素。 反之亦然:选择一个列表项,然后选择一个单元格。 如果选择正确,程序将在指定的单元格中输入元素的化学符号,并将其从列表中删除。 否则,参与者将获得一个罚款点。 得分计数器放置在可用空间tableDlg上 。 该程序还配备了一个计时器,用于计算参与者填写整个表格所花费的时间。 您可以提供一个轻量级的选项:不要填充镧系元素和act系元素。 获胜者取决于所花费的时间减去罚分。 例如,第一名获得10分,其中扣除罚分,第二名8分,第三名5分。

附录4:在一个程序中集成多个任务
上面,我们检查了许多可能的任务:化学元素目录,化学计算器和化学测验。 ( ). , ( ), .


我们预先使用了预定的静态控制卡,但是有许多重要的任务可以使用在程序运行期间更改的动态控制卡。一个示例是图形编辑器,其中用户使用鼠标指向顶点的位置并在顶点之间绘制边缘。要删除顶点或边,用户必须指向它。但是,如果圆所指示的顶点很容易指示,则细线绘制的边缘将更难以指向。此处的控制图会有所帮助,在该图中,顶点和边缘比可见图中的区域更宽。

一个有趣的附带问题与已解决的集成学习方法相关:该方法对教授AI有用吗?

Source: https://habr.com/ru/post/zh-CN446836/


All Articles