Помощь - Поиск - Пользователи - Календарь
Полная версия: Записи
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Страницы: 1, 2
Светлана
Здравствуйте! У меня 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.

Как в этой проге написать, чья зар. плата за месяц явл. ниже средней по предприятию???И как вывести фамилии тех, кто проработал более 10 лет? Помогите пож-та...

2) Распечатать фамилии тех учеников класса, которые являются хорошистами и отличниками по итогам года. Также узнать, насколько их средний балл отличается от среднего балла класса.
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.

И я не знаю как сравнить эти средние баллы...

Заранее большое спасибо за помощь!
klem4
начнем с начала ...

Цитата
assign(r,'anketa.dat'); reset®; { -> вот тут у меня высвечивается ошибка: File not found }


Потому что ты пытаешь открыть несуществующий (пока) файл для чтения, а хочешь, видимо для записи (rewrite а не reset)

Далее после заполнения файла, открываешь его уже для чтения (reset) и считаешь сначала среднюю зарплату, попутно выводя работников со стажем > 10


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;






ps

Записи. Record.
Файлы
Светлана
спасибо! Но в примерах, которые нам давали, было сначала assign, а потом сразу шло reset... Вот... может чет я просто не допираю... (извините, а во второй задаче также будет?)....
Светик
smile.gif спасибо большое! Так и надо было, чтобы писалось 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.


заранее большое спасибо!
Bokul
Попробуй перед последнем end-ом поставить процедуру readln. smile.gif
PS советую при вводе данных вместо write использовать writeln. smile.gif
Светлана
Цитата(Bokul @ 22.12.2006 8:37) *

Попробуй перед последнем end-ом поставить процедуру readln. smile.gif
PS советую при вводе данных вместо write использовать writeln. smile.gif


пасиб! У меня стало вот что выводиться!!! Ну я там фамилии, должности и т.д. ввожу, потом выводится
anketa.fam
anketa.zar
anketa.stazh
anketa.dolzh
Zarplata rabotnika nizhe srednei

и все....
Bokul
Ну конечно же. smile.gif
вместо
         
writeln('anketa.fam');
writeln('anketa.zar');
writeln('anketa.stazh');
writeln('anketa.dolzh');


поставь
         
writeln(anketa.fam);
writeln(anketa.zar);
writeln(anketa.stazh);
writeln(anketa.dolzh);


wink.gif
Светлана
О! теперь нормально! Спасибо огромное... Но вот насчет Zarplata rabotnika nizhe srednei - это так и остается в самом конце, и ниче не выводится!... я не знаю, что надо исправить.....
volvo
А что бы ты хотела, чтобы выводилось? Фамилия работника, у которого зарплата ниже средней? Тогда вот так:
         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;
...
Светлана
Хорошо, спасибо большое! Так и попробую сделать!!!!
Светлана
У меня еще вот такой вопрос: мне не надо самой вводить данные!!!! Надо как-то связать это с файлом!!! Как это сделать? Подскажите пож-та.... unsure.gif
мисс_граффити
А в файле они откуда должны браться?
Или ты хочешь один раз заполнить, а потом работать с готовым?
Светлана
Цитата(мисс_граффити @ 22.12.2006 22:37) *

А в файле они откуда должны браться?
Или ты хочешь один раз заполнить, а потом работать с готовым?


Да, вводить самой данные нельзя (так сказал препод)... значит надо 1 раз его заполнить, и работать с ним! А как вот это сделать, не могу сообразить...
мисс_граффити
так у тебя половина программы - заполнение, а вторая половина - основная работа.
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®;{конец}

вот этот кусок отвечает за заполнение. если ты его уберешь - получишь программку, работающую с готовым файлом.
Светлана
спасибки! Так и сделаю!!!! yes2.gif
Светлана
Я удалила выделенную часть, и у меня чет какая-то ошибка выдается: Error 207: Invalid floating point operation. Я ее не могу исправить, потому что курсор не мигает, где есть ошибка... Это значит, что ошибка не в какой-то определенной строке?
Танкистка
Цитата(Светлана @ 23.12.2006 0:57) *

Да, вводить самой данные нельзя (так сказал препод)... значит надо 1 раз его заполнить, и работать с ним! А как вот это сделать, не могу сообразить...

Надо не через паскаль ввести данные... а непосредственно в сам файл.. т.е. ты создаешь файл на диске и указываешь в проге путь к нему... а файл этот, например блокнот, заполняешь уже сама.. в ручную... т.е. если у тебя фамилия string[15], то ты должна хоть как отвести под нее эти 15 ячеек... и т.д.
мисс_граффити
assign(r,'anketa.dat'); 

должно остаться! (я тебе поэтому начало и конец отметила)
прикрепи, что получилось...
Танкистка, речь про типизированные файлы. Их все же лучше заполнять не через блокнот (как текстовые). Имхо.
Светлана
Цитата(Танкистка @ 23.12.2006 10:31) *

Надо не через паскаль ввести данные... а непосредственно в сам файл.. т.е. ты создаешь файл на диске и указываешь в проге путь к нему... а файл этот, например блокнот, заполняешь уже сама.. в ручную... т.е. если у тебя фамилия string[15], то ты должна хоть как отвести под нее эти 15 ячеек... и т.д.


Ха, привет!!! ТанюХа, молодец!!!!! good.gif Спасибо! То есть я в блокноте пишу эти данные (англ. буквами...) сама, да?


Цитата(мисс_граффити @ 23.12.2006 10:45) *

assign(r,'anketa.dat'); 

должно остаться! (я тебе поэтому начало и конец отметила)
прикрепи, что получилось...
Танкистка, речь про типизированные файлы. Их все же лучше заполнять не через блокнот (как текстовые). Имхо.


вот то что получилось...

Нажмите для просмотра прикрепленного файла
volvo
Цитата(Светлана @ 23.12.2006 15:57)
Ха, привет!!! ТанюХа, молодец!!!!!

Ну да, как же... Молодец... Особенно с вот таким описанием:
r: file of rabotnik_predpriyatiya;
тебе ее совет как раз поможет... запутаться еще больше...

Типизированные файлы (я повторяю в сотый раз!!!) - это МАШИННОЕ представление данных...

Цитата(Танкистка @ 23.12.2006 9:31)
т.е. если у тебя фамилия string[15], то ты должна хоть как отвести под нее эти 15 ячеек... и т.д.
А ты нулевой символ (где длина строки хранится) тоже будешь сама устанавливать? А значения Integer в форме, понятной компилятору?
Светлана
Цитата(volvo @ 23.12.2006 17:16) *

Ну да, как же... Молодец... Особенно с вот таким описанием:
r: file of rabotnik_predpriyatiya;
тебе ее совет как раз поможет... запутаться еще больше...

Типизированные файлы (я повторяю в сотый раз!!!) - это МАШИННОЕ представление данных...

А ты нулевой символ (где длина строки хранится) тоже будешь сама устанавливать? А значения Integer в форме, понятной компилятору?


а у меня значит эта строка неверная?


r: file of rabotnik_predpriyatiya;


мисс_граффити
да нормально все с этой строкой!
Просто Танюха путает типизированные и текстовые файлы.
Не, ну если хочешь, заполняй через блокнот. Но я не знаю, как потом твоя программа интерпретирует содержимое файла...
     rewrite( R );
close( R );

Знаешь, что ты этим делаешь?
Открываешь файл для записи (стирая все, что там было), и, ничего не записывая, тут же закрываешь.
Вопрос на засыпку: зачем?



® ®
Светлана
Я переделала эту задачу!!!
Вот ее формулировка: "Среди работников данного предприятия найти тех, чья заработная плата за месяц является ниже средней по предприятию, а также распечатать список тех, кто проработал на предприятии более 10 лет с указанием их фамилии, зарплаты, стажа работы и должности."

Первая часть этой программы:

Нажмите для просмотра прикрепленного файла

она как бы должна просто выдавать данные о работниках. Но у меня там ошибка выдается, где написано
Reset(rp);{File not found}
... Почему так, я не знаю... Решала по алгоритму..


А вот вторая часть:

Нажмите для просмотра прикрепленного файла

эта программа производит считывание инф-ции из типизированного файла spisok, который был создан и заполнен информацией с помощью программы из 1-й части.

Но и тут у меня такая же ошибка высвечивается!!!

Помогите пож-та их исправить...
мисс_граффити
первая:
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 лет... я там условия написала, но у меня почему-то этого не выводится.. подскажите пож-та, в чем ошибка?

А, я вторую часть немного подправила, поэтому ее прикреплю.

Нажмите для просмотра прикрепленного файла

заранее спасибо!
klem4
Цитата
А скажите пож-та, что означает {$I-} и {$I+} ?


Директивы компилятора
мисс_граффити
 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);

прикрепи файлик, который получился в результате работы с первой...
Светлана
Цитата(мисс_граффити @ 24.12.2006 13:31) *

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


Вот он:

Нажмите для просмотра прикрепленного файла

Цитата(мисс_граффити @ 24.12.2006 13:31) *

 
Seek(rp,i); {а зачем ты это делаешь? после read указатель автоматически перейдет на след. запись}
read(rp,v);




Значит эту строчку вообще не надо, да?


мисс_граффити
я не про то smile.gif
не про исходники, а про spisok
Светлана
Цитата(мисс_граффити @ 24.12.2006 13:31) *

 
sr:=0;
sr:=sr+v.zar; {средняя - это же не сумма, а сумма/количество, правда? поэтому, видимо, придется за 2 прохода: сначала считать сумму и количество, потом делить, а потом заново идти по файлу и смотреть, у кого меньше}
if v.zar<sr then writeln('Zarplata','', v.fam,'','nizhe srednei');
until eof(rp);



а до нахождения средней зарплаты у меня правильно написано???
мисс_граффити
похоже на правду на первый взгляд.
если ты прикрепишь файлик, с которым работаешь, я смогу сказать точнее.
Светлана
Цитата(мисс_граффити @ 24.12.2006 14:18) *

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


ага, прикреплю!

Первая часть:

Нажмите для просмотра прикрепленного файла

и вторая часть:

Нажмите для просмотра прикрепленного файла

Вот это все к первой задаче (только во второй части про среднюю зар. плату я еще не исправляла)...
мисс_граффити
и где обещанный spisok, с которым ты работаешь?
если все нормально, после запуска первой части у тебя должен создаваться файл spisok
вот прикрепи именно его
Танкистка
Цитата(volvo @ 23.12.2006 19:16) *

Ну да, как же... Молодец... Особенно с вот таким описанием:
r: file of rabotnik_predpriyatiya;
тебе ее совет как раз поможет... запутаться еще больше...
Типизированные файлы (я повторяю в сотый раз!!!) - это МАШИННОЕ представление данных...


Простите.. не кричи на меня так.... wacko.gif Я не обратила внимания на эту строку... просто у меня немнога похожая задача была, и у меня просто был txt файл..ну я и все про него и думала...
Светлана
Цитата(мисс_граффити @ 24.12.2006 19:53) *

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


ааа, поняла! Блиин!!! Он почему-то не прикрепляется!!!!.... (я делаю обзор, потом с:\spisok, добавить файл.. и все, ниче у меня не прикрепляется...)


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

мисс_граффити
возможно... блокнот строковую информацию понимает, а вместо чисел рисует квадратики.
вроде как работает. (то, что не касается подсчета средней. со средней - бред полнейший).
и мы же вроде договорились seek убрать.
Светлана
Цитата(мисс_граффити @ 24.12.2006 22:27) *

то, что не касается подсчета средней. со средней - бред полнейший.
и мы же вроде договорились seek убрать.


Ага, я убрала Seek. И подсчет средней я немного изменила... но мне так кажется, что у меня все неправильно...

Нажмите для просмотра прикрепленного файла
Светлана
blink.gif эх, информатика - это жесть!
мисс_граффити
blink.gif
"нифига не поняла" (с)
смотри, как проще всего сделать:
открываешь файл и идешь по нему (пока не конец файла), считая сумму зарплат и количество работников (хотя количество можно не считать: если файл типизированный, то sizeof(f) как раз даст это число).
считаешь среднее.
возвращаешься в начало файла (закрываешь и открываешь или делаешь seek(f,0))
дальше идет твой цикл (вот где про стаж и т.д.), в который добавляешь одно-единственное условие: если зарплата меньше средней...
Светлана
mega_chok.gif
Здравствуйте!!!
Извините пож-та... я ваще натупила с этими задачами!!! До меня ток недавно доперло как надо их делать!!!

Вот первая задачка: "Среди работников данного предприятия найти тех, чья заработная плата за месяц является ниже средней по предприятию, а также рампечатать список тех, кто проработал на предприятии более 10 лет с указанием их фамилии, зарплаты, стажа работы и должности."

И вот как я ее решила!!!

Сначала я напечатала список работников: вот...

Нажмите для просмотра прикрепленного файла

а вот сама программа:

Нажмите для просмотра прикрепленного файла

у меня вроде все работает, но вот ПРОБЛЕМА в следующем: у меня никакие значения не выводятся во второй список... он появляется после запуска программы, но почему-то пустой... Помогите пож-та разобраться...




и вот вторая задачка: "Распечатать фамилии тех учеников класса, которые являются хорошистами и отличниками по итогам года. Также указакть, насколько их средний балл отличается от среднего балла класса".

Вот мое решение: Сначала я составила список этих учеников:

Нажмите для просмотра прикрепленного файла

а вот сама прога:

Нажмите для просмотра прикрепленного файла

и у меня опять такая же проблема: Второй файл, который открывается, он опять пустой.. в чем же ошибка? И я вот еще не знаю, как про средний балл решить.... Помогите плиз... Заранее спасибо!
мисс_граффити
а ты в него где-то что-то записываешь, чтобы он был не пустым?
я не вижу, где и что...
volvo
Светлана, я еще раз повторяю:
readln(fin,fam,nam,ocenka);
не будет читать данные так, как ты этого хочешь...
Светлана
Цитата(volvo @ 26.12.2006 13:37) *

Светлана, я еще раз повторяю:
readln(fin,fam,nam,ocenka);
не будет читать данные так, как ты этого хочешь...


извиняюсь, а как надо, чтобы читало? или на какую ссылку зайти, чтобы прочитать?
Светлана
Цитата(мисс_граффити @ 26.12.2006 13:34) *

а ты в него где-то что-то записываешь, чтобы он был не пустым?
я не вижу, где и что...


эээ, не поняла... у меня как бы 2 файла: 1-fin, который ссылается на тот список, который я сама составляю! А второй - fout - в него чтоли значения не сами должны выводиться???

А вчера я их еще решала, дак у меня во второй файл выводятся значения в обеих прогах, но почему-то только значения последнего, кто написан в списке....
мисс_граффити
Цитата
А второй - fout - в него чтоли значения не сами должны выводиться???

blink.gif
Что значит - сами?
Ты же компьютеру нигде не сообщаешь, что туда должно вводиться. Откуда он знает, ЗАЧЕМ ты делаешь rewrite? А вывод весь у тебя идет только на экран...
Светлана
Цитата(мисс_граффити @ 27.12.2006 17:55) *

Что значит - сами?
Ты же компьютеру нигде не сообщаешь, что туда должно вводиться. Откуда он знает, ЗАЧЕМ ты делаешь rewrite? А вывод весь у тебя идет только на экран...


Эээээ, ну как объяснить... Ну дак ведь я вроде первую часть описала, все, закрыла файл... Потом описываю, что там во втором файле надо делать... И тож его закрываю... Значит фамилии и др. из первого списка (который я сама писала), которые удовлетворяют условиям из второго файла, должны переноситься во второй список..... Я вот так понимаю...


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

Это сам список
Нажмите для просмотра прикрепленного файла

это прога
Нажмите для просмотра прикрепленного файла

и второй список..
Нажмите для просмотра прикрепленного файла

Я про учеников написала тоже самое, но у меня второй список пустой при выводе!!!

вот мой список!
Нажмите для просмотра прикрепленного файла

вот прога!
Нажмите для просмотра прикрепленного файла

вот список, в которй должно выводиться, но он пустой...



вот список, в который должно выводиться, но он пустой!
ха.. он даж не прикрепляется.. ну если прогу запустить, то он откроется!...
мисс_граффити
цитата из твоей работающей программы:
Цитата
writeln(fout,a[j].fam,a[j].nam,a[j].otch,a[j].predmet,a[j].stazh,a[j].nagruzka);

то есть ты указываешь, что надо писать в этот файл!!!
а в неработающих - не указываешь.
Светлана
Цитата(мисс_граффити @ 27.12.2006 20:59) *

цитата из твоей работающей программы:

то есть ты указываешь, что надо писать в этот файл!!!
а в неработающих - не указываешь.


указываю... у меня написано:


then writeln (fout,a[j].fam);



мне просто только фамилию нужно вывести!
Светлана
хм... или не правильно? mega_chok.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.