Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2009, 21:07   #1
vAdiM_Kubski
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 16
По умолчанию Задача на текстовый файл

задача следующая:
отсортировать записи в порядке возрастания среднемесячной з/п
и вставить после этого новую запись в файл так, чтобы не нарушилась упорядоченность файла (запись вводится с клавиатуры)

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

program ex232;
uses crt;
const m=6;maxN=5;
type worker=record
Name:string[10];
Post:string[10];
Year:integer;
Zrpl:array [1..m] of real;
end;
var
Fin,Fout:text;
S:array [1..maxN] of worker;
j,i,n,k:integer;
z,R,L:worker;
procedure input(var T:worker);
var j:integer;
begin
read(Fin,T.Name,T.Post,T.Year);
for j:=1 to m do read(Fin,T.Zrpl[j]);
readln(Fin);
end;
procedure output(T:worker);
var j:integer;
begin
write(Fout,T.Name:10,' ',T.Post:10,' ',T.Year:4,' ');
for j:=1 to m do write(Fout,T.Zrpl[j]:9:2);
writeln(Fout);
end;
function SRED(T:worker):real;
var j:integer;sum:real;
begin
sum:=0;
for j:=1 to m do sum:=sum+T.Zrpl[j];
SRED:=sum/m;
end;
BEGIN
clrscr;
write('vvedite imya:');readln(R.NAME);
write('vvedite doljnoct:');readln(R.POST);
write('vvedite god:');readln(R.YEAR);
write('vvedite ',m,' z/p:');
for j:=1 to m do read(R.Zrpl[j]);
Assign(Fin,'d:\data1.pas');
reset(Fin);
n:=0;
while not eof(Fin) do
begin
n:=n+1;
input(S[n]);
end;
close(Fin);
for j:=1 to n-1 do
for i:=1 to n-j do
if SRED(S[i])>SRED(S[i+1]) then
begin
z:=S[i];S[i]:=S[i+1];S[i+1]:=z;
end;
{L:=S[maxN];
i:=1;
while SRED(R)>SRED(S[i]) do i:=i+1;
k:=i-1;
for i:=maxn-1 downto k+1 do S[i+1]:=S[i];
S[k+1]:=R;}
Assign(Fout,'d:\resault.pas');
rewrite(Fout);
for i:=1 to n do output(S[i]);
{if k<maxN then output(L);}
close(Fout);
writeln('cmotri file');
readkey
END.

в дата.пас:

ivanov menedjer1 2001 10000 20000 30000 40000 50000 60000
petrov menedjer2 2009 10000 10000 10000 10000 10000 10000
sidorov menedjer3 2005 30000 30200 30000 30000 30000 30000
budagov director 2008 50000 60000 70000 80000 90000 94444
mixnov assistent 2004 20000 20000 20000 20000 20000 20000

все, что в {} скобках - это мой способ решения второй части задания, т.е. ненарушения отсортированности файла
без них - выполненная первая часть задания, т.е. сортировка

проблема в том, что при моем решении, задача выполняется, только если среднемесячная з/п новой записи не привышает максимальной уже существующей
если она выше, то в файл помимо записей выводится непомерное количество мусора, но сам паскаль не жалуется...

т.е. если среднемесячная больше чем у директора, то - мусор в файле..

помогите, кто знает
заранее спасибо
vAdiM_Kubski вне форума Ответить с цитированием
Старый 24.05.2009, 12:09   #2
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

Вопрос! У кого может быть зарплата больше чем у ДИРЕКТОРА!!!!
(шутка).
А если серьезно....
самый простой вариант:
1.Ввисти в програму переменную Max_значение с фай(Fin,'d:\data1.pas');
а. Процедура открывает файл находит Max_ значения, в файле.
б. И сравнивает их.
в. Если привышает то False.
г. Обязательно закрывает Close(fin)
2.Наложить просто ограничение

Дурная мысль, но это то что пришло мне в голову)
Doholyan вне форума Ответить с цитированием
Старый 24.05.2009, 13:36   #3
vAdiM_Kubski
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 16
По умолчанию

вообщем сам решил)) если кому надо, то:
BEGIN
clrscr;
write('vvedite imya:');readln(R.NAME);
write('vvedite doljnoct:');readln(R.POST);
write('vvedite god:');readln(R.YEAR);
write('vvedite ',m,' z/p:');
for j:=1 to m do read(R.Zrpl[j]);
Assign(Fin,'d:\data1.pas');
reset(Fin);
n:=0;
while not eof(Fin) do
begin
n:=n+1;
input(S[n]);
end;
close(Fin);
for j:=1 to n-1 do
for i:=1 to n-j do
if SRED(S[i])>SRED(S[i+1]) then
begin
z:=S[i];S[i]:=S[i+1];S[i+1]:=z;
end;
L:=S[maxN];
i:=1;
while SRED(R)>SRED(S[i]) do
begin
i:=i+1;
k:=i-1;
end;
if k<maxn then
begin
for i:=maxn-1 downto k+1 do S[i+1]:=S[i];
S[k+1]:=R;
Assign(Fout,'d:\resault.pas');
rewrite(Fout);
for i:=1 to n do output(S[i]);
output(L);
close(Fout);
end
else
begin
Assign(Fout,'d:\resault.pas');
rewrite(Fout);
for i:=1 to n do output(S[i]);
output(R);
close(Fout);
end;
writeln('cmotri file');
readkey
END.
vAdiM_Kubski вне форума Ответить с цитированием
Старый 24.05.2009, 20:19   #4
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

ек опробывал твое последнее решения.....
но, мысль так себе...не плохая.
молодец!))
Doholyan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как текстовый файл в формате word 2007 переделать в файл в формате ZAY JULIA Microsoft Office Word 13 09.06.2010 19:43
Паскаль. Задача на текстовый файл MAnytta Помощь студентам 1 03.03.2009 19:41
Текстовый файл! Задача! Straiker Паскаль, Turbo Pascal, PascalABC.NET 4 18.01.2009 10:10
задача на текстовый файл в delphi [Drumm-are-turG] Помощь студентам 1 27.12.2008 15:42
Текстовый файл в текстовый массив Kimimaru Общие вопросы C/C++ 1 02.12.2007 11:55