Автор Тема: Делфи(строки)  (Прочитано 5197 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Астасья

  • Постоялец
  • ***
  • Сообщений: 173
    • Просмотр профиля
Делфи(строки)
« : 10 Мая 2012, 19:28:12 »
Задание 1 в edit1 пишем выражения вида "число знак число знак...." после нажатия на кнопку в edit 2 выводиться результат (знаки только +,-,*,/),программа работает,но как сделать так чтобы она учитывала приоритеты ариф.действий????????

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
 z=['-','+','*','/'];
 var
s: string;
yach, nachchisla, i: integer;
sum: real;
masch: array [1..20] of string;
masz: array [1..20] of char;
begin
s:=Edit1.Text;
yach:=1;
nachchisla:=1;
s:=s+'#';
for i := 1 to Length(s) do
 if (s in z) or (s='#') then
 begin
masch[yach]:=copy(s, nachchisla, i- nachchisla);
nachchisla:=i+1;
yach:=yach+1;
 end;
 yach:=1;
for i := 1 to Length(s) do
 if (s in z) then
 begin
masz[yach]:=s;
yach:=yach+1;
end;
 sum:=strToFloat(masch[1]);
 for i := 1 to yach - 1 do
 begin case masz of
'-': sum:=sum-strToFloat(masch[i+1]);
'+': sum:=sum+ strToFloat(masch[i+1]);
'*': sum:=sum*strToFloat(masch[i+1]);
'/': sum:=sum/strToFloat(masch[i+1]);
end;
Edit2.Text:=floatTostr(sum);
end;
 end;

end.
Задание 2  на экране 2 edit и кнопка.в первой строке произвольное текстовое предложение.по нажатию на кнопку нужно зашифровать строку по след. алгоритму:каждый буквенный символ заменяется на следующий за ним в табл ASCII.Знаки препинания и пробелы не изменять.Результат выести в etdit2. Как сделать так чтобы он не изменял знаки препинания???

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var N: integer;
begin
Edit2.Text:= '';//очистка
for N:= 1 to Length(Edit1.Text) do
Edit2.Text:= Edit2.Text + Chr(ord(Edit1.Text[N])+1);

end;

end.
« Последнее редактирование: 10 Мая 2012, 20:21:17 от Астасья »

Оффлайн ki

  • Ветеран
  • *****
  • Сообщений: 668
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #1 : 11 Мая 2012, 12:37:37 »
по первой задаче: сперва можно по порядку искать знак *, и выделять числа из строки слева и справа от него, вычислять значение и a*b заменять на результат...далее то же с /...ну а потом просто плюсовать или вычитать....

по второй задаче, наверно, можно выполнить проверку кода символа на попадание в интервал кодов для A-Z, a-z, A-Я, а-я и 0-9..либо перечислить в проверке символа все знаки препинания и другую абракадабру...

Оффлайн Астасья

  • Постоялец
  • ***
  • Сообщений: 173
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #2 : 11 Мая 2012, 14:17:11 »
Первое не понимаю можете написать прямо эту часть программы ,второе попробую с if

Оффлайн ki

  • Ветеран
  • *****
  • Сообщений: 668
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #3 : 11 Мая 2012, 14:46:47 »
Не уверен, что функции со строками напишу правильно, давно ничего не писал)

алгоритм примерно такой: ищем знак, который имеет больший приоритет, например "*".
Встречаем первый знак в строке, например это символ с номером i0;
Далее в строке выделяем числа, находящиеся справа и слева от него:
...-1      2    *     2     3 +...
  i0-2   i0-1  i0   i0+1  i0+2
считаем выражение 12*23, удаляем из строки символы с i0-2 до i0+2, и вставляем после значения i0-3 результат умножения.
Далее ищем следующий символ и т.д...
Получите примитивный калькулятор с парсингом выражения...

Оффлайн ki

  • Ветеран
  • *****
  • Сообщений: 668
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #4 : 11 Мая 2012, 15:06:49 »
Или можно считать все в массив чисел, обозначив арифметические функции отрицательными числами и оперировать с массивом будет проще...

Оффлайн Астасья

  • Постоялец
  • ***
  • Сообщений: 173
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #5 : 11 Мая 2012, 21:43:52 »
2 задача.Но он пишет тоже самое,что не так?????? :(

procedure TForm1.Button1Click(Sender: TObject);
var N: integer;
begin
Edit2.Text:= '';//очистка
for N:= 1 to Length(Edit1.Text) do
begin
if (Edit1.Text[N] in ['A'..'Z']) or (Edit1.Text[N] in ['a'..'z']) or (Edit1.Text[N] in ['А'..'Я']) or (Edit1.Text[N] in ['а'..'я'])  then
 begin
 Edit2.Text:= Edit2.Text + Chr(ord(Edit1.Text[N])+1);//переводит знак в число и обратно
 end
else  Edit2.Text:= Edit2.Text+ Edit1.Text[N];
end;
end;

end.


В первой я поняла логику размышления но перевести на делфи не получается :( :( :'( :'( :'(

Оффлайн ki

  • Ветеран
  • *****
  • Сообщений: 668
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #6 : 12 Мая 2012, 10:08:13 »
По второй задаче:
Думаю, лучше работать не напрямую с edit.text, а со строковой переменной S=edit.text...
Почему-то я не использовал "in" раньше...на просторах инета пишут, что сперва лучше инициализировать набор:
Цитировать
begin
  IsLetter('G');  // G - символ алфавита (верхнего регистра)
  IsLetter('1');  // 1 не является буквой
end;

// Проверка, является ли символ буквой
procedure TForm1.IsLetter(Letter : char);
var
  Alphabet : set of 'A'..'Z';

begin
  Alphabet := ['A'..'Z'];

  if Letter In Alphabet then
    ShowMessage(Letter+' в алфавите')
  else
    ShowMessage(Letter+' не в алфавите');
end;

или можно фильтровать не по самому символу, а по коду:
(ord(ch)>=48)and(ord(ch)<=57)   //ch = 0..9

И еще...ord работает с типом char, является ли s(i] чаром?..

ссылка на таблицу символов: ссылка
« Последнее редактирование: 12 Мая 2012, 10:55:17 от ki »

Оффлайн ki

  • Ветеран
  • *****
  • Сообщений: 668
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #7 : 12 Мая 2012, 10:37:08 »
по первой задаче:
s:=edit1.text;

repeat
if pos('*';s) then   //проверяем наличие '*' в строке
   begin
     k0:=pos('*';s);  //присваиваем k0 номер позиции первого "*"

     kleft:=k0;         //далее ищем позицию арифм.знака слева от "*" или начала строки.
     repeat                  
        kleft:=kleft-1;
     until (s[kleft]='+')or(s[kleft]='-')or(s[kleft]='*')or(s[kleft]='/')or(kleft=1);
     kleft:=k0;         //далее ищем позицию арифм.знака слева от "*" или начала строки.

     kright:=k0;         //далее ищем позицию арифм.знака справа от "*" или конца строки.
     repeat                  
        kright:=kright+1;
     until (s[kright]='+')or(s[kright]='-')or(s[kright]='*')or(s[kright]='/')or(kright=length(s));
  
    //далее копируем строки
    s1:=copy(s;kleft+1;k0-kleft-1);   //первый множитель
    s2:=copy(s;kright-1;kright-k0-1);   //второй множитель
    //переводим в числа,ищем результат,удаляем часть строки, вставляем результат.
    delete(s;kleft+1;kright-kleft-1);
    insert(s;inttostr(strtoint(s1)*strtoint(s2));kleft+1);
  end;
until pos('*';s)=0;

не уверен, что все правильно, но примерно так...
если код заработает, можно вывести его в процедуру и прогнать со всеми арифметическими действиями, изменив, конечно, в insert..
Ну и выводить промежуточный результаты действий со строкой, например в memo для контроля работы...
« Последнее редактирование: 12 Мая 2012, 10:53:47 от ki »

Оффлайн Астасья

  • Постоялец
  • ***
  • Сообщений: 173
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #8 : 13 Мая 2012, 16:10:48 »
1 получилась!!! :)
procedure TForm1.Button1Click(Sender: TObject);
var n: integer;
s:string;
begin
s:=Edit1.Text;
Edit2.Text:= '';//очистка
for N:= 1 to Length(s) do
begin
 if ord(s[n]) in [32..64]  then     //цифры тоже не меняем
 Edit2.Text:= Edit2.Text + Edit1.Text[N]//переводит знак в число и обратно
 else  Edit2.Text:= Edit2.Text+ Chr(ord(s[n])+1);
end;
end;

end.

Оффлайн Астасья

  • Постоялец
  • ***
  • Сообщений: 173
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #9 : 13 Мая 2012, 16:31:06 »
2 так и не получилась....на делфи никак не могу

Оффлайн Астасья

  • Постоялец
  • ***
  • Сообщений: 173
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #10 : 13 Мая 2012, 20:32:31 »
У меня тут ещё один вопрос .Задание:дано число n и тект. файл ,по нажатию на кнопку из файла удалить строку n,если такой строки нет оставить файл без изменения. Удалять получается но вот если такой строки нет,как сделать ,чтоб файл не менялся(те чтоб не выходила ошибка)????

procedure TForm1.Button1Click(Sender: TObject);
var F:TStringList;
begin
 F:=TStringList.Create;
 F.LoadFromFile('1.txt');
 F.Delete(strtoint(edit1.Text));
 F.SaveToFile('1.txt');
 F.Free;
end;

end.

Оффлайн ki

  • Ветеран
  • *****
  • Сообщений: 668
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #11 : 14 Мая 2012, 10:05:51 »
насколько помню, у stringlist есть свойство count - число строк..
Соответственно используйте условие на n<=F.count-1

Оффлайн Астасья

  • Постоялец
  • ***
  • Сообщений: 173
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #12 : 14 Мая 2012, 13:51:51 »
спасибо!получилось

Оффлайн ki

  • Ветеран
  • *****
  • Сообщений: 668
    • Просмотр профиля
Re: Делфи(строки)
« Ответ #13 : 14 Мая 2012, 15:08:22 »
пожалуйста)

 

Задача на строки в Паскале. Упорядочить и найти средний вес

Автор Ana

Ответов: 13
Просмотров: 8032
Последний ответ 23 Февраля 2010, 22:33:15
от Asix
Помогите решить задачи на СИ, про матрицы и символьные строки.

Автор katerinka777

Ответов: 4
Просмотров: 8164
Последний ответ 25 Апреля 2010, 12:56:01
от InfStudent
Программа в делфи. Вычислить определенный интеграл методом трапеции

Автор Мозг

Ответов: 0
Просмотров: 8411
Последний ответ 15 Сентября 2010, 21:06:25
от Мозг
Ввод строки с клавиатуры, модификация, вывод.

Автор ImThe

Ответов: 1
Просмотров: 4096
Последний ответ 18 Мая 2013, 01:08:04
от ImThe
Сортировка двумерного массива по возрастанию, делфи

Автор Asira

Ответов: 1
Просмотров: 7701
Последний ответ 30 Апреля 2010, 01:39:45
от InfStudent