Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2012, 13:01   #1
Monori
Пользователь
 
Аватар для Monori
 
Регистрация: 11.04.2012
Сообщений: 13
По умолчанию Pascal, работа с файлами

Добрый вечер, при написании программы выдает ошибку, подробнее-снизу.

Условие:
1) Создать нетекстовый файл Video.dat,в котором хранятся данные о фильмах(Название фильма, киностудия, режиссер, год выпуска).
2) Переписать в текстовый файл информацию о фильмах, упорядоченную по году выпуска.
Остальное, пока не нужно.

Начало программы:
Код:
Program trololo;
uses crt;
type
    film = record
    name : string;
    avtor : string;
    stud  : string;
    god  : string;
end;
var
i      : integer;
q,q1    : film;
f      : file of film;
f2    : file of string;
Begin
Assign(F, 'C:\Video.dat');
Assing(F2, 'C:\Film.txt');


Rewrite(f);
Writeln('Сколько фильмов будете вводить?');
Readln(n);

for i := 1 to n do begin
      write('Введите название фильма:');
      readln(q.name);
      write('Киностудия:');
      readln(q.stud);
      write('Режиссер:');
      readln(q.avtor);
      write('Год выпуска:');
      readln(q.god);
      write(f, q);
end;
close(f);

С первым пунктом - ВСЕ ОК
Далее, 2ой пункт:
Чтобы проверить просто перезапись из одного файла в другой, программа продолжается как
Код:
reset(f);rewrite(f2);
read(f, q);write(f2, q);
Программа выдает ошибку: Нельзя преобразовать выражение типа record(string;string;string;integer ) к типу string

Подскажите, как исправить, или в чем у меня ошибка?
Monori вне форума Ответить с цитированием
Старый 07.05.2012, 13:57   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Код:
reset(f);rewrite(f2);
read(f, q);writeln(f2, q.name,' ',q.stud,' ',q.avtor,' ',q.god);
Ошибка явно сообщает, что вы пытаетесь записать запись (извините за каламбур) как строку.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 07.05.2012 в 14:00.
BDA вне форума Ответить с цитированием
Старый 07.05.2012, 15:24   #3
Monori
Пользователь
 
Аватар для Monori
 
Регистрация: 11.04.2012
Сообщений: 13
По умолчанию

Спасибо, все понятно)

Последний раз редактировалось Monori; 07.05.2012 в 15:28.
Monori вне форума Ответить с цитированием
Старый 07.05.2012, 17:03   #4
Monori
Пользователь
 
Аватар для Monori
 
Регистрация: 11.04.2012
Сообщений: 13
По умолчанию

Такс, нужно теперь, чтобы то, что ввели сверху переписывалось в другой файл с сортировкой:
Код:
for i=1 to n-1 do
   for j:=i+1 to n do
if q.god>q1.god..............................
С сортировкой не знакома, прочитала про метод "пузырька", не дается он мне в понимание. как закончить сортировку по году?
Monori вне форума Ответить с цитированием
Старый 07.05.2012, 21:37   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Сортировать записи прямо в файле не получится (даже и не заморачивайся).
Сначала тебе придется вводить список фильмов в память (динамический массив, список...), после в памяти сортировать, а уже только потом переписывать в файл.
В твоем (студенческом) случае проще всего будет так:
Код:
Program trololo;
uses crt;
type
    film = record
    name : string;
    avtor : string;
    stud  : string;
    god  : string;
end;
var
i,j     : integer;
q    :array[1..100] of film;
w    :film;
f      : file of film;
f2    : file of string;
Begin

Write('Сколько кинчиков вы вводите?:');readln(n);

{вводим кинчики}
for i := 1 to n do begin
  with q[i] do begin
      write('Введите название фильма:');      readln(name);
      write('Киностудия:');                          readln(stud);
      write('Режиссер:');                            readln(avtor);
      write('Год выпуска:');                        readln(god);
 end;
end;

{Сортирим}
for i := 1 to n do begin
 for j := i to n do begin
  if q[i].god<q[j].god then begin w:=q[i];q[i]:=q[j];q[j]:=w;end;
 end
end;

{А вот теперь записываем}
Assign(F, 'C:\Video.dat');
Rewrite(f);
blockwrite(f,q,n); {Отут могу напутать с параметрами - посмотри в хелпе как точною...}
close(f);
I'm learning to live...

Последний раз редактировалось Stilet; 07.05.2012 в 21:42.
Stilet вне форума Ответить с цитированием
Старый 07.05.2012, 22:07   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Цитата:
Сортировать записи прямо в файле не получится
Почему же не получится?
Код:
q1,q2:film;
i,j,sz:integer;

sz:=filesize(f1);
for i:=0 to sz-2 do
	for j:=i+1 to sz-1 do
	begin
		seek(f1,i);
		read(f1,q1);
		seek(f1,j);
		read(f1,q2);
		if q1.god>q2.god then
		begin
			seek(f1,i);
			write(f1,q2);
			seek(f1,j);
			write(f1,q1);
		end;
	end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.05.2012, 22:13   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
BDA
Ха!!! Красавчик. Шутку оценил )
Преподаватель думаю тоже оценит ))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.05.2012, 22:50   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,316
По умолчанию

Stilet, в чем шутка?
Код:
uses
  crt;

type
  film = record
    name: string[50];
    avtor: string[30];
    stud: string[40];
    god: integer;
  end;

var
  i, j, n, sz: integer;
  q1, q2: film;
  f1: file of film;
  f2: text;

begin
  Assign(F1, 'Video.dat');
  Assign(F2, 'Film.txt');
  
  Rewrite(f1);
  Writeln('Сколько фильмов будете вводить?');
  Readln(n);
  
  for i := 1 to n do 
  begin
    write('Введите название фильма:');
    readln(q1.name);
    write('Киностудия:');
    readln(q1.stud);
    write('Режиссер:');
    readln(q1.avtor);
    write('Год выпуска:');
    readln(q1.god);
    write(f1, q1);
  end;
  
  sz := filesize(f1);
  for i := 0 to sz - 2 do
    for j := i + 1 to sz - 1 do
    begin
      seek(f1, i);
      read(f1, q1);
      seek(f1, j);
      read(f1, q2);
      if q1.god > q2.god then
      begin
        seek(f1, i);
        write(f1, q2);
        seek(f1, j);
        write(f1, q1);
      end;
    end;
  
  rewrite(f2);
  seek(f1, 0);
  for i := 1 to sz do
  begin
    read(f1, q1);
    writeln(f2, q1.name, ' ', q1.stud, ' ', q1.avtor, ' ', q1.god);
  end;
  
  close(f1);
  close(f2);
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.05.2012, 07:43   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в чем шутка?
В том что преподаватель по-любому зацепится за функции (навигации в файле), которые не давал в методичке

Впрочем я представляю еще одну ситуацию: У тебя 1ТБ инфы в файле, и ты этим методом пробуешь сортировать
Интересно успеет ли среднестатистический фермер вырастить картошку за то время пока будет сортироваться таким способом 1ТБ инфы?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.05.2012, 09:43   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

BDA, я согласен с мнением Stilet - предложенный вариант (безусловно рабочий), но выполняется такое количество "сиков" по файлу, такое число чтений/записи, что и времени займёт непростительно много (особенно, если его запустить под "чистым" DOS, где не было кэширования чтения), да и головкам винчестера такая сортировка - это стресс-тест на выживаемость.
Вариант Stilet более подходящий в учебных целях.


p.s.
Цитата:
Сообщение от Stilet
У тебя 1ТБ инфы в файле
напоминаю, что программы под MS DOS не могли оперировать с файлами более 2 Гб. в Seek (и в функциях MS DOS) указатель типа LongInt - больше банально не адресуется!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с файлами (pascal) zenid Помощь студентам 1 26.12.2011 16:18
Работа с файлами (Pascal). MaxuM Помощь студентам 6 26.11.2011 21:01
Работа с файлами (Pascal) andrey256 Помощь студентам 5 25.10.2011 20:52
PASCAL Работа с файлами Natsu Помощь студентам 22 28.02.2010 20:16