2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Строки. Язык Си
Сообщение01.12.2013, 12:28 


23/10/13
46
Здравствуйте. Помогите пожалуйста кое в чём разобраться. Дана задача: Дана последовательность слов (не более 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 
Заслуженный участник
Аватара пользователя


06/10/08
6422
А где Вы проверяете, что слово не совпадает с последним?

 Профиль  
                  
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 13:04 


23/10/13
46
Xaositect в сообщении #794894 писал(а):
А где Вы проверяете, что слово не совпадает с последним?


разве не так?

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

 Профиль  
                  
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 13:25 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Это вообще что-то странное. pslovo - это у нас очередное перевернутое слово. значит, pslovo + 1 - это перевернутое слово без последней буквы, а *strrev(pslovo) - это первая буква. Мы проверяем, что первая буква встречается в слове без последней буквы. Это вообще будет истинно всегда, кроме однобуквенных слов.

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

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

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

 Профиль  
                  
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 13:45 


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

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

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

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


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

 Профиль  
                  
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 13:51 
Заслуженный участник
Аватара пользователя


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

 Профиль  
                  
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 14:11 


23/10/13
46
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 
Заслуженный участник
Аватара пользователя


06/10/08
6422
Ох.
Конечно. pslovo разворачивается, и указатель передается в функцию.
Я отвык уже от такой неявной мутабельности, я бы тут написал strrev(pslovo); if (strchr(pslovo, *pslovo)) ...

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

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

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

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

 Профиль  
                  
 
 Re: Строки. Язык Си
Сообщение01.12.2013, 14:28 


23/10/13
46
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 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group