Programming Taskbook

English

E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

Электронный задачник по программированию

©  М. Э. Абрамян, 1998–2011

 

Решения | C# и VB.NET | Простое задание

PrevNext


Пример выполнения простого задания: Begin3

В данном пункте приводится пошаговое описание процесса решения на языках C# и VB.NET следующего простого учебного задания из группы Begin.

Begin3°. Даны стороны прямоугольника a и b. Найти его площадь S = ab и периметр P = 2(a + b).

В качестве среды программирования используется среда Visual Studio 2003, однако аналогичные результаты будут получены и при выполнении приведенных программ в среде Visual Studio 2005, 2008 и 2010.

В этом и последующих пунктах, в целях краткости и единообразия, процедурами называются не только обычные процедуры Sub языка VB.NET, но и функции языка C#, которые не возвращают значения (у таких функций в качестве типа возвращаемого значения указывается ключевое слово void).

Создание программы-заготовки и знакомство с заданием

Для создания проекта, содержащего заготовку для требуемого задания, следует воспользоваться программным модулем PT4Load. Для этого достаточно перейти в рабочий каталог задачника и с помощью ярлыка Load.lnk запустить программу-утилиту PT4Load.exe. На экране появится окно модуля PT4Load, в котором следует указать имя нужного задания. Отметим, что в заголовке этого окна указывается краткое имя той программной среды, для которой будет создана заготовка. Приведем имена сред, связанных с языками платформы .NET: [CSNET1] и [VBNET1] — Visual Studio 2003, языки C# и VB.NET соответственно; [CSNET2] и [VBNET2] — Visual Studio 2005, [CSNET3] и [VBNET3] — Visual Studio 2008, [CSNET4] и [VBNET4] — Visual Studio 2010.

Созданный проект-заготовка состоит из нескольких файлов, однако для решения задания нам потребуется только один файл: Begin3.cs для языка C# и Begin3.vb для языка VB.NET. Именно этот файл будет загружен в редактор среды Visual Studio. Приведем содержимое файлов Begin3.cs и Begin3.vb:

[Begin3.cs]

using System;
using PT4;

namespace PT4Tasks
{
    public class MyTask: PT
    {
        public static void Solve()
        {
            Task("Begin3");

        }
    }
}

[Begin3.vb]

Option Strict On
Imports System
Imports PT4.PT

Module PT4Tasks
    Sub Solve()
        Task("Begin3")

    End Sub
End Module

Файл Begin3.cs содержит описание класса MyTask (этот класс является потомком класса PT, описанного в пространстве имен PT4). Процедура Solve — метод класса MyTask — содержит вызов процедуры Task, инициализирующей задание Begin3. Файл Begin3.vb содержит описание «обычной» процедуры Solve, не являющейся методом какого-либо класса; в процедуре Solve уже содержится вызов процедуры Task. Решение задания необходимо запрограммировать в процедуре Solve (хотя, разумеется, в решении могут использоваться другие процедуры и функции, описанные в данном проекте).

Заметим, что процедура Task (наряду с функциями группы Get и процедурой Put) является классовым методом класса PT (она описана с атрибутом static в C# и Shared в VB.NET). Однако перед ее именем можно не указывать имя класса PT. Для языка C# это возможно, поскольку Task вызывается из метода Solve класса MyTask — потомка класса PT; для языка VB.NET это возможно благодаря директиве Imports PT4.PT.

Заметим также, что в файле Begin3 отсутствует описание процедуры Main, которая является стартовой при выполнении программы как на языке C#, так и на языке VB.NET. Эта процедура описана в файле pt4main, также созданном при генерации проекта-заготовки для данного задания (для языка C# данный файл имеет расширение .cs, для языка VB.NET — расширение .vb). Именно в процедуре Main происходит вызов процедуры Solve, решающей задание. Поскольку содержимое файла pt4main не требует редактирования, данный файл не загружается в редактор среды Visual Studio. Однако он входит в проект, в чем можно убедиться, посмотрев на окно Solution Explorer (данное окно обычно располагается в правой части окна среды Visual Studio; на рисунке слева приведен вид окна для проекта на языке C#, справа — для проекта на языке VB.NET):

  

Окно Solution Explorer также показывает, что к проекту подключен файл pt4net.dll. В этом файле описано пространство имен PT4, содержащее классы, используемые задачником, в частности, класс PT.

Запустим программу, нажав клавишу [F5], чтобы увидеть на экране окно задачника с формулировкой задания и примером исходных данных. Ниже приводится вид окна для проекта на C# (окно для VB.NET отличается только заголовком, в котором вместо текста «[C#]» содержится текст «[Visual Basic .NET]»).

Запуск нашей программы был признан ознакомительным (и поэтому правильность решения не анализировалась), так как в ходе ее выполнения не было совершено ни одной операции ввода-вывода.

Ввод исходных данных

Приступая к решению задания, надо прежде всего организовать ввод в программу исходных данных. В нашем случае исходными данными являются вещественные числа a и b, определяющие стороны прямоугольника (в области исходных данных эти числа выделены желтым цветом и снабжены комментариями).

При вводе исходных данных важно правильно указывать их тип, в противном случае задачник зафиксирует ошибку. Продемонстрируем это на примере нашей программы, организовав считывание исходных данные в переменные целого типа, используя функцию GetInt. Для этого закроем окно задачника (нажав кнопку «Выход», клавишу Esc или клавишу [F5]) и дополним текст процедуры Solve следующим образом:

[C#]

public static void Solve()
{
    Task("Begin3");
    int a = GetInt(), b = GetInt();
}

[VB.NET]

Sub Solve()
    Task("Begin3")
    Dim a As Integer = GetInt(), b As Integer = GetInt()
End Sub

Повторно запустив программу, мы увидим, что исходные данные изменились. При каждом запуске генерируется новый набор исходных данных, поэтому для успешного решения задания необходимо запрограммировать алгоритм, правильно обрабатывающий любой допустимый набор исходных данных.

Поскольку мы попытались ввести исходные данные (т. е. продемонстрировали намерение выполнить задание), данный запуск программы уже не считается ознакомительным. Однако тип исходных данных был выбран нами неправильно, поэтому на информационной панели будет выведена следующая информация об ошибке (на красном фоне): «Неверно указан тип при вводе исходных данных. Для ввода 1-го элемента (вещественного типа) использована переменная целого типа».

Для правильного ввода исходных данных в нашем случае надо использовать функцию GetDouble, обеспечивающую ввод данных вещественного типа. Исправим соответствующим образом процедуру Solve:

[C#]

public static void Solve()
{
    Task("Begin3");
    double a = GetDouble(), b = GetDouble();
}

[VB.NET]

Sub Solve()
    Task("Begin3")
    Dim a As Double = GetDouble(), b As Double = GetDouble()
End Sub

Теперь ввод данных выполнен правильно. Однако наша программа не выводит результатов, поэтому ее работа опять признана ошибочной с диагностикой «Выведены не все результирующие данные. Количество выведенных данных: 0 (из 2)».

Вычисления и вывод полученных данных

Выполним необходимые вычисления и выведем результаты, используя процедуру Put (напомним, что в процедуре Put можно указывать произвольное количество параметров):

[C#]

public static void Solve()
{
    Task("Begin3");
    double a = GetDouble(), b = GetDouble(), S, P;
    S = a * b;
    P = 2 * (a + b);
    Put(P, S);
}

[VB.NET]

Sub Solve()
    Task("Begin3")
    Dim a As Double = GetDouble(), b As Double = GetDouble(), _
        S, P As Double
    S = = a * b
    P = 2 * (a + b)
    Put(P, S)
End Sub

В данном фрагменте программы демонстрируются два варианта описания переменных: с инициализацией и без нее. Переменные a и b, предназначенные для хранения исходных данных, инициализируются в момент описания; при этом используется функция GetDouble. Переменные S и P, предназначенные для хранения результатов, не инициализируются при описании; они получают требуемые значения при последующем выполнении двух операторов присваивания. Заметим, что вполне возможно было бы инициализировать при описании все переменные (поскольку в момент описания переменных S и P значения a и b уже известны) или, наоборот, описать все четыре переменные без инициализации, а затем задать их значения, используя операторы присваивания. В языке VB.NET все локальные переменные, не инициализированные явно, по умолчанию инициализируются нулевыми значениями. В языке C# неинициализированные локальные переменные не получают значения по умолчанию, а попытка обратиться к содержимому неинициализированных переменных приводит к ошибке компиляции.

После запуска программы мы можем убедиться, что найденные значения выведены в разделе результирующих данных. Но из-за того, что вначале мы вывели значение периметра P, а затем — значение площади S, решение по-прежнему признано неверным, а сообщение об ошибке имеет вид «Ошибочное решение». Подобное сообщение означает, что все исходные данные были введены, все результирующие данные выведены, но значения полученных результатов не совпадают с контрольными. Перейдя на вкладку «Пример верного решения», мы можем убедиться в том, что площадь и периметр найдены верно и нарушен только порядок их вывода.

Таким образом, важно не только найти правильные значения результирующих данных, но и вывести их в нужном порядке. Для того чтобы указать этот порядок, в разделе результатов используется поясняющий текст (см. приведенный выше рисунок окна задачника). Заметим, что исходные данные тоже важно вводить именно в том порядке, в котором они указаны в окне задачника. Общее правило здесь следующее: ввод и вывод данных производится по строкам (слева направо), а строки просматриваются сверху вниз. Иными словами, данные, отображаемые в окне задачника, вводятся и выводятся в том порядке, в котором читается обычный текст на русском языке.

Правильное решение и его тестирование

Исправим допущенную ошибку, изменив порядок вывода результирующих данных в процедуре Put:

[C#]

    Put(S, P);

[VB.NET]

    Put(S, P)

После запуска исправленной программы на информационной панели окна задачника будет выведено сообщение на зеленом фоне: «Верное решение. Тест номер 1 (из 3)».

Таким образом, мы провели первое успешное испытание нашей программы. Однако однократное успешное испытание алгоритма еще не означает, что он является правильным. Для того чтобы получить уверенность в правильности алгоритма, его надо протестировать несколько раз на различных наборах данных. Количество тестовых испытаний, требующихся для каждого учебного задания, различно и может меняться в пределах от 3 до 9 (для простого задания Begin3 число испытаний равно 3). Если нужное количество испытаний, проведенных подряд, прошло успешно, то на информационной панели появится сообщение «Задание выполнено!». Если же в ходе очередного испытания будет получено неверное решение, то счетчик количества успешных испытаний для данного задания будет сброшен в 0, и после исправления алгоритма программу придется тестировать заново.

В нашем случае алгоритм является правильным, поэтому после трех запусков на информационной панели окна задачника появится текст «Задание выполнено!». Выполнение задания Begin3 завершено.

С помощью модуля PT4Results можно просмотреть информацию о ходе выполнения задания. Проще всего это сделать, используя команду «Tools | PT4 Results» меню Visual Studio. Напомним, что команда «Tools | PT4 Load» из этого же меню позволяет создать заготовку для выполнения нового задания.

Примечание. В использовании вспомогательных переменных S и P при выполнения задания Begin3 нет необходимости, поскольку при выводе данных можно указывать не только переменные, но и выражения. Учитывая это, можно получить более короткий вариант решения задания Begin3:

[C#]

public static void Solve()
{
    Task("Begin3");
    double a = GetDouble(), b = GetDouble();
    Put(a * b, 2 * (a + b));
}

[VB.NET]

Sub Solve()
    Task("Begin3")
    Dim a As Double = GetDouble(), b As Double = GetDouble()
    Put(a * b, 2 * (a + b))
End Sub

PrevNext

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
11.10.2011