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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2009, 00:11   #1
CodeExpert
Заблокирован
 
Регистрация: 30.10.2009
Сообщений: 468
Злость Никак не разберусь почему не работает..

пишу себе лабу по программированию, не фига не пойму где ошибка, задание:Дана строка символов, содержащая русские слова, разделенные пробелами. Удалить из слов с четной длиной все гласные, а из слов с нечетной длинной – все согласные. Полученные слова вывести на экран в лексикографическом виде.
код:
Код:
program aaa;
uses Crt;
const gla: set of char=['А','а','Е','е','И','и','О','о','У','у','Ы','ы','Э','э',
     'Ю','ю','Я','я'];
      so:set of char=['Б','б','В','в','Г','г','Д','д','Ж','ж','З','з','К','к',
      'Л','л','М','м','Н','н','П','п','Р','р','С','с','Т','т','Ф','ф','Х','х',
      'Ц','ц','Ч','ч','Ш','ш','Щ','щ','Ъ','ъ','Ь','ь'];
var mas:array[1..50] of string;//массив слов
    q:integer;//счетчик слов
    str:string[255];//строка
    i:integer;//циклический счетчик
    slovo:string; //очередное слово
    n:integer;//счетчик для букв
    max,min:integer;
begin

{ввод строки}
Writeln('Введите строку');
readln(str);

{присвоение начального значения счетчикам}
i:=1;
q:=1;
repeat
 if str[i]=char(#32) then
    begin
      slovo:=copy(str,1,i-1);//копируем очередное слово
      mas[q]:=slovo;//заносим его в массив
      q:=q+1;//повышаем счетчик кол-ва слов
      delete(str,1,i);//удаляем использованное строчное слово
      i:=1; //присваиваем начальное значение
      end;
 if i=length(str) then
    begin
      slovo:=copy(str,1,i);//копируем очередное слово
      mas[q]:=slovo;//заносим его в массив
      {присваиваем значение больше длинны строки чтоб
      выйти из цикла}
      i:=length(str)+1;
      q:=q+1;
      end;
  i:=i+1;
until i>length(str);

{уменьшаем кол-во слов до реальности}
q:=q-1;

{выводим кол-во слов}
Writeln('Количество слов:= ',q);

{вид разобранной строки}
Writeln('Вид разобранной по словам строки:');
for i:=1 to q do
 begin writeln(mas[i]);end;
 
{разбираем каждое слово массива на составляющие}
i:=1; n:=1;
repeat 
slovo:=mas[i];
  if (length(slovo)mod 2 = 0) then
    begin
       repeat
           if slovo[n] in gla then
               begin
                  delete(slovo,n,1);
                   end;
                inc(n);
         until n>=length(slovo) 
           end;
  if not(length(slovo)mod 2 = 0) then
       begin
           repeat
                if slovo[n] in so then
                  begin
                   delete(slovo,n,1);
                   end;
                 inc(n);
          until n>=length(slovo);
          end;
mas[i]:=slovo;
inc(i);n:=1;
until i=q;

Writeln('результ:');
for i:=1 to q do
 begin writeln(mas[i]);end;
 readln;
 end.
Помогите плиз найти...!
CodeExpert вне форума Ответить с цитированием
Старый 21.12.2009, 00:22   #2
Анатоль
Пользователь
 
Регистрация: 17.12.2009
Сообщений: 74
По умолчанию

Хорошая задача. говори что конкретно не работает в проге. говори ограничения на длину сторки и время выполнения программы.
Анатоль вне форума Ответить с цитированием
Старый 21.12.2009, 00:28   #3
CodeExpert
Заблокирован
 
Регистрация: 30.10.2009
Сообщений: 468
По умолчанию

Не работает с последними буквами в слове и последними словами в строке, длинна строки до 255, во времени не ограничено
CodeExpert вне форума Ответить с цитированием
Старый 21.12.2009, 00:35   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Стандартная ошибка. Пример из вашей программы:
Код:
begin
delete(slovo,n,1);
end;
inc(n);
Теперь смотрим.
Вы удалили N-ю букву.
И тут же увеличили счетчик - и следующая анализируемая буква будет не та, которая следовала за удаленной, а через одну...
Вывод: инкремент счетчика только в том случае, если удаления не было...
Доступно?
mihali4 вне форума Ответить с цитированием
Старый 21.12.2009, 00:56   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Ещё парочка замечаний
Код:
repeat
slovo:=mas[i];
  if (length(slovo)mod 2 = 0) then
    begin
       repeat
           if slovo[n] in gla then
               begin
                  delete(slovo,n,1);
                   end else{см замечание mihali4}
                inc(n);
         until n>{=}length(slovo)//последний символ не обрабатывался
           end{;}
  else{if not(length(slovo)mod 2 = 0) then}//тут слово может ещё раз обработаться, т.к. его длина могла стать нечётной
       begin
           repeat
                if slovo[n] in so then
                  begin
                   delete(slovo,n,1);
                   end else{}
                 inc(n);
          until n{=}>length(slovo);
          end;
mas[i]:=slovo;
inc(i);n:=1;
until i{=}>q;{}//последнее слово не обрабатывалось
eoln вне форума Ответить с цитированием
Старый 21.12.2009, 01:09   #6
CodeExpert
Заблокирован
 
Регистрация: 30.10.2009
Сообщений: 468
По умолчанию

Итак все равно не выводит результат:
Код:
program aaa;
uses Crt;
const gla: set of char=['А','а','Е','е','И','и','О','о','У','у','Ы','ы','Э','э',
     'Ю','ю','Я','я'];
      so:set of char=['Б','б','В','в','Г','г','Д','д','Ж','ж','З','з','К','к',
      'Л','л','М','м','Н','н','П','п','Р','р','С','с','Т','т','Ф','ф','Х','х',
      'Ц','ц','Ч','ч','Ш','ш','Щ','щ','Ъ','ъ','Ь','ь'];
var mas:array[1..50] of string;//массив слов
    q:integer;//счетчик слов
    str:string[255];//строка
    i:integer;//циклический счетчик
    slovo:string; //очередное слово
    n:integer;//счетчик для букв
    max,min:integer;
begin

{ввод строки}
Writeln('Введите строку');
readln(str);

{присвоение начального значения счетчикам}
i:=1;
q:=1;
repeat
 if str[i]=char(#32) then
    begin
      slovo:=copy(str,1,i-1);//копируем очередное слово
      mas[q]:=slovo;//заносим его в массив
      q:=q+1;//повышаем счетчик кол-ва слов
      delete(str,1,i);//удаляем использованное строчное слово
      i:=1; //присваиваем начальное значение
      end;
 if i=length(str) then
    begin
      slovo:=copy(str,1,i);//копируем очередное слово
      mas[q]:=slovo;//заносим его в массив
      {присваиваем значение больше длинны строки чтоб
      выйти из цикла}
      i:=length(str)+1;
      q:=q+1;
      end;
  i:=i+1;
until i>length(str);

{уменьшаем кол-во слов до реальности}
q:=q-1;

{выводим кол-во слов}
Writeln('Количество слов:= ',q);

{вид разобранной строки}
Writeln('Вид разобранной по словам строки:');
for i:=1 to q do
 begin writeln(mas[i]);end;

repeat
slovo:=mas[i];
  if (length(slovo)mod 2 = 0) then
    begin
       repeat
           if slovo[n] in gla then
               begin
                  delete(slovo,n,1);
                   end else{см замечание mihali4}
                inc(n);
         until n=length(slovo)//последний символ не обрабатывался
           end;
if not(length(slovo)mod 2 = 0) then//тут слово может ещё раз обработаться, т.к. его длина могла стать нечётной
       begin
           repeat
                if slovo[n] in so then
                  begin
                   delete(slovo,n,1);
                   end else{}
                 inc(n);
          until n=length(slovo);
          end;
mas[i]:=slovo;
inc(i);n:=1;
until i=q;{}//последнее слово не обрабатывалось

Writeln('результ:');
for i:=1 to q do
 begin writeln(mas[i]);end;
 readln;
 end.
((((((((((((((((((((
CodeExpert вне форума Ответить с цитированием
Старый 21.12.2009, 01:11   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Во-первых,
Код:
if not(length(slovo)mod 2 = 0) then//тут слово может ещё раз обработаться, т.к. его длина могла стать нечётной
заменяем на простое
Код:
ELSE...
чтобы не было ненужной обработки.
Цитата:
Где логическое мышление, Зин ?!
mihali4 вне форума Ответить с цитированием
Старый 21.12.2009, 01:20   #8
CodeExpert
Заблокирован
 
Регистрация: 30.10.2009
Сообщений: 468
По умолчанию

Цитата:
Цитата:Где логическое мышление, Зин ?!
Сорри, Михалыч, мозг уже не работает, весь день пробыл на форуме, помогал, а теперь сожалею что не могу управлять своим временем, прийдется забросить лабу на после нг (((
CodeExpert вне форума Ответить с цитированием
Старый 21.12.2009, 01:23   #9
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Просто кусок из моего поста надо было скопировать, а вы опять за своё.
Код:
const gla: set of char=['А','а','Е','е','И','и','О','о','У','у','Ы','ы','Э','э',
     'Ю','ю','Я','я'];
      so:set of char=['Б','б','В','в','Г','г','Д','д','Ж','ж','З','з','К','к',
      'Л','л','М','м','Н','н','П','п','Р','р','С','с','Т','т','Ф','ф','Х','х',
      'Ц','ц','Ч','ч','Ш','ш','Щ','щ','Ъ','ъ','Ь','ь'];
var mas:array[1..50] of string;//массив слов
    q:integer;//счетчик слов
    str:string[255];//строка
    i:integer;//циклический счетчик
    slovo:string; //очередное слово
    n:integer;//счетчик для букв
    max,min:integer;
begin

{ввод строки}
Writeln('Введите строку');
readln(str);

{присвоение начального значения счетчикам}
i:=1;
q:=1;
repeat
 if str[i]=char(#32) then
    begin
      slovo:=copy(str,1,i-1);//копируем очередное слово
      mas[q]:=slovo;//заносим его в массив
      q:=q+1;//повышаем счетчик кол-ва слов
      delete(str,1,i);//удаляем использованное строчное слово
      i:=1; //присваиваем начальное значение
      end;
 if i=length(str) then
    begin
      slovo:=copy(str,1,i);//копируем очередное слово
      mas[q]:=slovo;//заносим его в массив
      {присваиваем значение больше длинны строки чтоб
      выйти из цикла}
      i:=length(str)+1;
      q:=q+1;
      end;
  i:=i+1;
until i>length(str);

{уменьшаем кол-во слов до реальности}
q:=q-1;

{выводим кол-во слов}
Writeln('Количество слов:= ',q);

{вид разобранной строки}
Writeln('Вид разобранной по словам строки:');
for i:=1 to q do
 begin writeln(mas[i]);end;

{разбираем каждое слово массива на составляющие}
i:=1; n:=1;
repeat
slovo:=mas[i];
  if (length(slovo)mod 2 = 0) then
    begin
       repeat
           if slovo[n] in gla then
               begin
                  delete(slovo,n,1);
                   end else{}
                inc(n);
         until n>length(slovo)
           end{;}
  else{if not(length(slovo)mod 2 = 0) then}
       begin
           repeat
                if slovo[n] in so then
                  begin
                   delete(slovo,n,1);
                   end else{}
                 inc(n);
          until n>length(slovo);
          end;
mas[i]:=slovo;
inc(i);n:=1;
until i>q;{}

Writeln('результ:');
for i:=1 to q do
 begin writeln(mas[i]);end;
 readln;
 end.
З.Ы. На счёт кодировки не уверен, с латинскими буквами всё нормально
eoln вне форума Ответить с цитированием
Старый 21.12.2009, 01:29   #10
CodeExpert
Заблокирован
 
Регистрация: 30.10.2009
Сообщений: 468
По умолчанию

eoln, пожалуйста помоги прилепить лексикографическую сортировку сюда...
CodeExpert вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему не работает тег align=right?valign работает а align нет! aviv HTML и CSS 5 21.01.2009 17:46
Пишу программку, а она никак не работает... Программа в Борланд Си... Катюшенька Помощь студентам 4 13.01.2009 00:21
почему не работает domovoi Общие вопросы Delphi 1 15.10.2008 18:42
Почему не работает цикл????? Marsik Помощь студентам 2 22.06.2008 14:16