Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.05.2009, 16:34
Milka Milka вне форума
Прохожий
 
Регистрация: 25.05.2009
Сообщения: 2
Репутация: 10
По умолчанию Калькулятор

Всем Привет!!! Помогите, пожалуйста!!! Экзамен никак не сдам!!!
Задача: Необходимо составить инженерный калькулятор (похожий на стандартный) с переводом чисел во все системы счисления. Долго мучилась но ничего не получается. Заранее спасибо!!!
Ответить с цитированием
  #2  
Старый 25.05.2009, 16:39
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,564
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Milka
Всем Привет!!! Помогите, пожалуйста!!! Экзамен никак не сдам!!!
Задача: Необходимо составить инженерный калькулятор (похожий на стандартный) с переводом чисел во все системы счисления. Долго мучилась но ничего не получается. Заранее спасибо!!!
Ищи в Исходниках, там есть несколько примеров калькуляторов...
Ответить с цитированием
  #3  
Старый 25.05.2009, 21:33
Аватар для TOJluK
TOJluK TOJluK вне форума
Местный
 
Регистрация: 25.02.2009
Адрес: Минск
Сообщения: 551
Версия Delphi: 2007
Репутация: 110
По умолчанию

Ну, а что именно, не получается?
Ответить с цитированием
  #4  
Старый 26.05.2009, 09:54
Milka Milka вне форума
Прохожий
 
Регистрация: 25.05.2009
Сообщения: 2
Репутация: 10
По умолчанию

Да вроде бы всё правильно ввожу, а он не пашет. А с системами счисления вообще ничего, даже не понимаю как их делать.
Ответить с цитированием
  #5  
Старый 26.05.2009, 23:03
Аватар для vah-smile
vah-smile vah-smile вне форума
Новичок
 
Регистрация: 16.02.2009
Адрес: Украина
Сообщения: 67
Репутация: -53
По умолчанию

Вот код для двоичного исчисления:
Код:
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  
Старый 29.07.2009, 08:10
Sash Sash вне форума
Прохожий
 
Регистрация: 29.07.2009
Сообщения: 2
Репутация: 10
По умолчанию

может есть у кого готовый? дайте пожалста, очень нужен!!!
Ответить с цитированием
  #7  
Старый 29.07.2009, 10:05
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

Вот тоже функции по преобразованиям :

Код:
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  
Старый 29.07.2009, 10:10
roamer roamer вне форума
Активный
 
Регистрация: 15.04.2009
Сообщения: 369
Репутация: 93
По умолчанию

А это модуль формы :
Код:
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  
Старый 29.07.2009, 13:45
Аватар для hkdkest
hkdkest hkdkest вне форума
Начинающий
 
Регистрация: 06.05.2008
Адрес: Рязань
Сообщения: 180
Репутация: 10
По умолчанию

функции: Перевод между системами исчисления
__________________
Делаю курсовые и лабораторные на Delphi, GPSS, Assembler, C++.
Заказать и почитать отзывы можно на сайте, который указан в этой теме
Дешево!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 02:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter