Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба1.doc
Скачиваний:
3
Добавлен:
04.09.2019
Размер:
449.02 Кб
Скачать

Министерство высшего образования и науки РФ

Государственное образовательное учреждение высшего профессионального образования

Национальный минерально-сырьевой университет «Горный»

Институт заочного образования

Лабораторная работа №1

Обработка скалярных данных

По дисциплине «Объектно-ориентированное программирование»

Выполнил: студент 3-го курса

Воробьев К.И.

Специальность: 230202

Шифр: 9405020001

Проверил: __________________

Дата: «_____» _________ 2012 г.

Санкт-Петербург

2012

Цель: исследование допустимых значений для данных различных типов.

Работа подразумевает 3 этапа:

  • обработка плавающих чисел типа float;

  • обработка целых чисел типа int;

  • обработка строк типа AnsiString;

Для разработки интерфейса программы для каждой отдельной задачи применялся компонент TPageControl, на вкладках которого были размещены каждая из задач (обработка плавающих чисел, обработка целых чисел и обработка строк).

Плавающие числа

  • Цель – ознакомление с особенностями обработкой плавающих чисел.

В качестве ввода данных в программе использовался компонент TEdit. Для преобразования из текста в плавающий формат использовалась функция StrToFloat. Для форматированного вывода значений результата с плавающей точкой использовалась функция FloatToStrF(). Последняя выполненная операция выводится на экран в специально предназначенный для этого компонент TLabel. В программе предусмотрена проверка вводимых данных на допустимые значения посредством пользовательской обработки исключительной ситуации, которая может возникнуть в результате конвертирования исходной строки (TEdit) в значение типа float. Такая проверка вынесена в отдельную функцию.

Интерфейс вкладки для задачи обработки плавающих чисел представлен ниже:

Рис. 1

Целые числа

Цель – ознакомление с особенностями целочисленной арифметики.

Элементы управления для этой задачи находятся во второй вкладке компонента TPageControl.

Ввод исходных данных производится в компоненты TEdit, которые фильтруют ввод только цифр при наборе пользователем. Таким образом, в эти компоненты можно ввести только целочисленные цифры, что демонстрирует один из способов контроля вводимых данных пользователем. Для реализации данного подхода использовался собственный обработчик события OnKeyPress для компонентов ввода исходных данных – TEdit. В таких обработчиках в качестве аргументов, система передает ссылку на значение системной переменной Key, которая хранит код нажатой клавиши до передачи его знакогенератору. В зависимости от нужных условий, значение этой переменной можно изменить в соответствии с логическим смыслом программы. Значение Key=0 означает, что знакогенератор не будет обрабатывать нажатие клавиши, что позволит избежать печати ненужных символов.

Для конвертирования из строки в целое число и наоборот использовались функции StrToInt и IntToStr соотвественно.

Интерфейс вкладки для задачи обработки целых чисел представлен ниже:

Рис. 2

Строки

Цель – ознакомление с особенностями обработки строковых переменных типа AnsiString.

Задача по обработке строк выполнена в третьей вкладке компонента TPageControl.

В программе использовались следующие встроенные функции для AnsiString:

- операция конкатенации – знак +.

- Length() – определения размера строки

- AnsiUpperCase(AnsiString) – все буквы заглавные

- AnsiLowerCase(AnsiString) – все буквы прописные

- SubString(int,int) – возврат подстроки

- Delete(int,int) – удаление подстроки

- Insert(AnsiString,int) – вставка подстроки

- AnsiPos(AnsiString,AnsiString) – позиция подстроки в строке

- Trim(AnsiString) – удаление всех пробелов слева и справа.

- операции сравнения (<,>,==)

В качестве проверки ввода корректных данных использована проверка на пустой ввод, т.е. любые введенные данные считаются корректными, при условии, что они не пустые.

Интерфейс вкладки для задачи обработки строк представлен ниже:

Ниже представлен листинг всей программы (модуля Unit1.cpp). Остальные модули формируются Borland Builder автоматически при проектировании формы, поэтому нет смысла представлять их листинг.

//---------------------------------------------------------------------------

#include <vcl.h>

#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

}

//---------------------------------------------------------------------------

//проверка корректности введенных данных (для первого задания)

bool CheckCorrectInput(float &A, float &B)

{

AnsiString St = "";

try {

A = StrToFloat(Form1->P1edFirst->Text);

}

catch (EConvertError &E) {

St = "в первом";

Form1->P1edFirst->Color = clRed;

}

try {

B = StrToFloat(Form1->P1edSecond->Text);

}

catch (EConvertError &E) {

if (St != "")

St = St + " и ";

St = St + "во втором";

Form1->P1edSecond->Color = clRed;

}

if (St != "") {

St = "Ошибка " + St + " операнде. Проверьте правильность ввода !";

ShowMessage(St);

return false;

}

return true;

}

//---------------------------------------------------------------------------

//стираем результат, если изменился операнд (для первого задания)

void __fastcall TForm1::P1edFirstChange(TObject *Sender)

{

P1edFirst->Color = clWindow;

P1edResult->Text = "";

P1lbOper->Caption = "";

}

//---------------------------------------------------------------------------

//стираем результат, если изменился операнд (для первого задания)

void __fastcall TForm1::P1edSecondChange(TObject *Sender)

{

P1edSecond->Color = clWindow;

P1edResult->Text = "";

P1lbOper->Caption = "";

}

//---------------------------------------------------------------------------

// кнопка "+" для первого задания

void __fastcall TForm1::P1btPlusClick(TObject *Sender)

{

float a,b;

//проверка корректности введенных данных

if (!(CheckCorrectInput(a, b)))

return;

//выводим сложение на экран

P1lbOper->Caption = "+";

P1edResult->Text = FloatToStrF(a+b,ffFixed,7,2);

}

//---------------------------------------------------------------------------

// кнопка "-" для первого задания

void __fastcall TForm1::P1btMinusClick(TObject *Sender)

{

float a,b;

//проверка корректности введенных данных

if (!(CheckCorrectInput(a, b)))

return;

//выводим вычитание на экран

P1lbOper->Caption = "-";

P1edResult->Text = FloatToStrF(a-b,ffFixed,7,2);

}

//---------------------------------------------------------------------------

// кнопка "*" для первого задания

void __fastcall TForm1::P1btMultClick(TObject *Sender)

{

float a,b;

//проверка корректности введенных данных

if (!(CheckCorrectInput(a, b)))

return;

//выводим умножение на экран

P1lbOper->Caption = "*";

P1edResult->Text = FloatToStrF(a*b,ffFixed,7,2);

}

//---------------------------------------------------------------------------

// кнопка "/" для первого задания

void __fastcall TForm1::P1btDivClick(TObject *Sender)

{

float a,b;

//проверка корректности введенных данных

if (!(CheckCorrectInput(a, b)))

return;

//проверка деления на ноль

if (b == 0) {

P1edSecond->Color = clRed;

ShowMessage("На ноль делить нельзя !");

return;

}

//выводим деление на экран

P1lbOper->Caption = "/";

P1edResult->Text = FloatToStrF(a/b,ffFixed,7,2);

}

//---------------------------------------------------------------------------

//фильтр вводимых данных для операнда (задание 2)

void __fastcall TForm1::P2edFirstKeyPress(TObject *Sender, char &Key)

{

if (!(((Key>='0') && (Key<='9')) || (Key == VK_BACK)))

Key = 0;

}

//---------------------------------------------------------------------------

//фильтр вводимых данных для операнда (задание 2)

void __fastcall TForm1::P2edSecondKeyPress(TObject *Sender, char &Key)

{

if (!(((Key>='0') && (Key<='9')) || (Key == VK_BACK)))

Key = 0;

}

//---------------------------------------------------------------------------

//кнопка "+" для второго задания

void __fastcall TForm1::P2btPlusClick(TObject *Sender)

{

//проверка, все ли операнды введены

if ((P2edFirst->Text == "") || (P2edSecond->Text == "")) {

ShowMessage("Введите операнды");

return;

}

//складываем и выводим на экран

P2lbOper->Caption = "+";

P2edResult->Text = IntToStr(StrToInt(P2edFirst->Text)+StrToInt(P2edSecond->Text));

}

//---------------------------------------------------------------------------

//кнопка "-" для второго задания

void __fastcall TForm1::P2edMinusClick(TObject *Sender)

{

//проверка, все ли операнды введены

if ((P2edFirst->Text == "") || (P2edSecond->Text == "")) {

ShowMessage("Введите операнды");

return;

}

//минусуем и выводим на экран

P2lbOper->Caption = "-";

P2edResult->Text = IntToStr(StrToInt(P2edFirst->Text)-StrToInt(P2edSecond->Text));

}

//---------------------------------------------------------------------------

//кнопка "*" для второго задания

void __fastcall TForm1::P2btMultClick(TObject *Sender)

{

//проверка, все ли операнды введены

if ((P2edFirst->Text == "") || (P2edSecond->Text == "")) {

ShowMessage("Введите операнды");

return;

}

//умножаем и выводим на экран

P2lbOper->Caption = "*";

P2edResult->Text = IntToStr(StrToInt(P2edFirst->Text)*StrToInt(P2edSecond->Text));

}

//---------------------------------------------------------------------------

//кнопка "/" для второго задания

void __fastcall TForm1::P2btDivClick(TObject *Sender)

{

//проверка, все ли операнды введены

if ((P2edFirst->Text == "") || (P2edSecond->Text == "")) {

ShowMessage("Введите операнды");

return;

}

// проверка деления на ноль

if (StrToInt(P2edSecond->Text) == 0) {

ShowMessage("На ноль делить нельзя");

return;

}

//делим и выводим на экран

P2lbOper->Caption = "/";

P2edResult->Text = IntToStr(StrToInt(P2edFirst->Text)/StrToInt(P2edSecond->Text));

}

//---------------------------------------------------------------------------

//кнопка "%" для второго задания

void __fastcall TForm1::P2btOstClick(TObject *Sender)

{

//проверка, все ли операнды введены

if ((P2edFirst->Text == "") || (P2edSecond->Text == "")) {

ShowMessage("Введите операнды");

return;

}

//находим остаток от деления и выводим на экран

P2lbOper->Caption = "%";

P2edOst->Text = IntToStr(StrToInt(P2edFirst->Text)%StrToInt(P2edSecond->Text));

}

//---------------------------------------------------------------------------

//стираем результат, если изменился операнд (для второго задания)

void __fastcall TForm1::P2edFirstChange(TObject *Sender)

{

P2edResult->Text = "";

P2edOst->Text = "";

P2lbOper->Caption = "";

}

//---------------------------------------------------------------------------

//стираем результат, если изменился операнд (для второго задания)

void __fastcall TForm1::P2edSecondChange(TObject *Sender)

{

P2edResult->Text = "";

P2edOst->Text = "";

P2lbOper->Caption = "";

}

//---------------------------------------------------------------------------

// кнопка "Выход"

void __fastcall TForm1::btExitClick(TObject *Sender)

{

Close();

}

//---------------------------------------------------------------------------

//стираем результат, если изменился операнд (для третьего задания)

void __fastcall TForm1::P3edS1Change(TObject *Sender)

{

P3lbOper->Caption = "";

P3edRes->Text = "";

P3edN->Text = "";

}

//---------------------------------------------------------------------------

//стираем результат, если изменился операнд (для третьего задания)

void __fastcall TForm1::P3edS2Change(TObject *Sender)

{

P3lbOper->Caption = "";

P3edRes->Text = "";

P3edN->Text = "";

}

//---------------------------------------------------------------------------

//стираем результат, если изменился операнд (для третьего задания)

void __fastcall TForm1::P3edPosChange(TObject *Sender)

{

P3lbOper->Caption = "";

P3edRes->Text = "";

P3edN->Text = "";

}

//---------------------------------------------------------------------------

//стираем результат, если изменился операнд (для третьего задания)

void __fastcall TForm1::P3edKolChange(TObject *Sender)

{

P3lbOper->Caption = "";

P3edRes->Text = "";

P3edN->Text = "";

}

//---------------------------------------------------------------------------

//кнопка "Сложение строк" (задание 3)

void __fastcall TForm1::P3btPlusClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if ((P3edS1->Text == "") || (P3edS2->Text == "")){

ShowMessage("Введите исходные данные (S1, S2)");

return;

}

P3lbOper->Caption = "Соединение строк";

P3edRes->Text = P3edS1->Text + P3edS2->Text;

}

//---------------------------------------------------------------------------

//кнопка "Длина строки" (задание 3)

void __fastcall TForm1::P3btLengthClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if (P3edS1->Text == ""){

ShowMessage("Введите исходные данные (S1)");

return;

}

P3lbOper->Caption = "Длина строки";

AnsiString S1 = P3edS1->Text;

P3edN->Text = IntToStr(S1.Length());

}

//---------------------------------------------------------------------------

//кнопка "Большие буквы" (задание 3)

void __fastcall TForm1::P3btUCaseClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if (P3edS1->Text == ""){

ShowMessage("Введите исходные данные (S1)");

return;

}

P3lbOper->Caption = "Большие буквы";

P3edRes->Text = AnsiUpperCase(P3edS1->Text);

}

//---------------------------------------------------------------------------

//кнопка "Маленькие буквы"

void __fastcall TForm1::P3btLCaseClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if (P3edS1->Text == ""){

ShowMessage("Введите исходные данные (S1)");

return;

}

P3lbOper->Caption = "Маленькие буквы";

P3edRes->Text = AnsiLowerCase(P3edS1->Text);

}

//---------------------------------------------------------------------------

//кнопка "Выделение подстроки"

void __fastcall TForm1::P3btSubStringClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if ((P3edS1->Text == "") || (P3edPos->Text == "") || (P3edKol->Text == "")){

ShowMessage("Введите исходные данные (S1,Pos,Kol)");

return;

}

AnsiString S1 = P3edS1->Text;

P3lbOper->Caption = "Выделение подстроки";

P3edRes->Text = S1.SubString(StrToInt(P3edPos->Text),StrToInt(P3edKol->Text));

}

//---------------------------------------------------------------------------

//кнопка "Удаление подстроки"

void __fastcall TForm1::P3btDeleteClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if ((P3edS1->Text == "") || (P3edPos->Text == "") || (P3edKol->Text == "")){

ShowMessage("Введите исходные данные (S1,Pos,Kol)");

return;

}

AnsiString S1 = P3edS1->Text;

P3lbOper->Caption = "Удаление подстроки";

P3edRes->Text = S1.Delete(StrToInt(P3edPos->Text),StrToInt(P3edKol->Text));

}

//---------------------------------------------------------------------------

//кнопка "Вставка подстроки"

void __fastcall TForm1::P3btInsertClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if ((P3edS1->Text == "") || (P3edS2->Text == "") || (P3edPos->Text == "")){

ShowMessage("Введите исходные данные (S1,S2,Pos)");

return;

}

AnsiString S1 = P3edS1->Text;

P3lbOper->Caption = "Вставка подстроки";

P3edRes->Text = S1.Insert(P3edS2->Text,StrToInt(P3edPos->Text));

}

//---------------------------------------------------------------------------

// кнопка "Позиция подстроки в строке"

void __fastcall TForm1::P3btPosClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if ((P3edS1->Text == "") || (P3edS2->Text == "")){

ShowMessage("Введите исходные данные (S1,S2)");

return;

}

P3lbOper->Caption = "Позиция подстроки в строке";

P3edN->Text = IntToStr(AnsiPos(P3edS2->Text,P3edS1->Text));

}

//---------------------------------------------------------------------------

// кнопка "Удаление пробелов"

void __fastcall TForm1::P3btTrimClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if (P3edS1->Text == ""){

ShowMessage("Введите исходные данные (S1)");

return;

}

P3lbOper->Caption = "Удаление пробелов";

P3edRes->Text = Trim(P3edS1->Text);

}

//---------------------------------------------------------------------------

// кнопка "Проверка на равенство"

void __fastcall TForm1::P3btCompareClick(TObject *Sender)

{

//проверяем, все ли операнды введены

if ((P3edS1->Text == "") || (P3edS2->Text == "")){

ShowMessage("Введите исходные данные (S1,S2)");

return;

}

AnsiString St = "";

P3lbOper->Caption = "Проверка на равенство";

if (P3edS1->Text > P3edS2->Text)

St = "S1 > S2";

if (P3edS1->Text == P3edS2->Text)

St = "S1 = S2";

if (P3edS1->Text < P3edS2->Text)

St = "S1 < S2";

P3edRes->Text = St;

}

//---------------------------------------------------------------------------

12

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]