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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.03.2013, 10:27   #1
lika1129970
Пользователь
 
Регистрация: 22.03.2013
Сообщений: 28
По умолчанию Прочитать из файла числа, отсортировать их по возрастанию, результат записать в новый файл.

большая часть программы есть, но нужно отсортировать их. и если можно то прокомментировать полностью всю программу

вот программа:
Код:
program DFG;
var file1,file2:file of integer;
    n,i,num:integer;
begin
    writeln('Введите кол-во чисел:'); readln(n);
    writeln('Введите ',n,' целых чисел:');
    assign(file1,'D:\числа1.txt');
    rewrite(file1);
    for i:=1 to n do
    begin
         read(num);
         write(file1,num);
    end;
    close(file1);
    assign(file2,'D:\числа2.txt');
    rewrite(file2);
    reset(file1); //для чтения
    while not eof(file1) do      //используется для проверки, достигнут ли конец файла.
    begin
    
          read(file1,n);          //записывает в перем n
          if n>0 then
             begin write(file2,n); end;
    end;
    close(file1); close(file2);   //закрывает
    reset(file2);       //открывает файл
    writeln('Во втором файле: ');
    while not eof(file2) do
    begin
         read(file2,n);            //записывает в перем n
         write(n,' ');
    end;
    close(file2);
end.

Последний раз редактировалось Stilet; 31.03.2013 в 12:03.
lika1129970 вне форума Ответить с цитированием
Старый 31.03.2013, 12:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Опиши тип:
Код:
type arr=^integer
Фукцию считывания:
Код:
function rread:arr;
var i:integer; p,v:arr;
begin
Получаем размер файла
 i:=FileSize(file1);
Резервируем для него память
 GetMem(p,(i+1)*sizeof(integer));
Считываем файл в массив. Первый элемент - размер массива
 p^:=i;v:=p;inc(v);
 while not eof(file1) do begin
  read(file1,v^);
  inc(v);
 end;
Возвращаем массив
rread:=p;
end;
Далее сортировка:
Код:
procedure sort(a:arr);
var q,w:arr;i,j,k:integer;
begin
Обычная сортировка пузырьком, но используя указатели.
 w:=a; inc(w);
 for i:=0 to a^ do begin
  q:=a; inc(q);
  for j:=0 to a^ do begin
   if q^<w^ then begin k:=q^;q^:=w^;w^:=k;end;
   inc(q);
  end; inc(w);
 end;
end;
Ну и допустим запись в файл:
Код:
 procedure tofile(a:arr);
 var p:arr;
 begin
Получаем размер массива
  p:=a; inc(p);
Пишем массив в файл целиком
  blockwrite(file2,p,a^);
 end;
Соответственно вызова такие:
Код:
    writeln('Введите кол-во чисел:'); readln(n);
    writeln('Введите ',n,' целых чисел:');
    assign(file1,'D:\числа1.txt');
    rewrite(file1);
    for i:=1 to n do
    begin
         read(num);
         write(file1,num);
    end;
    close(file1);
    assign(file2,'D:\числа2.txt');
    rewrite(file2);
    reset(file1); //для чтения

Считываем в массив
farr:=rread;
Сортируем
sort(farr);
Пишем во второй файл
tofile(farr);
close(file1);close(file2);
Dispose(farr);
Где farr:arr - т.е. типа массива, что считываем из файла.
Все это писал с потолка, не проверял.

Идея понятна?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 01.04.2013, 13:20   #3
lika1129970
Пользователь
 
Регистрация: 22.03.2013
Сообщений: 28
По умолчанию

inc(v);
пишет что процедура с параметрами указанных типов не найдена

а можно просто в мою программу добавить сортировку и все? и что б так ее не усложнять?!

Последний раз редактировалось Stilet; 01.04.2013 в 22:39.
lika1129970 вне форума Ответить с цитированием
Старый 01.04.2013, 15:38   #4
UaKot
Пользователь
 
Регистрация: 16.02.2013
Сообщений: 36
По умолчанию

зачем в паскале такие сложности? это же не С++.. по моему никакие указатели не нужны для создания функций для массивов ибо из program они все глобальные...

Я код не понял, он получается у вас считывает цифорку из файла в переменную и переписывает в другой файл. Затем переприсваивает переменную. Как вы собираетесь сортировать без массива?

Отсортировать массив:

Код:
for i:=1 to n do
  for j:=1 to n-1 do
    if a[j]>a[j+1] then
         begin
           temp:=a[j]
           a[j]:=a[j+1];
           a[j+1]:=temp;
         end;
UaKot вне форума Ответить с цитированием
Старый 01.04.2013, 22:44   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
зачем в паскале такие сложности?
Предложи свой вариант )
Цитата:
процедура с параметрами указанных типов не найдена
Всмысле?
Цитата:
а можно просто в мою программу добавить сортировку и все? и что б так ее не усложнять?!
Врядли получится, потому что ты не знаешь заранее размер обрабатываемых данных.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.04.2013, 09:07   #6
lika1129970
Пользователь
 
Регистрация: 22.03.2013
Сообщений: 28
По умолчанию

а если тогда программу без процедур??
lika1129970 вне форума Ответить с цитированием
Старый 02.04.2013, 10:44   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

без процедур - это очень легко - весь код, который находится внутри процедуры запишите в основной программе (только не забывайте формальные параметры менять на фактическое значение) и всё. Это просто.

теперь по поводу указателей.
Лика, какой у Вас Паскаль? в некоторых версиях паскаля есть нормальные динамические массивы.
Можно использовать их.

А, возможно, что вас устроит и такой вариант. использовать статический массив.
Этот вариант намного проще того, что предложил Stilet, но недостаток в том, что этот способ имеет ограничение на количество обрабатываемых записей.

Примерно вот так:
Код:
program DFG;
const
   MaxCount = 1000; {максимальное количество записей, которое может отсортировать программа}

var file1,file2:file of integer;
    n,i,j,num:integer;
    A : array[1..MaxCount] of integer;

begin
    repeat
      writeln('Введите кол-во чисел:'); readln(n);
      if (n<=0) or (n>MaxCount) then WriteLn('#Ошибка: число n должно быть от 1 до ',MaxCount);
    until (n>0) and (n<=MaxCount);

    writeln('Введите ',n,' целых чисел:');
    assign(file1,'D:\числа1.txt');
    rewrite(file1);
    for i:=1 to n do
    begin
         read(num);
         write(file1,num);
    end;
    close(file1);


    {прочитаем исходный файл в массив}
    reset(file1); //для чтения
    n := 0; {считаем, что записей во входном файле НЕТ}
    while not eof(file1) do      //используется для проверки, достигнут ли конец файла.
    begin
          Inc(n);
          read(file1, A[n]);          //читаем в переменную A[n] - т.е. в массив A
    end;
    close(file1);


    {отсортируем массив}
    {сортировка массива методом простых обменов}
    for i:=1 to n-1 do
      for j:=i+1 to n do
      if A[i] > A[j]then
        begin
          num := A[i];
          A[i]:= A[j];
          A[j]:= num
        end;


    {сохраним результат во второй файл}
    assign(file2,'D:\числа2.txt');
    rewrite(file2);
    for i:=1 to n do Write(file2, A[i]);
    Close(file2);

    {выведем содержимое второго файла на экран}
    assign(file2,'D:\числа2.txt');
    reset(file2);       //открывает файл
    writeln('Во втором файле: ');
    while not eof(file2) do
    begin
         read(file2, num);            //записывает в перем num
         write(num,' ');
    end;
    close(file2);

    Readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.04.2013, 13:45   #8
lika1129970
Пользователь
 
Регистрация: 22.03.2013
Сообщений: 28
По умолчанию

спасибо) работает!
lika1129970 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан файл f, который содержит вещественные числа. Найти сумму чисел и записать результат в новый файл. (Delphi) 2Nboy Помощь студентам 1 08.06.2012 17:01
Записать в другой файл числа имеющегося файла в обратном порядке. pascal_luzer Паскаль, Turbo Pascal, PascalABC.NET 1 06.04.2012 23:14
Прочитать из файла и записать в функцию Ilya_L Общие вопросы Delphi 3 27.10.2010 15:48
Прочитать файл и записать данные в массив ChukCha Общие вопросы C/C++ 6 22.02.2009 19:56
Записать в файл g все парные числа файла f Lemo Помощь студентам 3 19.10.2008 21:27