Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

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

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

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 20.01.2014, 19:24   #1
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
Печаль Ввод данных в массив записей из текстового файла, сортировка по ключу, вывод в файл (на Паскаль)

Код:
program STUDETNIQI;
const kol = 21; tp = '   ';
type Tstud = record
      surname:string[20];
      mod1:integer;
      mod2:integer;
      mod3:integer;
      end;
Mstud = array [1..kol] of Tstud;

var f:text;
    k,j,i:integer;
    A:Mstud;
    elem:string[5];
    kod:integer;
    
PROCEDURE sort (var A:Mstud);
 var x,i,j:integer;
BEGIN
for j:=kol downto 2 do
 for i:=1 to j-1 do
  if (a[i].mod2>a[i+1].mod2) then begin
    x:=a[i].mod2;
    a[i].mod2:=a[i+1].mod2 ;
    a[i+1].mod2:=x;
                                  end
end;

BEGIN
assign (f, 'STUDENTI.txt');
reset (f);
for i:=1 to kol do
 begin
  for k:=1 to 20 do
   read (f, A[i].surname[k]);
  for k:=1 to 5 do
     read (f, elem[k]);
     elem[0]:='2';
     val (elem, A[i].mod1,kod);
  for k:=1 to 5 do
     read (f, elem[k]);
     elem[0]:='2';
     val (elem, A[i].mod2,kod);
  for k:=1 to 5 do
     read (f, elem[k]);
     elem[0]:='2';
     val (elem, A[i].mod3,kod);
     end;
     for i:=1 to kol do
     writeln (A[i].surname, A[i].mod1, A[i].mod2, A[i].mod3);
      close (f);

sort (A);
assign (f, 'RESULT.txt');
rewrite (f);
 for i:=1 to kol do begin
  for j:=1 to 20 do
   write (f, A[i].surname[j]);
  write (f, inttostr(A[i].mod1));
  write (f, tp);
  write (f, inttostr(A[i].mod2));
  write (f, tp);
  write (f, inttostr(A[i].mod3));
  write (f, tp);
  writeln (f);
                    end;
 for i:=kol downto 1 do begin
  for j:=1 to 20 do
   write (f, A[i].surname[j]);
  write (f, inttostr(A[i].mod1));
  write (f, tp);
  write (f, inttostr(A[i].mod2));
  write (f, tp);
  write (f, inttostr(A[i].mod3));
  write (f, tp);
  writeln (f);
                        end;
  close (f);
  end.
Собственно, само задание:
Необходимо спроектировать и отладить программу, осуществляющую:
– ввод данных в массив записей из текстового файла;
– сортировку массива по заданному ключу;
– вывод отсортированного массива в текстовый файл в прямом и обратном
порядке.
Исходными данными задачи являются сведения о студентах группы: фамилия, оценка за модуль №1, оценка за модуль №2, оценка за модуль №3. Все данные хранятся в файле текстового типа. Информация о каждом студенте записана в одной строке: по 20 позиций для фамилии, инициалов и по 5 позиций для каждого числа. Эту информацию необходимо считать из текстового файла в массив записей. Каждая запись массива содержит поле типа String[20] и три поля типа Integer.
Данные из массива записей необходимо отсортировать по заданному ключу сортировки с использованием метода сортировки, определяемого вариантом задания. Алгоритм сортировки требуется реализовать в виде отдельной процедуры.
По моему варианту ключ сортировки: оценка за модуль №2. Тип сортировки: сортировка прямым обменом (пузырёк).

Делаю уже второй день и то там, то сям вылазят ошибки.
Вот архив с текстовым документом, где данные о группе и файл кода. Заранее спасибо всем откликнувшимся
http://www.ex.ua/804638405459
orandzheviyman вне форума Ответить с цитированием
Старый 20.01.2014, 20:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
вылазят ошибки.
Текст ошибок и строки где вылазят в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.01.2014, 20:25   #3
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Текст ошибок и строки где вылазят в студию.
orandzheviyman вне форума Ответить с цитированием
Старый 20.01.2014, 21:24   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

read() не очень подходит для чтения из текстового файла.
Предлагаю так:
Код:
var s:string;
...
for i:=1 to kol do begin
 readln(f,s);
 A[i].surname:=trim(copy(s,1,20)); k:=21;
 elem:=trim(copy(s,k,5));val (elem, A[i].mod1,kod); inc(k,5);
 elem:=trim(copy(s,k,5));val (elem, A[i].mod2,kod); inc(k,5);
 elem:=trim(copy(s,k,5));val (elem, A[i].mod3,kod); inc(k,5);
end;
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.01.2014, 21:34   #5
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
read() не очень подходит для чтения из текстового файла.
Предлагаю так:
Код:
var s:string;
...
for i:=1 to kol do begin
 readln(f,s);
 A[i].surname:=trim(copy(s,1,20)); k:=21;
 elem:=trim(copy(s,k,5));val (elem, A[i].mod1,kod); inc(k,5);
 elem:=trim(copy(s,k,5));val (elem, A[i].mod2,kod); inc(k,5);
 elem:=trim(copy(s,k,5));val (elem, A[i].mod3,kod); inc(k,5);
end;
Можете разъяснить немного?
orandzheviyman вне форума Ответить с цитированием
Старый 20.01.2014, 22:06   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Могу.
Считываем всю строку, раз файл текстовый.
Далее ты в коде четко определил длины данных в строке, отсюда copy() просто скопирует N-е кол-во символов в строку. А далее уже эту строку можно превращать в число. Это я всего-лишь переписал твой вариант реализации.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.01.2014, 23:10   #7
orandzheviyman
Пользователь
 
Регистрация: 11.11.2013
Сообщений: 74
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Могу.
Считываем всю строку, раз файл текстовый.
Далее ты в коде четко определил длины данных в строке, отсюда copy() просто скопирует N-е кол-во символов в строку. А далее уже эту строку можно превращать в число. Это я всего-лишь переписал твой вариант реализации.
Код:
elem:=trim(copy(s,k,5));val (elem, A[i].mod1,kod); inc(k,5);
а что за trim? inc?
orandzheviyman вне форума Ответить с цитированием
Старый 21.01.2014, 06:04   #8
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Цитата:
а что за trim? inc?
А Вам 4 и 3 символа в гугль впадлу вбить?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 21.01.2014, 07:15   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,260
По умолчанию

хотя я по сути согласен с Vanta11a, но мне, в отличие от автора топика, не лень даже пару строк написать
trim() - функция, которая возвращает строку с обрезанными ведущими и конечными пробелами (т.е. без пробелов в начале строки и в конце строки).
Это важно, т.к. функция преобразования строки в число (см. val() ) чувствительна к лишним символам (в данном случае, к пробелам) и,если в строке с число в начале есть лишние пробелы - то будет ошибка преобразования!

inc(k,5) - это процедура увеличения переменной.
Данная запись по сути идентична оператору k := k + 5;



p.s. а в гугле посмотреть описание стандартных процедур и функций реально быстрее и проще, чем спрашивать на форуме и невесть сколько ждать ответа...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод и вывод данных из файла Despot777 Общие вопросы C/C++ 1 26.10.2013 19:11
Ввод текста из файла,шифровка и вывод в новый файл stdio Общие вопросы C/C++ 1 16.04.2012 08:40
Сортировка данных по алфавиту из текстового файла sidestep Помощь студентам 7 15.09.2011 18:46
чтение из текстового файла в структуру TRAIN и вывод информации по запросу (Паскаль) Arabic_Coffee Помощь студентам 0 14.05.2011 20:11
Консольная программа на Си: ввод, вывод, сортировка, сохранение в текстовый файл. zerg Помощь студентам 8 16.11.2007 12:57


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS
Здесь нужно купить рекламу за 7 тыс руб в месяц! )
пишите сюда - alarforum@yandex.ru
ИКС 840