C++. Разработка программы вычисления суммы отрицательных элементов массива




Разработка программы вычисления суммы отрицательных элементов массива. Демонстрация использования методов и свойств элемента управления 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 = «Сумма отрицательных элементов массива».

После настройки элементов управления форма приложения будет иметь вид, как показано на рисунке 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

На данный момент текст файла, который соответствует главному модулю формы следующий:

#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 формы). Перечень всех возможных результатов возвращения из формы описывается в перечислении (enum)

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.

 

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. Запуск программы на выполнение

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

 


Связанные темы