Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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

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.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:33
Выполнено за 0.04 сек.