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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2018, 23:13   #1
Mishka_M
Пользователь
 
Регистрация: 11.05.2018
Сообщений: 32
По умолчанию Pascal.база данных. сортировка

Добрый день . Заранее спасибо за помощь.
Задача такая , в 4м пункте case of нужно отсортировать сотрудников по стажу и вывести в другой файл. Пробовал сортировку через массивы , ничего не выходит(

Информация о сотрудниках предприятия содержит ФИО, номер отдела,
должность, дату начала работы. Вывести список сотрудников заданного отдела,
проработавших на предприятии более 20 лет.
В программе предусмотреть сохранение вводимых данных в
типизированный файл и возможность чтения из ранее сохраненного
типизированного файла. Результаты выводить на экран и в текстовый файл.

Код:
Program 2_1;
 uses crt;
Type Anketa=Record
     FIO:string[30];
     God_prin:string[5];
     Dolj:string[15];
     Otdel:string[10];
     End;
Var f:file of Anketa;
    f1:Anketa;
    {j,s,k}n,x,i:integer;
    
    
Procedure Zapol(n:integer);
Var i:integer;
Begin
  Assign(f,'G:Anketa.dat');
  Rewrite(f);
    For i:=1 to n do 
    Begin
      WitH f1 do
      Begin
        write('‚Введите Ф.И.О  [',i,'] -го сотрудника : ');readln(FIO);
        write('‚Введите год принятия[',i,'] -го сотрудника : ');readln(God_prin);
        write('‚Введите должность [',i,']-го сотрудника: ');readln(Dolj);
        write('‚Введите отдел [',i,'] -го сотрудника :');readln(Otdel);
      End;
    write(f,f1);
    End;
End;

Begin
    clrscr;
    Repeat
    Writeln('1: Заполнение анкет сотрудников, если запускается первый раз');
    Writeln('2: Просмотр анкет сотрудников');
    Writeln('3: Добавление новых анкет сотрудников, если запускается не первый раз');
    Writeln('4: Вывод сотрудников со стажем больше 20 лет ');
    Writeln('5: Выход');
    Write('‚Введите число 1-5: ');readln(x);
    Case x of
      1:Begin
        Write('‚Введите количество сотрудников: ');readln(n);Zapol(n);End;
      2:Begin
          assign (f,'G:Anketa.dat'); reset(f);
          Writeln('‘Список анкет сотрудников :');
          while not eof(f) do
            begin
              read (f,f1);
               writeln;
               Writeln (f1.FIO,' ');
               Writeln (f1.God_prin,' ' );
               Writeln (f1.Dolj,' ');
               Writeln (f1.Otdel,' ');
               writeln;
            end;
        end;
      3:Begin
        assign (f,'G:Anketa.dat'); reset(f);
        seek (f,filesize(f));
          WitH f1 do 
          Begin
            write('‚Введите Ф.И.О сотрудника ');readln(FIO);
            write('‚Введите год принятия сотрудника  ');readln(God_prin);
            write('‚Введите должность сотрудника* ');readln(Dolj);
            write('‚Введите отдел сотрудника ');readln(Otdel);
          End;
        write(f,f1); End;
    4:
    
    
     End;
    Until x=5;
End.

Последний раз редактировалось Mishka_M; 12.05.2018 в 12:42.
Mishka_M вне форума Ответить с цитированием
Старый 11.05.2018, 23:20   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Mishka_M Посмотреть сообщение
Задача такая , в 4м пункте case of нужно отсортировать сотрудников по стажу
Да?
а написано -
Цитата:
Сообщение от Mishka_M Посмотреть сообщение
Код:
Writeln('4: Вывод сотрудников со стажем больше 20 лет ');
но это неважно.
Два вопроса к Вам.
1) почему год принятия это строка, да ещё и длиной 5 символов?
Цитата:
Код:
God_prin:string[5];
Что Вы туда пишете?
Почему не сделать поле типа Integer ?
Это резко упростит взаимодействие со стажем и, в частности, позволит легко сделать сортировку по году принятия (по стажу).

2) сортировка массива записей ничем по сути не отличается от сортировки массива любого другого типа.
Вы точно пытались сделать? Где Ваши попытки? Что не получилось?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.05.2018, 23:30   #3
Mishka_M
Пользователь
 
Регистрация: 11.05.2018
Сообщений: 32
По умолчанию

пишет Program7.pas(20) : Нельзя преобразовать тип string[5] к array
немножко, не весь код, что я пробовал . уже , если честно, кучу всего перепробовал. Спасибо за оперативность.
проблема , что я с анкеты не могу передать значение на сортировку , а точнее не знаю как .
Код:
Program 2_1;
 uses crt;
Type Anketa=Record
     FIO:string[30];
     God_prin:string[5];
     Dolj:string[15];
     Otdel:string[10];
     stag:byte;
     End;
Var f:file of Anketa;
    sotrudn:array[1..20] of anketa;
    f1:Anketa;
    {j,s,k}n,x,i:integer;
    
   procedure stag_rabot;
var
     stroka1:string;
     st_rab,st,err:integer;
begin
     stroka1:=copy(sotrudn[i].god_prin);
     val(stroka1,st,err);
     if err<>0 then write(' В числе ',stroka1,' ',err,'-й символ портит !');
     st_rab:=2018-st;
     sotrudn[i].stag:=st_rab;
end;
    
Procedure Zapol(n:integer);
Var i:integer;
Begin
  Assign(f,'G:Anketa.dat');
  Rewrite(f);
    For i:=1 to n do 
    Begin
      WitH sotrudn[i] do
      Begin
        write('‚Введите Ф.И.О  [',i,'] -го сотрудника : ');readln(FIO);
        write('‚Введите год принятия[',i,'] -го сотрудника : ');readln(God_prin);
        write('‚Введите должность [',i,']-го сотрудника: ');readln(Dolj);
        write('‚Введите отдел [',i,'] -го сотрудника :');readln(Otdel);
      End;
    write(f,sotrudn[i]);
    End;
End;

Begin
    clrscr;
    Repeat
    Writeln('1: Заполнение анкет сотрудников, если запускается первый раз');
    Writeln('2: Просмотр анкет сотрудников');
    Writeln('3: Добавление новых анкет сотрудников, если запускается не первый раз');
    Writeln('4: Вывод сотрудников со стажем больше 20 лет ');
    Writeln('5: Выход');
    Write('‚Введите число 1-5: ');readln(x);
    Case x of
      1:Begin
        Write('‚Введите количество сотрудников: ');readln(n);Zapol(n);End;
      2:Begin
          assign (f,'G:Anketa.dat'); reset(f);
          Writeln('‘Список анкет сотрудников :');
          while not eof(f) do
            begin
              read (f,f1);
               writeln;
               Writeln (f1.FIO,' ');
               Writeln (f1.God_prin,' ' );
               Writeln (f1.Dolj,' ');
               Writeln (f1.Otdel,' ');
               writeln;
            end;
        end;
      3:Begin
        assign (f,'G:Anketa.dat'); reset(f);
        seek (f,filesize(f));
          WitH f1 do 
          Begin
            write('‚Введите Ф.И.О сотрудника ');readln(FIO);
            write('‚Введите год принятия сотрудника  ');readln(God_prin);
            write('‚Введите должность сотрудника* ');readln(Dolj);
            write('‚Введите отдел сотрудника ');readln(Otdel);
          End;
        write(f,f1); End;
    
     End;
    Until x=5;
End.

Последний раз редактировалось Mishka_M; 11.05.2018 в 23:35.
Mishka_M вне форума Ответить с цитированием
Старый 11.05.2018, 23:52   #4
Mishka_M
Пользователь
 
Регистрация: 11.05.2018
Сообщений: 32
По умолчанию

еще такой вариант был

Код:
procedure stag;
  var 
    str1:string;
    stag_rab,st:integer;
    begin
    assign(f,'G:Anketa.dat');
    reset(f);
    writeln('вывод сотрудников со стажем больше 20 лет');
    writeln;
    while not eof (f) do
      str1:=copy(f1.god_prin);
      val(str1,st);
      st_rab:=2018-st;
        if st_rab>=20 then
        begin
          writeln (f1.fio,'стаж-',st_rab);
        end;
      end;
Mishka_M вне форума Ответить с цитированием
Старый 12.05.2018, 00:34   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Во-первых, Вы так и не ответили, зачем Вам для хранения года строка, да ещё и длиной пять символов.
Что Вы туда записываете?!!

во-вторых, я не понимаю, зачем и для чего Вы пытаетесь использовать команду копирования подстроки Copy()

в-третьих, меня мучаются смутные сомнения. Вы уверены, что Вам нужно СОРТИРОВАТЬ записи, а не ОТОБРАТЬ (отфильтровать) нужные записи?!

сортировка - это расположение записей в заданном порядке.
Где у Вас СОРТИРОВКА?

вот, может Вы пытаетесь так сделать?

Код:
procedure stag;
  var 
       sotr : Anketa;
       god, errcode : integer;
  begin
    assign(f,'G:Anketa.dat');
    reset(f);
    writeln('вывод сотрудников со стажем больше 20 лет');
    writeln;
    while not eof (f) do begin
         Read(f, sotr);
         val(sotr.God_prin, god, errcode);
         if errcode<>0 then WriteLn('Ошибка в записи года принятия сотрудника ',sotr.FIO)
         else begin
            if (2018-god)>=20 then
                   writeln (sotr.FIO,' стаж: ',(2018-god));
         end;
      end;
      close(f)
   end;

NB. использовать относительный путь вида "G:Anketa.dat"
я Вам КРАЙНЕ не рекомендую.
Используйте ПОЛНЫЙ путь. Или вообще уберите указание логического диска!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.05.2018, 01:10   #6
Mishka_M
Пользователь
 
Регистрация: 11.05.2018
Сообщений: 32
По умолчанию

Цитата:
Во-первых, Вы так и не ответили, зачем Вам для хранения года строка, да ещё и длиной пять символов.
Что Вы туда записываете?!!
год (1960, 1980, 2000 и т.д.), 5 символов или 10 роли не играет мне, если вы в этом видите ошибку, подскажите как обойти ее, буду признателен.
Цитата:
в-третьих, меня мучаются смутные сомнения. Вы уверены, что Вам нужно СОРТИРОВАТЬ записи, а не ОТОБРАТЬ (отфильтровать) нужные записи?!
Вы абсолютно правы , я немного не так выразился , мне действительно надо отобрать определенные записи.
Спасибо за помощь , к сожалению , смогу продолжить борьбу с кодом только завтра , посему, доброй ночи.
п.с.
Цитата:
Используйте ПОЛНЫЙ путь. Или вообще уберите указание логического диска!
дельный совет . в будущем учту.
Mishka_M вне форума Ответить с цитированием
Старый 12.05.2018, 10:11   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

пожалуйста.

Цитата:
Сообщение от Mishka_M Посмотреть сообщение
год (1960, 1980, 2000 и т.д.), 5 символов или 10 роли не играет мне, если вы в этом видите ошибку, подскажите как обойти ее, буду признателен.
конечно вижу.

вместо

Цитата:
Сообщение от Mishka_M Посмотреть сообщение
Код:
Type Anketa=Record
     FIO:string[30];
     God_prin:string[5];
     Dolj:string[15];
     Otdel:string[10];
     stag:byte;
     End;
должно быть:
Код:
Type Anketa=Record
     FIO:string[30];
     God_prin:integer; {или God_prin:word; }
     Dolj:string[15];
     Otdel:string[10];
 End;
плюс я бы ещё добавил контроль на вводе данных.
ну, хотя бы
(God_prin>1900) and (God_prin<=God_Seijas)
где God_Seijas - это текущий год (текущий год можно брать из системного времени, можно запросить у пользователя (с контролем на разумность), либо задать константой // плохой вариант, но для учебной задачи может прокатить.


Цитата:
Сообщение от Mishka_M Посмотреть сообщение
смогу продолжить борьбу с кодом только завтра
Успехов! Будут вопросы - Welcome!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.05.2018, 12:30   #8
Mishka_M
Пользователь
 
Регистрация: 11.05.2018
Сообщений: 32
По умолчанию

Спасибо , все работает.
Возник еще вопрос ...) Как мне теперь это вывести в файл?)Такой вариант не прокатывает .
выводит только последнего сотрудника. Как скорректировать ?
Код:
procedure stag;
  var 
       otbor: text;
       sotr : Anketa;
       god, errcode, k : integer;
  begin
    assign(f,'G:\Anketa.dat');
    reset(f);
assign(otbor,'G:\vivod_stag.dat');
             rewrite(otbor);{создаю и закрываю файл}
             close(otbor);
    writeln('вывод сотрудников со стажем больше 20 лет');
    writeln;
    while not eof (f) do begin
         Read(f, sotr);
         
         val(sotr.God_prin, god, errcode);
         if errcode<>0 then WriteLn('Ошибка в записи года принятия сотрудника ',sotr.FIO)
         else begin
             k:=2018-god;
            
            if k>=20 then
            begin
                   writeln;
                   writeln (sotr.FIO,' ....стаж: ',k);
                   writeln;
                   assign(otbor,'G:\vivod_stag.dat');{открываю и дописываю  в файл
                   , после закрываю}
                   append(otbor);
                   writeln(otbor,sotr.FIO);
                   close(otbor); 
            end;
             
         end;
      end;
    close(otbor); 
      close(f)
   end;

Последний раз редактировалось Mishka_M; 12.05.2018 в 22:35.
Mishka_M вне форума Ответить с цитированием
Старый 12.05.2018, 12:37   #9
Mishka_M
Пользователь
 
Регистрация: 11.05.2018
Сообщений: 32
По умолчанию

все, подправил сам)
Спасибо еще раз за помощь. Буду обращаться . Сверху дописал задание . Весьма распространенное , кстати, но в сети есть ,почему то, только на си или в делфи.

Последний раз редактировалось Mishka_M; 12.05.2018 в 12:46.
Mishka_M вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal База данных pngfree Помощь студентам 1 21.12.2016 15:46
База данных pascal Lerner73 Паскаль, Turbo Pascal, PascalABC.NET 1 04.05.2014 14:27
База данных сортировка gamer_0101 БД в Delphi 2 22.06.2012 00:23
База данных на Pascal DJ DIMON Помощь студентам 1 06.12.2008 00:03
База данных Pascal. Dianochka Помощь студентам 6 10.12.2007 21:35