[ C / C++ ] — начинающим: задаем вопросы (архивная - 2015)

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Raine

    Raine New Member

    Joined:
    14 Feb 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Как сделать в Си проверку - является ли строка полиндромом? Т.е вот например строку шалаш программа должна считать полиндромом, т.е от центра влево и вправо одинаковые буквы.
     
  2. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Разбить строку на две части. Началом второй части считать конец общей строки. В первой подстроке двигаться к центру строки, как и во второй. Сравнивать их символы.

    К примеру Л - длина строки.
    И - переменная в цикле.
    Тогда следует сравнивать
    Первая(И) == Вторая(Л-И)

    Также следует предусмотреть четную или нечетную длину строки.
     
  3. Raine

    Raine New Member

    Joined:
    14 Feb 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    а можно код? Не понял как разбить на две строки.

    Ещё вопросик. Нужно строчку перевернуть. Я сделал так:
    Code:
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    
    using namespace std;
    
    int main()
    {
        char stroka1[]="эдуард";
        char stroka2;
        int dlina;
        for (int i=0;stroka1[i]!=0;i++)
        {
            dlina=i;
        }
        
        for (int j=0;j<dlina;j++)
        {
            stroka2[j]=stroka1[dlina];
            dlina=dlina-1;
            }
    system("pause");
    }
    Ошибку выводит в первой строке второго цикла. Как исправить?
     
  4. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Как разбить строку на две части?
    Можно и не разбивать. Просто получите длину строки (strlen). Возьмите от неё половину(Л/2) и сравнивайте по тому алгоритму что я написал
    Cтрока(И) == Строка(Л-И)

    Ошибку в студию.

    Перевернуть строку можно методом reverse из С++. Входные параметры - указатель на начало строки и указатель на элемент, после конца строки(элемент может и не существовать).
     
  5. Raine

    Raine New Member

    Joined:
    14 Feb 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    насчёт переворота строки проблемы решил. В объявление переменных char добавил [100]; А вот с полиндромами так и не разобрался. То что делать на 2 я так изначально и думал, а как дальше цикл организовать никак не пойму
     
  6. Catbert

    Catbert Banned

    Joined:
    29 Jun 2010
    Messages:
    80
    Likes Received:
    27
    Reputations:
    10
    Воспользуйся любой функцией сравнения строк и проверь идентичны ли исходная и перевернутая строки. Или свою функцию сравнения пиши.
     
  7. Raine

    Raine New Member

    Joined:
    14 Feb 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Блин гениально. Но к сожалению уже разобрался с алгоритмом tim-oleksii. Вот результат строки полиндрома:
    Code:
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    using namespace std;
    
    int main() {
    char s1[100];
    cin >> s1;
    int dlina;
    for (int i=0;s1[i]!=0;i++)
    {
    dlina=i;
    }
    int centr=dlina/2;
    int nomer=0;
    for (int i=0;i<centr;i++)
    {
    if (s1[i]==s1[dlina-i])
    {
                           nomer++;
                          }
    if (nomer==centr) {cout << "stroka polindrom";}
                          }
    system("pause");
    }
    
     
  8. Raine

    Raine New Member

    Joined:
    14 Feb 2010
    Messages:
    39
    Likes Received:
    0
    Reputations:
    0
    Мне нужно подсчитать кол-во слов в строке. Лешил протись циклом по всем элементам строки и какой равен пробелы - то значит +1 слово. Как обзначается пробел? Пробовал так char s==" "; не пашет. Пробовал вставлять тоже не работает.
     
  9. t3zo

    t3zo Member

    Joined:
    18 Feb 2010
    Messages:
    51
    Likes Received:
    14
    Reputations:
    5
    isspace(char argument)

    char string = ' ';

    if(isspace(strring)) // если string это пробел
     
  10. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139

    потому что const char *

    а у тебя судя по всему char

    используй одинарные ковычки.
     
  11. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Raine

    1. Палиндром ли строка?
    PHP:
    #include <string>
    #include <algorithm>
    #include <iostream>
    #include <iterator>

    int main()
    {
        
    std::string srs;
        
    std::getline(std::cins);
        
    std::reverse_copy(s.begin(), s.end(), std::back_inserter(rs));
        
    std::cout << (== rs "Yes" "No") << std::endl;
        return 
    0;
    }
    2. Количество слов в строке
    PHP:
    #include <string>
    #include <algorithm>
    #include <iostream>

    int main()
    {
        
    std::string s;
        
    std::getline(std::cins);
        
    std::cout << std::count(s.begin(), s.end(), ' ') + << std::endl;
        return 
    0;
    }
     
  12. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    Лучше разбивать строку через strtok с массивом разделителей "!\"№;%:?*()_=+ " Иначе все слова не посчитаешь.

    а кто знает аналог strtok на С++?

    Added:
    или boost::regex на символы [A-Zaz]{1,}
     
    #6292 tim-oleksii, 30 Mar 2011
    Last edited: 30 Mar 2011
  13. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    boost::tokenizer
     
  14. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    спасибо, так и думал, что в бусте.
     
  15. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    tim-oleksii можно на крайняк велосипед свой написать, что-то типа
    Code:
    char** split(char *splitIt, char splitter)
    {
      int x = 0;
      for(int i=0;i<strlen(splitIt);i++)
        if(splitIt[i] == splitter)
          x++;
      i = 0;
      char bits[x][256];
      x = 0;
    
      while (splitIt[i] != '\0')
      {
            if (splitIt[i] == splitter)
            {
               bits[x][i] = '\0';
               x++;
            }
            else
            {
               bits[x][i] = splitIt[i];
            }
         	i++;
      } 
      return bits;  
    }
    
    не тестил, но примерно так
     
    #6295 SHiNiGaMi, 30 Mar 2011
    Last edited: 30 Mar 2011
  16. MaTpOc

    MaTpOc Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    633
    Likes Received:
    475
    Reputations:
    25
    на каком компиляторе делал?
     
  17. MaTpOc

    MaTpOc Elder - Старейшина

    Joined:
    5 May 2008
    Messages:
    633
    Likes Received:
    475
    Reputations:
    25
    что означает &&?

    тут


     
  18. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    если джей больше нуля И джей меньше 4

    0 < j < 4
     
    #6298 Ins3t, 30 Mar 2011
    Last edited: 30 Mar 2011
  19. tim-oleksii

    tim-oleksii Member

    Joined:
    14 Mar 2011
    Messages:
    199
    Likes Received:
    10
    Reputations:
    0
    это сленговый and. C++ поддерживает and, or, not вместо &&, ||, !
     
  20. GRRRL Power

    GRRRL Power Elder - Старейшина

    Joined:
    13 Jul 2010
    Messages:
    823
    Likes Received:
    185
    Reputations:
    84
    Скорее наоборот, c+ никакие and, or, not совсем не поддерживает
     
    #6300 GRRRL Power, 31 Mar 2011
    Last edited: 31 Mar 2011
Thread Status:
Not open for further replies.