0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
1
Delphi 6-7

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

16.05.2019, 20:41. Показов 2524. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Дан массив данных о работающих на предприятии: фамилия, имя, отчество, адрес (улица, дом, квартира) и дата поступления на работу. Во второй массив записать данные только тех из них, кто на сегодняшний день уже проработал не менее 5 лет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2019, 20:41
Ответы с готовыми решениями:

Записать во второй массив данные тех работников, кто на сегодняшний день проработал уже не менее 5 лет
помогите с программой procedure TForm22.Button1Click(Sender: TObject); begin close; end;...

Во второй массив записать только данные тех из клиентов, кто взял телевизор
2. Дан массив данных о клиентах пункта проката: фамилия, имя, отчество, адрес (улица, дом,...

Напечатать данные тех работников, кто на сегодняшний день проработал уже не менее 5 лет
Помогите решить, прошу отнестись с уважением Дан массив данных о работающих в фирме: фамилия,...

Во второй массив записать данные только о тех рабочих, кто на сегодняшний день проработал не менее 5 лет
Дан массив данных о работающих в фирме: фамилия, имя, отчество, адрес (улица,дом,квартира) и дата...

24
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
16.05.2019, 22:42 2
Вопрос понятен. Проблема не понятна.
0
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
16.05.2019, 22:45  [ТС] 3
Я прошу написать ее, у меня есть код на паскале, а на делфи выдаёт ошибку
0
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
16.05.2019, 23:16 4
Цитата Сообщение от etoruru Посмотреть сообщение
у меня есть код на паскале,
Закидывайте сюда, раз уже есть.
0
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
16.05.2019, 23:32  [ТС] 5
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
const n = 3;
 
type
 TPerson = record
   FIO: string;
   Date: integer
 end;
 
 TMas = array[1..n] of TPerson;
 
 var Mas, MasRes: TMas;
     i, cnt: integer;
 
 
 begin
 
  for i := 1 to n do
    begin
      writeln(i,' - й человек из ', n,': ');
      write('ФИО и Адрес: '); readln(Mas[i].FIO);
      write('С какого года работает? '); readln(Mas[i].Date);
      writeln;
    end;
 
  cnt := 0;
  for i := 1 to n do
    begin
      with Mas[i] do
       if (2019 - Date) >= 5 then
                              begin
                               MasRes[i] := Mas[i];
                               inc(cnt)
                              end;
    end;
 
   for i := 1 to cnt do
     begin
       writeln('#', i);
       writeln('ФИО и Адрес: ', MasRes[i].FIO);
       writeln('Работает 5 лет, с ', MasRes[i].Date, ' года. ');
       writeln;
     end;
   readln;
end.
0
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
17.05.2019, 10:49 6
Лучший ответ Сообщение было отмечено qwertehok как решение

Решение

Раз есть программа на паскале, то можно сделать консольную программу. Во первых, хорошо бы добавить в самое начало строку 'program ProgName'. Далее нужно после этого добавить в отдельной строке директиву компилятора {$apptype console} и приведённая выше программа заработает. Но только вместо русских букв будут непонятные знаки. Чтобы это исправить можно либо переписать все сообщения английскими буквами, либо использовать системную функцию перекодировки. Эти функции доступны при подключении модуля "Windows" (uses Windows. Чтобы с ними было удобнее работать можно до begin объявить функции:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//Функция берёт строку в ANSI кодировке (Windows, CP1251)
//и возвращает её перевод в OEM кодировке (DOS, CP866)
//в виде отдельной строки.
function StrAnsiToOem(const aStr : String) : String;
var
  Len : Integer;
begin
  Result := '';
  Len := Length(aStr);
  if Len = 0 then Exit;
  SetLength(Result, Len);
  CharToOemBuff(PChar(aStr), PChar(Result), Len);
end;
 
//Функция берёт строку в OEM кодировке (DOS, CP866)
//и возвращает её перевод в ANSI кодировке (Windows, CP1251)
//в виде отдельной строки.
function StrOemToAnsi(const aStr : String) : String;
var
  Len : Integer;
begin
  Result := '';
  Len := Length(aStr);
  if Len = 0 then Exit;
  SetLength(Result, Len);
  OemToCharBuff(PChar(aStr), PChar(Result), Len);
end;
И потом использовать их в виде:
Delphi
1
      writeln(i, StrAnsiToOem(' - й человек из '), n,': ');
Второй вариант в следующем сообщении.

Добавлено через 1 час 21 минуту
Но, раз у нас Delphi, то желательно сделать обычное оконное приложение. Для этого нам понадобится Edit для ввода ФИО и адреса и SpinEdit для ввода даты принятия на работу. Так же, понадобится кнопка, по нажатию которой данные будут заносится в массив, и Memo, в который данные будут выводиться. Если нужна возможность повторить ввод не закрывая программу, то понадобится ещё одна кнопка сброса.
Внешний вид программы может быть, как во вложении.

Нужно действия по подготовке ко вводу данных вынести в отдельную процедуру, например:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure TForm1.InitInput;
var
  ii: integer;
begin
  Label4.Caption := '1-й человек из ' + IntToStr(n);
  Button1.Enabled := true;
  Memo1.Lines.Clear; // Очистка от предыдущих результатов
  i := 1;
  for ii := 1 to n do begin // Очистка входного и выходного массивов
    Mas[ii].FIO := '';
    Mas[ii].Date := 2019;
    MasRes[ii] := Mas[ii];
  end;
end;
Вызывать процедуру инициализации нужно при запуске программы, лучше в событии OnCreate формы, а так же, при нажатии на кнопку "Сброс".


Далее, заполнение массивов и вывод результата идёт в обработчике кнопки "Добавить запись":
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
procedure TForm1.Button1Click(Sender: TObject);
var
  ii, cnt: integer ;
begin
  // Заполнить элемент массива
  Mas[i].FIO := Edit1.Text;
  Mas[i].Date := SpinEdit1.Value;
  // Сбросить значения полей ввода
  Edit1.Text := '';
  SpinEdit1.Value := 2019;
 
  i := i + 1;
  if i <= n then
    // Если ещё нужно вводить данные, то обновим надпись
    Label4.Caption := IntToStr(i) + '-й человек из ' + IntToStr(n)
  else begin
    // Если ввели всех, кого нужно, то
    Label4.Caption := 'Ввод окончен'; // Известим об этом
    Button1.Enabled := false; // Деактивируем кнопку ввода
    cnt := 0; // подготовим счётчик подходящих записей
    for ii := 1 to n do begin
      if (2019 - Mas[ii].Date) >= 5 then begin // Если работает более 5 лет, то
        inc(cnt);  // Увеличим счётчик
        MasRes[cnt] := Mas[ii];  // и скопируем данную запись в выходной массив
      end;
    end;
    if cnt > 0 then for ii := 1 to cnt do begin // Если были обнаружены подходящие записи, то
      // выведем содержимое выходного массива на экран
      Memo1.Lines.Add('#' + IntToStr(ii));
      Memo1.Lines.Add('ФИО и адрес: ' + MasRes[ii].FIO);
      Memo1.Lines.Add('Работает ' + IntToStr(2019 - MasRes[ii].Date) + ' лет с ' + IntToStr(MasRes[ii].Date) + ' года');
      Memo1.Lines.Add('');
    end;
  end;
end;
Добавлено через 3 минуты
Кстати, в вашей программе ошибка при заполнении выходного массива. Использована не та переменная.
2
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
17.05.2019, 10:51 7
Лучший ответ Сообщение было отмечено etoruru как решение

Решение

Вариант внешнего вида.
Миниатюры
Записать массив данные только тех работников предприятия, кто на сегодняшний день уже проработал не менее 5 лет   Записать массив данные только тех работников предприятия, кто на сегодняшний день уже проработал не менее 5 лет  
0
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
17.05.2019, 12:20  [ТС] 8
а если нужно будет считывать эти данные из файла? как тогда сделать программу?
0
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
17.05.2019, 12:58 9
Можно загрузить этот файл в StringList и уже парсить строки, лежащие в нём. Для этого нужно знать формат, как эти данные будут записаны в файле.
0
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
17.05.2019, 13:04  [ТС] 10
допустим, у нас файл - блокнот, в котором данные записываются с новой строки
например:
иванов иван иванович улица пушкинская дом семь
2012
0
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
17.05.2019, 15:11 11
Загрузить файл и заполнить массив из строк, а дальше всё примерно так же и остаётся.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
var
  ii, cnt: integer ;
  Strings1: TStringList;
begin
  Strings1 := TStringList.Create;
  try
    // Попробовать загрузить файл
    Strings1.LoadFromFile('Sotrudniki.txt');
  except
    // Если не удалось загрузить файл, то сообщить об этом и выйти из процедуры
    Label4.Caption := 'Не удалось загрузить файл "Sotrudniki.txt"';
    Strings1.Free;
    exit;
  end;
  Label4.Caption := 'Данные успешно загружены из файла "Sotrudniki.txt"';
 
  ii := 0;
  if Strings1.Count >= n*2 then begin
    while (ii < n) do begin
      // Заполнить входной массив
      Mas[ii].FIO := Strings1.Strings[ii*2];
      Mas[ii].Date := StrToInt(Strings1.Strings[ii*2 + 1]);
      ii := ii + 1;
    end;
  end else begin
    Label4.Caption := 'Ошибка! Файл "Sotrudniki.txt" содержит меньше ' + IntToStr(n*2) + ' строк';
    Strings1.Free;
    exit;
  end;
  if Strings1.Count > n*2 then
    Label4.Caption := 'Предупреждение. Файл "Sotrudniki.txt" содержит больше ' + IntToStr(n*2) + ' строк. Лишние строки не учтены.';
  Strings1.Free;
А дальше по прежнему создание массива с результатом и его вывод.
0
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
21.05.2019, 20:54  [ТС] 12
подскажите, что не так? почему-то не выводятся данные кроме первого сотрудника
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Spin;
 
type
  TForm1 = class(TForm)
    mmo1: TMemo;
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
const n = 3;
 
type
 TPerson = record
   Famil, Imya, Otch, Ulitsa: string;
   Date, Dom, Kv: integer
 end;
 
 TMas = array[1..n] of TPerson;
 
 var Mas, MasRes: TMas;
     i, cnt: integer;
 
procedure TForm1.btn1Click(Sender: TObject);
var
  ii, cnt: integer ;
  Strings1: TStringList;
begin
begin
  Strings1 := TStringList.Create;
  try
    Strings1.LoadFromFile('Sotrudniki.txt');
  except
    Lbl1.Caption := 'Не удалось загрузить файл "Sotrudniki.txt"';
    Strings1.Free;
    exit;
  end;
  Lbl1.Caption := 'Данные успешно загружены из файла "Sotrudniki.txt"';
  ii := 0;
  if Strings1.Count >= n*7 then
  begin
    while (ii <= n) do
    begin
      Mas[ii].Famil := Strings1.Strings[ii];
      Mas[ii].Imya := Strings1.Strings[ii+1];
      Mas[ii].Otch := Strings1.Strings[ii+2];
      Mas[ii].Ulitsa := Strings1.Strings[ii+3];
      Mas[ii].Dom := StrToInt(Strings1.Strings[ii+4]);
      Mas[ii].Kv := StrToInt(Strings1.Strings[ii+5]);
      Mas[ii].Date := StrToInt(Strings1.Strings[ii+6]);
      ii := ii + 8;
    end;
  end
  else
  begin
    Lbl1.Caption := 'Ошибка! Файл "Sotrudniki.txt" содержит меньше ' + IntToStr(n*2) + ' строк';
    Strings1.Free;
    exit;
  end;
  if Strings1.Count > n*7 then
  Lbl1.Caption := 'Предупреждение. Файл "Sotrudniki.txt" содержит больше ' + IntToStr(n*2) + ' строк. Лишние строки не учтены.';
  Strings1.Free;
   end;
 
    cnt := 0;
    for ii := 0 to n do
    begin
      if (2019 - Mas[ii].Date) >= 5 then
      begin
        inc(cnt);
        MasRes[cnt] := Mas[ii];
      end;
    end;
    if cnt > 0 then for ii := 1 to cnt do
    begin
      Mmo1.Lines.Add('#' + IntToStr(ii));
      Mmo1.Lines.Add('ФИО и адрес: ' + MasRes[ii].Famil + ' ' + MasRes[ii].Imya + ' ' + MasRes[ii].Otch + ' ' + MasRes[ii].Ulitsa + ' ' +  IntToStr(MasRes[ii].Dom)+ '/' +  IntToStr(MasRes[ii].Kv));
      Mmo1.Lines.Add('Работает ' + IntToStr(2019 - MasRes[ii].Date) + ' лет с ' + IntToStr(MasRes[ii].Date) + ' года');
      Mmo1.Lines.Add('');
    end;
  end;
 
end.
0
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
21.05.2019, 21:00  [ТС] 13
фото файла
Миниатюры
Записать массив данные только тех работников предприятия, кто на сегодняшний день уже проработал не менее 5 лет  
0
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
21.05.2019, 21:41 14
Delphi
1
2
  Mas[ii].Date := StrToInt(Strings1.Strings[ii+6]); 
  ii := ii + 8;
Вот этого не должно быть. Если так делать, то адресуется каждый 8-й элемент массива Mas. Странно, что не происходит ошибки выхода за границы массива.
0
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
21.05.2019, 21:43  [ТС] 15
как тогда сделать?
0
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
21.05.2019, 21:45 16
Так было же выше
Delphi
1
2
3
      Mas[ii].FIO := Strings1.Strings[ii*2];
      Mas[ii].Date := StrToInt(Strings1.Strings[ii*2 + 1]);
      ii := ii + 1;
А теперь если данные на 1 сотрудника занимают 8 строк, то нужно писать ii*8, ii*8 + 1 и т.д.
0
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
21.05.2019, 21:58  [ТС] 17
а если у меня изменилось с двух пунктов в записи на семь, то в остальном нужно что-нибудь менять?
0
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
21.05.2019, 22:03 18
Вроде нет. Меняется только индексация строк в ListBox, остальное остаётся.
0
0 / 0 / 0
Регистрация: 22.02.2019
Сообщений: 27
21.05.2019, 22:06  [ТС] 19
ошибка вылетает
Миниатюры
Записать массив данные только тех работников предприятия, кто на сегодняшний день уже проработал не менее 5 лет  
0
Модератор
3658 / 2172 / 767
Регистрация: 15.11.2015
Сообщений: 8,721
21.05.2019, 22:16 20
Если на сотрудника 7 строк, то надо писать ii*7 и т.д. Ваше ii := ii + 8 меня сбило с толку.
0
21.05.2019, 22:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.05.2019, 22:16
Помогаю со студенческими работами здесь

Во второй массив записать данные только тех из них, кто на сегодняшний день проработал не менее 5 лет
1.Дан массив о работающих в фирме: фамилия, имя, отчество, адреч ( улица, дом, квартира) и дата...

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

Посчитать количество проработавших на сегодняшний день не менее 3 лет
Дан массив данных о работающих в фирме: фамилия, имя, отчество, адрес (улица, дом, квартира) и дата...

Во второй массив записать только данные тех из них, кто взял телевизор
. Дан массив данных о клиентах пункта проката: фамилия, имя, отчество, адрес (улица, дом, квартира)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru