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

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

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

> 1 программа по работе с текстовыми файлами, Программа по работе с файлами
сообщение
Сообщение #1





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

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


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


Гость






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
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Saver   1 программа по работе с текстовыми файлами   5.11.2006 22:09
klem4   Что уже готово ? Что не получается ? FAQ : Файлы …   5.11.2006 22:42
Saver   Программа считывает список фамилий, имен и номеро…   6.11.2006 0:01
мисс_граффити   а ты ее пробовал написать? если да - выкладывай, ч…   6.11.2006 0:09
Saver   Сам пробовал. Но мало что получилось. Попробуй ты.…   6.11.2006 0:41
klem4   Помочь и сделать полностью _за_тебя_ это разные ве…   6.11.2006 0:09
Saver   Помочь и сделать полностью _за_тебя_ это разные в…   6.11.2006 0:22
мисс_граффити   даже пробовать не буду, пока ты не выложишь то, чт…   6.11.2006 0:44
klem4   Разбирайся ... uses crt; const max_len = 100; …   6.11.2006 1:03
Saver   Ты сам эту прогу проверял? Мне она выдает ошибку в…   6.11.2006 2:48
volvo   klem4, еще одно использование тега PASCОDE закончи…   6.11.2006 1:12
klem4   :ohmy: Извини, не читал :mega_chok: исправил на…   6.11.2006 1:14
klem4   Интересно, в каком месте ? При каких входных данны…   6.11.2006 14:10
Saver   сначала просит переделать переменную e в integer, …   6.11.2006 23:40
volvo   klem4, проверять программы надо и на Turbo Pascal-…   7.11.2006 18:44


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

 





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