Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.03.2013, 22:48   #1
Vashka
Пользователь
 
Регистрация: 14.03.2013
Сообщений: 10
По умолчанию Задачи по паскалю!

Нужна помощь по паскалю,буду рад получить правильные варианты)

Составить подпрограмму, которая в произвольной строке символов находит наиболее часто повторяющееся сочетание (из двух) символов. В головной программе вызвать эту подпрограмму для различных значений строк.

и ещё...

В больнице имеется общий список больных, каждый из которых характеризуется записью:
struct ZAP
{
char FIO[25];
int NP;
char SEX[5], DGN[20];
}
где FIO - фамилия и инициалы больного, NP -номер палаты, SEX -пол (мужской или женский), DGN - диагноз. Написать программу для хранения и корректировки списка больных. Программа должна позволять вводить данные о новых больных, размещать их по палатам с учетом диагноза, выводить по запросам пользователя информацию о бальных по палатам, находить номер палаты, в которой лежит нужный больной. По запросу пользователя файл, в котором хранится вся эта информация, должен обновляться путем удаления информации об уже выписавшихся больных.
Vashka вне форума Ответить с цитированием
Старый 15.03.2013, 22:54   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

По поводу первой:
- без указания кодировки эта задача некорректна.
- ну и хотелось бы знать ограничения на длину строки.
s-andriano вне форума Ответить с цитированием
Старый 17.03.2013, 22:30   #3
Vashka
Пользователь
 
Регистрация: 14.03.2013
Сообщений: 10
По умолчанию

А по поводу второй?
Vashka вне форума Ответить с цитированием
Старый 17.03.2013, 22:37   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

А в формулировке второй я проблем не вижу.
s-andriano вне форума Ответить с цитированием
Старый 18.03.2013, 00:23   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а я и в первой задаче не вижу никаких проблем и противоречий.
Строка всегда состоит из символов, вне зависимости от кодировки!
Чтобы определить, какая пара символов встречается наиболее часто, знать в какой кодировке строка, совершенно необязательно!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.03.2013, 07:32   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

А можно вопрос по задаче#1?
Как еще решать ?)
У меня есть такой вариант
Код:
max := 0;

for i := 1 to Length(s-1) do begin
       cmbn := s[i] + s[i+1];
       PosNumberCmbn (cmbn, count);
       if max <  count then begin
                   max := count;
                   maxcmbn := cmbn
       end;
Код:
procedure <...>;

i := 1;
count := 0;

while i <= Length(s) do begin
       if s[i] + s[i+1] = cmbn then
              Inc (count);
       Inc (i, 2)
end;
А хочется красоты
Poma][a вне форума Ответить с цитированием
Старый 18.03.2013, 09:01   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Poma][a , вполне себе нормальное решение. Не очень эффективное (лишнее постоянно будет перебираться), но вполне себе рабочее!

из других решений (исключительно алгоритмически) я вижу ещё:
- решение с матрицей N x N - где N - это число различных символов в строке, элемент на пересечении I-й строки и J-го столбца означает частоту появления сочетания двух символов: chr(I)+chr(J)

- динамическая структура (связанный список, например), куда помещаем найденные сочетания и счётчик их появления в строке. (ищем сочетания в списке, если нет, добавляем с счётчиком = 1, если нашли, наращиваем счётчик на единичку).

Но я бы оставился именно на вашем решении с поиском подстроки в строке - это просто, минимум кода, нет требований и затрат по памяти и достаточно быстро (подозреваю, что автора строки до 255 символов максимум, они обработаются быстрее, чем будет позже вывод результата в консоль осуществляться! )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.03.2013, 09:12   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
наиболее часто повторяющееся сочетание (из двух) символов.
А я бы так делал:
Код:
function se(s:string):Char;
var a:array['A'..'z'] of integer; i,max:integer;
begin
 max:=0;i:=0; se:='';
 while i<length(s) do 
  if a[i]=a[i+1] then begin 
    inc(a[s[i]]); 
    if a[s[i]]>max then begin  max:=a[s[i]]; se:=s[i];end;
    inc(i,2);
  end else inc(i);
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.03.2013, 11:20   #9
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а я и в первой задаче не вижу никаких проблем и противоречий.
Строка всегда состоит из символов, вне зависимости от кодировки!
Чтобы определить, какая пара символов встречается наиболее часто, знать в какой кодировке строка, совершенно необязательно!
Ну да, осталось только выяснить, сколько байтов занимают эти два символа: 2, 3 или 4.
Как можно это узнать, не зная кодировки текста?
s-andriano вне форума Ответить с цитированием
Старый 18.03.2013, 11:29   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от s-andriano
Ну да, осталось только выяснить, сколько байтов занимают эти два символа: 2, 3 или 4.
Зачем это нам знать?! строка это ВСЕГДА array of char
Сколько занимает char - один байт, два или 4 - об этом пусть думает компилятор!
главное, чтобы s[i] (которое char) возвращало нам нужный символ строки. И всё.
Вы, наверное, рабочее решение от Poma][a проглядели...



Цитата:
Сообщение от Stilet
А я бы так делал:
Виталий, а почему Вы решили, что строка не может состоять из цифр, пробелов, знаков препинания, русских букв, наконец?
Потому что, так, как Вы решили, так проще?
Кроме того, "часто повторяющееся сочетание" это два символа, стоящии рядом, которые встречаются наибольшее число раз.
С чего Вы (ошибочно) решили, что это "if a[i]=a[i+1] " - ОДИНАКОВЫЕ символы?!!

Последний раз редактировалось Serge_Bliznykov; 18.03.2013 в 11:33.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задачи по паскалю alexrazor9 Паскаль, Turbo Pascal, PascalABC.NET 4 18.01.2012 17:45
2 задачи по паскалю ИЛЬЯ17 Помощь студентам 13 14.12.2011 11:53
задачи по паскалю!!!! *Марусенька* Помощь студентам 13 15.01.2010 00:22
Задачи по Паскалю. cone4ka Помощь студентам 6 30.10.2009 20:06
Задачи по Паскалю koshkarjov Помощь студентам 2 02.02.2009 18:06