Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2010, 12:49   #1
Vaserman
 
Регистрация: 13.05.2010
Сообщений: 3
Вопрос Строки Pascal

Здравствуйте. Помогите исправить задачу.

Даны две строки А и В. Составьте программу, проверяющую, можно ли из букв, входящих в строку А, составить строку В (буквы можно использовать не более одного раза и можно переставлять).
Например, А: ИНТЕГРАЛ. В: АГЕНТ - составить можно; В: ГРАФ - составить нельзя.

Проблема в том что постоянно выдает ответ "это возможно" , хотя на самом деле это не так.

Вот текст:
Код:
uses crt;
var a:array[1..400] of integer;
b:array[1..400]of integer;

i,j:integer;
g,h:char;
str1,str2:string;
flag:boolean;

begin
clrscr;
flag:=true;
write('vvedite pervuyu stroku   ');
readln(str1);
write('vvedite vtoruyu stroku   ');
readln(str2);

for g:='A' to 'z' do begin
for i:=1 to length(str1) do begin
if str1[i]=g then inc(a[ord(g)]);
end;
end;
for h:='A' to 'z' do begin
for j:=1 to length(str2) do begin
if str1[j]=h then inc(b[ord(h)]);
end;
end;
for i:=1 to 400 do begin
if a[i]<b[i] then flag:=false;
end;
if flag then write('eto vozmoghno') else write('eto nevozmogno');

readkey;
end.

Последний раз редактировалось Stilet; 01.06.2010 в 17:13.
Vaserman вне форума Ответить с цитированием
Старый 01.06.2010, 13:43   #2
Костя КС
Пользователь
 
Аватар для Костя КС
 
Регистрация: 22.01.2008
Сообщений: 78
По умолчанию

мне кажется, лучше всего было бы использовать множества.
Но вот есть пример без них

Код:
program ll;
var
  s1, s2 :string;
  i, j, k : integer;
begin
  readln(s1);
  readln(s2);
  
for k := 0 to length(s1) do
  for i := 0 to length(s1) do
    for j := 0 to length(s2) do
     begin
     if s1[i] = s2[j] then
       begin
        delete(s1,pos(s1[i],s1),1);
        delete(s2,pos(s2[j],s2),1);
        break;
        end;
     end;
     
  if length(s1) = 0 then writeln('верно')
    else writeln('неверно');
end.
Костя КС вне форума Ответить с цитированием
Старый 01.06.2010, 15:34   #3
Vaserman
 
Регистрация: 13.05.2010
Сообщений: 3
По умолчанию

Спасибо очень выручил.
Vaserman вне форума Ответить с цитированием
Старый 01.06.2010, 15:49   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а так не проще?!

Код:
flagPossible := true;
for i:=1 to length(s2) do
  if Pos(s2[i],s1)>0 then Delete(s1,Pos(s2[i],s1),1)
  else begin
     flagPossible := false;
     Break
  end;
  if flagPossible then WriteLn('Да, можно.')
  else WriteLn('Нет, нельзя.');
p.s. в принципе заменив цикл for на цикл while можно легко не только писать можно ли/нельзя, но и указывать, на какой букве во втором слове процесс остановился (т.е. какой нужной буквы нет в исходной строке...)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строки. Pascal Feran Помощь студентам 1 05.04.2010 11:06
Pascal Строки SVadiks Помощь студентам 2 18.02.2010 23:56
Pascal. Строки. Sendddd Помощь студентам 2 24.11.2009 22:52
Pascal. Строки blondinochka Помощь студентам 2 30.05.2009 18:44
Pascal. СтрокИ. АполинАрия Помощь студентам 8 29.05.2009 00:16