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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 29.11.2017, 19:58
ToxyLoxy ToxyLoxy вне форума
Прохожий
 
Регистрация: 29.11.2017
Сообщения: 2
Версия Delphi: Delphi 2009
Репутация: 10
По умолчанию Помогите найти ошибку

Программирую двоичный калькулятор. По заданию нужно сделать так чтобы он складывал два числа в двоичной системе счисления также как это происходит на бумаге, т.е. 0+0=1; 1+0=1; 1+1=0(с переносом единицы в следующий разряд) и выводил всё в той же двоичной системе счисления.
Программа компилируется, но при выполнении любого действия зависает...
Код не доработан, в частности не реализован перенос единица в след. разряд, с чем тоже возникают трудности.
Это моя первая работа в Delphi так что прошу без наездов типа:"Ты что, тупой? Тут же надо всего лишь..."
Код:
unit BiCalc;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender: TObject);

    private
    { Private declarations }
  public
    { Public declarations }
  end;

var s: string;
  ost, i, a: integer;
  Form1: TForm1;

implementation
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  s:= Edit1.Text;
  i:= Length(s);
  while i>0 do
  begin
    if StrToInt(Edit1.Text[i])+StrToInt(Edit2.Text[i])=0 then
    begin
      Edit3.Text:= IntToStr(ost);
      ost:=0;
    end;
    if StrToInt(Edit1.Text[i])+StrToInt(Edit2.Text[i])=1 then
    begin
      Edit3.Text:= IntToStr(ost);
      ost:=1;
    end;
    if StrToInt(Edit1.Text[i])+StrToInt(Edit2.Text[i])=2 then
    begin
      Edit3.Text:= IntToStr(ost);
      ost:=0;
      a:=1;
    end;
  end;
end;

end.
Ответить с цитированием
  #2  
Старый 29.11.2017, 22:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

м-м-м... а что, религия не позволяет конвертнуть оба числа в Integer, сложить, а потом конвертнуть обратно? Это, кстати, будет быстрее и проще.
Процки см тут.
Ответить с цитированием
  #3  
Старый 30.11.2017, 00:55
ToxyLoxy ToxyLoxy вне форума
Прохожий
 
Регистрация: 29.11.2017
Сообщения: 2
Версия Delphi: Delphi 2009
Репутация: 10
По умолчанию

Эмм.. Не въехал, разве StrToInt эту самую функцию не выполняет?
Ответить с цитированием
  #4  
Старый 30.11.2017, 02:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Нет, т.к., как я понял из задания, у тебя в строке находится БИТОВОЕ представление числа. В таком случае StrToInt('101') даст 101, а должно дать 5. Для этого представленные функции и даны. Ну и обратно, пусть будет такой пример:
3 + 5
что соответсвует исходным данным:
011 + 101
Тогда при использовании StrToInt() ты получиш 112, а должно получиться 1000
Ответить с цитированием
  #5  
Старый 30.11.2017, 10:38
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

И самое главное, внутри цикла i не меняется
Ответить с цитированием
  #6  
Старый 30.11.2017, 19:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да пофиг на i, там в принципе код кривой. Деже если это поправить будет неправильно работать. Например, перенос считается, но не используется.
Если уж очень хочется самому, то как-то вот так:
Код:
uses
  Math;
  
function BinAdd(D1, D2 : String) : String;

  function BitChrToVal(C : Char) : Byte;
  begin
    Case C Of
      '0' : Result := 0;
      '1' : Result := 1;
      Else Raise Exception.CreateFmt('Unexpected bit value - %s',[C]);
    End;
  end;
  
var
  I, MaxLen : Integer;
  Bit : Byte;
  Shtt : Byte;
begin
  if Length(D1) <> Length(D2) Then
    Begin
      MaxLen := Max(Length(D1),Length(D2));
      While Length(D1) < MaxLen Do D1 := '0' + D1;
      While Length(D2) < MaxLen Do D2 := '0' + D2;
    End;
    
  Result := '';
  Shft := 0;
  For I := MaxLen DownTo 1 Do
    Begin
      Bit := Shft + BitChrToVal(D1[i]) + BitChrToVal(D2[i]);
      Shft := 0;
      Case Bit Of
        0 : Result := '0' + Result;
        1 : Result := '1' + Result;
        2 : Begin Result := '0' + Result; Shft := 1; End;
        3 : Begin Result := '1' + Result; Shft := 1; End;
        Else Raise Exception.Create('something went wrong - got bit intermediate value out of [0..3].');
      End;
    End;
  If Shft > 0 Then Result := '1' + Result;
end;
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter