|
#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
|
||||
|
||||
функции: Перевод между системами исчисления
Делаю курсовые и лабораторные на Delphi, GPSS, Assembler, C++. Заказать и почитать отзывы можно на сайте, который указан в этой теме Дешево! |