Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Выбор слов из строки, Выбрать и напечатать слова с условием 
V
    Опции темы
deadlegolas
Дата 1.3.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



Не могу решить упражнение на строки, вообще даже не представляю как его реализовать.. хотя функции знаю..
Только начал работать со строками,буду благодарен если поможете решить:

С введенного текста распечатать только те слова, которые симетричные (типу AKA , ANNA, ORORO, RADAR), или в которых буквы упорядочены в порядке , обратном алфавитному.

благодарю заранее!
PM MAIL   Вверх
deadlegolas
Дата 1.3.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 19.4.2008

Репутация: нет
Всего: нет




Вот впринципе нашел как найти слово в предложении и вывести его. Но как узнать симметрично ли это слово? 
не могу придумать...

Код

int main()
{
    char* strSrc = "dfdsf,ANNA dsfsdadas";
    char* strCpy = "ANNA";
    char* a;
    
printf("Source sequence:\n\t%s\n\nslovo:\n", strSrc);                                             
   
     a= strstr(strSrc, strCpy)   ;
        printf("%s\n", a);
     a=strrev(a);
        printf("%s\n", a);
     a=strstr(strSrc,strCpy) ;
        printf("%s\n", a);
    

    getch();
    return 0;
}

PM MAIL   Вверх
deadlegolas
Дата 1.3.2009, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



Так,половину программы сделал. А вот как узнать что буквы в слове упорядочены в порядке, обратном алфавитному? хоть убейте - не знаю как это сделать.. хелп..

Код

#include <stdio.h>
#include <string.h>
#include <conio.h>
int main()
{
clrscr();
int i,k;
char* strSrc;
char* strCpy=strSrc;
char* strlim=" ,.()";
char* p;
char* pod2;
char* pod3;
char pod[8][20]={"olo","dfs","dfsdf"};
printf("Введите текст:\n");
gets(strSrc);
        p=strtok(strSrc,strlim);
        i=0;
        k=0;

 while(p)
    {
        strcpy(pod[k],p);
        k++;
        p = strtok(NULL, strlim);
    }
printf("\n");
/* for (i=0;i<k;i++)
    {
        printf("%s\n",pod[i])  ;
    } */
printf("\n");
 for (i=0;i<k;i++)
    {
    strcpy(pod3,pod[i]);
    pod2=strrev(pod[i]);
        if ( strcmp( pod2, pod3)==0 )
            {
                 printf("%s\n",pod[i]) ;
            }
     }
 getch();
}

PM MAIL   Вверх
IoganeGambaPuti
Дата 1.3.2009, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 13.1.2009

Репутация: нет
Всего: нет



Вот решение задачи,на поиск зеркальных слов 
Код

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int buff=4000;

int main(void)
{
  cout<<"Please enter a phrase:";
  char phrase[buff];
  fgets(phrase,buff,stdin);
  char *ptrch_start,*ptrch_finish,*ptrch_p;
  bool good_word=false;
  if( (ptrch_finish=strchr(phrase,' '))==NULL)
    {
      if( ( ptrch_finish=strchr(phrase,'\n'))==NULL)
    return 0;
    }
  ptrch_p=phrase;

  while(true)
    {
      // ptrch_finish=strchr(ptrch_p,' ');
      ptrch_start=ptrch_p;
      ptrch_finish--;
      while(ptrch_start!=ptrch_finish and ptrch_start<ptrch_finish)
    {
      if( (*ptrch_start)==(*ptrch_finish))
        {
          ptrch_start++;
          ptrch_finish--;
              good_word=true;
        }
          else
        {
          good_word=false;
          break;
        }
    }
      if(good_word)
        {
      if( (ptrch_finish=strchr(ptrch_p,' '))==NULL)
        {
          ptrch_start=ptrch_p;
          cout<<"------------------------------------\n";
          cout<<ptrch_start<<endl;
          cout<<"------------------------------------\n";
              return 0;  
        }else{
        ptrch_finish++;
        ptrch_start=ptrch_p;
        ptrch_p=ptrch_finish;
        ptrch_finish--;
        *ptrch_finish='\0';
        cout<<"------------------------------------\n";
        cout<<ptrch_start<<endl;
        cout<<"------------------------------------\n";
      }  
        }else{
    ptrch_finish=strchr(ptrch_p,' ');
    ptrch_finish++;
        ptrch_p=ptrch_finish;
      }
      if( (ptrch_finish=strchr(ptrch_p,' '))==NULL)
    {
      if( ( ptrch_finish=strchr(ptrch_p,'\n'))==NULL)
        return 0;
    }
    }
  
  return 0;
}


может где-то перемудрил,но вроде работает.Проверял на фразе "anna yznaet ihthi".
P.S. конечно плохо,так над адресами издеваться
А насчёт второй задачи поподробней, может пример какой-нить дай со словом, с буквами в обратном алфавитном порядке.

Это сообщение отредактировал(а) IoganeGambaPuti - 1.3.2009, 18:51
PM MAIL   Вверх
deadlegolas
Дата 1.3.2009, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



Ну вот слово TIK подходит под второе условие,так как "Т" в таблице символов имеет большее значение чем "І" и "К", а "І" больше чем "К". 
Вроде так..  идей ноль над решением..

Добавлено через 1 минуту и 3 секунды
Цитата

Вот решение задачи,на поиск зеркальных слов Вот решение задачи,на поиск зеркальных слов 

спасибо,но я лучше свой код буду юзать,ваш очень замудренный)
PM MAIL   Вверх
Dov
Дата 1.3.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(deadlegolas @  1.3.2009,  14:09 Найти цитируемый пост)
вообще даже не представляю как его реализовать.. хотя функции знаю..


deadlegolas, так чего функции не юзаешь? Тут писанины-то  всего пару строчек.

Добавлено через 10 минут и 58 секунд
deadlegolas, тебе нужны две маленькие функции, одна для проверки слова на "палиндром", а вторая для проверки на "обратную сортировку", то есть сортировку символов по убыванию.. Всё.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Soah
Дата 1.3.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 9
Всего: 54



Цитата(deadlegolas @  1.3.2009,  17:22 Найти цитируемый пост)
А вот как узнать что буквы в слове упорядочены в порядке, обратном алфавитному?

Код

char str[] = "Hello";
int i;

for (i = 0; i < strlen(str)-1; ++i)
    if (str[i] < str[i+1])
        break;

if (i == strlen(str)-1)
    printf("%s\n", str);


Цитата(deadlegolas @  1.3.2009,  18:54 Найти цитируемый пост)
Ну вот слово TIK подходит под второе условие,так как "Т" в таблице символов имеет большее значение чем "І" и "К", а "І" больше чем "К". 

ASCII
Цитата

I    73
K    75
T    84


Это сообщение отредактировал(а) Soah - 1.3.2009, 19:18
PM MAIL   Вверх
Dov
Дата 1.3.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



вообщем, вся программа могла бы выглядеть так:
Код
bool isPalindrom(char * str)
{
    char * buf = strdup(str);
    bool   res = !strcmp(str, _strrev(buf));

    free(buf);
    return res;
}

bool isBackSort(char * str)
{
    char * p = str;

    while(*p++)
        if(*p > *(p - 1))
            return false;

    return true;
}

int main()
{
    char   text[] = "abcdcba sdg erger fda ddffdd srwrrjn lkdba anna sfnwjw";
    char * word;
    char * delim = " .,;";  // добавь разделители, если нужно

    word = strtok(text, delim);

    while(word)
    {
        if(isPalindrom(word) || isBackSort(word))
            cout << word << endl;

        word = strtok(NULL, delim);
    }

    return 0;
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
deadlegolas
Дата 1.3.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



Цитата(Dov @  1.3.2009,  19:03 Найти цитируемый пост)
deadlegolas, так чего функции не юзаешь? Тут писанины-то  всего пару строчек.

мм.. не догадывался от таком применении)
Цитата(Dov @  1.3.2009,  19:03 Найти цитируемый пост)
deadlegolas, тебе нужны две маленькие функции, одна для проверки слова на "палиндром", а вторая для проверки на "обратную сортировку", то есть сортировку символов по убыванию.. Всё. 

омг. насколько же все просто)
благодарю!

Цитата(Soah @  1.3.2009,  19:15 Найти цитируемый пост)
ASCII
Цитата

I    73
K    75
T    84


это было типа "например")

Добавлено @ 19:53
блин..проставил библиотеки..сделал прототипы... не компилится.. 
Declaration syntax error.

странно..

Код

#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <conio.h>
bool isPalindrom (char * str){}
bool isBackSort(char * str){}

int main()
{
    char   text[] = "abcdcba sdg erger fda ddffdd srwrrjn lkdba anna sfnwjw";
    char * word;
    char * delim = " .,;";  // добавь разделители, если нужно
    word = strtok(text, delim);
    while(word)
    {
        if(isPalindrom(word) || isBackSort(word))
            cout << word << endl;
        word = strtok(NULL, delim);
    }
    return 0;
    getch();
}
bool isPalindrom (char * str)
{
    char * buf = strdup(str);
    bool   res = !strcmp(str, _strrev(buf));
    free(buf);
    return res;
}
bool isBackSort(char * str)
{
    char * p = str;
    while(*p++)
        if(*p > *(p - 1))
            return false;
    return true;
}


Это сообщение отредактировал(а) deadlegolas - 1.3.2009, 19:57
PM MAIL   Вверх
Soah
Дата 1.3.2009, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 9
Всего: 54



Код

#include <iostream.h>
#include <string.h>
#include <conio.h>

enum bool {
    false = 0,
    true = 1
};

bool isPalindrom (char * str);
bool isBackSort(char * str);
// ...
    getch();
    return 0;
// ...


PM MAIL   Вверх
deadlegolas
Дата 1.3.2009, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



о,спасибо.. этот ерор исправило)
а как быть с ерором над "_strrev" - функция должна иметь прототип... а если забрать "_", то ошибка инициализация буля с интом..

и какую библиотеку нужно использовать для функции free?
PM MAIL   Вверх
Soah
Дата 1.3.2009, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 512
Регистрация: 18.2.2009

Репутация: 9
Всего: 54



Цитата(deadlegolas @  1.3.2009,  20:14 Найти цитируемый пост)
и какую библиотеку нужно использовать для функции free?

alloc.h, а вообще, можешь в хэлпе посмотреть.

Код

#include <stdio.h>
#include <iostream.h>
#include <string.h>
#include <conio.h>
#include <alloc.h>

int isPalindrom(char * str);
int isBackSort(char * str);

int main()
{
    char   text[] = "abcdcba sdg erger fda ddffdd srwrrjn lkdba anna sfnwjw";
    char * word;
    char * delim = " .,;";  // добавь разделители, если нужно
    word = strtok(text, delim);
    while(word)
    {
        if(isPalindrom(word) || isBackSort(word))
            cout << word << endl;
        word = strtok(NULL, delim);
    }

    getch();
    return 0;
}

int isPalindrom (char * str)
{
    char * buf = strdup(str);
    int   res = !strcmp(str, strrev(buf));
    free(buf);
    return res;
}

int isBackSort(char * str)
{
    char * p = str;
    while(*p++)
        if(*p > *(p - 1))
            return 0;

    return 1;
}

PM MAIL   Вверх
Dov
Дата 1.3.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



deadlegolas,  а чем ты компилишь?

попробуй эту функцию, что бы не мучаться:
Код
bool isPalindrom(char * str)
{
    char * a = str;
    char * b = str + strlen(str) - 1;

    while(a < b)
        if(*a++ != *b--)
            return false;

    return true;
}




--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
deadlegolas
Дата 1.3.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



Цитата(Dov @  1.3.2009,  20:25 Найти цитируемый пост)
deadlegolas,  а чем ты компилишь?

Borland C++
сейчас попробую

Добавлено через 1 минуту и 56 секунд
скомпилилось) всем спасибо!) 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.