Консультация № 186228
28.05.2012, 22:08
200.00 руб.
0 11 2
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Помогите, пожалуйста,выполнить задания в делфи (консольное приложение и пояснение в каждой строчке).Задания нужно выполнить до 30 включительно:
1)Дана строка символов. Известно, что первый символ отличен от пробела и что среди остальных сим-волов имеется хотя бы один пробел. Рассматриваются символы s1,..., sn - символы, предшествующие первому пробелу. Преобразовать последовательность s1,..., sn, удалив из каждой группы идущих подряд цифр, в которой более двух цифр и которой предшествует точка, все цифры, начиная с третьей (напри-мер, ab+0.1973-1.1 преобразуется в ab+0.19-1.1).
2)Программа. Дан текст, за которым следует точка. В алфавитном порядке напечатать (по разу) все строчные русские гласные буквы, входящие в этот текст.
3)на делфи написана игра Пятнашки,дан алгоритм и нужно построить блок схему по этому алгоритму:
1) Добавляем стартовую клетку в открытый список.
2) Повторяем следующее:
a) Ищем в открытом списке клетку с наименьшей стоимостью F. Делаем ее текущей клеткой.
b) Помещаем ее в закрытый список. (И удаляем с открытого)
c) Для каждой из соседних 8-ми клеток ...
• Если клетка непроходимая или она находится в закрытом списке, игнорируем ее. В противном случае делаем следующее.
• Если клетка еще не в открытом списке, то добавляем ее туда. Делаем текущую клетку родительской для это клетки. Расчитываем стоимости F, G и H клетки.
• Если клетка уже в открытом списке, то проверяем, не дешевле ли будет путь через эту клетку. Для сравнения используем стоимость G. Более низкая стоимость G указывает на то, что путь будет дешевле. Если это так, то меняем родителя клетки на текущую клетку и пересчитываем для нее стоимости G и F. Если вы сортируете открытый список по стоимости F, то вам надо отсортировать свесь список в соответствии с изменениями.
d) Останавливаемся если:
• Добавили целевую клетку в открытый список, в этом случае путь найден.
• Или открытый список пуст и мы не дошли до целевой клетки. В этом случае путь отсутствует.
3) Сохраняем путь. Двигаясь назад от целевой точки, проходя от каждой точки к ее родителю до тех пор, пока не дойдем до стартовой точки. Это и будет наш путь.

Обсуждение

Неизвестный
31.05.2012, 00:08
общий
это ответ
Здравствуйте, Бондаренко Сергей Николаевич!
Соответственно правилам, при наличии в вопросе более чем одной задачи эксперт в праве ответить на любую по выбору. Отвечу на первую.
Цитата: Бондаренко Сергей Николаевич
Дана строка символов. Известно, что первый символ отличен от пробела и что среди остальных сим-волов имеется хотя бы один пробел. Рассматриваются символы s1,..., sn - символы, предшествующие первому пробелу. Преобразовать последовательность s1,..., sn, удалив из каждой группы идущих подряд цифр, в которой более двух цифр и которой предшествует точка, все цифры, начиная с третьей (напри-мер, ab+0.1973-1.1 преобразуется в ab+0.19-1.1).

Для поиска пробела в строке пользуемся функцией pos (<подстрока>,<строка>). Она возвращает индекс первого вхождения подстроки в строку. Для удаления символов используем процедуру delete (<строка>,<позиция>,<количество>). Остальное должно быть ясно из комментариев.
[code h=300]program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

Var s: string; //строка
ps, pd, i: integer; //позиция пробела, позиция точки, текущий символ
begin
readln (s); //получаем строку
ps:= pos (' ', s); //получаем позицию пробела
i:= 1; //начинаем с первого символа
while (i<ps) do //пока не дойдём до пробела
begin
while (i<ps) and (s[i]<>'.') do inc(i); //доходим до первой точки
pd:= i; //запоминаем позицию точки
inc (i); //переходим на символ за точкой
while (i<ps) and (ord(s[i])>=48) and (ord(s[i])<= 57) do inc(i);
//пока не кончится строка и текущий символ - цифровой, проходим дальше
if (i-pd-1>2) then begin //если число цифр больше двух
delete (s, pd+3, i-pd-3); //удаляем все с третьей
ps:= ps-(i-pd-3); //уменьшаем позицию пробела на число удалённых символов
end;
end;
writeln ('Result: ', s); //выводим результат
readln; //чтобы не закрылось окно
end.
[/code]
Проверено в Delphi 7.
Удачи!
Неизвестный
31.05.2012, 00:09
общий
Обратите внимание. Быть может, у кого-то есть желание ответить на другие задачи из мультиконсультации.
Неизвестный
31.05.2012, 10:41
общий
ну за одну задачу тогда же не 200 рублей
давно
Мастер-Эксперт
425
4118
31.05.2012, 11:48
общий
это ответ
Здравствуйте, Бондаренко Сергей Николаевич!
Ответ на вопрос №2. Код в приложении.
Использование: в функцию OnlyLowerSimbols() в качестве параметра передаётся любая строка текста. Каждая буква из этой строки текста сверяется с набором русских строчных букв и заносится в хранилище букв типа TStringList. Буква проверяется на существование в хранилище с помощью функции CheckExists() - если такая уже есть, то буква не заносится, если нет, то заносится. После того, как все буквы занесены, происходит их сортировка с помощью встроенного в хранилище метода Sort.
Вывод строки отсортированных букв осуществляется любым удобным для Вас способом (т.к. способов очень много, я не стал этого делать в программе), например:
Memo1.Lines.Add(OnlyLowerSimbols(Какая-то_строка_текста));

Приложение:
{Это вспомогательная функция проверяет, есть ли в хранилище List строка
checkstring. Если есть - возвращается True, если нет - False}
function CheckExists(checkstring: string; List: TStringList): boolean;
Var
i: integer;
Begin
Result:=False;
For i:=0 To List.Count-1 Do
If checkstring=List[i] Then
Result:=True;
End;

{Функция выискивает в передаваемой ей, в качестве параметра, строе
s строчные гласные буквы. Потом сортирует их по алфавиту
и возвращает результат в виде строки символов}
function OnlyLowerSimbols(s: string): string;
Var
i: integer;
LowerSimbolsRus: set of 'а'..'я'; //Набор русских букв
len: integer; //Длина строки
st: TStringList; //Объект хранения найденых символов и для сортировки
Begin
Result:='';
//Определяем длину строки
len:=Length(s);
//Если она больше ноля, т.е. строка непустая
If len>0 Then
Begin
//Правильный набор букв
LowerSimbolsRus:=['а','е','ё','и','й','о','у','ы','э','ю','я'];
//Создаём объект-хранилище найденых букв
st:=TStringList.Create;
//Просматриваем всю строку от начала до конца
For i:=1 To len Do
//Если буква входит в искомый набор
If (s[i] in LowerSimbolsRus) Then
//Если такой буквы в хранилище ещё нет
If not CheckExists(s[i], st) Then
st.Add(s[i]); //Добавляем символ в хранилище
//Сортировка символов в хранилище
st.Sort;
End;
Result:=st.Text;
End;
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Профессионал
304622
583
31.05.2012, 16:06
общий
По третьей задаче.

Ничего не понял.
Неизвестный
31.05.2012, 16:14
общий
по третьей нужно построить только блок схему по алгоритму,который написан.......со словами,которые описывают алгоритм
Неизвестный
31.05.2012, 16:15
общий
Адресаты:
Предполагаю, что надо все эти слова перевести в прямоугольнички, ромбики и стрелочки. Хотя задача странноватая...
давно
Профессионал
304622
583
31.05.2012, 16:16
общий
Цитата: 369940
алгоритму,который написан.......со словами,которые описывают алгоритм


Именно. Алгоритм совершенно непонятен.
Неизвестный
31.05.2012, 17:31
общий

правильно говорите)))
Неизвестный
01.06.2012, 11:42
общий
мне поможет кто-нибудь с блок-схемой????
Неизвестный
01.06.2012, 12:17
общий
Ну, может что-то типа этого. Но не поручусь, задание странное.
Форма ответа