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

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

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

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


Пионер
**

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

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


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


Пионер
**

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

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


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


Пионер
**

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

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


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


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


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

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

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


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

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

попробуй...

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

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



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


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


Пионер
**

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

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


Вот горе. Программа все рано висит на поцедуре сортировки. mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

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

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


Что же делать? Я, признаюсь, плохо разбираюсь в булеановских функциях, да и в других тоже не очень. Как исправить программу? Заранее простите за настырность
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

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

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


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


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


Пионер
**

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

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


Здравтвуйте! Может быть, кто-нибудь из вас посмотрит еще раз на мое решение? Я боюсь, начинаю просто зацикливаться на этой программе wacko.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

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

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


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


Профи
****

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

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


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

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

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

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


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


Пионер
**

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

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


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

Прошу прощения, либо только с большой, либо только с малой буквы. Если слов в файле нет, то в выходном файле выходит слово "nothing". Входной файл до мегабайта объемом
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -


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


Пионер
**

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

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


Бог с ним, с этим мегабайтом! Мне бы сортировку по строкам добить, а то скоро экзамен и решать еще четыре таких же замудреных задачи
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Пионер
**

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

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


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

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

 





- Текстовая версия 28.03.2024 22:05
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name