IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Сортировка в текстовом файле
Jekaterina
сообщение 26.12.2006 23:06
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Добрый вечер! Не могу справиться с такой задачей: дан текстовой файл, содержащий названия городов
1) если он пуст, в файле вывода вывести слово nothing (с этим я справилась),
2) если названия городов начинаются на одну и ту же букву, то выводим города в файл в обратном порядке,
3) если города начинаются на разные буквы, то сортируем только по первой букве.
Помогите чайнику, пожалуйста!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TS*
сообщение 27.12.2006 12:57
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 71
Пол: Мужской
Реальное имя: Max

Репутация: -  0  +


Цитата(Jekaterina @ 26.12.2006 22:06) *

Добрый вечер! Не могу справиться с такой задачей: дан текстовой файл, содержащий названия городов
1) если он пуст, в файле вывода вывести слово nothing (с этим я справилась),
2) если названия городов начинаются на одну и ту же букву, то выводим города в файл в обратном порядке,
3) если города начинаются на разные буквы, то сортируем только по первой букве.
Помогите чайнику, пожалуйста!

Создаеш масив строк, проверяеш одинаковость первых букв строк, если да то выводиш в файл масив строк наоборот, если нет, сортируеш в процедуре по первой букве:


const
n=100;
var
.....
str: array[1..n] of string;
F, F1: text;
i, m: word;

function check(strs:array of string; nn: word): boolean; {проверка одинаковы ли все первые буквы}
tr: boolean; k: word;
begin
tr:=true;
for k:=1 to nn-1 do
if(strs[k][1]<strs[k-1][1]) then tr:=false;
if tr then check:=true
else
check:=false;
end;

procedure sort_first(var strf: array of string; mm: word) {сортировка по первой букве}
fl: boolean; temp: string; j: word;
begin
repeat
fl:=true;
for j:=0 to mm-2 do
if(s[j][1]>s[j+1][1]) then begin
temp:=s[j]; s[j]:=s[j+1]; s[j+1]:=temp;
end;
until not fl;
end;

begin
.....
i:=1;
while not(EoF(F)) do begin
readln(F, str[i]);
inc(i);
end;
m:=i;
if check(str, i) then begin
for i:=m downto 1 do
writeln(F1, str[i]);
end
else
sort_first(str, m);
.....
end.



Сообщение отредактировано: TS* - 27.12.2006 12:59
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 27.12.2006 13:12
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Спасибо, буду пробовать! smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 27.12.2006 14:18
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Господи, не идет-стек переполняется!
Добрый человек (человеки,народ, люди) что исправить в программе??


Прикрепленные файлы
Прикрепленный файл  MEEG.PAS ( 1.09 килобайт ) Кол-во скачиваний: 183
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 27.12.2006 14:35
Сообщение #5


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


только собралась написать про большие файлы smile.gif

function check(const strs:array of string; nn: word): boolean;

попробуй...

но это тоже так... полумеры.

М
Для TS*: (цитата из правил)
7. Проверяйте программы перед тем, как разместить их на форуме!!!



Сообщение отредактировано: мисс_граффити - 27.12.2006 14:37


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 27.12.2006 14:51
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Вот горе. Программа все рано висит на поцедуре сортировки. mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 27.12.2006 14:57
Сообщение #7


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


    repeat
fl:=true;
for j:=0 to mm-2 do
if(strf[j][1]>strf[j+1][1]) then begin
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
end;
until not fl; // <----------- Тут всегда true ....


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 27.12.2006 15:19
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Что же делать? Я, признаюсь, плохо разбираюсь в булеановских функциях, да и в других тоже не очень. Как исправить программу? Заранее простите за настырность
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 27.12.2006 15:25
Сообщение #9


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +



repeat
fl:=false; //<---------- устанавливаем фалг в 0
for j:=0 to mm-2 do
if(strf[j][1]>strf[j+1][1]) then begin
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl := true; // <------------ если были перестановки, устанавливаем флаг в единицу
end;
until not(fl); //<------------ а если не было, то флаг как был 0 так и остался и сорт. завршена



--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 27.12.2006 15:37
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Исправляла-исправляла, но все-таки не получается с выводом ничего: не идет ни сортировка по первой букве с выводом в файл, не идет и вывод в файл в обратном порядке, если первая буква слова одинаковая. Пишет тоже самое в файл, и все тут


Прикрепленные файлы
Прикрепленный файл  MEG1.PAS ( 1.08 килобайт ) Кол-во скачиваний: 176
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 28.12.2006 10:49
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Здравтвуйте! Может быть, кто-нибудь из вас посмотрит еще раз на мое решение? Я боюсь, начинаю просто зацикливаться на этой программе wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 28.12.2006 12:56
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Цитата(Jekaterina @ 28.12.2006 10:49) *

Здравтвуйте! Может быть, кто-нибудь из вас посмотрит еще раз на мое решение? Я боюсь, начинаю просто зацикливаться на этой программе wacko.gif

Зацикливалось потому, что строки читала оператором read, который не читает строку целиком. Чтоб узнать где зацикливается жми Ctrl+Break. Подсвеченная строка тебе покажет это место. А дальше пошагово выполняешь программу нажимая F8 и смотришь в Watch значения переменных.
Вот работающий код:
const
n=10;
var
str: array[1..n] of string;
f1, f2: text;
i, m: word;

Function sort(var strf: array of string; mm: word):string;
Var fl: boolean; temp: string; j: word;
begin
repeat
fl:=false;
for j:=0 to mm-2 do
if(strf[j][1]>strf[j+1][1]) then begin {сортируем по первой букве}
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl:=true;
end
else {если совпадают первые символы, то сортируем наоборот}
if (strf[j][1]=strf[j+1][1])and(strf[j]<strf[j+1]) then begin
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl:=true;
end;
until not (fl);
end;

begin
Assign (f1, 'pasts.in');
Assign (f2,'pasts.out');
Reset (f1);
Rewrite (f2);
i:=1;
while not(EoF(F1)) do begin
readln(F1, str[i]); {ведь строки читаем!}
if length(str[i])>0 then inc(i); {пустые строки пропускаем}
end;
m:=i;

sort(str, m);

for i:=1 to m-1 do writeln (f2,str[i]); {если выводить то все}

Close (f1);
Close (f2);
end.



--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 28.12.2006 13:14
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Огромное спасибо! Только мне требуется считывать города, записанные в строчку, а не в столбик. Поэтому было "read".
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 28.12.2006 13:17
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Цитата(Jekaterina @ 28.12.2006 13:14) *

Огромное спасибо! Только мне требуется считывать города, записанные в строчку, а не в столбик. Поэтому было "read".

И сколько таких строчек? И каким символом города друг от друга отделяются?

Сообщение отредактировано: hiv - 28.12.2006 13:18


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 28.12.2006 13:26
Сообщение #15


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Любое слово может начинаться с большой или малой буквы, длиной от 1 до 255 символов, между словами один или несколько пропусков

Прошу прощения, либо только с большой, либо только с малой буквы. Если слов в файле нет, то в выходном файле выходит слово "nothing". Входной файл до мегабайта объемом
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 28.12.2006 13:47
Сообщение #16


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Цитата(Jekaterina @ 28.12.2006 13:26) *

Любое слово может начинаться с большой или малой буквы, длиной от 1 до 255 символов, между словами один или несколько пропусков

Прошу прощения, либо только с большой, либо только с малой буквы. Если слов в файле нет, то в выходном файле выходит слово "nothing". Входной файл до мегабайта объемом

Вот с этого и надо было начинать. Тут телепаты не водятся.
Тогда читать надо посимвольно с помощью read(с), где с :char; - один символ.
Цитата(Jekaterina @ 28.12.2006 13:26) *
Входной файл до мегабайта объемом
Столько в массив строк просто не влезет (ибо в DOS не более 640Килобайт оперативной памяти используется). Таким способом решать задачу нельзя! nea.gif

Сообщение отредактировано: hiv - 28.12.2006 14:05


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 28.12.2006 14:11
Сообщение #17


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


Бог с ним, с этим мегабайтом! Мне бы сортировку по строкам добить, а то скоро экзамен и решать еще четыре таких же замудреных задачи
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
hiv
сообщение 28.12.2006 14:23
Сообщение #18


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Тогда так:
const
n=10;
var
str: array[1..n] of string;
f1, f2: text;
i, m: word;
c :char;

Function sort(var strf: array of string; mm: word):string;
Var fl: boolean; temp: string; j: word;
begin
repeat
fl:=false;
for j:=0 to mm-2 do
if(strf[j][1]>strf[j+1][1]) then begin {сортируем по первой букве}
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl:=true;
end
else {если совпадают первые символы, то сортируем наоборот}
if (strf[j][1]=strf[j+1][1])and(strf[j]<strf[j+1]) then begin
temp:=strf[j]; strf[j]:=strf[j+1]; strf[j+1]:=temp;
fl:=true;
end;
until not (fl);
end;

begin
Assign (f1, 'pasts.in');
Assign (f2,'pasts.out');
Reset (f1);
Rewrite (f2);
i:=1;
str[i]:=''; {в начале инициализируем пустой строкой}
while not(EoF(F1)) do begin
read(F1, c); {читаем посимвольно!}
if (c<>' ')and(c<>#10)and(c<>#13) then str[i]:=str[i]+c
else if length(str[i])>0 then begin {непустые строки нам нужны}
inc(i);
str[i]:=''; {инициализируем пустой строкой}
end;
end;
m:=i;

sort(str, m);

for i:=1 to m-1 do write(f2,str[i],' '); {если выводить то все и через пробел}

Close (f1);
Close (f2);
end.



--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Jekaterina
сообщение 28.12.2006 14:43
Сообщение #19


Пионер
**

Группа: Пользователи
Сообщений: 61
Пол: Женский
Реальное имя: Jekaterina Lauce

Репутация: -  0  +


give_rose.gif Спасибо громаднейшее!!! Буду дальше над оставшимеся голову ломать!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 2:25
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"