На входе программе подается последовательность символов, состоящая из букв латинского алфавита и цифр. ввод символов заканчивается вопросительным знаком.Требуется написать как можно более эффективную программу, которая состоит из всех цифр, встретившихся в строке и не равных нулю, формирует наименьшее число (без повторов) и выводит на экран число, равное синусу полученного числа. если таких цифр нет, то программа выводит нуль.
пусть, например, на входе программе поданы следующие символы: a1ab1ac1ad2ae4r4
в данном случае программа должна вывести sin(124)=-0,995686
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, Buttons, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
SBQuit: TSpeedButton;
SBOpen: TSpeedButton;
SBSave: TSpeedButton;
ODText: TOpenDialog;
SDText: TSaveDialog;
CBChar: TCheckBox;
MText: TMemo;
Label1: TLabel;
procedure SBOpenClick(Sender: TObject);
procedure SBQuitClick(Sender: TObject);
procedure SBSaveClick(Sender: TObject);
procedure MTextKeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Function DeleteRepeatChar(s:string):string;
var buf:string;
begin
while length(s)<>0 do // пока строка s не пустая
begin
buf:=buf+s[1]; // забираем из нее 1 символ
while pos(buf[length(buf)],s)<>0 do delete(s,pos(buf[length(buf)],s),1); // и удаляем все его вхождения
end;
DeleteRepeatChar:=buf;
end;
procedure TForm1.MTextKeyPress(Sender: TObject; var Key: Char);
const
a=['1'..'9']; //указываем границы вхождения в массив(чтобы отбирать из символов цифры)
Digit: Set of Char=['0' .. '9','a'..'z','A'..'Z','?', '-',#32,#16,#8,#17,#13]; //указываем возможные для ввода символы
var S,d,k:String;
i,j,ch:integer;
changed:boolean;
buf:String;
begin
if not (Key in Digit) then //если прожимается неразрешённая клавиша, то она не вводится
Key:=#0;
S:= MText.Text;
ch:=0;
if Key in ['?'] then //если вводится знак ? то начинается выполнение программы
for i:= 1 to Length(S) do begin //для i от одного до конечного символа
if (s[i] in a) then begin //если символ явл-ся цифрой, то он проходит
ch:=ch*10+ord(s[i])-ord('0'); //прибавляется цифра к числу
end;
d:= DeleteRepeatChar(IntToStr(ch)); //из числа удаляются повторяющиеся символы
//не работает сортировка
repeat
changed:=false;
for j:= 1 to Length(d) - 1 do
if d[j]<d[j+1] then begin
buf:=d[j];
d[j]:=d[j+1];
d[j+1]:=buf;
changed:=true;
end;
until not changed;
//конец нерабочей сортировки
label1.caption:= 'sin('+d+')='+FloatToStr(sin(StrToFloat(d))); //считается символ полученного числа и выводится в однострочный текстовый редактор
end;
end;
end.
не работает только часть кода отвечающая за сортировку цифр по возрастанию, помогите исправить.
Примечание:
число составляется из всех цифр присутсвующих, но главное чтоб они не повторялись, а наименьшее значит, что не 421 будет и не 214, а самое малое возможное 124.
Примечание:
не вижу в ней сортировки по возрастанию
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.