Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
katze
0 / 0 / 0
Регистрация: 13.10.2015
Сообщений: 43
1

Из исходного файла в новый файл скопировать заданное количество записей по заданному критерию

12.12.2015, 18:04. Просмотров 895. Ответов 3
Метки нет (Все метки)

Здравствуйте! Помогите, пожалуйста, реализовать эту процедуру. Пытался делать через сортировку и вывод первых пяти позиций, но, как я понял, такой метод не реализуем, а других идей нет. Заранее спасибо.
Задание:
В файле записей содержатся сведения об арендаторах торговых площадей: ИНН, название организации, телефон, занимаемая площадь, стоимость аренды.
В новый файл записей переписать информацию о пяти арендаторах, которые платят максимальную арендную плату за свои площади;

Добавлено через 28 минут
Алсо, как сделал это я. Но мне кажется, что весь мой код стоит на костылях, и вряд ли вообще даст нужный результат.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type Arends=record
         inn:real;
         number:real;
         area:integer;
         summa:integer;
         name:string[20];
         fio:string[20];
     end;
     arend=array[1..10] of arends;
     TFarends=file of arends;
procedure FileToFile(var f1,f2:TFarends);
var p:arend; j,i,z:integer;e:arends;
begin
  reset(f1);
  rewrite(f2);
  i:=1;
  for i:= 1 to (filesize(f1)-1) do begin
  for j:= i+1 to (filesize(f1)) do
   if p[i].summa > p[j].summa then begin
     z:= p[i].summa;
     p[i].summa:= p[j].summa;
     p[j].summa:= z;
   end;
  end;
   write(f2,e)
end;
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2015, 18:04
Ответы с готовыми решениями:

Скопировать из одного файла записей в другой записи, соответствующие заданному критерию
Разработать программу работы с файлами записей. Каждая запись создаваемых...

Текстовый файл. В новый файл поместить те строки файла, которые содержат заданное слово
Дан текстовый файл и некоторое слово. В новый файл поместить те строки файла,...

Создать новый текстовый файл, содержащий k последних строк исходного файла
Дано число k (< 10) и текстовый файл, содержащий более k строк. Создать новый...

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

Из элементов исходного массива сформировать новый массив по заданному правилу
Из элементов массива С сформировать массив А той же размерности по правилу:...

3
Cyborg Drone
Модератор
5406 / 3217 / 2453
Регистрация: 17.08.2012
Сообщений: 10,291
14.12.2015, 03:18 2
Лучший ответ Сообщение было отмечено katze как решение

Решение

Цитата Сообщение от katze Посмотреть сообщение
Пытался делать через сортировку и вывод первых пяти позиций, но, как я понял, такой метод не реализуем
Вполне реализуем. Сортировать нужно по полю summa, а перемещать всю запись целиком. Вот пример программы:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
type arends = record
                inn, number, area, summa: longint;
                name, fio: string[20];
              end;
     TFarends = file of arends;
 
procedure FileToFile(var f1, f2: TFarends);
var i, j, m: longint;
    p, e: arends;
begin
  reset(f1);
  if filesize(f1) = 0
    then writeln('Входной файл не содержит записей.')
    else begin
      if filesize(f1) < 4
        then m := filesize(f1) - 1
        else m := 4;
      for i := 0 to m do
        begin
          seek(f1, i);
          read(f1, p);
          for j := i + 1 to filesize(f1) - 1 do
            begin
              read(f1, e);
              if p.summa < e.summa
                then begin
                  seek(f1, i);
                  write(f1, e);
                  seek(f1, j);
                  write(f1, p);
                  p := e
                end
            end
        end;
      reset(f1);
      rewrite(f2);
      for i := 0 to m do
        begin
          read(f1, p);
          write(f2, p)
        end
   end
end;
 
var f, g: TFarends;
    s: string;
    x: arends;
    i: integer;
 
begin
  assign(f, 'd:\input.dat');
  rewrite(f);
  repeat
    writeln('Введите данные об арендаторе:');
    write('ИНН: '); readln(x.inn);
    write('Номер телефона: '); readln(x.number);
    write('Арендуемая площадь: '); readln(x.area);
    write('Арендная плата: '); readln(x.summa);
    write('Название организации: '); readln(x.name);
    write('ФИО арендатора: '); readln(x.fio);
    write(f, x);
    write('Продолжить? ');
    readln(s)
  until (length(s) > 0) and (s[1] in ['N', 'n', 'Н', 'н']);
  assign(g, 'd:\output.dat');
  FileToFile(f, g);
  close(f);
  writeln;
  writeln('Арендаторы с наибольшей арендной платой:');
  writeln;
  reset(g);
  for i := 1 to filesize(g) do
    begin
      read(g, x);
      writeln('ИНН: ', x.inn, ', телефон: ', x.number, ', площадь: ', x.area, 'м^2,');
      writeln('организация: ', x.name, ', арендатор: ', x.fio, ',');
      writeln('платит ', x.summa, ' денег.');
      writeln
    end;
  close(g);
  readln
end.
В программе происходит частичная сортировка обменом, перемещаются на первые позиции в порядке убывания поля summa 5 записей (или менее, если записей во входном файле менее 5) и затем первые 5 записей (или менее) копируются в выходной файл. Если нельзя менять местами записи во входном файле, входной файл придётся скопировать во временный файл, который потом можно удалить.

Старался не особо махать кувалдой, чтобы Вам не понадобилось много чего переделывать.
1
katze
0 / 0 / 0
Регистрация: 13.10.2015
Сообщений: 43
16.12.2015, 13:35  [ТС] 3
Мало ли, вдруг кому пригодится.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
procedure FileToFile(var f1,f2:TFarends);
var strnum:integer; a:array[1..10] of arends; j,i:integer;z:arends;
begin
  reset(f1);
  rewrite(f2);
  i:=1;
  while not eof(f1) do begin
  read(f1,a[i]);
  inc(i);
  end;
   for j:=1 to filesize(f1)-1 do begin
     for i:=1 to (filesize(f1)-j) do
        if a[i].summa > a[i+1].summa then begin
           z:=a[i];
           a[i]:=a[i+1];
           a[i+1]:=z;
         end;
   end;
    for i:=1 to 5 do begin
      write(f2,a[i]);
    end;
    readln;
close(f2);
end;
0
Cyborg Drone
Модератор
5406 / 3217 / 2453
Регистрация: 17.08.2012
Сообщений: 10,291
16.12.2015, 23:29 4
katze, так себе варант. Плохой. Никому не пригодится.

Если количество записей в файле больше, чем элементов в массиве, программа аварийно завершится из-за выхода за границы индексов массива. И зачем вообще переписывать файл в массив, если типизированный файл, по своей сути, уже является массивом, поскольку каждая запись в файле имеет уникальный номер, по кототрому к ней можно обратиться?

И по заданию незачем сортировать файл полностью, достаточно выяснить пять записей с наибольшей суммой.

filesize имеет тип longint, точнее - longword, Вы же неявно его преобразовываете к integer. Это порождает труднообнаруживаемые ошибки при больших размерах файла.

Никак не обрабатывается ситуация, если элементов во входном файле менее 5. В большинстве диалектов паскаля локальные переменные ничем не инициализируется и по факту содержат случайные данные ("мусор"). При количестве элементов во входном файле менее 5 в выходной файл, кроме элементов входного файла, будет записан и "мусор" из массива "а".

Отговорка, что в Вашем файле ровно 10 элементов, не выдерживает критики: когда создаются типизированные файлы, как правило, подразумевается, что количество элементов в них может меняться. Вот взяли и записали в файл, плюс к Вашим 10, информацию ещё о +100500 арендаторах...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2015, 23:29

Из исходного массива сформировать новый массив того же размера по заданному правилу
Дан массив А размера N. Сформировать новый массив того же размера по следующему...

Переписать из исходного файла в новый файл отрицательные, затем нулевые, затем положительные компоненты
Ввести файл с числовыми компонентами F1.Создать файл F2, переписав в него в...

Найти сумму элементов и минимальный элемент. Получить новый файл, поместив в него только те компоненты исходного файла, которые представляют собой неч
Решите задачу пожалуйста если вам не трудно :) ►Сформировать типизированный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru