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

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

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

 
 Ответить  Открыть новую тему 
> 1 программа по работе с текстовыми файлами, Программа по работе с файлами
Saver
сообщение 5.11.2006 18:09
Сообщение #1





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

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


Программа считывает список фамилий, имен и номеров зачеток с текстового файла и по выбору пользователя(по имени, фамилии или номеру зачетки) сортирует их по алфавиту и сохраняет в новый текстовый файл. Очень надо до сегодняшнего вечера до 23:00. Помогите!!!! unsure.gif rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 5.11.2006 18:42
Сообщение #2


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

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

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


Что уже готово ? Что не получается ?

FAQ : Файлы
FAQ : Записи

+ Поиск ...


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





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

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


Цитата(Saver @ 5.11.2006 18:09) *

Программа считывает список фамилий, имен и номеров зачеток с текстового файла и по выбору пользователя(по имени, фамилии или номеру зачетки) сортирует их по алфавиту и сохраняет в новый текстовый файл. Очень надо до сегодняшнего вечера до 23:00. Помогите!!!! unsure.gif rolleyes.gif


Я написал то, что эта прога должна делать. А не получается мне её написать Помоги пожалуйста, а то препод меня завтра четветует.

Я написал то, что эта прога должна делать. А не получается её написать. Помоги пожалуйста, а то препод меня завтра четвертует.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 5.11.2006 20:09
Сообщение #4


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

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

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


а ты ее пробовал написать?
если да - выкладывай, что получилось.


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


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

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

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


Помочь и сделать полностью _за_тебя_ это разные вещи, тебе не кажется ? Я могу написать тебе программу, но разбираться в ней ты уже будешь самостоятельно, согласен ?





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





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

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


Цитата(klem4 @ 5.11.2006 20:09) *

Помочь и сделать полностью _за_тебя_ это разные вещи, тебе не кажется ? Я могу написать тебе программу, но разбираться в ней ты уже будешь самостоятельно, согласен ?


Конечно согласен. Разобраться я смогу. Ты сегодня её сможешь написать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Saver
сообщение 5.11.2006 20:41
Сообщение #7





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

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


Сам пробовал. Но мало что получилось. Попробуй ты. Только сегодня если сможешь.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 5.11.2006 20:44
Сообщение #8


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

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

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


даже пробовать не буду, пока ты не выложишь то, что написал.

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


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


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

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

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


Разбирайся ...

uses crt;

const
max_len = 100;

type

TStudent = record
name: String;
book: LongInt;
end;

TDataBase = array [1..max_len] of TStudent;

TFile = Text;

function ReadData(fName: String; var db: TDataBase; var dbSize: Integer): Boolean;
var
temp: String;
f: TFile;
value, e: LongInt;
begin


dbSize := 0;

assign(f, fName);

{$i-}
reset(f);
{$i+}

if IOResult <> 0 then ReadData := false else begin

ReadData := true;

while not(eof(f)) do begin

readln(f, temp);

inc(dbSize);

with db[dbSize] do begin
name := Copy(temp, 1, pos(' ', temp) - 1);
Val(Copy(temp, pos(' ', temp) + 1, 255), value, e);
if e = 0 then
book := value;
end;

end;

close(f);

end;
end;

procedure SortBy(var db: TDataBase; dbSize: Integer; byName: Boolean; desc: Boolean);
var
i, j: Integer;
temp: TStudent;

begin

for i := dbSize downto 2 do

for j := 1 to i - 1 do

case byName of

true: begin

if ((db[j].name <= db[j + 1].name) = desc) then begin
temp := db[j];
db[j] := db[j + 1];
db[j + 1] := temp;
end;

end;

false: begin

if ((db[j].book <= db[j + 1].book) = desc) then begin
temp := db[j];
db[j] := db[j + 1];
db[j + 1] := temp;
end;

end;
end;
end;

procedure WriteToFile(fName: String; db: TDataBase; dbSize: Integer);
var
i: Integer;
f: TFile;
begin
assign(f, fName);
rewrite(f);
for i := 1 to dbSize do
writeln(f, db[i].name, ' ', db[i].book);
close(f);
end;

var
db: TDataBase;
dbSize: Integer;
choice: Char;

begin
clrscr;

if not(ReadData('c:\studentsIn.txt', db, dbSize)) then begin
writeln('Can''t open file');
halt(1);
end;

writeln('Sort By : ');
writeln('1 - ByName');
writeln('2 - ByBookNumber');
write('Your choice ->');

readln(choice);

case choice of
'1': SortBy(db, dbSize, true, false);
'2': SortBy(db, dbSize, false, false);
end;

WriteToFile('c:\studentsOut.txt', db, dbSize);

writeln('Done');

readln;
end.


Для более точной сортировки по фамилии пользуйся поиском по форуму ...

ps Пример входного файла прикрепляю.


Прикрепленные файлы
Прикрепленный файл  studentsIn.txt ( 103 байт ) Кол-во скачиваний: 186


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


Гость






 ! 
klem4, еще одно использование тега PASCОDE закончится для тебя баном на несколько дней. Я просил (в Новостях) больше этот тег НЕ использовать. Ты продолжаешь. Одно из двух, либо ты не читал Новости, либо не принимаешь всерьез мою просьбу...

 К началу страницы 
+ Ответить 
klem4
сообщение 5.11.2006 21:14
Сообщение #11


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

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

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


ohmy.gif

Извини, не читал mega_chok.gif исправил на [code]

Прочитал, исправляю на [code = ...]

Виноват, просто не был на форуме почти 2 дня и эта тема у меня не подсвечивалась как непрочитанная почему-то (в 'Обзор нерпочитанных сообщений')...


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





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

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


Ты сам эту прогу проверял? Мне она выдает ошибку вида: Error 202 Stack Overflow Error. Че это ты не в курсе? mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 6.11.2006 10:10
Сообщение #13


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

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

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


Интересно, в каком месте ? При каких входных данных ? У меня отрабатывает без ошибок.


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





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

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


сначала просит переделать переменную e в integer, а когда переделываю, после
var
i: Integer;
f: TFile;
ВОТ ЗДЕСЬ ПИШЕТ ЭТУ ОШИБКУ
begin
assign(f, fName);
rewrite(f);
Кстати, ты не мог прогу попроще написать? Я просто учусь на первом курсе и боюсь, что препод сильно удивится, увидив эту.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.11.2006 14:44
Сообщение #15


Гость






klem4, проверять программы надо и на Turbo Pascal-е иногда:

Цитата
сначала просит переделать переменную e в integer
Это - потому, что в TP размер типа Integer в 2 раза меньше размера LongInt, а все-таки там VAR-параметр, то есть как минимум размер типа формального и фактического параметра должен совпадать...

Цитата
Error 202 Stack Overflow Error.
Будет возникать, сомо собой... Ты же в стек запихиваешь полностью весь массив типа TDataBase, а это все-таки 26 Кб (по умолчанию стек ограничен 16384 байтами)...

Saver, я бы немного подправил вышеприведенную программу:

uses crt;

const
max_len = 100;

type
TStudent = record
name: String;
book: LongInt;
end;

TDataBase = array [1..max_len] of TStudent;

TFile = Text;

function ReadData(fName: String; var db: TDataBase; var dbSize: Integer): Boolean;
var
temp: String;
f: TFile;
p: byte;
value: LongInt;
e: integer;
begin
dbSize := 0;
assign(f, fName);

{$i-}
reset(f);
{$i+}

if IOResult <> 0 then ReadData := false
else begin
ReadData := true;
while not(eof(f)) do begin

readln(f, temp);
inc(dbSize);

p := length(temp);
while temp[p] <> ' ' do dec(p);

with db[dbSize] do begin

name := copy(temp, 1, p - 1);
Val(Copy(temp, p + 1, 255), book, e);

end;

end;
close(f);

end;
end;

procedure SortBy(var db: TDataBase; dbSize: Integer; sort_by: char);
var
i, j: Integer;
temp: TStudent;
swap_it: boolean;

begin

for i := dbSize downto 2 do

for j := 1 to i - 1 do begin

case sort_by of
'1': swap_it := (db[j].name > db[j + 1].name);
'2': swap_it := (db[j].book > db[j + 1].book);
end;
if swap_it then begin
temp := db[j];
db[j] := db[j + 1];
db[j + 1] := temp;
end;
end;

end;

{ const добавляем, чтобы избавиться от переполнения стека }
procedure WriteToFile(fName: String; const db: TDataBase; dbSize: Integer);
var
i: Integer;
f: TFile;
begin
assign(f, fName);
rewrite(f);
for i := 1 to dbSize do
writeln(f, db[i].name, ' ', db[i].book);
close(f);
end;

var
db: TDataBase;
dbSize: Integer;
choice: Char;

begin
clrscr;

if not(ReadData('s_In.txt', db, dbSize)) then begin
writeln('Can''t open file');
halt(1);
end;

writeln('Sort By : ');
writeln('1 - ByName');
writeln('2 - ByBookNumber');
write('Your choice ->');

readln(choice);
if choice in ['1' .. '2'] then SortBy(db, dbSize, choice);

WriteToFile('s_Out.txt', db, dbSize);
writeln('Done');

readln;
end.

Обрати внимание на следующие изменения:
1) добавлен Const в списке параметров процедуры WriteToFile: это сделано для того, чтобы в процедуру передавалась не копия всего массива (о чем я писал выше), а только его адрес, причем если параметр объявлен как Const, то это дает хоть какую-то защиту от случайного изменения данных, хранящихся в этом массиве... Преднамеренно его, конечно, можно изменить, но это уже другая тема...

2) я немного переделал саму процедуру сортировки... Ну, не утерпел я, не могу смириться с тем, что одни и те же действия (а именно - обмен элементов массива местами) присутствуют в коде два раза... Да и вызов процедуры сортировки немного упрощен, ты же не должен сортировать И по возрастанию И по убыванию? Тогда один параметр оказывается лишним...

3) имена файлов: когда работаешь в TP (а это еще DOS-компилятор, лучше давать файлам имена, подходящие под схему 8.3: длина имени 8 символов, и 3 - на расширение...)

4) в процедуре чтения я нахожу позицию последнего пробела. Мне кажется, это более точно подходит под условие, ведь в файле может хранится и имя, и фамилия, а они могут разделяться и пробелом тоже... В моем варианте главное, чтобы группа символов после последнего пробела представляла собой номер зачетной книжки...

Будут вопросы по программе - милости просим smile.gif
 К началу страницы 
+ Ответить 

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

 



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