![]() |
|
|
#1
|
|||
|
|||
|
Всем Привет!!! Помогите, пожалуйста!!! Экзамен никак не сдам!!!
Задача: Необходимо составить инженерный калькулятор (похожий на стандартный) с переводом чисел во все системы счисления. Долго мучилась но ничего не получается. Заранее спасибо!!! |
|
#2
|
||||
|
||||
|
Цитата:
|
|
#3
|
||||
|
||||
|
Ну, а что именно, не получается?
|
|
#4
|
|||
|
|||
|
Да вроде бы всё правильно ввожу, а он не пашет. А с системами счисления вообще ничего, даже не понимаю как их делать.
|
|
#5
|
||||
|
||||
|
Вот код для двоичного исчисления:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text := '0'; //Изначально зануляем поле Edit1
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
var i, x: integer;
s1, s2: string;
begin
x:=StrToInt (Edit1.Text);
// Алгоритм исчисления
while x > 1 do
begin
s1:=s1+IntToStr(x mod 2);
x:=x div 2;
end;
s1:=s1+'1';
// Переворачиваем строку (смотри теорию)
for i:=length(s1) downto 0 do
begin
s2:=s2+s1[i];
end;
// Выводим результат (заносим в поле Edit1)
Edit1.Text := s2;
end;Для других систем исчисления просто подставляешь свой алгоритм (читай теорию). |
|
#6
|
|||
|
|||
|
может есть у кого готовый? дайте пожалста, очень нужен!!!
|
|
#7
|
|||
|
|||
|
Вот тоже функции по преобразованиям :
Код:
function Convert_Int10_to_Another(v10 : cardinal; BaseAnother : integer) : string;
//Перевод целого 10-чного числа (v10) в систему счисления
//с основанием (BaseAnother [2..36])
//Функция возвращает представление числа
//в заданной системе счисления
Var
vFrac : integer; //остаток по модулю (основание)
vFracStr : string;//строковое представления остатка
begin
Result:='';
if (BaseAnother>1) and (BaseAnother<=36) then begin
repeat
vFrac:=v10 MOD BaseAnother; //v10 – (v10 div BaseAnother)*BaseAnother
v10:=v10 DIV BaseAnother; //trunc(v10/BaseAnother)
if vFrac>9 then begin
//Это буква латинского алфавита
vFracStr:=CHR(ORD('A')-10+vFrac)
end
else begin
//переводим остаток в строковое представление
STR(vFrac,vFracStr);
end;
Result:=Result+vFracStr;
until v10=0;
//Инвертируем результат
Result:=InversionString(Result);
end;
end;
function Convert_IntAnother_to_10(vAnother : string; BaseAnother : integer) : cardinal;
//Перевод целого числа (vAnother) из системы счисления BaseAnother [2..36]
//в десятичную систему счисления
//Функция возвращает представление числа
//в десятичной системе счисления
var
i : integer;
Res, ValNum : integer;
begin
Result:=0;
if (BaseAnother>1) and (BaseAnother<=36) then begin
vAnother:=Trim(vAnother);
if length(vAnother)>0 then begin
vAnother:=AnsiUpperCase(vAnother);
for i:=1 to length(vAnother) do
begin
//Конвертируем текущий символ в число
VAL(vAnother[i],ValNum,Res);
if Res<>0 then begin
//если это не число - считаем,
//что буква латинского алфавита
//и вычисляем по позиции
ValNum:=10+ORD(vAnother[i])-ORD('A');
end;
//Вычисляем соответствующую степень и суммируем
Result:=Result+sp_XpowerN(BaseAnother,length(vAnother)-i)*ValNum;
end;
end;
end;
end;
function sp_XpowerN(X, N :integer ):cardinal;
//X в степени N
var
i : integer;
begin
Result:=1;
for i:=1 to N do
begin
Result:=Result*X;
end;
end;
function InversionString(Sx : string) : string;
//Инвертировать строку
Var
i : integer;
begin
Result:=Sx;
if Length(Sx)>0 then begin
Result:='';
for i:=Length(Sx) downto 1 do
begin
Result:=Result+Sx[i];
end;
end;
end;
|
|
#8
|
|||
|
|||
|
А это модуль формы :
Код:
unit z1;
interface
uses
__Str,
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Spin, Buttons, ExtCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
Memo1: TMemo;
Edit10: TEdit;
Label1: TLabel;
EditAnother: TEdit;
SE_base: TSpinEdit;
Label2: TLabel;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Splitter1: TSplitter;
procedure FormCreate(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SE_baseChange(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
ItsFirst : byte;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.Title:='10 <-> '+SE_base.Text;
ItsFirst := 1;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
if ItsFirst>0 then begin
ItsFirst:=0;
Memo1.Lines.Clear;
end;
Edit10.Text:=Trim(Edit10.Text);
if (SE_base.Value>=2) and (SE_base.Value<=36) then begin
EditAnother.Text:=Convert_Int10_to_Another(StrToInt(Edit10.Text),SE_base.Value);
Memo1.Lines.Insert(0,'(10) '+Edit10.Text+' -> ('+SE_base.Text+') '+EditAnother.Text);
end
else begin
EditAnother.Text:='Error. Основание должно быть 2..36';
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if ItsFirst>0 then begin
ItsFirst:=0;
Memo1.Lines.Clear;
end;
EditAnother.Text:=Trim(EditAnother.Text);
if (SE_base.Value>=2) and (SE_base.Value<=36) then begin
Edit10.Text:=IntToStr(Convert_IntAnother_to_10(EditAnother.Text,SE_base.Value));
Memo1.Lines.Insert(0,'('+SE_base.Text+') '+EditAnother.Text+' -> (10) '+Edit10.Text);
end
else begin
EditAnother.Text:='Error. Основание должно быть 2..36';
end;
end;
procedure TForm1.SE_baseChange(Sender: TObject);
begin
Application.Title:='10 <-> '+SE_base.Text;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key=32 then begin
SpeedButton2.Click;
Key:=0;
end;
if Key=13 then begin
SpeedButton1.Click;
Key:=0;
end;
end;
end. |
|
#9
|
||||
|
||||
|
функции: Перевод между системами исчисления
|