Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 27.10.2014, 18:40   #1 (permalink)
Эффект массы
Member
 
Регистрация: 31.05.2014
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Сортировка записей. Паскаль

Задача на файлы. Нужно найти максимальный и минимальный элемент в "Экономические показатели" и отсортировать его по возрастанию. Не могу исправить ошибки в программе.
Код:
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)
Эффект массы вне форума   Ответить с цитированием

Старый 27.10.2014, 18:40
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

У нас нашлись схожие топики

Массив записей, Pascal
Создать массив записей на паскале
Создать двоичное дерево записей
Паскаль АВС, сортировка в одномерном массиве без функций и операций
Массивы записей
Режим учетных записей

Старый 27.10.2014, 20:16   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Эффект массы Посмотреть сообщение
Задача на файлы. Нужно найти максимальный и минимальный элемент в "Экономические показатели" и отсортировать его по возрастанию. Не могу исправить ошибки в программе.
Как-то Вы очень странно задаёте эти самые показатели: вроде это поле описали, как строковый тип с длиной 5, а в сортировке начинаете их сравнивать по величине... Как Вы себе это представляете?
Vladimir_S вне форума   Ответить с цитированием
Старый 29.10.2014, 14:58   #3 (permalink)
Эффект массы
Member
 
Регистрация: 31.05.2014
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Исправил, но все равно ошибку выдает.
Цитата:
writeln(i, '-: ');
with sd do begin
write('Название региона: ');
"ожидалось выражение типа записи"
Эффект массы вне форума   Ответить с цитированием
Старый 29.10.2014, 16:01   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Нет, извините, но этого "исправления" я совсем не понял. Что такое вообще эти "показатели"? Число? Несколько чисел? Текст? Как это мыслится?
Vladimir_S вне форума   Ответить с цитированием
Старый 29.10.2014, 18:08   #5 (permalink)
Эффект массы
Member
 
Регистрация: 31.05.2014
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

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

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 30.10.2014, 16:23   #6 (permalink)
Эффект массы
Member
 
Регистрация: 31.05.2014
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Еще почему то в sort пишет, что файл не открыт для записи, хотя я прописал это
Эффект массы вне форума   Ответить с цитированием
Старый 30.10.2014, 16:28   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Если время терпит, попробую на праздниках повозиться. Так сходу "с листа" не разобраться.
Vladimir_S вне форума   Ответить с цитированием
Старый 02.11.2014, 15:22   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Отладил.
Ошибок - такое море, что за голову хватаешься и стонешь. Тут и обращение с массивами, как с простой переменной (без указания индекса), и абсолютно безграмотно написанная сортировка, и много чего еще разного - всего и не перечислишь.
Устал уже повторять, но повторю вновь: в программировании неряшливость недопустима, транслятор не понимает никаких "ну что-то типо...", тут каждое действие, каждый значок должен быть строго выверен и осмысленно поставлен.
Несколько пояснений:
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.
Vladimir_S вне форума   Ответить с цитированием
Старый 04.11.2014, 17:10   #9 (permalink)
Эффект массы
Member
 
Регистрация: 31.05.2014
Сообщений: 16
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо вам большое)
Эффект массы вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.