Розробка програми обчислення суми від’ємних елементів масиву

Розробка програми обчислення суми від’ємних елементів масиву. Демонстрація використання методів та властивостей елементу управління DataGridView


Зміст


Умова задачі

Задано масив з n чисел типу double (n = 1..10). Розробити програму, яка знаходить суму від’ємних елементів цього масиву. Програму реалізувати як Windows-додаток, створений за шаблоном Windows Forms Application. У програмі передбачити:

  • ввід значення n (розмірність масиву);
  • ввід значень елементів масиву;
  • виведення результату в окремій формі.

Ввід даних та вивід результату повинен виконуватись у декілька етапів за зразком майстра.

Виконання

1. Завантажити систему Microsoft Visual Studio. Створити додаток за шаблоном Windows Forms Application. Зберегти проект

Після завантаження Microsoft Visual Studio, щоб створити додаток за шаблоном Windows Forms Application потрібно виконати послідовність команд:

File -> New -> Project...

У результаті відкриється вікно New Project (рисунок 1).

Рис. 1. Створення нового проекту. Вибір шаблону, задавання розміщення та назви проекту

У вікні, що відкриється, потрібно вибрати шаблон:

Visual C++ - Windows Forms Applicaiton

У полі “Location:” задати папку, в якій буде розміщуватись додаток (кнопка “Browse…“). У полі “Name:” задати ім’я додатку (наприклад, Train03).
У нашому випадку додаток має ім’я MyApp01 і розміщується в папці

C:\Programs\CPP

Більш детальний приклад створення додатку за шаблоном Windows Forms Application описаний в темі:

У результаті виконаних дій, буде створено новий проект. Проекту відповідає форма, основний код якої описаний в файлі “Form1.h”. На рисунку 2 відображено загальний вигляд додатку на даний момент.

Рис. 2. Пуста форма додатку (програми)

 

2. Розробка основної форми додатку Form1

2.1. Розміщення елементів управління на формі Form1

З допомогою панелі інструментів ToolBox з вкладки “Common Controls” потрібно розмістити на формі такі елементи управління як показано на рисунку 3:

  • два елементи управління типу Button (кнопка). У результаті буде створено два об’єкти (змінні) з іменами button1, button2. З допомогою цих імен можна мати доступ до методів та властивостей відповідних елементів управління;
  • один елемент управління Label. У результаті буде створено об’єкт (змінну) з іменем label1.

Також потрібно скорегувати розміри форми Form1.

Рис. 3. Елементи управління Button та Label з панелі інструментів ToolBox

 

2.2. Налаштування елементів управління

Щоб налаштувати властивість в деякому елементі управління, що розміщується на формі (або самої форми) потрібно спочатку виділити цей елемент управління (або форму), а потім у вікні Properties змінити значення цієї властивості (рисунок 4).

Рисунок 4. Вікно Properties для елементу управління button1

Налаштувати такі властивості елементів управління:

  • в елементі управління Form1 (основна форма додатку), властивість Text = “Сума від’ємних елементів”;
  • у Form1, властивість StartPosition = “CenterScreen”;
  • у button1 властивість Text = “Вихід”;
  • у button2 властивість Text = “Розрахунок”;
  • у label1 властивість Text = “Cума від’ємних елементів масиву”.

Після налаштування елементів управління форма додатку матиме вигляд як показано на рисунку 5.

Рис. 5. Головна форма додатку після налаштування елементів управління

 

3. Розробка форми додатку Form2 задавання значення n

3.1. Додавання нової форми до додатку

Ввід значення n здійснюється у новій формі. Для створення нової форми потрібно у головному меню викликати команду

Project -> Add New Item...

Рис. 6. Команда додавання нового елементу в програму

У результаті відкриється вікно “Add New Item – MyApp01” (рисунок 7). У цьому вікні у полі переліку існуючих шаблонів потрібно вибрати “Windows Form”.
У полі Name потрібно задати ім’я форми Form2. Це є ім’я об’єкту (змінної) форми. З допомогою цього імені можна програмно керувати роботою форми.

Рис. 7. Вікно створення нової форми

Після виконаних дій, буде створено нову форму, якій відповідатиме файл “Form2.h”.

 

3.2. Проектування форми Form2 вводу значення n
3.2.1. Розміщення елементів управління на формі

У формі Form2 має вводитись значення n (кількість елементів масиву). Для того, щоб здійснити ввід, потрібно використати елемент управління типу TextBox, який є полем для вводу рядків.

З вкладки Common Controls панелі інструментів ToolBox, на формі потрібно розмістити такі елементи управління:

  • елемент управління типу Label. Створюється об’єкт-змінна з іменем label1;
  • два елементи управління типу Button. Створюється два об’єкти з іменами button1, button2;
  • елемент управління типу TextBox. Цей елемент управління представляє собою поле для вводу рядка. Створюється об’єкт-змінна з іменем textBox1.

Після розміщення, вікно форми Form2 буде мати вигляд, як показано на рисунку 8.

Рис. 8. Вікно форми Form2 після розміщення елементів управління та корегування розмірів форми

 

3.2.2. Налаштування елементів управління

Налаштувати такі властивості елементів управління:

  • в елементі управління Form2 властивість Text = “Ввід значення n”;
  • у Form2, властивість StartPosition = “CenterScreen”;
  • у Form2, властивість FormBorderStyle = “FixedDialog”;
  • у Form2, властивість ControlBox = false;
  • у button1, властивість Text = “<< Назад”;
  • у button1, властивість DialogResult = Cancel. Це означає, що при натиску на button1 буде закриватись вікно форми з кодом повернення Cancel;
  • у button2, властивість Text = “Продовжити >>”. Щоб текст помістився на кнопці, потрібно дещо відкорегувати розмір кнопки;
  • у button2, властивість DialogResult = OK (код повернення з форми OK);
  • у label1, властивість Text = “n = “;
  • у textBox1, властивість Modifiers = public. Це означає, що елемент управління стає видимим ззовні, з інших форм. Таким чином, можна мати доступ до цього елементу управління з головної форми Form1 (як буде показано далі).

Після налаштування, вікно форми Form2 має вигляд, як показано на рисунку 9.

Рис. 9. Вікно форми Form2 після налаштування елементів управління

 

4. Розробка форми додатку Form3 вводу масиву

4.1. Створення (додавання до додатку) форми Form3

Створення форми Form3 виконується так само, як описано в п. 3.1. У вікні додавання форми потрібно задати ім’я форми Form3.

4.2. Проектування форми Form3
4.2.1. Розміщення елементів управління на формі. DataGridView

У формі Form3 повинен вводитись масив чисел типу double. Розмір масиву був заданий у попередній формі Form2. Для вводу масиву добре підходить елемент управління DataGridView, що розміщується вкладках “All Windows Forms” або “Data” (рисунок 10). Цей елемент управління дозволяє отримувати дані у вигляді двовимірної таблиці. Дані можуть бути отримані з клавіатури, бази даних, колекції, масиву. Таблиця DataGridView має фіксовані та нефіксовані стовпці (Columns) та рядки (Rows).

Рис. 10. Елемент управління DataGridView у вкладці Data

Розмістити такі елементи управління на формі:

  • елемент управління типу DataGridView. Автоматично створюється об’єкт-змінна з іменем dataGridView1;
  • елемент управління типу Label (label1);
  • два елементи управління типу Button. Створюється два об’єкти-змінні з іменами button1, button2.

Після розміщення елементів управління форма Form3 буде мати вигляд як показано на рисунку 11.

Рис. 11. Форма Form3

 

4.2.2. Налаштування елементів управління форми Form3

Потрібно налаштувати наступні елементи управління:

  • у button1 властивість Text = “<<“;
  • у button1 властивість DialogResult = Cancel;
  • у button2 властивість Text = “>>”;
  • у button2 властивість DialogResult = OK;
  • у Form3 властивість Text = “Ввід масиву”;
  • у Form3 властивість StartPosition = “CenterScreen”;
  • у Form3 властивість FormBorderStyle = “FixedDialog”;
  • у dataGridView1 властивість Modifiers = Public. Елемент управління dataGridView1 стає видимим з інших модулів;
  • у label1 властивість Text = “Введіть масив”.

Після налаштування елементів управління форма має вигляд, як показано на рисунку 12.

Рис. 12. Форма Form3 після проектування

 

5. Розробка форми додатку Form4 виведення результату

У формі Form4 виводиться результат. Додавання форми Form4 здійснюється таким самим способом, як і форм Form2, Form3 (дивіться пункти 3, 4). Ім’я класу форми потрібно задати Form4.

На формі Form4 розміщуються такі елементи управління:

  • елемент управління типу Label. Створюється об’єкт-змінна з іменем label1;
  • елемент управління типу Button. Створюється об’єкт-змінна з іменем button1.

Налаштовуються такі властивості елементів управління:

  • в елементі управління Form4 властивість Text = “Результат”;
  • у Form4 властивість StartPosition = “CenterScreen”;
  • у Form4 властивість FormBorderStyle = “FixedDialog”;
  • у Form4 властивість ControlBox = false;
  • у button1 властивість Text = “OK”;
  • у button1 властивість DialogResult = OK;
  • у label1 властивість Modifiers = Public. Елемент управління label1 стає видимий з інших модулів, в тому числі і з головної форми Form1.

Змінювати властивість Text елементу управління label1 немає потреби, тому що ця властивість виводить результат і буде формуватись програмно з головної форми Form1.

Після виконаних дій, вікно форми Form4 наступне (рисунок 13).

Рис. 13. Форма Form4 після проектування

 

6. Текст файлу “Form1.h”

На даний момент текст файлу “Form1.h”, що відповідає головному модулю форми наступний:

#pragma once

namespace MyApp01 {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

/// <summary>
/// Summary for Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
    public:
    Form1(void)
    {
        InitializeComponent();
        //
        //TODO: Add the constructor code here
        //
    }

    protected:
    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    ~Form1()
    {
        if (components)
        {
            delete components;
        }
    }
    private: System::Windows::Forms::Button^ button1;
    protected:
    private: System::Windows::Forms::Label^ label1;
    private: System::Windows::Forms::Button^ button2;

    private:
    /// <summary>
    /// Required designer variable.
    /// </summary>
 System::ComponentModel::Container ^components;

    #pragma region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    void InitializeComponent(void)
    {
        this->button1 = (gcnew System::Windows::Forms::Button());
        this->label1 = (gcnew System::Windows::Forms::Label());
        this->button2 = (gcnew System::Windows::Forms::Button());
        this->SuspendLayout();
        //
        // button1
        //
        this->button1->Location = System::Drawing::Point(15, 91);
        this->button1->Name = L"button1";
        this->button1->Size = System::Drawing::Size(75, 23);
        this->button1->TabIndex = 0;
        this->button1->Text = L"Вихід";
        this->button1->UseVisualStyleBackColor = true;
        //
        // label1
        //
        this->label1->AutoSize = true;
        this->label1->Location = System::Drawing::Point(12, 39);
        this->label1->Name = L"label1";
        this->label1->Size = System::Drawing::Size(177, 13);
        this->label1->TabIndex = 1;
        this->label1->Text = L"Сума від\'ємних елементів масиву";
        //
        // button2
        //
        this->button2->Location = System::Drawing::Point(131, 91);
        this->button2->Name = L"button2";
        this->button2->Size = System::Drawing::Size(75, 23);
        this->button2->TabIndex = 2;
        this->button2->Text = L"Розрахунок";
        this->button2->UseVisualStyleBackColor = true;
        this->button2->Click += gcnew System::EventHandler(this, &Form1::button2_Click);
        //
        // Form1
        //
        this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
        this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
 this->ClientSize = System::Drawing::Size(270, 169);
        this->Controls->Add(this->button2);
        this->Controls->Add(this->label1);
        this->Controls->Add(this->button1);
        this->Name = L"Form1";
        this->StartPosition = System::Windows::Forms::FormStartPosition::CenterScreen;
        this->Text = L"Сума від\'ємних елементів";
        this->ResumeLayout(false);
        this->PerformLayout();
    }
#pragma endregion
 };
 }

 

7. Написання програмного коду взаємодії між формами та розрахунку

Після проектування усіх форм, залишається останній “найлегший” етап – написання програмного коду, що розв’язує дану задачу.

Увесь процес розрахунку виконується в модулі “Form1.h”, що відповідає головній формі програми. З цієї форми викликаються послідовно усі три новостворені форми Form2, Form3, Form4. Значення властивостей деяких елементів управління цих форм формуються програмно. Тому, при проектуванні форм Form2, Form3, Form4, для деяких елементів управління, було встановлено властивість Modifiers у значення Public.

7.1. Підключення другорядних форм до головної форми

Оскільки, з головної форми послідовно будуть викликатися додаткові форми, на самому початку файлу головної форми “Form1.h” потрібно додати такі рядки:

#include "Form2.h"
#include "Form3.h"
#include "Form4.h"

Після цього, є програмний доступ до класів Form2, Form3, Form4, що відповідають новоствореним формам (див. пп. 3, 4, 5).

7.2. Програмування обробника події запуску процесу проведення розрахунку

На цьому етапі потрібно запрограмувати клік на кнопці “Розрахунок” головної форми Form1. Відповідно системою буде згенеровано подію OnClick, для якої створюється метод обробки цієї події (обробник події). У цьому методі потрібно написати весь програмний код розрахунку згідно з умовою задачі.

Детальний приклад програмування події кліку на кнопці наведено в темі:

Не вдаючись в деталі розв’язку задачі (пошук суми елементів масиву), текст обробника події має наступний вигляд:

private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)
{
    // обробник події кліку на кнопці "Розрахунок"
    Form2 f2; // оголосити об'єкт-змінну типу Form2
    Form3 f3; // оголосити об'єкт-змінну типу Form3
    Form4 f4;

    double A[10]; // масив чисел
    int n; // кількість елементів у масиві

    // виклик форми Form2 з перевіркою на OK
    if (f2.ShowDialog()== System::Windows::Forms::DialogResult::OK)
    {
        // якщо у формі Form2 натиснуто "Продовжити"
        // 1. Перевірка, чи введено значення у f2.textBox1->Text
        if (f2.textBox1->Text=="") return;

        // 2. Взяти значення n
        n = System::Int32::Parse(f2.textBox1->Text);

        // 3. Сформувати dataGridView1 у Form3
        // 3.1. Додати колонку з іменем "column" без заголовку ("")
        f3.dataGridView1->Columns->Add("column","");

        // 3.2. Додати рядки. Кількість рядків = n
        for (int i=0; i<n; i++)
            f3.dataGridView1->Rows->Add(""); // додаємо пусті рядки

        // 4. Виклик форми Form3 вводу масиву
        System::Windows::Forms::DialogResult DR; // змінна-результат повернення з форми

        // викликати форму і зчитати результат повернення у DR (OK або Cancel)
        DR = f3.ShowDialog();
        if (DR == System::Windows::Forms::DialogResult::OK) // перевірка на OK
        {
            // якщо результат поверенння OK, то продовжуємо розрахунок
            String ^s; // додаткова змінна - рядок з dataGridView1

            // 5. Перевірка, чи у dataGridView1 усі поля заповнені
            for (int i=0; i<n; i++)
            {
                // взяти рядок з dataGridView1
                s = f3.dataGridView1->Rows[i]->Cells[0]->Value->ToString();
                if (s == "") return; // перевірка,чи рядок пустий
            }

            // 6. Перетворити значення рядків з dataGridView1 у масив чисел A
            for (int i=0; i<n; i++)
            {
                s = f3.dataGridView1->Rows[i]->Cells[0]->Value->ToString(); // взяли рядок
                A[i] = System::Double::Parse(s);
            }

            // 7. Обчислення суми (дочекались!!!)
            double sum = 0; // результат - сума
            for (int i=0; i<n; i++)
                if (A[i]<0)
                    sum += A[i];

            // 8. Вивести результат на форму Form4
            f4.label1->Text = "Сума від\'ємних елементів масиву = " + sum.ToString();
            f4.ShowDialog();
        }
    }
}

Пояснимо деякі фрагменти коду. На початку методу оголошуються три змінні f2, f3, f4, що відповідають формам Form2, Form3, Form4.
Виклик будь-якої форми здійснюється з допомогою методу ShowDialog(). Наприклад, для форми Form2, виклик має вигляд:

f2.ShowDialog();

Форма після виклику повертає результат. У нашому випадку, наприклад, форма Form2 повертає результат OK або Cancel (властивість DialogResult кнопок button1, button2 форми). Перелік усіх можливих результатів повернення з форми описується в перечисленні

System::Windows::Forms:DialogResult

Щоб перевести рядкове значення (string) в числове (int або double), використовується метод Parse(), який у різних класах (Int32, Double) викликається

System::Int32::Parse(s)
System::Double::Parse(s)

де s – рядок, що потрібно перетворити в числове значення. Наприклад “234” => 234

Щоб додати рядок в dataGridView1 використовується метод Add().
Щоб отримати значення заданої комірки використовується код

f3.dataGridView1->Rows[i]->Cells[0]->Value->ToString()

де

  • i – номер рядка в dataGridView1;
  • 0 – номер стовпця. У нашому випадку маємо тільки 1 стовпець, який нумерується з нуля. Значення комірки міститься у властивості Value, яка має тип object.
7.3. Програмування обробника події виходу з програми (кнопка “Вихід”)

Щоб вийти з програми з допомогою натиску на кнопці “Вихід”, потрібно використати метод Close().
Текст обробника події кліку на кнопці “Вихід” наступний

private:
System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
{
    // команда "Вихід"
    Close();
}

 

8. Текст модуля Form1.h

У скороченому (загальному) вигляді текст модуля Form1.h має вигляд (реалізація методів класу Form1 опущена)

#include "Form2.h"
#include "Form3.h"
#include "Form4.h"

#pragma once

namespace MyApp01 {

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

/// <summary>
/// Summary for Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
    public:
    Form1(void)
    {
        ...
    }

    protected:
    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    ~Form1()
    {
        ...
    }
    private: System::Windows::Forms::Button^ button1;
    protected:
    private: System::Windows::Forms::Label^ label1;
    private: System::Windows::Forms::Button^ button2;

    private:
    /// <summary>
    /// Required designer variable.
    /// </summary>
    System::ComponentModel::Container ^components;

    #pragma region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    void InitializeComponent(void)
    {
        ...
    }
    #pragma endregion
    private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e)
    {
        // обробник події кліку на кнопці "Розрахунок"
        ...
    }
    private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)
    {
        // команда "Вихід"
        ...
    }
};
}

 

9. Запуск програми на виконання

Після виконаних дій можна запускати програму на виконання та тестувати її роботу.

 


Зв’язані теми