ИНФОРМАТИКА / ЛАБ№1 / ЛАБ№1_отчет
.docМИНОБРНАУКИ РОССИЙСКОЙ ФЕДЕРАЦИЙ
Федеральное государственное бюджетное образовательное учреждение
«Ижевский государственный технический университет имени
М.Т. Калашникова»
Кафедра АСОИУ
ОТЧЕТ
По дисциплине «ИНФОРМАТИКА»
Лабораторная работа №1
Выполнил:
Студент группы Б1-782-1з Жигалов А.С.
Проверил:
Преподаватель. Ю.В. Шибанова
Ижевск 2012 год
Содержание
Введение. 2
Блок схема программы 8
Скриншоты 9
Введение.
Передо мной была поставлена цель, создать программу для перевода чисел из десятичной(Далее 10СС) системы исчисления в двоичную(Далее 2СС) применив к ним операцию деления. Для её решения я вывел несколько задач:
-
Создать подпрограмму для определения, "Какая цифра соответствует числу".
-
Сделать подпрограмму для определения, "Какое число соответствует цифре".
-
Заложить в программу алгоритм пересчета из 10СС системы исчисления в 2СС систему исчисления с (определенным количеством значимых знаков после запятой).
-
Заложить в программу алгоритм деления чисел в 2СС.
-
Реализовать интерфейс простой и приятный пользователю.
Для достижения этой цели я использовал программный продукт Delphi 7. Характеристики ноутбука, на котором производилось создание и тестирование программы:
Процессор Intel® Core™ i3-2370M Processor (3M Cache, 2.40 GHz);
ОЗУ 8 Гб;
Видеокарта NVIDIA GeForce GT 650M;
OS Windows 7 x64 bit
Описание программы.
Для написания программы было решено написать вспомогательные функции перевода из 10СС в 2СС. Для более удобного восприятия программы были так же подключёны следующие модули: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls.
В качестве дизайна было решено расположить последовательно следующие поля: входные данные "для ввода основание системы", "исходные числа", и результирующие данные . "для ввода основание системы", "исходные числа". А также иметься одна кнопка для вывода.
Исходный код:
unit uMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,ShellApi,Math, Spin;
type
TfrmMain = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Edit7: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label5: TLabel;
Label6: TLabel;
Label9: TLabel;
Label7: TLabel;
Label10: TLabel;
Label11: TLabel;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
implementation
uses StrUtils;
{$R *.dfm}
//Определяет какая цифра соответствует числу.
function IntToDigit(aNum : Byte) : String;
const
SelfName : String = 'IntToDigit.';
begin
case aNum of
0..9 : Result := IntToStr(aNum);
10 : Result := 'A';
11 : Result := 'B';
12 : Result := 'C';
13 : Result := 'D';
14 : Result := 'E';
15 : Result := 'F';
else
Raise Exception.Create(SelfName + ' Числу не сопоставлена цифра!');
end;
end;
//Определяет какое число соответствует цифре.
function DigitToInt(aDigit : AnsiChar; aBase : Byte) : Byte;
const
SelfName : String = 'DigitToInt.';
begin
if aBase < 2 then
Raise Exception.Create(SelfName + ' Основание системы счисления должно быть >= 2!')
;
case aDigit of
'0'..'9' : Result := StrToInt(aDigit);
'A', 'a' : Result := 10;
'B', 'b' : Result := 11;
'C', 'c' : Result := 12;
'D', 'd' : Result := 13;
'E', 'e' : Result := 14;
'F', 'f' : Result := 15;
else
Raise Exception.Create(SelfName + ' Неизвестный символ в представлении числа!');
end;
if Result > aBase - 1 then
Raise Exception.Create(SelfName + ' В данной системе счисления нет такой цифры!')
;
end;
//По записи числа в системе счисления с онованием aBase, определяет само это число.
function XcimalStrToNumber(aStrXcimal : String; aBase : Byte) : Extended;
const
SelfName : String = 'XcimalStrToNumber.';
var
i, j : Integer;
StrInt : String;
StrFrac : String;
Pos1 : Integer;
IntPart : Extended;
FracPart : Extended;
begin
if Length(aStrXcimal) = 0 then
Raise Exception.Create(SelfName + ' Не задано число!');
//Ищем десятичную точку. Она у нас обозначается знаком запятая: ','.
Pos1 := Pos(',', aStrXcimal);
//Определяем подстроку с записью целой части числа
//и подстроку с записью дробной части.
if Pos1 = 0 then begin
//Значит число состоит только из целой части.
StrInt := aStrXcimal;
StrFrac := '';
end else begin
//Число имеет целую и дробную части.
StrInt := LeftStr(aStrXcimal, Pos1 - 1);
StrFrac := Copy(aStrXcimal, Pos1 + 1, Length(aStrXcimal) - Pos1);
end;
//Определяем значение целой части числа.
IntPart := 0;
for i := 1 to Length(StrInt) do begin
//Порядок разряда = позиции разряда при отсчёте от нуля в направлении справа налево.
j := Length(StrInt) - i;
IntPart := IntPart + DigitToInt(StrInt[i], aBase) * Power(aBase, j);
end;
//Определяем значение дробной части числа.
//В начале вычисляем значение аналогично тому, как это сделано для целой части:
FracPart := 0;
for i := 1 to Length(StrFrac) do begin
j := Length(StrFrac) - i;
FracPart := FracPart + DigitToInt(StrFrac[i], aBase) * Power(aBase, j);
end;
//Теперь учитываем экспоненциальную часть:
FracPart := FracPart / Power(aBase, Length(StrFrac));
//Получаем число, которое соответствует записи aStrXcimal
//в системе счисления с основанием aBase.
Result := IntPart + FracPart;
end;
//Преобразует запись числа в системе счисления с основанием aSrcBase в запись
//этого же числа в системе счисления с онованием aTrgBase.
//Преобразование производится с точностью до aTrgPrecision цифр после запятой
//в результирующем представлении числа.
function XcimalStrToYcimalStr
(
aSrcBase : Byte;
aSrcNumStr : String;
aTrgBase : Byte;
aTrgPrecision : Byte
) : String;
var
//Число соответствующее записи aSrcNumStr в системе счисления с основанием aSrcBase.
SrcNum : Extended;
//Целая часть, выделенная из числа SrcNum.
IntPart : Int64;
//Дробная часть, выделенная из числа SrcNum.
FracPart : Extended;
//Представление целой части числа SrcNum в системе счисления с основанием aTrgBase.
StrInt : String;
//Представление дробной части числа SrcNum в системе счисления с основанием aTrgBase.
StrFrac : String;
//Счетчик.
i : Integer;
//Для промежуточных вычислений.
TempNum : Extended;
begin
//Исходное число.
SrcNum := XcimalStrToNumber(aSrcNumStr, aSrcBase);
// Получаем целую и дробную части числа.
IntPart := Trunc(SrcNum);
FracPart := Frac(SrcNum);
//Переводим целую часть.
StrInt := '';
repeat
StrInt := IntToDigit(IntPart mod aTrgBase) + StrInt;
IntPart := IntPart div aTrgBase;
until IntPart = 0;
// Если дробная часть = 0, то перевод закончен.
if FracPart = 0 then
begin
Result := StrInt;
exit;
end;
//Переводим дробную часть. Точность - до aTrgPrecision цифр после запятой.
StrFrac := '';
for i := 1 to aTrgPrecision do
begin
TempNum := FracPart * aTrgBase;
StrFrac := StrFrac + IntToDigit(Trunc(TempNum));
FracPart := Frac(TempNum);
//Если дробная часть = 0, то перевод закончен.
if FracPart = 0 then Break;
end;
Result := StrInt + ',' + StrFrac;
end;
//По записи числа в системе счисления с онованием aBase, определяет само это число.
function AdelitnaB(A : String; B : String) : string;
var
octatok : Int64;
rez : Int64;
Srez:string;
begin
Result:='';
repeat
rez:= strtoint(A) div strtoint(B);
octatok:= strtoint(A) mod strtoint(B);
Result:=Result+IntToStr(rez);
until octatok = 0;
end;
procedure TfrmMain.Button1Click(Sender: TObject);
begin
// 1. Перевести оба числа в двоичную систему счисления.
Edit3.Text := XcimalStrToYcimalStr(10,Edit1.Text,2,0);
Edit4.Text := XcimalStrToYcimalStr(10,Edit2.Text,2,0);
// 2. Выполнить над переведенными числами машинную операцию деления
Edit5.Text := AdelitnaB(Edit3.Text,Edit4.Text);
// 3. Выполнить операцию над числами в десятичной системе счисления и перевести
//результат в двоичную систему счисления.
Edit6.Text := inttostr(round(Strtoint(Edit1.Text)/Strtoint(Edit2.Text))) ;
Edit7.Text := XcimalStrToYcimalStr(10,Edit6.Text,2,0);
end;
end.
Блок схема программы
Скриншоты