Задача на сортировку записей и вывод части из них по условию (pascal)

  • Автор темы Ruschel
  • Дата начала
R

Ruschel

#1
Всем привет! Задали сделать задачку, состоящую из 2 частей, 1 часть сделал, а во второй есть напряги. Значит собсно условие задачи:
В файле данных хранится информация о каждом из воспитанников детского сада: фамилия, имя, название группы (младшая средняя старшая), заключение о состоянии здоровья("здоров" или "нуждается в лечении") каждого из четырёх специалистов - невропатолога, отоларинголога, ортопеда и стоматолога.
Разработать и реализовать программу "Учёт результатов диспансеризации", которая считывает исходную информацию и позволяет организовать обработку следующих запросов:
1. Определить процентное соотношение здоровых и нуждающихся в лечении детей по заключению указанного в запросе специалиста;
2. Вывести на экран в удобной для пользователя форме полную информацию по указанной в запросе группе. При этом сведения должны быть упорядочены в алфавитном порядке.
Число воспитанников детского сада не превышает 100.
Входной файл я сделал в формате:
Код:
Астафьева  Ксения	1 0 1 1 0
...............................
где "Астафьева* "-фамилия, 12 позиций, "Ксения "-имя,10 позиций, "1 0 1 1 0" - группа(0..2), состояние врачей по порядку(0-болен, 1-здоров).
Чтобы было проще, выложу первую часть проги:
[codebox]program prakt;
uses crt;
type zap=record
family:string[12];
name:string[10];
gr:byte;
vrach:array[1..4] of byte
end;
var z:zap; inp:text; proc1:real;

procedure Procent(var proc:real);
var i,j,ln,bolnix,zdorov:byte; spec:string;
begin
assign(inp,'C:\tp7\praktika\input.in');
reset(inp);
writeln('Учет результатов диспансеризации':55);
write('Запрос 1: Укажите специалиста - '); read(spec);
ln:=length(spec);
case ln of
12: j:=1;
13: j:=2;
7: j:=3;
10: j:=4;
end;
bolnix:=0; zdorov:=0;
repeat
read(inp,z.family,z.name,z.gr);
for i:=1 to 4 do
begin
read(inp,z.vrach);
if i=j then
begin
if z.vrach=0 then
bolnix:=bolnix+1
else
zdorov:=zdorov+1;
end;
end;
readln(inp);
until eof(inp);
proc:=zdorov/(zdorov+bolnix)*100;
writeln('У ',spec,' ',proc:3:2,'% здоровых, ',(100-proc):3:2,'% больных');
close(inp);
readkey;
end;

begin
clrscr;
{1 часть}
Procent(proc1);[/codebox]
(*требования препода - переносить по максимуму в локальные параметры процедур\функций)
По второй(и 1 вопрос по первой) задаче вознивают вопросы:
1) Каким алгоритмом реализовать сортировку записей?
2) Как трансформировать из цифр (состояния здоровья, группа и т.д.) в "полную информацию по группе детей"?
3)(1 и 2 задача) - как поставить лимит записей?

Буду очень рад, если поможете написать код 2 части или хотя бы часть подскажите!
Всем заранее спасибо!
 
E
#2
Вам про типизораванные файлы еще не рассказывали?
Каким алгоритмом реализовать сортировку записей?
Любым. А ваще закиньте записи в какой-нибудь список/коллекцию, где есть метод Sort.
2) Как трансформировать из цифр (состояния здоровья, группа и т.д.) в "полную информацию по группе детей"?
Тут не понятно.
3)(1 и 2 задача) - как поставить лимит записей?
Тупо в коде. Если записей 100 то все в сад.


"1 0 1 1 0" - группа(0..2), состояние врачей по порядку(0-болен, 1-здоров).
Еще почитайте про set'ы.
 
R

Ruschel

#3
1) Что значит закинуть в список\коллекцию? Может вы про Дельфи имеете ввиду, так мне надо на турбо паскале. Про типизораванные файлы не расказывали, только про типизированные, но причём тут они и ответ на вопрос по сортировке записей?
2) Ну у меня во входном файле информация введена почти по типу булеана, а не словами "здоров", группа "старшая" ну и т.д, но вот на экран надо вывести всё в тексте, а не как во входном файле
3) В текстовых файлах не работают функции filepos и filesize, поэтому надо как-то по другому....но я уже реализовал, засунув сразу после repeat счётчик
Код:
n:=n+1;
if n>100 then
break;
 
E
#4
Может вы про Дельфи имеете ввиду, так мне надо на турбо паскале.
Хм, сори, действительно сразу не заметил. Тогда сортировку только руками, наверное, хотя невкурсе, может и там чего есть.
Но типизированные файлы есть и в турбо паскале, а спросил, потому как с ними работать гораздо удобнее.
И вот это не понял:
Про типизораванные файлы не расказывали, только про типизированные
Ну у меня во входном файле информация введена почти по типу булеана
С сетами это просто решаетться, держиться рядом масив[ы] с этими самыми - "здоров", группа "старшая" ну и т.д, а потом по индексу достаете все что нужно. Преимуществ масса.
 
R

Ruschel

#5
ну если входной должен быть текстовый, то тип. и нетип. вид файлов сразу отпадает))), а следовательно большинство удобных функций тоже отпадает(( По крайней мере так в паскале....
Мда, видать придётся изучать сеты, мы просто до них видимо, как и до библиотек и тому прочее ещё не дошли))
Буду рад услышать от участников форума ещё идеи по поводу сортировки записей...
 
A

astronom

#6
Можно объявить входной файл как нетипизированный и сразу получить в распоряжение filepos seek и т.п.
Насчет сортировки ... если файл небольшой (в смысле, записей не несколько тысяч штук), то можно просто сделать массив записей (в смысле. record) . В каждую запись занести номер первого символа строки (т.е., смещение начала строки относительно начала файла), номер последнего символа и имя ребенка. Потом отсортировать этот массив и переписать исходный файл. :(

Кстати, раз уж в условии задачи не указано, что входной файл должен быть отсортирован по алфавиту, то кажется разумным сгруппировать в нем записи по группам детей (интересный каламбур :( ), т.е. собрать вместе все записи о детях младшей группы, отдельно - средней и старшей. По-моему, так будет проще работать с файлом.