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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2014, 10:55   #1
fedorova-nusa
Пользователь
 
Регистрация: 09.12.2014
Сообщений: 12
Сообщение Замена Seek

Здравствуйте. Подскажите пожалуйста, как можно заменить seek в работе с файлами, а то препод сказал, что нам нельзя его использовать((
fedorova-nusa вне форума Ответить с цитированием
Старый 17.12.2014, 11:07   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А для чего его использовали?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.12.2014, 11:38   #3
fedorova-nusa
Пользователь
 
Регистрация: 09.12.2014
Сообщений: 12
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А для чего его использовали?
Для базы данных, сейчас кину ее сюда.
fedorova-nusa вне форума Ответить с цитированием
Старый 17.12.2014, 11:41   #4
fedorova-nusa
Пользователь
 
Регистрация: 09.12.2014
Сообщений: 12
По умолчанию

Код:
PROGRAM baza;

{База данных банка}

TYPE elem = RECORD
     elem : ARRAY [1..8] OF STRING[255];
END;
     rezultat_poiska = ARRAY [1..1000] OF INTEGER;
VAR
  f : FILE OF elem;
  path : STRING;
  ch : CHAR;
  vibor, i, j, sort1, x, q, l : INTEGER;
  k : elem;
  wasRemoved : BOOLEAN;
  mas1 : ARRAY[0..100] of elem;
  z, D : STRING;

  
  
FUNCTION PrVvDanBykva(var STR:string):BOOLEAN;                                  {Контроль ввода данных для алфавита}
      var h : SET OF CHAR; s, temp : STRING; i : BYTE;
        BEGIN
          PrVvDanBykva := TRUE;
           temp := '';
           h := [];
           h := ['А'..'Я','а'..'я','A'..'Z','a'..'z',' '];
           s := STR;
           FOR i := 1 TO length(s) DO
           BEGIN
               IF (s[i] in h) THEN
               BEGIN
               temp := concat(temp, s[i]);
               END;
           END;
           IF(length(s) > length(temp)) THEN PrVvDanBykva := FALSE;
           STR := temp
        END;



FUNCTION PrVvDanZifra(VAR STR:STRING):BOOLEAN;                                  {Контроль ввода данных для цифр}
      var h : SET OF CHAR; s, temp : STRING; i : BYTE;
        BEGIN
          PrVvDanZifra := TRUE;
           temp := '';
           h := [];
           h := ['0'..'9'];
           s := STR;
           FOR i := 1 TO length(s) DO
           BEGIN
               IF (s[i] in h) THEN
                BEGIN
                temp := concat(temp, s[i]);
                END;
           END;
           IF(length(s) > length(temp)) THEN PrVvDanZifra := FALSE;
           STR := temp
        END;

PROCEDURE PrVvDan;                                                              {Процедура проверки введённых данных}
BEGIN
REPEAT
readln(D);
val(D,vibor,l);
  IF l <> 0 THEN writeln('Ошибка ввода');
  UNTIL l = 0;
  writeln;
END;



PROCEDURE sort;                                                                 {Сортировка по критериям}
VAR  i1, j1, temp : elem; i, j : INTEGER;
BEGIN
 assign(f, 'F:\Pascal.txt');
 reset(f);
 seek(f, 0);
BEGIN
  writeln('Введите число, чтобы сортировать базу данных по:');
  writeln('1. Номеру вклада');
  writeln('2. Фамилии Имени Отчеству');
  writeln('3. Типу вклада');
  writeln('4. Размеру вклада');
  writeln('5. Дате вклада');
  writeln('6. Сроку вклада');
  writeln;
  readln(sort1);
FOR i := 0 TO filesize(f) - 2 DO
  BEGIN
    FOR j := i + 1 TO filesize(f) - 1 DO
    BEGIN
      seek(f, i); read(f, i1);
      seek(f, j); read(f, j1);
      IF i1.elem[sort1] > j1.elem[sort1] THEN
      BEGIN
        temp := j1; j1 := i1; i1 := temp;
        seek(f, i); write(f, i1);
        seek(f, j); write(f, j1);
      END;
    END;
  END;
END;
END;



PROCEDURE add;{Использование подпрограммы "процедура" для добавления записи в БД}
VAR k : elem;
BEGIN
 assign(f, 'F:\Pascal.txt');
 reset(f);
 seek(f, 0);
BEGIN
  writeln('Для добавления записи введите:');
  REPEAT
  write('Номер вклада: ');
  readln(k.elem[1]);
  wasRemoved := PrVvDanZifra(k.elem[1]);
  UNTIL wasRemoved = TRUE;
  REPEAT
  write('Фамилия Имя Отчество: ');
  readln(k.elem[2]);
  wasRemoved := PrVvDanBykva(k.elem[2]);
  UNTIL wasRemoved = TRUE;
  PrVvDanBykva(k.elem[2]);
  REPEAT
  write('Тип вклада: ');
  readln(k.elem[3]);
  wasRemoved := PrVvDanBykva(k.elem[3]);
  UNTIL wasRemoved = TRUE;
  REPEAT
  write('Размер вклада: ');
  readln(k.elem[4]);
  wasRemoved := PrVvDanZifra(k.elem[4]);
  UNTIL wasRemoved = TRUE;
  REPEAT
  write('Дата вклада: ');
  readln(k.elem[5]);
  wasRemoved := PrVvDanZifra(k.elem[5]);
  UNTIL wasRemoved = TRUE;
  REPEAT
  write('Срок вклада: ');
  readln(k.elem[6]);
  wasRemoved := PrVvDanZifra(k.elem[6]);
  until wasRemoved = TRUE;
  seek(f, filesize(f));
  write(f, k);
  writeln('Запись добавлена в файл!');
  writeln;
END;
END;



PROCEDURE vivod;                        {Использование подпрограммы "процедура" сортировки БД по критериям}
VAR k : elem; i : INTEGER;
BEGIN
  sort;
  writeln('Вывод записей:');
 assign(f,'F:\Pascal.txt');
 reset(f);
 seek(f, 0);
  i := 1;
WHILE NOT eof(f) DO
  BEGIN
    read(f, k);
    writeln('   ---',i,'---   ');
    writeln;
    writeln('Номер вклада: ', k.elem[1]);
    writeln('Фамилия Имя Отчество: ', k.elem[2]);
    writeln('Тип вклада: ', k.elem[3]);
    writeln('Размер вклада: ', k.elem[4]);
    writeln('Дата вклада: ', k.elem[5]);
    writeln('Срок вклада: ', k.elem[6]);
    writeln;
    writeln;
    inc(i);
    end;
  writeln('Вывод окончен!');
  writeln;
END;

Последний раз редактировалось Stilet; 17.12.2014 в 11:52.
fedorova-nusa вне форума Ответить с цитированием
Старый 17.12.2014, 11:43   #5
fedorova-nusa
Пользователь
 
Регистрация: 09.12.2014
Сообщений: 12
По умолчанию

Код:
PROCEDURE poisk(VAR rez: rezultat_poiska; VAR j: integer);{Использование подпрограммы "процедура" для поиска записи по критериям}
VAR  k : elem; vibor : BYTE; i : INTEGER; s : STRING;
BEGIN
  writeln('Поиск записи. Введите номер критерия для поиска:');
  writeln('1. Номер вклада');
  writeln('2. Фамилия Имя Отчество');
  writeln('3. Тип вклада');
  writeln('4. Размер вклада');
  writeln('5. Дата вклада');
  writeln('6. Срок вклада');
  writeln;
  readln(vibor);
  write('Введите значение выбранного критерия: ');
 assign(f, 'F:\Pascal.txt');
 reset(f);
 seek(f, 0);
  i := 0;
  j := 1;
  REPEAT
  readln(s);
  wasRemoved := PrVvDanZifra(s);
  UNTIL wasRemoved = TRUE;
CASE vibor OF
1: WHILE NOT eof(f) DO
      BEGIN
        read(f, k);
        IF k.elem[1] = s THEN
        BEGIN rez[j] := i; inc(j);
        END;
        inc(i);
      END;
2: WHILE NOT eof(f) DO
      BEGIN
        read(f, k);
        IF k.elem[2] = s THEN
        BEGIN rez[j] := i; inc(j);
        END;
        inc(i);
      END;
3: WHILE NOT eof(f) DO
      BEGIN
        read(f, k);
        IF k.elem[3] = s THEN
        BEGIN rez[j] := i; inc(j);
        END;
        inc(i);
      END;
4: WHILE NOT eof(f) DO
      BEGIN
        read(f, k);
        IF k.elem[4] = s THEN
        BEGIN rez[j] := i; inc(j);
        END;
        inc(i);
      END;
5: WHILE NOT eof(f) DO
      BEGIN
        read(f, k);
        IF k.elem[5] = s THEN
        BEGIN rez[j] := i; inc(j);
        END;
        inc(i);
      END;
6: WHILE NOT eof(f) DO
      BEGIN
        read(f, k);
        IF k.elem[6] = s THEN
        BEGIN rez[j] := i; inc(j);
        END;
        inc(i);
      END;
  END;
END;



PROCEDURE poisk_vivod;                          {Использование подпрограммы "процедура" для поиска определённой записи}
VAR  rez : rezultat_poiska; j, i : INTEGER; k : elem;
BEGIN
  poisk(rez, j);
  IF j > 1 THEN
 BEGIN
      FOR i := 1 TO j - 1 DO
      BEGIN
        seek(f, rez[i]);
        read(f, k);
    writeln('-------',i,'-------');
    writeln;
    writeln('Номер вклада: ', k.elem[1]);
    writeln('Фамилия Имя Отчество: ',k.elem[2]);
    writeln('Тип вклада: ',k.elem[3]);
    writeln('Размер вклада: ',k.elem[4]);
    writeln('Дата вклада: ',k.elem[5]);
    writeln('Срок вклада: ',k.elem[6]);
      END;
    END
  ELSE
  writeln('Записей, удовлетворяющих условию, не найдено!');
  writeln;
END;
  


PROCEDURE all;                                      {Использование подпрограммы "поцедура" для вывода всех данных}
VAR k : elem; i : INTEGER;
BEGIN
  writeln('|_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_|');
  writeln('|№|','Номер вклада','|','                   ФИО                  ','|','    Тип вклада   ','|','Размер вклада','|','Дата вклада','|','Срок  вклада',' |');
  assign(f, 'F:\Pascal.txt');
 reset(f);
 seek(f, 0);
  i := 1;
WHILE NOT eof(f) DO
  BEGIN
    read(f, k);
    writeln('|_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_|');
    writeln('|',i,'|',k.elem[1]:12,'|',k.elem[2]:40,'|',k.elem[3]:16,' ','|',k.elem[4]:13,'|',k.elem[5]:11,'|',k.elem[6]:12,' |');
    writeln('|_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_|');
    inc(i);
    END;
  writeln('Вывод окончен!');
  writeln;
END;

Последний раз редактировалось Stilet; 17.12.2014 в 11:53.
fedorova-nusa вне форума Ответить с цитированием
Старый 17.12.2014, 11:43   #6
fedorova-nusa
Пользователь
 
Регистрация: 09.12.2014
Сообщений: 12
По умолчанию

Код:
PROCEDURE modify;                                  {Использование подпрограммы "процедура" для изменения записи}
VAR j : INTEGER; rez : rezultat_poiska; ch : CHAR; z : elem;
BEGIN
  writeln('Поиск записи, которую необходимо редактировать');
  poisk(rez, j);
  ch := 'Y';
  WHILE (j > 2) and (ch = 'Y') DO
  BEGIN
    writeln('Найдено более одной записи, необходимо повторить поиск (y/n)');
    readln(ch);
    ch := upcase(ch);
    IF ch = 'Y' THEN poisk(rez, j);
    END;
  IF j = 2 THEN
  BEGIN
  writeln('Введите новые данные для изменяемой записи');
  REPEAT
  write('Номер вклада: ');
  readln(k.elem[1]);
  wasRemoved := PrVvDanZifra(k.elem[1]);
  UNTIL wasRemoved = TRUE;
  REPEAT
  write('Фамилия Имя Отчество: ');
  readln(k.elem[2]);
  wasRemoved := PrVvDanBykva(k.elem[2]);
  UNTIL wasRemoved = TRUE;
  PrVvDanBykva(k.elem[2]);
  REPEAT
  write('Тип вклада: ');
  readln(k.elem[3]);
  wasRemoved := PrVvDanBykva(k.elem[3]);
  UNTIL wasRemoved = TRUE;
  REPEAT
  write('Размер вклада: ');
  readln(k.elem[4]);
  wasRemoved := PrVvDanZifra(k.elem[4]);
  UNTIL wasRemoved = TRUE;
  REPEAT
  write('Дата вклада: ');
  readln(k.elem[5]);
  wasRemoved := PrVvDanZifra(k.elem[5]);
  UNTIL wasRemoved = TRUE;
  REPEAT
  write('Срок вклада: ');
  readln(k.elem[6]);
  wasRemoved := PrVvDanZifra(k.elem[6]);
  UNTIL wasRemoved = TRUE;
    seek(f, rez[1]);
    write(f, z);
    END;
  IF j = 1 THEN writeln('Записи для редактирования не найдено!');
  writeln;
END;



PROCEDURE del;                                  {Использование подпрограммы "процедура" для удаления записи}
VAR rez : rezultat_poiska; k, j, i : INTEGER; ch : CHAR; z : elem;
BEGIN
  writeln('Укажите записи, подлежащие удалению');
  poisk(rez, j);
  IF j > 1 THEN
  BEGIN
    writeln('Указанному критерию удовлетворяет следующее количество записей: ', j - 1);
    write('Удалить? (y/n) ');
    readln(ch);
    ch := upcase(ch);
    IF ch = 'Y' THEN
    BEGIN
      FOR i := 1 TO j - 1 DO
      BEGIN
        FOR k := rez[i] TO filesize(f) - 2 DO
        BEGIN
          seek(f, k + 1);
          read(f, z);
          seek(f, k);
          write(f, z);
        END;
        seek(f, filesize(f) - 1);
        truncate(f);
      END;
      writeln('Записи удалены');
      writeln;
      END;
      END
  ELSE writeln('Записей не найдено!');
  writeln;
END;


PROCEDURE task1;{вывод отсортированного по алфавиту списка вкладчиков с размером вклада, выше заданного со сроком вклада не более заданного или любого}
VAR VKLAD:STRING;
    srok,x,e:integer;
BEGIN
   REPEAT
   write('Введите ограничение по размеру вклада: ');
   read(VKLAD);
   write('Введите максимальный срок вклада: ');
   readln(srok);
   wasRemoved := PrVvDanBykva(vklad);
   UNTIL wasRemoved = TRUE;
   writeln;
 assign(f, 'F:\Pascal.txt');
 reset(f);
 seek(f, 0);
   WHILE NOT eof (f) DO
      WITH k DO
      BEGIN
         Read (f, k);
         val(k.elem[6], x, e);
         IF ((k.elem[4] = VKLAD) and ((x < srok) or (srok = 0))) THEN
            BEGIN
            writeln('Номер вклада: ', k.elem[1]);
            writeln('Фамилия Имя Отчество: ',k.elem[2]);
            writeln('Тип вклада: ',k.elem[3]);
            writeln('Размер вклада: ',k.elem[4]);
            writeln('Дата вклада: ',k.elem[5]);
            writeln('Срок вклада: ',k.elem[6]);
            writeln;
            writeln;
            END;
            END;
         writeln('Вывод окончен!');
         writeln;
END;


PROCEDURE task2;    {вывод отсортированного по алфавиту списка вкладчиков для указанного типа вклада в соответствии с указанным сроком его окончания}
VAR tip:STRING;
BEGIN
   REPEAT
   write('Введите тип вклада: ');
   read(tip);
   wasRemoved := PrVvDanBykva(tip);
   UNTIL wasRemoved = TRUE;
   writeln;
 assign(f, 'F:\Pascal.txt');
 reset(f);
 seek(f,0);
   WHILE NOT eof (f) DO
      WITH k DO
      BEGIN
         read (f, k);
         IF k.elem[1] >= tip THEN
            BEGIN
            writeln('Номер вклада: ', k.elem[1]);
            writeln('Фамилия Имя Отчество: ',k.elem[2]);
            writeln('Тип вклада: ',k.elem[3]);
            writeln('Размер вклада: ',k.elem[4]);
            writeln('Дата вклада: ',k.elem[5]);
            writeln('Срок вклада: ',k.elem[6]);
            writeln;
            writeln;
            END;
            END;
         writeln('Вывод окончен!');
         writeln;
END;

Последний раз редактировалось Stilet; 17.12.2014 в 11:53.
fedorova-nusa вне форума Ответить с цитированием
Старый 17.12.2014, 11:44   #7
fedorova-nusa
Пользователь
 
Регистрация: 09.12.2014
Сообщений: 12
По умолчанию

Код:
BEGIN                                                                       {Основная программа}
  sort1 := 1;
    WHILE vibor <> 9 DO
  BEGIN                {цикл выбора действия}
    writeln(' ____________________________________________________________________________________________________________________________________________');
    writeln('|                                                                                                                                            |');
    writeln('|                                               БАЗА ДАННЫХ БАНКА                                                                            |');
    writeln('|____________________________________________________________________________________________________________________________________________|');
    writeln('|                                                                                                                                            |');
    writeln('|                                Введите номер операции, которую Вы хотите выполнить:                                                        |');
    writeln('|____________________________________________________________________________________________________________________________________________|');
    writeln('|                                                                                                                                            |');
    writeln('|    1. Добавить запись в БД                                                                                                                 |');
    writeln('|    2. Удалить запись из БД                                                                                                                 |');
    writeln('|    3. Изменить запись в БД                                                                                                                 |');
    writeln('|    4. Поиск записи в БД                                                                                                                    |');
    writeln('|    5. Вывести на экран всю БД в виде таблицы                                                                                               |');
    writeln('|    6. Сортировка БД по критериям                                                                                                           |');
    writeln('|    7. Вывод отсортированного по алфавиту списка вкладчиков с размером вклада, выше заданного со сроком вклада не более заданного или любого|');
    writeln('|    8. Вывод отсортированного по алфавиту списка вкладчиков для указанного типа вклада в соответствии с указанным сроком его окончания      |');
    writeln('|    9. Выход                                                                                                                                |');
    writeln('|____________________________________________________________________________________________________________________________________________|');
    writeln;
    PrVvDan;
    writeln;
      CASE vibor OF
      1: add;
      2: del;
      3: modify;
      4: poisk_vivod;
      5: all;
      6: vivod;
      7: task1;
      8: task2;
      9: exit;
    END;
  END;
  close(f);
END.

Последний раз редактировалось Stilet; 17.12.2014 в 11:53.
fedorova-nusa вне форума Ответить с цитированием
Старый 17.12.2014, 11:54   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
препод сказал, что нам нельзя его использовать((
Ну и гад же он у вас...
Скажи ему что все СУБД используют прыжки по файлу базы, и пусть он не умничает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 17.12.2014, 11:59   #9
fedorova-nusa
Пользователь
 
Регистрация: 09.12.2014
Сообщений: 12
Радость

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну и гад же он у вас...
Скажи ему что все СУБД используют прыжки по файлу базы, и пусть он не умничает.
Хах)так и скажу ему)) а можете еще помочь сделать так, чтобы дата через точки выводилась? и чтобы тип вклада надо было не вбивать, а выбирать один из двух(именной/на предъявителя)
fedorova-nusa вне форума Ответить с цитированием
Старый 17.12.2014, 12:22   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
так и скажу ему
Скажи. Иначе судя по всему он хочет чтоб программа считала весь файл базы в некий динамический массив, и работа шла уже с ним а не с файлом.
Цитата:
чтобы дата через точки выводилась?
Теоретически да, но на практике тебе нормальный препод бы заулыбал зачетку за такую программу. Не по феншую все поля хранить в виде строк, несмотря на то что это допустимо и используется в форматах типа DBF, я не рекомендую так тебе
делать.
Но уж если хочешь геморроя то вот:
Код:
writeln('Дата вклада: ',copy(k.elem[5],1,2),'.',copy(k.elem[5],3,2),copy(k.elem[5],5,4));
Формат даты обязан быть в виде ddmmyyyy без разделителей.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает поиск записи методом seek. zakat2 Microsoft Office Access 5 08.08.2014 12:51
Lazarus. TProcess. Cannot seek on pipe Stilet Lazarus, Free Pascal, CodeTyphon 2 27.12.2012 23:28
seek & textfile dukales Помощь студентам 3 06.09.2011 18:17
Seek +основы индексированных таблиц net85 Microsoft Office Access 0 05.03.2009 10:23