學校電腦科學元素週期表

(控制卡)
(獻給國際化學元素週期表年)
(最新新增時間為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.

在表單上放置一個類別元件 的TImage。 我們得到 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 提供從鍵盤輸入試劑配方的能力是有意義的。 在這種情況下,您將需要實作一個簡單的解析器。

值得一提的是:

如今,該表已有數百個版本,科學家們也不斷提供新的選擇。 (維基百科)

學生可以透過實施已經提出的選項之一或嘗試製作自己的原創選項來展示他們在這個方向上的聰明才智。 這似乎是計算機科學課程中最無用的方向。 然而,在本文中實現的元素週期表形式中,一些學生可能看不到控制卡相對於使用標準按鈕的替代解決方案的任何特殊優勢 T按鈕。 表格的螺旋形狀(其中單元格具有不同形狀)將更清楚地展示此處提出的解決方案的優點。

學校電腦科學元素週期表
(西奧多·本菲 (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) 確保所選單元格的清單保存在文件中並且加載此類文件時自動選擇單元格是有意義的。 這將使用戶有機會從工作中休息一下。

我們使用了靜態的、預先確定的控製圖,但是有許多重要的任務可以使用隨著程式運作而變化的動態控製圖。 一個例子是圖形編輯器,其中使用者使用滑鼠來指示視窗中頂點的位置並在它們之間繪製邊緣。 要刪除頂點或邊,使用者必須指向它。 但是,如果指向用圓圈標記的頂點很容易,那麼指向用細線繪製的邊就會更困難。 控制圖在這裡會有所幫助,其中頂點和邊佔據比可見圖中更廣泛的鄰域。

與這種複雜訓練方法相關的一個有趣的附帶問題是:這種方法可用於訓練人工智慧嗎?

來源: www.habr.com

添加評論