|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Помогите найти ошибку
Программирую двоичный калькулятор. По заданию нужно сделать так чтобы он складывал два числа в двоичной системе счисления также как это происходит на бумаге, т.е. 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. |
#3
|
|||
|
|||
Эмм.. Не въехал, разве StrToInt эту самую функцию не выполняет?
|
#4
|
|||
|
|||
Нет, т.к., как я понял из задания, у тебя в строке находится БИТОВОЕ представление числа. В таком случае StrToInt('101') даст 101, а должно дать 5. Для этого представленные функции и даны. Ну и обратно, пусть будет такой пример:
3 + 5 что соответсвует исходным данным: 011 + 101 Тогда при использовании StrToInt() ты получиш 112, а должно получиться 1000 |
#5
|
|||
|
|||
И самое главное, внутри цикла i не меняется
|
#6
|
|||
|
|||
Да пофиг на 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; |