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