• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Паскаль. Задачи на строки

  • Автор темы Автор темы citrus
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.

citrus

Новые
Регистрация
29 Сен 2009
Сообщения
32
Реакции
0
Баллы
0
Паскаль. Задачи на строки

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

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

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

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

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

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

Ну а вот что удалось мне. Не уверен, что это решение оптимальное (я имею в виду считывание информации из строк через промежуточный файл), но ничего умнее я не придумал. Между прочим, задание формата (: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.
 
(я имею в виду считывание информации из строк через промежуточный файл)

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

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


Помогите пожалуйста.
 
Citrus, а самостоятельно? Тем более, что задача аналогична предыдущей, только проще. Во всяком случае, тут не указано, что информация забита в строки, поэтому можно ее расположить в виде отдельных массивов, а лучше полей массива записей. А в остальном - всё то же.
 
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;
 
Прекрасно, продолжайте. Вот Вы используете команды Delete (еще можно Insert), а я их никогда не употреблял и потому намертво про них забыл. Действительно, с ними можно и без файла обойтись. А вы пробуйте, ищите, пишите маленькие программки-фрагменты - только так и научитесь. А желание, как я вижу, у Вас есть, и это главное. И не надо при малейшем затруднении бежать на форумы "ой, не получается!" да "ах, запутался!". Смелее - у Вас всё получится. Удачи!
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху