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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2013, 20:48   #1
Rakot568
Новичок
Джуниор
 
Регистрация: 24.05.2013
Сообщений: 2
Сообщение Массив записей.

Есть программа на Pascal. Задан массив записей. В нем содержится информация о работниках. Данные о работниках располагаются в файле file.in. Нужно отобрать работников-мужчин, изменив процедуру Sort, чтобы в file.out выводились данные только о мужчинах.
Код:
Код:
Uses Crt; 
Const 
  n = 20; 
Type            
  Sotr = record 
    fam, nam, otc: string[20];  
    pol: char; 
    date: string[10]; 
    adr, phone: string[30]; 
    oklad: real; 
  end; 
  Arr = array[1..n] of Sotr; 
Var 
  m: Arr; 
  f: text; 
  k: byte; 
 
Procedure ParseString(st: string; var so: Sotr); 
{ Процедура разбора строки по запятым и записи  
  в соответствующие поля по порядку записи so } 
var 
  i: integer; 
  o: real; 
begin 
  i := pos(',',st); 
  if i<>0 then  
    begin 
      so.fam := copy(st,1,i-1); 
      delete(st,1,i); 
    end; 
  i := pos(',',st); 
  if i<>0 then  
    begin 
      so.nam := copy(st,1,i-1); 
      delete(st,1,i); 
    end; 
  i := pos(',',st); 
  if i<>0 then
    begin 
      so.otc := copy(st,1,i-1); 
      delete(st,1,i); 
    end; 
  i := pos(',',st); 
  if i<>0 then  
    begin 
      so.pol := st[1]; 
      delete(st,1,i); 
    end; 
  i := pos(',',st); 
  if i<>0 then  
    begin 
      so.date := copy(st,1,i-1); 
      delete(st,1,i); 
    end; 
  i := pos(',',st); 
  if i<>0 then  
    begin 
      so.adr := copy(st,1,i-1); 
      delete(st,1,i); 
    end; 
  i := pos(',',st); 
  if i<>0 then  
    begin 
      so.phone := copy(st,1,i-1); 
      delete(st,1,i); 
    end; 
  if st<>'' then 
    begin 
      val(st,o,i); 
      if i=0 then 
        so.oklad := o; 
    end; 
end; 
 
Function GetString(const so: Sotr): string; 
{ Функция, получающая запись, и формирующая строку из ее полей 
  разделенными запятыми в порядке следования полей } 
var 
  s: string; 
  o: string; 
begin 
  s := so.fam+','; 
  s := s+so.nam+','; 
  s := s+so.otc+','; 
  s := s+so.pol+','; 
  s := s+so.date+','; 
  s := s+so.adr+','; 
  s := s+so.phone+','; 
  str(so.oklad,o); 
  s := s+o; 
  GetString := s; 
end; 
 
Function ReadFromFile(var a: Arr): byte; 
{ Функция чтения из текстового файла и записи в массив данных о сотрудниках. 
  Функция возвращает количество считанных строк } 
var 
  s: string; 
  c: byte; 
begin 
  assign(f,'file.in');      { связываем файл с файловой переменной } 
{$I-}                             { отключаем проверку операций ввода-вывода }  
  reset(f);                 { открываем файл на чтение } 
  if IOResult<>0 then            { возможная ошибка - файл не найден }
    begin 
      writeln('Файл не найден...'); 
      halt;                     { прерываем программу } 
    end; 
{$I+}           { включаем проверку операций ввода-вывода } 
  c := 0; 
  while not eof(f) do      { пока не конец файла }  
    begin                                
      readln(f,s);          { считывам очередную строку файла } 
      inc(c);        { увеличиваем счетчик считанных }  
      ParseString(s,a[c]);        { разбираем строку в элемент массива }  
      if c=n then        { считано столько сколько элементов массива }  
        break;                     { больше считывать не куда - прерываем цикл } 
    end; 
  ReadFromFile := c;           { функция вернет количество считанных строк } 
  close(f);         { закрываем файл } 
end; 
 
Procedure Sort(var a: Arr; n: byte); 
{ Процедура сортировки масива записей методом простого обмена } 
var 
  i,j: byte; 
  tmp: Sotr; 
begin 
  for i := 2 to n do                
    for j := n downto i do          
      if a[j-1].oklad<a[j].oklad then     
      begin                         
        tmp := a[j-1];            
        a[j-1] := a[j];           
        a[j] := tmp;             
      end;                        
end; 
 
Procedure WriteToFile(const a: Arr; n: byte); 
{ Процедура записи в текстовой файл из массива } 
var 
  i: byte; 
begin 
  assign(f,'file.out');      { связываем файл с файловой переменной } 
  rewrite(f);            { открываем файл на перезапись } 
  for i := 1 to n do        { перебор элементов массива } 
    writeln(f,GetString(a[i]));    { запись очередного элемента в файл } 
  close(f);         { закрываем файл } 
end; 
 
Begin 
  clrscr;                  { очистка экрана } 
  k := ReadFromFile(m);      { считываем данные из файла в массив } 
  writeln('Считано строк: ',k); 
  Sort(m,k);        { сортируем массив по окладу } 
  WriteToFile(m,k);      { записываем данные в файл из массив } 
  writeln('Отсортированные данные записаны в файл "file.out"');   
  readkey;               { нажатие любой клавиши } 
End.

Последний раз редактировалось Rakot568; 24.05.2013 в 20:50.
Rakot568 вне форума Ответить с цитированием
Старый 25.05.2013, 11:49   #2
Rakot568
Новичок
Джуниор
 
Регистрация: 24.05.2013
Сообщений: 2
По умолчанию

Немного изменил процедуру Sort. Работает, выводит работников-мужчин, некоторых работников выводит 2 раза, и в конце пишет ерунду.
Код:
Код:
Procedure Sort(var a: Arr; n: byte); { Процедура сортировки масива записей методом простого обмена }
var
  i,j: byte;
  tmp: Sotr;
begin
   for i := 1 to n do
    for j := 1 to n do
     begin
      if (a[j].pol='м') and (a[j+1].pol<>'м') then
        a[j+1]:=a[j+2];
end.
Помогите, пожалуйста исправить задачу, послезавтра уже нужно ее сдать.
Rakot568 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
массив записей cat_gav Общие вопросы C/C++ 0 09.12.2012 16:58
Создать массив записей в соответствии с заданной структурой. Количество записей не больше 10. zulja Паскаль, Turbo Pascal, PascalABC.NET 0 21.05.2012 07:50
Массив записей. GripEnemy Visual C++ 0 05.12.2011 22:34
Массив записей... eragon_ua Паскаль, Turbo Pascal, PascalABC.NET 2 29.03.2011 15:08
массив записей qwerty98765 Помощь студентам 3 27.04.2010 19:07