|
Вопрос # 3 439/ вопрос открыт / |
|
Здравствуйте, эксперт!
Помогите,пожалуйста, составить программу для перевода
из 2-ой в 10-ую систему счисления в оконном приложении.
Смысл в том,что пользователь будет вводить любое число и будет
вводить свой ответ. Моя программа должна показать правильный ли
ответ и дать верный ответ. Спасибо заранее,премного благодарна.
 |
Вопрос задала: Альбина (статус: Посетитель)
Вопрос отправлен: 23 ноября 2009, 21:52
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Егор
Здравствуйте, Альбина!
Запускаем дельфи, на форму помещаем два текстовых поля (Edit), кнопку и две метки (Label). В метки пишем в свойство Caption "двоичное число" и "десятичное число", помещаем эти метки слева от текстовых полей.
Затем для текстовых полей делаем обработчики нажатия на клавишу (чтобы в первое поле можно было вводить только 0 или 1, во второе - только числа от 0 до 9). В обработчике создания формы просто очищаем текстовые поля.
Код обработчиков:
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Text:=''; // очистим первое поле
Edit2.Text:=''; // очистим второе поле
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
// если была нажата какая-то клавиша, не 0 или 1 (и при этом эта клавиша
// не является функциональной), то код клавиши обнулим, т.е. проигнорируем
if ((Key<'0') or (Key>'1')) and (Key>#31) then Key:=#0;
end;
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
// если была нажата какая-то клавиша, не цифровая (и при этом эта клавиша
// не является функциональной), то код клавиши обнулим, т.е. проигнорируем
if ((Key<'0') or (Key>'9')) and (Key>#31) then Key:=#0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
c : char;
k1, k2 : integer;
begin
// при нажатии на клавишу проверим, есть ли текст в текстовых полях
// если нет, то выйдем из процедуры:
if (Edit1.Text='') or (Edit2.Text='') then Exit;
// преобразуем текст из второго поля (десятичное число) в число:
k2 := StrToInt(Edit2.Text);
// теперь преобразуем текст в пером поле из двоичного в десятичное число:
k1 := 0;
for i:=1 to length(Edit1.Text) do
begin
k1 := k1*2 + StrToInt(Edit1.Text[i]);
end;
// тперь проверим, равны ли получившиеся числа:
if k1=k2 then
ShowMessage('Всё верно! Число в двоичном виде: ' + Edit1.Text +
'. В десятичном: ' + IntToStr(k1))
else
ShowMessage('Ошибка! Число в двоичном виде: ' + Edit1.Text +
'. В десятичном: ' + IntToStr(k1))
end;
Работа программы:
* в первое поле вводим число в двоичном виде (нолики и единички - а другие символы не введутся)
* во второе поле вводим число в десятичной системе
* нажимаем кнопку
* если числа введены верно, выдастся сообщение "Всё верно" и будут показаны оба числа - в двоичном и десятичном видах
* если числа введены различные, то сообщение будет гласить "ошибка" и будут показано число в двоичном виде и его аналог в десятичном
скачать исходники можно здесь: BinToDec
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 23 ноября 2009, 23:17
|
Мини-форум вопроса
Всего сообщений: 8; последнее сообщение — 30 ноября 2010, 21:12; участников в обсуждении: 3.
|
IlluminatI (статус: 2-ой класс), 23 ноября 2009, 22:35 [#1]:
Если я вас правильно понял, то вот то, что вам нужно (листинг программы, ссылка на скачивание - http://slil.ru/28243609):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
const
TrueAnswer = 'Верно!';
FalseAnswer = 'Не верно!';
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Button1: TButton;
Panel1: TPanel;
Label3: TLabel;
Label4: TLabel;
Button2: TButton;
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function pow(x, y: integer): integer;
var i, r: integer;
begin
r:=1;
if (y = 0) then
begin
Result:=1;
exit;
end;
for I := 1 to y do
r:=r*x;
Result:=r;
end;
function BinToDec(n: integer): integer;
var s: string;
I, x, rez, step: Integer;
begin
s:=IntToStr(n);
step:=0;
rez:=0;
for I := Length(s) downto 1 do
begin
rez:=rez + (StrToInt(s[i]) * pow(2, step));
inc(step);
end;
Result:=rez;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if (BinToDec(StrToInt(Edit1.Text)) = StrToInt(Edit2.Text)) then
begin
Label3.Font.Color:=clGreen;
Label3.Caption:=TrueAnswer;
Label3.Visible:=true;
end
else
begin
Label3.Font.Color:=clRed;
Label3.Caption:=FalseAnswer;
Label3.Visible:=true;
Label4.Visible:=true;
Label4.Caption:=Label4.Caption + IntToStr(BinToDec(StrToInt(Edit1.Text)));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Label3.Visible:=false;
Label4.Visible:=false;
Edit1.Text:='';
Edit2.Text:='';
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var a: integer;
begin
if not(key in ['0', '1']) then key:=#0;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Label3.Visible:=false;
Label4.Visible:=false;
end;
end.
|
|
Иринчик (статус: Посетитель), 11 ноября 2010, 15:05 [#2]:
Помогите пожалуйста! Нужна программа перевода из десятичной системы счисления в двоичную и наоборот. На форме в одно поле вводится десятичное число и нажимается кнопка, в другом поле выводится то же самое число в двоичной системе. И наоборот! Помогите!!!
|
|
Егор (статус: 10-ый класс), 11 ноября 2010, 17:32 [#3]:
Иринчик: а чем вышеприведённый код не нравится?
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Иринчик (статус: Посетитель), 30 ноября 2010, 20:16 [#4]:
Егор, условие задачи просто другое. Мне нужно переводить из одной системы счисления в другую, а не проверять, верно или не верно. Помогите пожалуйста!!!
|
|
Иринчик (статус: Посетитель), 30 ноября 2010, 20:17 [#5]:
И еще можно спросить? А в стеках разбираешься? помогите)))
|
|
Егор (статус: 10-ый класс), 30 ноября 2010, 20:47 [#6]:
стеки - понятие растяжимое. задание нужно
но ты лучше новый вопрос задай, а не здесь, в форуме пиши - и отклик будет
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Иринчик (статус: Посетитель), 30 ноября 2010, 20:53 [#7]:
А это куда именно писать надо? Задание есть. Ты сможешь посмотреть? Я напишу тебе его. Помоги, пожалуйста!!! Зачет не могу получить!!!
|
|
Егор (статус: 10-ый класс), 30 ноября 2010, 21:12 [#8]:

слева вверху есть менюшка. вот там третья-четвёртая ссылка и есть "задать вопрос"
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|