Дано предложение А, состоящее из слов - наборов латинских букв, разделенных любым количеством пробелов. Если ни один символ A не входит в заданное множество B и в A нет повторяющихся символов, то упорядочить слова A в порядке, обратном к алфавитному. Определить количество слов в А, в которые входит буква "e". З.Ы. 1) Максимально использовать множества. 2) Для подсчета количества требуемых слов, можно предварительно результат распаковки поместить в одномерный массив строк. 3) Для отладки программы удобно в качестве предложения взять типизированную строковую константу.
Решити плиз оч. нужна помощь!!!, я хз как ето делать=(
Добавлено (17.11.2008, 01:00) --------------------------------------------- неужели никто нехочет тряхнуть стариной и решить ету задачу???
PROTOSS, Может я не так понял суть задачи, но мне кажется, оно противоречиво. Итак, как я понял. У нас есть предложение A - тупо строка с разными символами, включая пробелы. [1] Так же есть множество символов B. Так вот, ни один из символов А не должен быть в множестве B, [2] и в строке A ни один символ не должен повторяться [3], так? Упорядочить слова в приницпе несложно... Но как определить количество слов, в которые входит буква "e" если [3]!?!?!
Quote (PROTOSS)
в A нет повторяющихся символов
. Т.е. символ "e" там тоже может быть всего один? Объясни, я вот не понял Поддерживаю также проект сообщество молодых сисадминов
гм... у нас в пятницу информатика, там и спрошу=) хотел еще вчера ответить но в универе инет обрубили=(
Добавлено (21.11.2008, 16:05) --------------------------------------------- значить суть: если "Если ни один символ A не входит в заданное множество B и в A нет повторяющихся символов, то упорядочить слова A в порядке, обратном к алфавитному." непроходит выполнить "Определить количество слов в А, в которые входит буква "e"." а если выполняется то посчитать есть е есть оно или нету. вот так, надо готовую уже через 45 минут...=)
так условие на татарском, никто и не возьмётся. А- это что такое? Такого понятия "предложение" в паскале нет, столо быть это либо множество, но тогда причём тут пробелы? Либо строка, но тогда как её упорядочить? Кроме того, во множестве не может быть повторяющихся элементов. Скажем дружно- нафиг нужно!
нам как дали я так и написал, думаеш мне в етом разбераться легко?=) ладно попробую у когонить из наших подобную задачку периписать с условием аки пример вам^^
Добавлено (24.11.2008, 18:55) --------------------------------------------- вот: 14. Дано предложение А, состоящее из слов - наборов русских и латинских букв, разделенных любым количеством пробелов. Если в словах предложения есть повторяющиеся латинские символы, то упорядочить слова A по невозрастанию количества латинских букв в словах. В противном случае, определить количество слов-палиндромов в А.
Code
Type ustring=array[1..129] of string; CLat=array[1..129] of byte; Const MesU1_1='V predlogenii est povtornie lat-ie simvoli,'; MesU1_2='predlogenie uporadocheno po ubivaniy kol-va lat-ih bukv v slovah.'; MesU2_1='V predlogenii net povtornih lat-ih bukv.'; MesU2_2='Kol-vo slov palindromov - '; var s: string; m: ustring; n: byte;
Procedure UnPack(s: string; var m: ustring; var n: byte); Const LetM=['a'..'z','A'..'Z']; var i: byte; L: integer; begin L := Length(s); n := 1;
for i := 1 to 129 do m[i] := '';
i := 1; while (i<=L) do begin if (s[i] in LetM) then m[n] := m[n] + s[i] else if m[n] <> '' then Inc(n); Inc(i); end; {if not(s[L-1] in LetM) then Dec(n);} end;
function LatDouble(var m: ustring; n: byte): boolean; Const Lat=['a'..'z','A'..'Z']; Var k,L,i,j: byte; begin LatDouble := false; k := 0; for i := 1 to n do begin L := Length(m[i]); k := 0; for j := 1 to L do begin if m[i][j] in Lat then Inc(k); if k>1 then begin LatDouble := true; exit; end; end; end; end;
procedure SortU(var m: ustring; n: byte); Const Lat=['a'..'z','A'..'Z']; var c: CLat; k,j,L,b: byte; buf: string; begin for k := 1 to n do begin L := Length(m[k]); c[k] := 0; for j := 1 to L do begin if m[k][j] in Lat then Inc(c[k]); end; end;
for k := 1 to n do for j := 1 to n-1 do begin if c[j]<c[j+1] then begin buf := m[j]; b := c[j]; m[j] := m[j+1]; c[j] := c[j+1]; m[j+1] := buf; c[j+1] := b; end; end; end;
function IsPal(s: string): boolean; var s1: string; L,i: byte; begin L := Length(s); if L=1 then begin IsPal := true; exit; end; for i := 1 to Trunc(L) do begin s1[i] := s[L-i]; end; IsPal := (s1=s); end;
function StrPal(var m: ustring; n: byte): byte; var k,i: byte; begin k := 0; StrPal := 0; for i := 1 to n do if IsPal(m[i]) then Inc(k); StrPal := k; end;
procedure PrintP(var m: ustring; n: byte); var i: byte; begin for i := 1 to n do begin write(m[i],' '); end; writeln; end;
begin Write('Vvedite predlogenie: '); Readln(s); UnPack(s,m,n); if n<>0 then if LatDouble(m,n) then begin SortU(m,n); writeln(MesU1_1,#13#10,MesU1_2); PrintP(m,n); end else begin write(MesU2_1,#13#10,MesU2_2); writeln(StrPal(m,n)); end; End.
Добавлено (22.01.2009, 22:22) --------------------------------------------- от себя исчо разик добавляю, общими усилиями мысли задачка была доведена примерно до:
Code
program p3; Type ustring=array[1..129] of string; LatS=array[1..26] of byte; var s: string; m: ustring; n: byte;
Procedure UnPack(s: string; var m: ustring; var n: byte); Const LetM=['a'..'z','A'..'Z']; var i: byte; L: integer; begin L := Length(s); n := 1; for i := 1 to 129 do m[i] := ''; i := 1; while (i<=L) do begin if (s[i] in LetM) then m[n] := m[n] + s[i] else if m[n] <> '' then begin Inc(n); end; Inc(i); end; { if not(s[L-1] in LetM) then Dec(n);} end;
function PovC(s: string): boolean; Const LetM=['A'..'Z']; var sm: LatS; i: byte; x: char; begin PovC := false; for i := 1 to 26 do sm[i] := 0; for i := 1 to Length(s) do begin x := UpCase(s[i]); if (x in LetM) then Inc(sm[Ord(x)-64]); if sm[Ord(x)-64]>1 then begin PovC := true; exit; end; end; end;
function PovtC(var m: ustring; n: byte): boolean; Var i: byte; begin PovtC := false; for i := 1 to n do if PovC(m[i]) then begin PovtC := true; exit; end; end;
procedure SortU(var m: ustring; n: byte); Const Lat=['a'..'z','A'..'Z']; var k,j: byte; buf: string; begin for k := 1 to n do for j := 1 to n-1 do begin if Change(m[j],m[j+1]) then begin buf := m[j]; m[j] := m[j+1]; m[j+1] := buf; end; end; end;
вот, здесь записано примерно: "Дано предложение А, состоящее из слов - наборов латинских букв, разделенных любым количеством пробелов." "в A нет повторяющихся символов, то упорядочить слова A в порядке, обратном к алфавитному." воть, прошу... я ы даже сказал умоляю написать мне в виде процедур или функций "Если ни один символ A не входит в заданное множество B" "Определить количество слов в А, в которые входит буква "e"."
program p3; uses crt; Type ustring=array[1..129] of string; LatS=array[1..26] of byte; Const M_S=['A'..'Z']; var s: string; m: ustring; n: byte;
Procedure UnPack(s: string; var m: ustring; var n: byte); Const LetM=['a'..'z','A'..'Z']; var i: byte; L: integer; begin L := Length(s); n := 1; for i := 1 to 129 do m[i] := ''; i := 1; while (i<=L) do begin if (s[i] in LetM) then m[n] := m[n] + s[i] else if m[n] <> '' then begin Inc(n); end; Inc(i); end; { if not(s[L-1] in LetM) then Dec(n);} end;
function PovC(s: string): boolean; Const LetM=['A'..'Z']; var sm: LatS; i: byte; x: char; begin PovC := false; for i := 1 to 26 do sm[i] := 0; for i := 1 to Length(s) do begin x := UpCase(s[i]); if (x in LetM) then Inc(sm[Ord(x)-64]); if sm[Ord(x)-64]>1 then begin PovC := true; exit; end; end; end;
function PovtC(var m: ustring; n: byte): boolean; Var i: byte; begin PovtC := false; for i := 1 to n do if PovC(m[i]) then begin PovtC := true; exit; end; end;
function Change(s1: string; s2: string): boolean; var s: string; i: byte; begin Change := false; s := s1; if s1>s2 then s := s2; for i := 1 to Length(s) do begin if Ord(s1[i])<Ord(s2[i]) then begin Change := true; exit; end; end; if s2>s1 then Change := true; end;
procedure SortU(var m: ustring; n: byte); Const Lat=['a'..'z','A'..'Z']; var k,j: byte; buf: string; begin for k := 1 to n do for j := 1 to n-1 do begin if Change(m[j],m[j+1]) then begin buf := m[j]; m[j] := m[j+1]; m[j+1] := buf; end; end; end;
function S_in_S(var m: ustring; n: word): boolean; var i,j: byte; begin S_in_S := true; for i := 1 to n do for j := 1 to Length(m[i]) do begin if not(m[i][j] in M_S) then begin S_in_S := false; exit; end; end; end;
function IncS(s: string; c: char): boolean; var i: integer; n: byte; begin n := Length(s); for i := 1 to n do if (s[i]=c) then begin IncS := true; Exit; end; end;
function IncSm(m: ustring; c: char; n: byte): byte; var i: integer; k: byte; begin for i := 1 to n do if IncS(m[i],c) then Inc(k); IncSm := k; end;
procedure PrintP(var m: ustring; n: byte); var i: byte; begin for i := 1 to n do begin write(m[i],' '); end; writeln; end;
begin clrscr; Write('Vvedite predlogenie: '); Readln(s); UnPack(s,m,n); if n<>0 then if PovtC(m,n) then begin SortU(m,n); PrintP(m,n); end else if S_in_S(m,n) then begin SortU(m,n); PrintP(m,n); end else writeln('4uCLO CLOB C "e" ', IncSm(m,'e',n)); readkey; End.
вот полностью задача, но неработает, помогите поправить до рабочего вида Излил душу - Вытри за собой!
Сообщение отредактировал PROTOSS - Понедельник, 24.11.2008, 09:01
Проверяй и перепроверяй! Но кое-что вроде работает.
Code
Uses CRT; Const A: String = 'cde fghtr ops ab'; B: String = 'x'; Type ARR = Array[1..16] of String[16]; Var s: String; i, j, count: byte; mas: ARR; temp: string[16];
flag1, flag2: Boolean; countE: Byte;
Procedure DelSpaces(var s: String); Var i: Byte; Begin {Убираем лишние пробелы} i := 0; While (i < length(s)) do Begin if (s[i] = ' ') and (s[i+1] = ' ') then Delete(s, i, 1) else Inc(i); End; End;
Procedure WordsSplit(var s: String; var count: Byte); Var j: Byte; Begin j := 1; {Разделяем строку на слова} For i := 1 to length(s) do Begin If (s[i] = ' ') then Begin Inc(count); mas[count] := Copy(s, j, i-j); j := i+1; End; End; inc(count); mas[count] := Copy(s, j, length(s)-j+1); {Конец разделения на слова} End;
Function CheckAtoB(B: String; A: String): Boolean; Var i: Byte; flag: Boolean; Begin {Проверяем, входит ли какой-нибудь символ A в множество B} flag := False; For i := 1 to length(B) do Begin if (Pos(B[i],s) <> 0) then Begin flag := true; Writeln(#13#10,'В множестве А найден символ ',B[i]); break; End; End; {Закончили проверку} CheckAtoB := flag; End;
Function CheckDublChar(A: String): Boolean; Var i, j: Byte; flag: Boolean; Begin flag := False; For i := 1 to length(A)-1 do Begin if (flag) then Break; For j := i+1 to length(A) do if (A[i] = A[j]) and (A[i] <> ' ') then Begin flag := true; Writeln('Найдены повторяющиеся символы: ',s[i], ' ', s[j]); Break; End; End; CheckDublChar := flag; End;
Function LeftRight(s1, s2: String): Boolean; Var i: Byte; Begin For i := 1 to length(s1) do Begin if (s1[i] = s2[i]) then Continue else If (s1[i] < s2[i]) then Begin LeftRight := False; Exit; End else Begin LeftRight := True; Exit; End; End; End;
Procedure SortWords(var mas: ARR); Var i, j: Byte; t: String[16]; Begin For i := 1 to count-1 do For j := i to count do Begin if (LeftRight(mas[i], mas[j])) then Begin t := mas[i]; mas[i] := mas[j]; mas[j] := t; End; End; End;
Begin s := A; ClrScr; DelSpaces(s); {Удаляем пробелы} WordsSplit(s, count); {Разделяем на слова} Writeln('Строка: ', s); {Выводим строку} Writeln('Массив слов: '); {Выводим массив слов} For i := 1 to count do Writeln(i,' ',mas[i]);
flag1 := CheckAtoB(B, s); {Входит ли символ из Б в А}
{Проверяем на повторяющиеся символы} if (flag1 = false) then flag2 := CheckDublChar(s);
{Если повторяющихся символов нет, то сортируем слова} if (flag1 or flag2 = false) then Begin SortWords(mas); Writeln('Массив слов после сортировки: '); For i := 1 to count do Writeln(i,' ',mas[i]); End;
{УСЛОВИЕ 2 - во сколько слов входит буква "e"} For i := 1 to count do if ((Pos('e', mas[i]) > 0) or (Pos('E',mas[i]) > 0)) then inc(countE); Writeln('Буква "e" входит в ',countE,' слов'); ReadKey; End.