|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.05.2009, 21:07 | #1 |
Пользователь
Регистрация: 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 все, что в {} скобках - это мой способ решения второй части задания, т.е. ненарушения отсортированности файла без них - выполненная первая часть задания, т.е. сортировка проблема в том, что при моем решении, задача выполняется, только если среднемесячная з/п новой записи не привышает максимальной уже существующей если она выше, то в файл помимо записей выводится непомерное количество мусора, но сам паскаль не жалуется... т.е. если среднемесячная больше чем у директора, то - мусор в файле.. помогите, кто знает заранее спасибо |
24.05.2009, 12:09 | #2 |
Форумчанин
Регистрация: 26.04.2009
Сообщений: 270
|
Вопрос! У кого может быть зарплата больше чем у ДИРЕКТОРА!!!!
(шутка). А если серьезно.... самый простой вариант: 1.Ввисти в програму переменную Max_значение с фай(Fin,'d:\data1.pas'); а. Процедура открывает файл находит Max_ значения, в файле. б. И сравнивает их. в. Если привышает то False. г. Обязательно закрывает Close(fin) 2.Наложить просто ограничение Дурная мысль, но это то что пришло мне в голову) |
24.05.2009, 13:36 | #3 |
Пользователь
Регистрация: 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. |
24.05.2009, 20:19 | #4 |
Форумчанин
Регистрация: 26.04.2009
Сообщений: 270
|
ек опробывал твое последнее решения.....
но, мысль так себе...не плохая. молодец!)) |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
как текстовый файл в формате 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 |