Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Сортировка записей. Паскаль (http://www.tehnari.ru/f41/t99105/)

Эффект массы 27.10.2014 18:40

Сортировка записей. Паскаль
 
Задача на файлы. Нужно найти максимальный и минимальный элемент в "Экономические показатели" и отсортировать его по возрастанию. Не могу исправить ошибки в программе.
Код:

program pro1;
 
uses
  op, obrabotki;
 
var
  sv: sved;
 
begin
  assign(sv, 'lep_zar.dat');
  vvod(sv,sd);
  vivod(sv);
  sort(sv);
end.

Код:

unit obrabotki;
interface
uses op;
 
procedure vvod(var sv:sved);
procedure vivod(var sv:sved);
procedure sort(var sv:sved);
implementation
 
procedure vvod(var sv:sved);
var
  i, n: integer;
begin
  assign(sv,'lep_zar.dat');
  rewrite(sv);
 
    writeln('Введите количество регионов:');
    readln(n);
    for i := 1 to n do
                    begin
                    writeln(i, '-: ');
                    with sd do begin
                    write('Название региона: ');
                    readln(name);
                    write('Экономические показатели: ');
                    readln(pocaz);
                    write(sv, sd);
    end;
  end;
  close(sv);
end;
 
 
procedure vivod(var sv:sved);
var
  i,n: integer;
begin
  assign(sv,'lep_zar.dat');
  reset(sv);
  writeln('-----------------------------');
  writeln('Регион  ': 10, 'Экономические показатели по промышленному производству': 10);
  writeln('-----------------------------');
  while not eof(sv) do
  begin
  read(sv,sd);
  with sd do begin
    writeln(sd.name: 10, sd.pocaz: 3);
  end;
  end;
  writeln('--------------------------------');
  close(sv);
end;
 
 
procedure sort(var sv:sved);
var
i,j:integer;
temp:region;
begin
assign(sv,'lep_zar.dat');
reset(sv);
while not eof (sv) do
begin
      read(sv,sd);
      begin
        for j:=1 to maxk do
        for i:=1 to maxk -1 do
                      if (sd[i].pocaz > sd[i+1].pocaz) then
                      temp:=sd[i];
                      sd[i]:=sd[i+1];
                      sd[i+1]:=temp;
                      end;
                      end;
  WriteLn(' Average date: ',sd[i]);
 
  close(sv);
  end;
end;
end;
end.

Код:

unit op;
interface
const maxk = 10;
 
type
    region = record
    name: string[20];
    pocaz: string[5];
  end;
 
type
  sved = file of region;
  sdd = array[1..maxk] of region;
  var
  sd:sdd;
 
 
 
 
 
implementation
end.

И конечно же паскаль ABC)

Vladimir_S 27.10.2014 20:16

Цитата:

Сообщение от Эффект массы (Сообщение 1073721)
Задача на файлы. Нужно найти максимальный и минимальный элемент в "Экономические показатели" и отсортировать его по возрастанию. Не могу исправить ошибки в программе.

Как-то Вы очень странно задаёте эти самые показатели: вроде это поле описали, как строковый тип с длиной 5, а в сортировке начинаете их сравнивать по величине... Как Вы себе это представляете?

Эффект массы 29.10.2014 14:58

Исправил, но все равно ошибку выдает.
Цитата:

writeln(i, '-: ');
with sd do begin
write('Название региона: ');
"ожидалось выражение типа записи"

Vladimir_S 29.10.2014 16:01

Нет, извините, но этого "исправления" я совсем не понял. Что такое вообще эти "показатели"? Число? Несколько чисел? Текст? Как это мыслится?

Эффект массы 29.10.2014 18:08

У меня sd.pocaz записан как сроковый тип, я поставил integer. Там должны быть числа
Вот задание:8. Создайте файл, содержащий записи следующей структуры: название региона, информация об экономических показателях по промышленному производству основных видов продукции в регионах России в 2000 г. по сравнению с 1992 г. в %. Составьте отчет, содержащий информацию о минимальном и максимальном показателе. Напишите программу реорганизации исходного файла так, чтобы распределить регионы в порядке убывания какого-либо экономического показателя.

Эффект массы 30.10.2014 16:23

Еще почему то в sort пишет, что файл не открыт для записи, хотя я прописал это

Vladimir_S 30.10.2014 16:28

Если время терпит, попробую на праздниках повозиться. Так сходу "с листа" не разобраться.

Vladimir_S 02.11.2014 15:22

Отладил.
Ошибок - такое море, что за голову хватаешься и стонешь. Тут и обращение с массивами, как с простой переменной (без указания индекса), и абсолютно безграмотно написанная сортировка, и много чего еще разного - всего и не перечислишь.
Устал уже повторять, но повторю вновь: в программировании неряшливость недопустима, транслятор не понимает никаких "ну что-то типо...", тут каждое действие, каждый значок должен быть строго выверен и осмысленно поставлен.
Несколько пояснений:
1. Отлаживалось на DOS Free Pascal, поэтому имя модуля obrabotki сокращено (в DOS имена ограничиваются восьмью символами). Поправьте, если надо.
2. Во избежание заморочек с кодировками кириллица убрана.
3. Путь к файлу в команде Assign - тоже поправьте.
А так - программа полностью отлажена и оттестирована.
Код:

program pro1;

uses
  op, obrab;

begin
 assign(sv, 'D:\lep_zar.dat');
 vvod;
 vivod;
 sort;
 readln
end.

Код:

unit obrab;

interface
uses op;

procedure vvod;
procedure vivod;
procedure sort;

implementation

procedure vvod;
var
 i,n: integer;
begin
 rewrite(sv);
 write('Enter the number of regions: ');
 readln(n);
 for i:= 1 to n do
  begin
  writeln(i, '-: ');
  with sd[i] do
    begin
    write('Region name: ');
    readln(name);
    write('Economical indicators: ');
    readln(pocaz);
    write(sv, sd[i]);
    end;
  end;
  close(sv);
end;


procedure vivod;
var
 sxx:region;
begin
 reset(sv);
 writeln('-----------------------------');
 writeln('Region      Industrial economical indications');
 writeln('-----------------------------');
 while not eof(sv) do
  begin
  read(sv,sxx);
  with sxx do writeln(name: 10, pocaz: 16);
  end;
 writeln('--------------------------------');
 close(sv);
end;


procedure sort;
var
 i,j,n,i_min,i_max,min,max:integer;
 temp:region;
begin
 reset(sv);
 n:=0;
 while not eof(sv) do
  begin
  Inc(n);
  read(sv,sd[n]);
  end;
 close(sv);

 for j:=1 to n-1 do
  for i:=1 to n-j do
  if sd[i].pocaz>sd[i+1].pocaz then
    begin
    temp:=sd[i];
    sd[i]:=sd[i+1];
    sd[i+1]:=temp;
    end;

 i_min:=1;
 i_max:=1;
 min:=sd[1].pocaz;
 max:=sd[1].pocaz;
 for i:=2 to n do
  begin
  if sd[n].pocaz<min then
    begin
    i_min:=n;
    min:=sd[n].pocaz;
    end;
  if sd[n].pocaz>max then
    begin
    i_max:=n;
    max:=sd[n].pocaz;
    end;
 end;

 Writeln('Sorted:');
 writeln('-----------------------------');
 writeln('Region      Industrial economical indications');
 writeln('-----------------------------');
 for i:=1 to n do
  with sd[i] do writeln(name: 10, pocaz: 16);
 writeln('--------------------------------');
 Writeln;
 Writeln('Minimal:');
 with sd[i_min] do writeln(name: 10, pocaz: 16);
 Writeln('Maximal:');
 with sd[i_max] do writeln(name: 10, pocaz: 16);
end;

end.

Код:

unit op;

interface

const maxk = 10;

type
 region = record
          name: string[20];
          pocaz: Integer;
          end;
 sved = file of region;
 sdd = array[1..maxk] of region;

var
 sd:sdd;
 sv:sved;

implementation

end.


Эффект массы 04.11.2014 17:10

Спасибо вам большое)


Часовой пояс GMT +4, время: 05:39.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.