Консультация № 177486
27.03.2010, 14:12
42.44 руб.
0 11 1
Здравствуйте уважаемые эксперты. Помогите в решении задачи.
Условие задачи. Заданы сведения о сотрудниках некоторой организации. Формат сведений: Фамилия, заработная плата. Количество сведений любое. Сохранить сведения в памяти и файле. Прочитать из файла по запросу и определить среднюю заработную плату всех сотрудников организации. Предусмотреть дополнение сведений и их исправление.
Вид программы.

Нужно написать:
1. Процедуру сохранения сведений в файле.
2. Процедуру Обработки сведений.
Открыть файл и загрузить с изменением цвета шрифта. Вывести сообщение при отсуствии файла.
Используя функцию вычисления средней зарплаты вычислить среднюю зарплату. Фамилии вывести в Memo1 с упорядочиванием по алфавиту.
Результат программы.



Приложение:
type
TForm1 = class(TForm)
Panel1: TPanel;
MainMenu1: TMainMenu;
OpenDialog1: TOpenDialog;
ListBox1: TListBox;
StringGrid1: TStringGrid;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
StatusBar1: TStatusBar;
N5: TMenuItem;
N6: TMenuItem;
Edit1: TEdit;
procedure N4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N6Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
str=string[30];
sotrudnik=record
Familiya:str;
Zarplata:real;
end;
massiv=array of sotrudnik;
var
mas:massiv;
n:word;
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.N4Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.FormCreate(Sender: TObject); \\Событие создания формы
StringGriD1.Cells[0,0]:='Фамилия';
StringGriD1.Cells[1,0]:='Зарплата';
StringGriD1.Font.Color:=clRed;
Setlength(mas,0);
end;

procedure TForm1.N5Click(Sender: TObject); \Метод для пункта меню «Сохранение данных в памяти»
var i:integer;
begin
i:=1;
setlength(mas,1);
while StringGrid1.Cells[0,i]<>'' do
begin
mas[i-1].Familiya:=StringGrid1.Cells[0,i];
mas[i-1].Zarplata:=StrToInt(StringGrid1.Cells[1,i]);
i:=i+1;
Setlength(mas,i);
end;
n:=i-1;
statusBar1.Panels.Items[0].Text:='n ='+ IntToStr(n);
end;

function Count(var s:massiv):real; \Функция для определения средней зарплаты, которая не использует компоненты формы.
var i:integer;
p:real;
begin
p:=0;
for i:=0 to n-1 do
with s[i] do
p:=p+s[i].Zarplata;
result:=p/n;
end;

procedure TForm1.N6Click(Sender: TObject); \применение функции
var i:integer; k:real;
begin
i:=1;
setlength(mas,1);
while StringGrid1.Cells[0,i]<>'' do
begin
mas[i-1].Familiya:=stringgrid1.Cells[0,i];
mas[i-1].Zarplata:=StrToInt(StringGrid1.Cells[1,i]);
i:=i+1;
setlength(mas,i);
end;
n:=i-1;
k:=count(mas);
Edit1.Text:=FloattostrF(k,ffFixed,8,4);
end;

end.

Обсуждение

давно
Профессионал
153662
1070
27.03.2010, 20:13
общий
Спиридонов Данил Сергеевич:
Надо бы Ваш проект.
2. Процедуру Обработки сведений.
Что должна делать эта процедура?
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
28.03.2010, 09:04
общий
Евгений/Genia007/:
Открыть файл и загрузить с изменением цвета шрифта. Вывести сообщение при отсуствии файла.
Используя функцию вычисления средней зарплаты вычислить среднюю зарплату. Фамилии вывести в Memo1 с упорядочиванием по алфавиту.


procedure __________________(Sender: TObject);
var ______________________
begin
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
MessageDlg(_______________________________________);
exit;
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
end;

Результат. Ссылка на рис. https://rfpro.ru/upload/1958
Неизвестный
28.03.2010, 18:18
общий
Спиридонов Данил Сергеевич:
Задача в общем несложная, вот только почему Вы решили использовать Memo-компонент? Существует StringGrid, в котором данные будут представлены значительно удобнее. И ещё уточнение: проект можно написать с нуля или необходимо привязаться к Вашей наработке?
Неизвестный
29.03.2010, 13:19
общий
Евгений/Genia007/:
Фамилии и зарплата вводятся в StringGrid1. Memo используется по условиям задачи во время процедуры Обработки данных, для вывода фамилий с сортировкой по алфавиту. Лучше с привязкой к моей наработке.
Вид программы

Результат работы программы.

давно
Профессионал
153662
1070
29.03.2010, 13:25
общий
Спиридонов Данил Сергеевич:
У Вас же и просят Вашу наработку выложить.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
29.03.2010, 13:52
общий
Евгений/Genia007/:
Наработок кроме того, что есть вопросе нету.
давно
Профессионал
153662
1070
29.03.2010, 13:57
общий
Спиридонов Данил Сергеевич:
Нужен Ваш проект, т.е. папка с модулем программы, раз есть эти картинки и в приложении указан код к ним, вот это всё и надо, то что Вы на данный момент сделали.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
29.03.2010, 14:11
общий
Евгений/Genia007/:
https://rfpro.ru/upload/1997
давно
Профессионал
153662
1070
29.03.2010, 15:07
общий
Спиридонов Данил Сергеевич:
Вот посмотрите, Вам это нужно было.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Неизвестный
30.03.2010, 11:06
общий
Евгений/Genia007/:
Спасибо за подробный ответ.
давно
Профессионал
153662
1070
30.03.2010, 11:27
общий
это ответ
Здравствуйте, Спиридонов Данил Сергеевич.
Вот добавленная процедура сохранения данных в файл:
Код:
procedure TForm1.N7Click(Sender: TObject);
var
i, j, y: word;
f: TextFile;
begin
y:= 0;
AssignFile(f, 'stringdrid.txt'); // Связали переменную с файлом
Rewrite(f); // Открыли файл для перезаписи
with StringGrid1 do // Делаем для сетки
begin
for i:= 0 to RowCount - 1 do
if Cells[0, i] <> '' then
inc(y); // Считаем сколько занято ячеек в сетке
// Записываем номер колонки и строки
Writeln(f, ColCount);
Writeln(f, y);
// Записываем содержимое ячейки
for i:= 0 to ColCount - 1 do
for j:= 0 to y - 1 do
Writeln(F, Cells[i, j]);
end;
CloseFile(F); // Закрыли файл
end;
Процедура загрузки данных из файла:
Код:
procedure TForm1.N2Click(Sender: TObject);
var
f: TextFile;
x, i, j: Integer;
str: String;
begin
StringGriD1.Font.Color:= clGreen; // Делаем шрифт сетки зелённым
{If not OpenDialog1.Execute then
exit; }
if not Fileexists('stringdrid.txt') then
begin // Выводим сообщение при отсутствии файла
ShowMessage('Файла не существует.');
exit;
end;
AssignFile(f, {OpenDialog1.FileName}'stringdrid.txt'); // Связали переменную с файлом
Reset(f); // Открыли файл на чтение
with StringGrid1 do // Делаем для сетки
begin
// Получаем номер колонки
Readln(f, x);
ColCount:= x;
// Получаем номер строки
Readln(f, x);
RowCount:= x;
// Загружаем сетку
for i:= 0 to ColCount - 1 do
for j:= 0 to RowCount - 1 do
begin
Readln(f, str);
Cells[i, j]:= str;
end;
end;
CloseFile(f); // Закрыли файл
StatusBar1.Panels[0].Text:= 'n = ' + IntToStr(StringGrid1.RowCount - 1); // Выдаём на статус бар количество записей в сетке
StatusBar1.Panels[1].Text:= ExtractFilePath(ParamStr(0)) + 'stringdrid.txt'; // Выдаём на статус бар полный путь к файлу
end;
Изменённая процедура расчёта и вывода средней зарплаты:
Код:
procedure TForm1.N6Click(Sender: TObject);
var
i: integer;
k: real;
list: TStringList;
begin
i:=1;
setlength(mas,1);
while StringGrid1.Cells[0,i]<>'' do
begin
mas[i-1].Familiya:= stringgrid1.Cells[0,i];
mas[i-1].Zarplata:= StrToInt(StringGrid1.Cells[1,i]);
i:= i + 1;
setlength(mas, i);
end;
n:= i - 1;
k:= count(mas);
Edit1.Text:= FloattostrF(k, ffFixed, 8, 2);
Memo1.Clear; // Отчистили memo
List:= TStringList.Create; // Создали список
for i:= 1 to StringGrid1.RowCount do
if StringGrid1.Cells[0, i] <> '' then
List.Add(StringGrid1.Cells[0, i]); // Загружаем в список данные
List.Sort; // Сортируем список
Memo1.Lines.AddStrings(List); // Добавили данние в memo
List.Free; // Освободили список

end;

Весь проект.
5
Спасибо за грамотный ответ.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа