![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#11 |
Регистрация: 21.12.2011
Сообщений: 6
|
![]()
Вот исправил под структуру ООН, работает но не совсем правильно. Т.е. иногда ложится в рантайме, а вообще не сортирует два-три числа. Где-то мне кажется ошибка в алгоритме.
uses crt; type country = record name: string[20]; area: real; population: real; end; var f0, f1, f2, d1, d2: file of country; i, n, prov : integer; x: country; countrymas : array[1..5] of country; procedure firstras(var prov: integer); var k, i: integer; x, last: country; begin reset(f0); rewrite(f1); rewrite(f2); k := 1; //записывать в k-файл(в первый изначально) в f1 i := 1; read(f0, last); write(f1, last); while not eof(f0) do begin read(f0, x); if ((x.population < last.population) and (k = 1)) then begin write(f1, x); last := x; end; if ((x.population < last.population) and (k = 2)) then begin write(f2, x); last := x; end; if (x.population > last.population) then begin if k = 1 then begin write(f2, x);last := x; k := 2 end else begin write(f1, x);last := x; k := 1 end; end; end; reset(f2); if eof(f2) then prov := 1 //файл отсортирован! else prov := 2; close(f1); close(f2); end;// изначальное распределение procedure sort(var f1, f2, d1, d2: file of country; var prov: integer ); var a, b, alast, blast : country; k, m, x, i, n: integer; fl: boolean; begin rewrite(d1); rewrite(d2); reset(f1); reset(f2); fl := true; k := 1; //записываем в файл 1 m := 1; //читаем из файла 1 read(f1, a); read(f2, b); if a.population > b.population then begin write(d1, a); alast := a; blast := a; end else begin write(d1, b); blast := b; alast := b; m := 2; end; if m = 1 then begin read(f1, a); if a.population > alast.population then fl := false end; if m = 2 then begin read(f2, b); if b.population > blast.population then fl := false end; while (not eof(f1)) and (not eof(f2)) do begin if fl = true then begin if a.population > b.population then begin if k = 1 then write(d1, a) else write(d2, a); alast := a; m := 1; read(f1, a); if a.population > alast.population then fl := false end else begin if k = 2 then write(d2, b) else write(d1, b); blast := b; m := 2; read(f2, b); if b.population > blast.population then fl := false end; end else begin if (m = 1) then begin if k = 1 then write(d1, b) else write(d2, b); blast := b; read(f2, b); while (b.population < blast.population) and ((not eof(f1)) and (not eof(f2))) do begin if k = 1 then begin write(d1, b);blast := b; read(f2, b); end else begin write(d2, b); blast := b; read(f2, b); end; end; end else begin if k = 1 then write(d1, a) else write(d2, a); alast := a; read(f1, a); while (a.population < alast.population) and ((not eof(f1)) and (not eof(f2))) do begin if k = 1 then begin write(d1, a);alast := a; read(f1, a); end else begin write(d2, b); blast := b; read(f1, a); end; end; end; if k = 1 then k := 2 else k := 1; fl := true; end; end; //while 85 if not eof(f1) then begin while not eof(f1) do begin if k = 1 then write(d1, a) else write(d2, a); alast := a; read(f1, a); if a.population > alast.population then if k = 1 then k := 2 else k := 1; end; if k = 1 then begin if a.population < b.population then begin write(d1, b); write(d1, a); end else begin write(d1, a); write(d1, b); end end else begin if a.population < b.population then begin write(d2, b); write(d2, a) end else begin write(d2, b); write(d2, a) end; end; end; if not eof(f2) then begin while not eof(f2) do begin if k = 1 then write(d1, b) else write(d2, b); blast := b; read(f2, b); if b.population > blast.population then if k = 1 then k := 2 else k := 1; end; if k = 1 then begin if a.population < b.population then begin write(d1, b); write(d1, a) end else begin write(d1, a); write(d1, b); end; end else begin if a.population < b.population then begin write(d2, b); write(d2, a); end else begin write(d2, a); write(d2, b) end; end; end; close(d2); reset(d2); if eof(d2) then prov := 1 //файл d1 отсортирован! else prov := 2; close(d1); close(d2); close(f1); rewrite(f1); close(f1); close(f2); rewrite(f2); close(f2); end; |
![]() |
![]() |
![]() |
#12 |
Регистрация: 21.12.2011
Сообщений: 6
|
![]()
begin
countrymas[1].name := 'New York'; countrymas[1].population := 5; countrymas[2].name := 'L.A.'; countrymas[2].population := 3; countrymas[3].name := 'Vitebsk'; countrymas[3].population := 25; countrymas[4].name := 'Moscow'; countrymas[4].population := 8; countrymas[5].name := 'Minsk'; countrymas[5].population := 12; //countrymas[5].name := 'Florida'; //countrymas[5].population := 6; assign(f0, 'f0.dat'); assign(f1, 'f1.dat'); assign(f2, 'f2.dat'); assign(d1, 'd1.dat'); assign(d2, 'd2.dat'); rewrite(f1); close(f1); rewrite(f2); close(f2); rewrite(d1); close(d1); rewrite(d2); close(d2); write('Введите кол-во элементов иcходного файла: '); //readln(n); n := 5; rewrite(f0); for i := 1 to n do begin write(f0, countrymas[i]); write(countrymas[i].population, ' '); end; write('Исходный файл: '); reset(f0); while not eof(f0) do begin read(f0, x); write(x, ' '); end; writeln; firstras(prov); while(prov <> 1) do begin sort(f1, f2, d1, d2, prov); if prov <> 1 then sort(d1, d2, f1, f2, prov); end; reset(d1); reset(f1); rewrite(f0); if not eof(d1) then begin while not eof(d1) do begin read(d1, x); write(f0, x); end; end; if not eof(f1) then begin while not eof(f1) do begin read(f1, x); write(f0, x); end; end; close(f1); close(d1); close(f0); write('Результат: '); reset(f0); while not eof(f0) do begin read(f0, x); write(x.population, ' '); end; writeln; close(f0); erase(f1); erase(f2); erase(d1); erase(d2); end. |
![]() |
![]() |
![]() |
#13 |
Пользователь
Регистрация: 10.12.2011
Сообщений: 32
|
![]()
У меня со странами было... но я сделал так. Просто много геммороя будет... нужно или вручную заполнять все данные, или записать их в файл... Стран очень много. Я сделел так, в задании(РГР) написал условие без стран.... просто Применить......
чтобы сделать как надо... нужно читать не числа из файла и записи, сделать это довольно просто... ну тогда и в сортировке нужно будет немного подправить. |
![]() |
![]() |
![]() |
#14 |
Пользователь
Регистрация: 10.12.2011
Сообщений: 32
|
![]()
dmgcodevil, есть такая структура данных как запись, которая включает несколько переменных различного типа...
например type strana = record stoliza: string [20]; pop: integer; end; var temp:strana; |
![]() |
![]() |
![]() |
#15 |
Пользователь
Регистрация: 10.12.2011
Сообщений: 32
|
![]()
Извиняюсь, плохо посмотрел код... вы испотльзуете записи.
Зачем вам массив записей? Просто циклом вводите данные в запись, её записываете в файл и всё. Ну в принципе можно и через массив записей, но это неправильно со стороный памяти (препод может ...) |
![]() |
![]() |
![]() |
#16 |
Пользователь
Регистрация: 10.12.2011
Сообщений: 32
|
![]()
Может и алгоритм работает не правильно... Но с большим кол-вом данных вроде работает правильно.
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Отсортировать файл с ростом первых букв предложений.. | dragon_pb_ | Общие вопросы C/C++ | 0 | 01.12.2011 22:40 |
Отсортировать структуры (Паскаль) | Traus | Помощь студентам | 0 | 04.10.2011 00:31 |
Добавить элемент в типизированный файл и его с отсортировать | Valja | Паскаль, Turbo Pascal, PascalABC.NET | 5 | 09.05.2011 19:21 |
Найти наибольший и наименьший элемент в каждой строке матрицы. Отсортировать... (Паскаль) | Tifa | Помощь студентам | 0 | 27.01.2011 23:07 |
Тестовый файл. Найти сумму всех чисел, входящих в этот файл. (Паскаль) | Homeros | Помощь студентам | 1 | 26.01.2011 14:05 |