Здравствуйте! У меня 2 задачки по записям... Помогите пож-та немного исправить...
1) Среди работников данного предприятия найти тех, чья заработная плата за месяц является ниже средней по предприятию, а также распечатать список тех, кто проработал на предприятии более 10 лет с указанием их фамилии, зарплаты, стажа работы и должности.
Вот мой вариант решения...
Program Zapisi_7;
type
rabotnik_predpriyatiya=record
stazh:integer;
zar:integer;
fam:string[15];
dolzh:string[10];
end;
var
i,n: integer;
anketa: rabotnik_predpriyatiya;
r: file of rabotnik_predpriyatiya;
begin
assign(r,'anketa.dat'); reset( r ); { -> вот тут у меня высвечивается ошибка: File not found }
write('Skolko dannyh vvodit');
readln(n);
for i:=1 to n do
begin
write('Vvedite familiu');
readln(anketa.fam);
write('Vvedite stazh raboty');
readln(anketa.stazh);
write('Vvedite velichinu mes. zarabotka');
readln(anketa.zar);
write('Vvedite dolzhnost');
readln(anketa.dolzh);
write(r,anketa);
end;
close( r );
end.
Program Zapisi_12;
type uchenik=record
fam:string[15];
ucheb_god:integer;
har:string[20];
end;
var a:array[1..10] of uchenik;
fin,fout:text;
i,j:integer;
begin
assign(fin,'uch.pas');
reset(fin); { -> тут опять эта же ошибка: File not found }
i:=0;
repeat
i:=i+1;
with a[i] do
readln(fin,fam,ucheb_god,har);
until eof(fin);
close(fin);
assign(fout,'hor_i_otl.pas');
rewrite(fout);
for j:=1 to i do
if a[i].har='horoshisty i otlichniki' then
writeln(fout,a[i].fam);
close(fout);
end.
начнем с начала ...
sr := 0;
reset(f);
while not(eof(f)) do begin
read(f, anketa);
sr := sr + anketa.zar;
if anketa.stazh > 10 then begin
// выводишь нужные данные по работнику (anketa.fam например)
end;
end;
sr := sr / FileSize(f);
(* на всякий случай можно проверить не равно ли FileSize(f) == 0,
FileSize(f) - количество записей в файле *)
(*
далее еще раз переоткрываешь файл (reset) и таким же циклом идешь по файлу,
проверяя наличие работников с зарплатой ниже средней
*)
reset(f);
while not(eof(f)) do begin
read(f, anketa);
if anketa.zar < sr then // зарплата этого работника ниже средней
end;
спасибо! Но в примерах, которые нам давали, было сначала assign, а потом сразу шло reset... Вот... может чет я просто не допираю... (извините, а во второй задаче также будет?)....
спасибо большое! Так и надо было, чтобы писалось rewrite!
Вот, я переделала 1-ю задачку, она так то работает, но когда я ввожу все данные, она не выводит никаких данных... может я просто не даю команду для этого? Помогите плиз ошибку найти...
Program Zapisi_7;
type
rabotnik_predpriyatiya=record
stazh:integer;
zar:integer;
fam:string[15];
dolzh:string[10];
end;
var
i,n: integer;
sr:real;
anketa: rabotnik_predpriyatiya;
r: file of rabotnik_predpriyatiya;
begin
assign(r,'anketa.dat');
rewrite®;
write('Skolko dannyh vvodit');
readln(n);
for i:=1 to n do
begin
write('Vvedite familiu');
readln(anketa.fam);
write('Vvedite stazh raboty');
readln(anketa.stazh);
write('Vvedite velichinu mes. zarabotka');
readln(anketa.zar);
write('Vvedite dolzhnost');
readln(anketa.dolzh);
write(r,anketa);
end;
close®;
sr:=0;
reset®;
while not (eof®) do begin
read(r,anketa);
sr:=sr+anketa.zar;
if anketa.stazh>10 then begin
writeln('anketa.fam');
writeln('anketa.zar');
writeln('anketa.stazh');
writeln('anketa.dolzh');
end;
end;
sr:=sr/FileSize®;
reset®;
while not(eof®) do begin
read(r,anketa);
if anketa.zar<sr then writeln ('Zarplata rabotnika nizhe srednei');
end;
end.
Попробуй перед последнем end-ом поставить процедуру readln.
PS советую при вводе данных вместо write использовать writeln.
Ну конечно же.
вместо
writeln('anketa.fam');
writeln('anketa.zar');
writeln('anketa.stazh');
writeln('anketa.dolzh');
writeln(anketa.fam);
writeln(anketa.zar);
writeln(anketa.stazh);
writeln(anketa.dolzh);
О! теперь нормально! Спасибо огромное... Но вот насчет Zarplata rabotnika nizhe srednei - это так и остается в самом конце, и ниче не выводится!... я не знаю, что надо исправить.....
А что бы ты хотела, чтобы выводилось? Фамилия работника, у которого зарплата ниже средней? Тогда вот так:
while not(eof( R )) do beginИли тебе придется сначала пройтись в цикле по файлу для вычисления средней зарплаты, и только потом вообще выводить все данные:
read(r, anketa);
if anketa.zar<sr then writeln (anketa.fam, ' : Zarplata rabotnika nizhe srednei');
end;
...
sr:=0;
reset( R );
while not eof( R ) do begin
read(R, anketa); sr := sr + anketa.zar;
end;
sr := sr / FileSize( R );
reset( R );
while not eof( R ) do begin
read(r,anketa);
if anketa.stazh>10 then begin
writeln(anketa.fam);
writeln(anketa.zar);
writeln(anketa.stazh);
writeln(anketa.dolzh);
end;
if anketa.zar < sr then writeln (anketa.fam, ': Zarplata rabotnika nizhe srednei');
end;
...
Хорошо, спасибо большое! Так и попробую сделать!!!!
У меня еще вот такой вопрос: мне не надо самой вводить данные!!!! Надо как-то связать это с файлом!!! Как это сделать? Подскажите пож-та....
А в файле они откуда должны браться?
Или ты хочешь один раз заполнить, а потом работать с готовым?
так у тебя половина программы - заполнение, а вторая половина - основная работа.
assign(r,'anketa.dat');
rewrite®; {начало}
write('Skolko dannyh vvodit');
readln(n);
for i:=1 to n do
begin
write('Vvedite familiu');
readln(anketa.fam);
write('Vvedite stazh raboty');
readln(anketa.stazh);
write('Vvedite velichinu mes. zarabotka');
readln(anketa.zar);
write('Vvedite dolzhnost');
readln(anketa.dolzh);
write(r,anketa);
end;
close®;{конец}
спасибки! Так и сделаю!!!!
Я удалила выделенную часть, и у меня чет какая-то ошибка выдается: Error 207: Invalid floating point operation. Я ее не могу исправить, потому что курсор не мигает, где есть ошибка... Это значит, что ошибка не в какой-то определенной строке?
assign(r,'anketa.dat');
assign(r,'anketa.dat');
r: file of rabotnik_predpriyatiya;тебе ее совет как раз поможет... запутаться еще больше...
r: file of rabotnik_predpriyatiya;тебе ее совет как раз поможет... запутаться еще больше...
r: file of rabotnik_predpriyatiya;
да нормально все с этой строкой!
Просто Танюха путает типизированные и текстовые файлы.
Не, ну если хочешь, заполняй через блокнот. Но я не знаю, как потом твоя программа интерпретирует содержимое файла...
rewrite( R );
close( R );
Я переделала эту задачу!!!
Вот ее формулировка: "Среди работников данного предприятия найти тех, чья заработная плата за месяц является ниже средней по предприятию, а также распечатать список тех, кто проработал на предприятии более 10 лет с указанием их фамилии, зарплаты, стажа работы и должности."
Первая часть этой программы:
ZAP.PAS ( 748 байт )
Кол-во скачиваний: 519
она как бы должна просто выдавать данные о работниках. Но у меня там ошибка выдается, где написано
Reset(rp);{File not found}... Почему так, я не знаю... Решала по алгоритму..
первая:
Program Zapisi_7;
type
rabotnik_predpriyatiya=record
fam:string[15];
name:string[10];
dolzh:string[15];
stazh:integer;
zar:integer;
end;
var
rp:file of rabotnik_predpriyatiya;
v:rabotnik_predpriyatiya;
k:char;
begin
Assign(rp,'c:\spisok');
{$I-}
Reset(rp);
{$I+}
if IOResult<>0 then rewrite(rp);
repeat
writeln('Vvedite familiu rabotnika'); readln(v.fam);
writeln('Vvedite imya rabotnika'); readln(v.name);
writeln('Vvedite dolzhnost rabotnika'); readln(v.dolzh);
writeln('Vvedite stazh rabotnika'); readln(v.stazh);
writeln('Vvedite zarplaty rabotnika'); readln(v.zar);
write(rp,v);
writeln('Budete prodolzhat vvod dannyh?(da/net)'); readln(k);
until k='N';
readln
end.
Спасибо! Теперь у меня программа запускается! А скажите пож-та, что означает {$I-} и {$I+} ? Вот еще какой вопрос... Вот, у меня программа запустилась... теперь я САМА должна там все данные занести или нет?
И вот во второй части, она у меня тоже запускается.. мне там надо про среднюю зар. плату и про то, кто проработал на предприятии больше 10 лет... я там условия написала, но у меня почему-то этого не выводится.. подскажите пож-та, в чем ошибка?
А, я вторую часть немного подправила, поэтому ее прикреплю.
ZAPP.PAS ( 890 байт )
Кол-во скачиваний: 443
заранее спасибо!
i:=0;
writeln('Ukazhite familiu rabotnika');
readln(fff);
repeat
Seek(rp,i); {а зачем ты это делаешь? после read указатель автоматически перейдет на след. запись}
read(rp,v);
i:=i+1;
if v.fam=fff then
writeln('rabotnik',v.fam);
if v.stazh>10 then
begin
writeln('rabotnik', v.fam, '', v.name);
writeln('dolzhnost', v.dolzh);
writeln('ego stazh', v.stazh);
writeln('poluchaet zarplatu', v.zar);
end;
sr:=0;
sr:=sr+v.zar; {средняя - это же не сумма, а сумма/количество, правда? поэтому, видимо, придется за 2 прохода: сначала считать сумму и количество, потом делить, а потом заново идти по файлу и смотреть, у кого меньше}
if v.zar<sr then writeln('Zarplata','', v.fam,'','nizhe srednei');
until eof(rp);
Seek(rp,i); {а зачем ты это делаешь? после read указатель автоматически перейдет на след. запись}
read(rp,v);
я не про то
не про исходники, а про spisok
sr:=0;
sr:=sr+v.zar; {средняя - это же не сумма, а сумма/количество, правда? поэтому, видимо, придется за 2 прохода: сначала считать сумму и количество, потом делить, а потом заново идти по файлу и смотреть, у кого меньше}
if v.zar<sr then writeln('Zarplata','', v.fam,'','nizhe srednei');
until eof(rp);
похоже на правду на первый взгляд.
если ты прикрепишь файлик, с которым работаешь, я смогу сказать точнее.
и где обещанный spisok, с которым ты работаешь?
если все нормально, после запуска первой части у тебя должен создаваться файл spisok
вот прикрепи именно его
r: file of rabotnik_predpriyatiya;тебе ее совет как раз поможет... запутаться еще больше...
возможно... блокнот строковую информацию понимает, а вместо чисел рисует квадратики.
вроде как работает. (то, что не касается подсчета средней. со средней - бред полнейший).
и мы же вроде договорились seek убрать.
эх, информатика - это жесть!
"нифига не поняла" (с)
смотри, как проще всего сделать:
открываешь файл и идешь по нему (пока не конец файла), считая сумму зарплат и количество работников (хотя количество можно не считать: если файл типизированный, то sizeof(f) как раз даст это число).
считаешь среднее.
возвращаешься в начало файла (закрываешь и открываешь или делаешь seek(f,0))
дальше идет твой цикл (вот где про стаж и т.д.), в который добавляешь одно-единственное условие: если зарплата меньше средней...
Здравствуйте!!!
Извините пож-та... я ваще натупила с этими задачами!!! До меня ток недавно доперло как надо их делать!!!
Вот первая задачка: "Среди работников данного предприятия найти тех, чья заработная плата за месяц является ниже средней по предприятию, а также рампечатать список тех, кто проработал на предприятии более 10 лет с указанием их фамилии, зарплаты, стажа работы и должности."
И вот как я ее решила!!!
Сначала я напечатала список работников: вот...
SPISOK.PAS ( 203 байт )
Кол-во скачиваний: 535
а вот сама программа:
RAB_PRED.PAS ( 1 килобайт )
Кол-во скачиваний: 530
у меня вроде все работает, но вот ПРОБЛЕМА в следующем: у меня никакие значения не выводятся во второй список... он появляется после запуска программы, но почему-то пустой... Помогите пож-та разобраться...
и вот вторая задачка: "Распечатать фамилии тех учеников класса, которые являются хорошистами и отличниками по итогам года. Также указакть, насколько их средний балл отличается от среднего балла класса".
Вот мое решение: Сначала я составила список этих учеников:
uch1.txt ( 208 байт )
Кол-во скачиваний: 536
а вот сама прога:
UCHENIK.PAS ( 520 байт )
Кол-во скачиваний: 541
и у меня опять такая же проблема: Второй файл, который открывается, он опять пустой.. в чем же ошибка? И я вот еще не знаю, как про средний балл решить.... Помогите плиз... Заранее спасибо!
а ты в него где-то что-то записываешь, чтобы он был не пустым?
я не вижу, где и что...
Светлана, я еще раз повторяю:
readln(fin,fam,nam,ocenka);не будет читать данные так, как ты этого хочешь...
readln(fin,fam,nam,ocenka);не будет читать данные так, как ты этого хочешь...
цитата из твоей работающей программы:
then writeln (fout,a[j].fam);
хм... или не правильно?
я по работникам предприятия смотрела
а если не
with a[i] do
readln(fin,fam,nam,ocenka);
with a[i] do
read(fin,fam,nam,ocenka);