2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Строки. Язык Си
Сообщение01.12.2013, 12:28 
Здравствуйте. Помогите пожалуйста кое в чём разобраться. Дана задача: Дана последовательность слов (не более 50), в каждом слове не более восьми символов. Слова разделены пробелом, за последним словом стоит точка. Найти те слова, которые отличаются от последнего слова и удовлетворяют следующему условию: первая буква слова входит в него ещё раз.
Программу я написал, но она не работает если вводить строку "mama papa mama." или "papa ......... papa." , вообщем где последнее слово состоит из одной и той же пары букв. Тогда программа выводит также слово, совпадающее с последним. В остальных случаях программа работает. Что же нужно исправить?

Код:
#include <iostream>
#include <conio.h>
#include <string.h>

void main()

{
   setlocale (LC_CTYPE, "Russian");
   const char strRASD[] = " ";
    char strString[255], strWord[7];

   printf ("Введите строку\n");
   gets(strString);
   strrev (strString);
   char *pslovo = strtok (strnset(strString,' ',1), strRASD);
   strrev (pslovo);
   strcpy (strWord, pslovo);
   printf ("\n Найдены слова по условию:\n");
   while (pslovo = strtok(NULL, strRASD))
   {
      if (strchr(pslovo+1, *strrev(pslovo)))
         printf("%s\n", pslovo);
   }
   _getch();
}

 
 
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 12:55 
Аватара пользователя
А где Вы проверяете, что слово не совпадает с последним?

 
 
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 13:04 
Xaositect в сообщении #794894 писал(а):
А где Вы проверяете, что слово не совпадает с последним?


разве не так?

Код:
while (pslovo = strtok(NULL, strRASD))
   {
      if (strchr(pslovo+1, *strrev(pslovo)))

 
 
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 13:25 
Аватара пользователя
Это вообще что-то странное. pslovo - это у нас очередное перевернутое слово. значит, pslovo + 1 - это перевернутое слово без последней буквы, а *strrev(pslovo) - это первая буква. Мы проверяем, что первая буква встречается в слове без последней буквы. Это вообще будет истинно всегда, кроме однобуквенных слов.

А еще я не понимаю, зачем у Вас strnset в первом strtok.

Собственно, у меня Ваша программа так и работает (если убрать strnset) - выводит все слова, кроме однобуквенных.

Кстати, strrev, strnset и conio.h - это нестандартные вещи, но пока хотя бы так разберитесь.

 
 
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 13:45 
Xaositect в сообщении #794915 писал(а):
Это вообще что-то странное. pslovo - это у нас очередное перевернутое слово. значит, pslovo + 1 - это перевернутое слово без последней буквы, а *strrev(pslovo) - это первая буква. Мы проверяем, что первая буква встречается в слове без последней буквы. Это вообще будет истинно всегда, кроме однобуквенных слов.

А еще я не понимаю, зачем у Вас strnset в первом strtok.

Собственно, у меня Ваша программа так и работает (если убрать strnset) - выводит все слова, кроме однобуквенных.

Кстати, strrev, strnset и conio.h - это нестандартные вещи, но пока хотя бы так разберитесь.


Как ни странно программа выводит те слова, которые нужно(кроме однобуквенных). Выводить все слова программа будет, если убрать "+1".

 
 
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 13:51 
Аватара пользователя
Я, к сожалению, Вашу программу протестировать могу только с тем strrev, который я сам написал, возможно, я неправильно понимаю, что он делает.
Можете вставить в цикле while вызов printf("DEBUG: pslovo = %s; char = %c.\n", pslovo, *strrev(pslovo)) и показать вывод на каком-нибудь правильном примере и на каком-нибудь неправильном?

 
 
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 14:11 
Xaositect в сообщении #794939 писал(а):
Я, к сожалению, Вашу программу протестировать могу только с тем strrev, который я сам написал, возможно, я неправильно понимаю, что он делает.
Можете вставить в цикле while вызов printf("DEBUG: pslovo = %s; char = %c.\n", pslovo, *strrev(pslovo)) и показать вывод на каком-нибудь правильном примере и на каком-нибудь неправильном?


Правильный:

Код:
Введите строку
kak zit to blin uru ya yay blin.

Найдены слова по условию:
DEBUG: pslovo = yay; char = y.
yay
DEBUG: pslovo = ya; char = y.
DEBUG: pslovo = uru; char = u.
uru
DEBUG: pslovo = blin; char = b.
DEBUG: pslovo = to; char = t.
DEBUG: pslovo = zit; char = z.
DEBUG: pslovo = kak; char = k.
kak


Неправильный:

Код:
Введите строку
mama gde papa kak ya mama.

Найдены слова по условию:
DEBUG: pslovo = ya; char = y.
DEBUG: pslovo = kak; char = k.
kak
DEBUG: pslovo = papa; char = p.
apap
DEBUG: pslovo = gde; char = g.
DEBUG: pslovo = mama; char = m.
amam


-- 01.12.2013, 18:13 --

Странно, но тут тоже неправильно.

Код:
Введите строку
bakrab stan nat tatar rak stan.

Найдены слова по условию:
DEBUG: pslovo = rak; char = r.
DEBUG: pslovo = tatar; char = t.
DEBUG: pslovo = nat; char = n.
DEBUG: pslovo = stan; char = s.
DEBUG: pslovo = bakrab; char = b.
barkab

 
 
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 14:20 
Аватара пользователя
Ох.
Конечно. pslovo разворачивается, и указатель передается в функцию.
Я отвык уже от такой неявной мутабельности, я бы тут написал strrev(pslovo); if (strchr(pslovo, *pslovo)) ...

С этим разобрались. Этот ваш if проверяет, что первая буква слова встречается в этом слове еще раз.

А вот то, что слово не совпадает с последним, у Вас нигде не проверяется. Это в принципе видно - у вас последнее слово в strWord записывается и дальше нигде не используется.

-- Вс дек 01, 2013 15:22:06 --

Retard в сообщении #794960 писал(а):
Странно, но тут тоже неправильно.
Не, это я Вас путаю. Уберите мой printf - станет нормально.

 
 
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 14:28 
Xaositect в сообщении #794968 писал(а):

А вот то, что слово не совпадает с последним, у Вас нигде не проверяется. Это в принципе видно - у вас последнее слово в strWord записывается и дальше нигде не используется.



Для этого нужно использовать функцию strcmp или как-то по-другому?

-- 01.12.2013, 19:06 --

У меня получается так:

Код:
#include <iostream>
#include <conio.h>
#include <string.h>

void main()

{
   setlocale (LC_CTYPE, "Russian");
   const char strRASD[] = " ";
    char strString[255], strWord[7];

   printf ("Введите строку\n");
   gets(strString);
   strrev (strString);
   char *pslovo = strtok (strnset(strString,' ',1), strRASD);
   strrev (pslovo);
   strcpy (strWord, pslovo);
   printf ("\n Найдены слова по условию:\n");
   while (pslovo = strtok(NULL, strRASD))
   {
      if (strchr(pslovo+1, *strrev(pslovo)) && strcmp(strWord, pslovo))
         printf("%s\n", pslovo);
   }
   _getch();
}


З.Ы. strnset нужен чтобы удалить точку в конце

 
 
 [ Сообщений: 9 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group