05.12.2012, 16:02 | #1 (permalink) | ||
Member
Регистрация: 26.10.2012
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Паскаль. Задача на типизированный файл
Создать типизированный файл целых чисел. Записать в него с консоли последовательность целых чисел, конец последовательности (терминатор) – ноль, который не записывается в файл. Отсортировать файл по возрастанию. Как отсортировать файл?
|
||
05.12.2012, 16:02 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Проблема должна решиться быстрее, если ознакомиться с подобными темами Задача на Паскаль Задача, Паскаль |
05.12.2012, 16:15 | #5 (permalink) |
Member
Регистрация: 04.12.2012
Сообщений: 48
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
К тому же поиск в инете никто не запрещал. По ключевым словам очень много инфы вывалилось, та что батенька: "Ищущий да обрящет"
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
05.12.2012, 16:19 | #6 (permalink) |
Member
Регистрация: 04.12.2012
Сообщений: 48
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
пробуй:
10. Метод швидкого сортування. В основу метода покладена ідея послідовного дроблення масиву на частини.Код Pascal 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Const N=10; Var A: array[1..N] of integer; i:integer; Procedure Quick(first,last:integer); Var i,j,x,w,linteger; Begin I:=first; J:=last; X:=A[(first+last) div 2]; Repeat While A[i]>x do i:=i+1; While x>A[j] do j:=j-1; If i<=j then begin W:=A[i]; A[i]:=A[j]; A[j]:=w; I:=i+1; J:=j-1; End; until i>j; if first<j then Quick(first,j); if i<last then quick(i,last); end; Begin For i:=1 to N do begin Writeln(‘введи елемент масиву’); Readln(A[i]); End; Quick(1,N); writeln('Масив після сортування:'); writeln; for i:=l to N do write(A[i]:5); writeln; end. |
05.12.2012, 16:47 | #8 (permalink) |
Member
Регистрация: 04.12.2012
Сообщений: 48
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Отсюда можешь основу взять, а дальше все просто:
Код:
Uses crt; var f:file of integer; a,b,mx1,mx2,mn1,mn2,imx1,imx2,imn1,imn2,i,k1,k2,k:integer; begin //создание файла assign(f,'file'); rewrite(f); writeln('Введите в файл целые числа, окончание ввода 0:'); repeat read(a); if a<>0 then write(f,a); until a=0; clrscr; //вывод на экран writeln('Содержание исходного файла:'); reset(f); //если нет 2 элементов if filesize(f)<2 then begin writeln('Вы ввели менее двух чисел, поиск не возможен'); close(f); exit; end; //если есть while not eof(f) do begin read(f,a); write(a,' '); end; writeln; seek(f,0); //в начало файла read(f,a);//первое число seek(f,1); read(f,b); //второе if a>b then //выбираем первые мин и макс begin mx1:=a; imx1:=0; mx2:=b; imx2:=1; mn1:=b; imn1:=1; mn2:=a; imn2:=0; end else begin mx1:=b; imx1:=1; mx2:=a; imx2:=0; mn1:=a; imn1:=0; mn2:=b; imn2:=1; end; //если только 2 элемента, удалять нечего if filesize(f)=2 then begin writeln('Второе максимальное=',mx2,' его позиция=',imx2); writeln('Второе минимальное =',mn2,' его позиция=',imn2); writeln('Элементов для удаления нет'); close(f); exit; end; // если больше for i:=2 to filesize(f)-1 do //от третьего до последнего begin seek(f,i); read(f,a); if a>mx1 then //первый макс begin imx2:=imx1;//старый первый удет вторым mx2:=mx1; imx1:=i; mx1:=a; //первй новый end else if a>mx2 then//если второй begin imx2:=i; mx2:=a;//он сменится, первый нет end; if a<mn1 then //так же с минимальными begin imn2:=imn1; mn2:=mn1; imn1:=i; mn1:=a; end else if a<mn2 then begin imn2:=i; mn2:=a; end; end; writeln('Первый максимальный=',mx1,' второй=',mx2,' его индекс=',imx2); writeln('Первый минимальный =',mn1,' второй=',mn2,' его индекс=',imn2); if imx2<imn2 then //если макс меньше, поменяем begin a:=imx2; imx2:=imn2; imn2:=a; end; writeln('Удаляем элементы с номерами ',imn2+2,'...',imx2);//номер на 1 больше индекса if imx2-imx1<=2 then //если они рядом begin write('Элементов для удаления нет'); close(f); exit; end; k:=0; for i:=imx2 to filesize(f)-1 do//от 2 макс до конца begin seek(f,i); read(f,a); k:=k+1; seek(f,imn2+k);//все поднимем вверх за 2 мин write(f,a); end; seek(f,filesize(f)-(imx2-imn2-1));//отступаем от конца на кол. удаляемых элементов truncate(f);//обрезаем пустое seek(f,0); //вывод результата writeln('Удаление элементов между вторым минимальным и вторым максимальным:'); while not eof(f) do begin read(f,a); write(a,' '); end; close(f); end. |
05.12.2012, 16:49 | #9 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
|
|
05.12.2012, 19:00 | #10 (permalink) |
Member
Регистрация: 26.10.2012
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Можете считать меня полной идиоткой, но я не знаю как считать числа из файла и наоборот.
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|