Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Закрытая тема
 
Опции темы Опции просмотра
Старый 28.01.2010, 18:03   #1 (permalink)
citrus
Member
 
Регистрация: 29.09.2009
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Паскаль. Задачи на строки

"Задан строковый массив. Каждая строка содержит информацию о сотруднике фирмы и имеет след структуру: фамилия пол з/п должность.
Вывести в алфавитном порядке всех мужчин, з/п которых выше средней."

Я вот написал пока что процедуры ввода/вывода и процедуру сортировки мужчин. Теперь, как мне сказали, нужно написать функцию выделения из строки з/п. Затем нужно как-то применять эту функцию к всему массиву и выбирать те, что больше средней.. Помогите, пожалуйста, написать эти функции.

Вот, что я пока что сделал:

Код:
Program ZP;
uses crt;
Type MAS=array[1..15] of string;
Var A,B:MAS;
    N:byte;
    y:real;

 Procedure Vvod(var x:MAS;N:byte);
  Var i:byte;
     s:string;
 begin
 For i:=1 to N do
 begin
 Writeln ('Vvedite imy');
 Readln (x[i]);
 Writeln ('Vvidite pol:m ili j');
 Readln (s);
  x[i]:=x[i]+' '+s;
 Writeln ('Vvedite z/p');
 Readln (s);
  x[i]:=x[i]+' '+s;
 Writeln ('Vvedite dolzhnost');
 readln (s);
  x[i]:=x[i]+' '+s;
 end;
 end;

 Procedure Vivod (var x:MAS; N:byte);
 Var i:byte;
 begin
 For i:=1 to N do
 begin
 Writeln (x[i]:20);
 end;
 Writeln;
 Readln;
 end;

Procedure M(var x:MAS; N:byte);
     var i,p:byte;
         s,dub:string;
         Fl:boolean;
     begin
If s='m'then
begin
     Fl:=true;
While Fl do
     begin
     Fl:=false;
For i:=1 to N do
If x[i]>x[i+1] then
     begin
     Fl:=true;
     dub:=x[i];
     x[i]:=x[i+1];
     x[i+1]:=dub;
    end;
    end;
    end;
    end;


Begin
clrscr;
Writeln('vvedite kol-vo rabotnikov');
readln(N);
vvod(A,N);
vivod(A,N);
M(A,N);
vivod (A,N);
end.
citrus вне форума  

Старый 28.01.2010, 18:03
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Обращаю ваше внимание на то, что на нашем форуме уже были похожи темы

Задачи на строки
Паскаль, символы и строки

Старый 31.01.2010, 15:51   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от citrus Посмотреть сообщение
"Задан строковый массив. Каждая строка содержит информацию о сотруднике фирмы и имеет след структуру: фамилия пол з/п должность.
Вывести в алфавитном порядке всех мужчин, з/п которых выше средней."

Я вот написал пока что процедуры ввода/вывода и процедуру сортировки мужчин. Теперь, как мне сказали, нужно написать функцию выделения из строки з/п. Затем нужно как-то применять эту функцию к всему массиву и выбирать те, что больше средней.. Помогите, пожалуйста, написать эти функции.

Вот, что я пока что сделал:
Ну а вот что удалось мне. Не уверен, что это решение оптимальное (я имею в виду считывание информации из строк через промежуточный файл), но ничего умнее я не придумал. Между прочим, задание формата (:20) в процедуре vivod - ошибка. Уберите обязательно. И еще. Имена (фамилии) сотрудников нужно писать или все с большой буквы, или все с маленькой, но не вперемешку - иначе в конце получится неправильный список.
Код:
Program ZP;
uses crt;
Type MAS=array[1..15] of string;
Var A,B,C:MAS;
    N,Nm:byte;

Procedure Vvod(var x:MAS; Nvvod:byte);
 Var i:byte;
     s:string;
 begin
  For i:=1 to Nvvod do
   begin
    Writeln('Vvedite imy');
    Readln(x[i]);
    Writeln('Vvedite pol:m ili j');
    Readln(s);
    x[i]:=x[i]+' '+s;
    Writeln('Vvedite z/p');
    Readln(s);
    x[i]:=x[i]+' '+s;
    Writeln('Vvedite dolzhnost');
    readln(s);
    x[i]:=x[i]+' '+s;
    WriteLn;
   end;
 end;

Procedure Vivod (x:MAS; Nvivod:byte);
 Var i:byte;
 begin
  For i:=1 to Nvivod do
   begin
    Writeln(x[i]);
   end;
  Writeln;
  Readln;
 end;

Procedure Select(x:MAS; Ns:byte; var y:Mas; var Nms:byte);
 Var i,j:byte;
     f:TEXT;
     Surn:array[1..15] of String;
     Sex:array[1..15] of Char;
     Money:array[1..15] of Word;
     ZPmed:Real;
 begin
  Assign(f,'C:\xxx');
  For i:=1 to Ns do
   begin
    ReWrite(f);
    j:=1;
    Repeat
     Write(f,x[i][j]);
     Inc(j);
    Until x[i][j]=' ';
    Inc(j);
    WriteLn(f);
    WriteLn(f,x[i][j]);
    Inc(j,2);
    Repeat
     Write(f,x[i][j]);
     Inc(j);
    Until x[i][j]=' ';
    WriteLn(f);
    Close(f);
    ReSet(f);
    ReadLn(f,Surn[i]);
    ReadLn(f,Sex[i]);
    ReadLn(f,Money[i]);
    Close(f);
   end;
  Erase(f);
  ZPmed:=0;
  For i:=1 to Ns do
   ZPmed:=ZPmed+1.0*Money[i]/Ns;
  Nms:=0;
  For i:=1 to Ns do
   If (Sex[i]='m') and (1.0*Money[i]>ZPmed) then
    begin
     Inc(Nms);
     y[Nms]:=Surn[i];
    end;
 end;

Procedure Ordering(x:MAS; Nor:byte; var y:MAS);
 var i,j:byte;
     dub:string;
 begin
  y:=x;
  For i:=1 to Nor do
   For j:=1 to Nor-i do
    If ORD(y[j][1])>ORD(y[j+1][1]) then
     begin
      dub:=y[j];
      y[j]:=y[j+1];
      y[j+1]:=dub;
     end;
 end;


Begin
 clrscr;
 Writeln('vvedite kol-vo rabotnikov');
 readln(N);
 vvod(A,N);
 vivod(A,N);
 select(A,N,B,Nm);
 ordering(B,Nm,C);
 vivod(C,Nm);
End.
Vladimir_S вне форума  
Старый 01.02.2010, 16:41   #3 (permalink)
citrus
Member
 
Регистрация: 29.09.2009
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
(я имею в виду считывание информации из строк через промежуточный файл)
все бы ничего, но мы еще файлы не проходили..
citrus вне форума  
Старый 01.02.2010, 17:00   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от citrus Посмотреть сообщение
все бы ничего, но мы еще файлы не проходили..
Ну тогда, как писал М.Зощенко, "Что пардон, то пардон". Я другого способа не нашел. Может кто еще поможет - не знаю.
Vladimir_S вне форума  
Старый 02.02.2010, 20:47   #5 (permalink)
citrus
Member
 
Регистрация: 29.09.2009
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Часть задачи, видимо в ней нужно реализовать несколько подпрограмм:

Дана информация по жителям N городов в таком виде: Фамилия Имя год рождения пол.
Для тех из них, у которых средний возраст жителя не более Q(задается с клавиат.) упорядочить жителей в порядке убывания возрастов.


Помогите пожалуйста.
citrus вне форума  
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 02.02.2010, 21:28   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Citrus, а самостоятельно? Тем более, что задача аналогична предыдущей, только проще. Во всяком случае, тут не указано, что информация забита в строки, поэтому можно ее расположить в виде отдельных массивов, а лучше полей массива записей. А в остальном - всё то же.
Vladimir_S вне форума  
Старый 02.02.2010, 22:00   #7 (permalink)
citrus
Member
 
Регистрация: 29.09.2009
Сообщений: 32
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Citrus, а самостоятельно? Тем более, что задача аналогична предыдущей, только проще. Во всяком случае, тут не указано, что информация забита в строки, поэтому можно ее расположить в виде отдельных массивов, а лучше полей массива записей. А в остальном - всё то же.
если бы все было так просто.. задача на строки, и как нам сказали здесь будет три массива, один MAS - типа стринг (один город) , другой MASA типа MAS (N городов) и третий MASB типа байт..

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

Мысли таковы: из каждой строки (фамилия имя г.р. пол) вытащить г.д. в новый массив и уже там дальше искать средний возраст и упорядовачивать.

Тогда получается, что вводить в подпрограмму нужно какой-то из массивов, а выводом будет массив, содержащий г.р. всех жителей. Вот не пойму, что и как объявить тогда

Код:
Procedure KM (Var x:MAS; s:MAS; N:byte);
   Var i,t:byte;
   Begin
   s[i]:='';
    For i:=1 to N do
    Begin
   For t:=1 to 2 do
   Begin
     delete(x[i],1, pos(' ',x[i]));
     s[i]:=copy(x[i],1, pos(' ',x[i])-1);
     end;
     end;
     end;
citrus вне форума  
Старый 02.02.2010, 22:36   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Прекрасно, продолжайте. Вот Вы используете команды Delete (еще можно Insert), а я их никогда не употреблял и потому намертво про них забыл. Действительно, с ними можно и без файла обойтись. А вы пробуйте, ищите, пишите маленькие программки-фрагменты - только так и научитесь. А желание, как я вижу, у Вас есть, и это главное. И не надо при малейшем затруднении бежать на форумы "ой, не получается!" да "ах, запутался!". Смелее - у Вас всё получится. Удачи!
Vladimir_S вне форума  
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Закрытая тема

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 08:33.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.