Форум программистов, компьютерный форум, киберфорум
Наши страницы

Pascal (Паскаль)

Войти
Регистрация
Восстановить пароль
 
katze
0 / 0 / 0
Регистрация: 13.10.2015
Сообщений: 43
#1

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

12.12.2015, 18:04. Просмотров 259. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Из исходного файла в новый файл скопировать заданное количество записей по заданному критерию (Pascal):

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

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

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

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

Из элементов исходного массива сформировать новый массив по заданному правилу - Pascal
Из элементов массива С сформировать массив А той же размерности по правилу: если элемент отрицательный, то Аi=Ci+2, иначе –Аi=Ci-2.

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

3
Cyborg Drone
Модератор
5490 / 3099 / 1286
Регистрация: 17.08.2012
Сообщений: 10,017
14.12.2015, 03:18 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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
Модератор
5490 / 3099 / 1286
Регистрация: 17.08.2012
Сообщений: 10,017
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
Привет! Вот еще темы с ответами:

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

Создать типизированный файл целых чисел, скопировать во 2 файл из исходного записи, хранящие простые числа - Pascal
создать типизированный файл целых чисел, скопировать во 2 файл из исходного записи, хранящие простые числа вот такая вот задачка %(

По значению x и файлу из M полиномов сформировать новый файл из тех полиномов исходного файла ,чье значение в точке X больше нуля - Pascal
Помогите пожалуйста решить задачу в паскале : Полином степени ,не большей Nmax представлен степенью n и коэффициентоми при...

Дан файл f. Переписать его в новый файл, вставляя на последнее место в строке заданное слово. - Pascal
Дан файл f. Переписать его в новый файл, вставляя на последнее место в строке заданное слово.


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

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

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