Министерство высшего образования и науки РФ
Государственное образовательное учреждение высшего профессионального образования
Национальный минерально-сырьевой университет «Горный»
Институт заочного образования
Лабораторная работа №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;
}
//---------------------------------------------------------------------------