Форум программистов, компьютерный форум CyberForum.ru

Есть ли в с++ какой-нибудь аналог in - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
kilik
5 / 5 / 1
Регистрация: 15.11.2010
Сообщений: 58
26.01.2011, 23:02     Есть ли в с++ какой-нибудь аналог in #1
Есть ли в с++ какой-нибудь аналог in
К примеру в вот такая задача
Подсчитать количество гласных символов в тексте в паскале все запишется красиво:
Pascal
1
2
3
4
5
6
7
8
const 
   glasn=['а','е','и','о','у','ы','э','ю','я','А','У','И','О','У','Ы','Э','Ю','Я'];
var
   st: string; 
   g,i:integer; 
begin
   if st[i] in glasn then inc(g)
end.
Если буква принадлежит к гласным, количество гласных букв плюс один.
в с++ я не нашел ничего подобного и код получается очень громоздким.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
26.01.2011, 23:08     Есть ли в с++ какой-нибудь аналог in #2
C++
1
2
3
4
5
6
7
std::string glas("аеиоуыэюяАУИОУЫЭЮЯ");
int cnt = 0;
std::string text("что угодно..");
std::for_each(text.begin(), text.end(), [&cnt, &glas](char a_)
{ 
   glas.find(a_) != std::string::npos? ++cnt : 0;
});
И где тут громоздкость ?
sadok
14 / 14 / 0
Регистрация: 26.01.2011
Сообщений: 64
26.01.2011, 23:26     Есть ли в с++ какой-нибудь аналог in #3
вот код с++ консоль, для английских букв работает без проблем,но когда руские буквы-то несчитывает(

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "iostream"
#include "windows.h"
#include "stdio.h"
#include "conio.h"
#include "string.h"
using namespace std;
void main()
{
    int col=0;//количество гластных
    char mas[19]="qwertyuiopasdfgh";//"аеиоуыэюяАУИОУЫЭЮЯ";
    char text[_MAX_PATH];
    cin.getline(text,_MAX_PATH);
    for(int i=0;text[i];++i)
        for(int a=0;a<18;++a)
            if(text[i]==mas[a])
                ++col;
    cout<<"col="<<col;
    _getch();
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
26.01.2011, 23:43     Есть ли в с++ какой-нибудь аналог in #4
Цитата Сообщение от kilik Посмотреть сообщение
в с++ я не нашел ничего подобного и код получается очень громоздким.
Плохо искали!
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
    
#define VOWELS "AaEeIiOoUuYy"
 
int main(void){
    char buf[BUFSIZ], * p;
    int cnt;
    
    printf("String: ");
    scanf("%[^\n]", buf);
    
    for ( cnt = 0, p = strpbrk(buf, VOWELS); p && ++cnt; p = strpbrk(p+1, VOWELS) )
        ;
    
    printf("%d vowels.\n", cnt);
    
    return 0;
}
Добавлено через 5 минут
Цитата Сообщение от kilik Посмотреть сообщение
Pascal
1
2
3
begin 
  if st[i] in glasn then inc(g) 
end.
Я паскаль совсем не помню, но по-моему это зациклится, не?
Или просто значение ничем не инициализированной переменной на 1 увеличит?
Iron Bug
22 / 22 / 0
Регистрация: 06.12.2010
Сообщений: 125
26.01.2011, 23:56     Есть ли в с++ какой-нибудь аналог in #5
можно через std::set решить задачу. получится очень кратко.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
27.01.2011, 00:17     Есть ли в с++ какой-нибудь аналог in #6
Цитата Сообщение от Iron Bug Посмотреть сообщение
можно через std::set решить задачу. получится очень кратко.
и пример приведёте?

Добавлено через 9 минут
по-старинке
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <algorithm>
 
class SearchFor{
    std::string _toFind;
public:
    SearchFor(const std::string & toFind): _toFind(toFind) {}
    bool operator () (const char & ch) { return _toFind.find(ch) != std::string::npos; }
};
 
int main(){
    std::string str;
    
    std::cout << "String: ";
    std::getline(std::cin, str);
    
    std::cout << std::count_if(str.begin(), str.end(), SearchFor("AaEeIiOoUuYy")) << " vowels." << std::endl;
    
    return 0;
}
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
27.01.2011, 00:53     Есть ли в с++ какой-нибудь аналог in #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
 
int main()
{
    std::string s;
    std::getline(std::cin, s);
 
    int i = std::count_if(s.begin(), s.end(),
                          std::bind1st(std::ptr_fun(strchr), "AaEeIiOoUuYy"));
    std::cout << i;
 
    return 0;
}
Iron Bug
22 / 22 / 0
Регистрация: 06.12.2010
Сообщений: 125
27.01.2011, 15:04     Есть ли в с++ какой-нибудь аналог in #8
Цитата Сообщение от easybudda Посмотреть сообщение
и пример приведёте?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <string>
#include <iostream>
#include <set>
 
using namespace std;
 
int main()
{
    string swovels="аАяЯоОёЁуУюЮыЫиИэЭеЕ";
    set<unsigned char> wovels(swovels.begin(),swovels.end());
    string str = "Тестовая строка";
    int counter = 0;
    for(size_t i=0;i<str.length();i++)
    {
        if(wovels.find(str[i])!=wovels.end()) counter++;
    }
    cout << counter;
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
27.01.2011, 15:20     Есть ли в с++ какой-нибудь аналог in #9
Iron Bug, а зачем конкретно в данном случае std::set? Без него даже более кратко получается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <string>
#include <iostream>
 
using namespace std;
 
int main()
{
        string svowels="aeiouyAEIOUY";
        string str = "FoO Bar BAz QuUz";
        int counter = 0;
        for(size_t i=0;i<str.length();i++)
        {
                if(svowels.find(str[i])!=string::npos) counter++;
        }
        cout << counter << endl;
}
easybudda
27.01.2011, 15:33
  #10

Не по теме:

Цитата Сообщение от Nameless One Посмотреть сообщение
а зачем конкретно в данном случае std::set?
Хакерский способ взлома банкоматов с помощью ноутбука и кувалды: подходишь к банкомату и долбишь по нему кувалдой, пока деньги не посыпятся. Спросишь, для чего ноутбук? А какой же ты за хакер без ноутбука?!
(с)старая шутка, не помню, откуда...

Iron Bug
22 / 22 / 0
Регистрация: 06.12.2010
Сообщений: 125
27.01.2011, 15:34     Есть ли в с++ какой-нибудь аналог in #11
ну, можно и так. просто set как раз и есть аналог паскалевских множеств. да, и set будет гораздо быстрее работать - он упорядочен в памяти и оптимизирован под работу с поиском.
есть ещё бустовские решения, более изящные. но буст далеко не все используют, ну и это не совсем решение в рамках языка.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2011, 07:02     Есть ли в с++ какой-нибудь аналог in
Еще ссылки по теме:

C++ А есть какой нибудь широкий аналог std::ofstream?
какой существует аналог tmp (паскаль) только на c++? C++
Какой аналог в С++ библиотеке dlfcn.h C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 07:02     Есть ли в с++ какой-нибудь аналог in #12
kilik, объяви класс множества с функцией - членом IsMember, так, чтоб
C++
1
a.IsMember(b)
было эквивалентно
Pascal
1
b in a
и никакой громоздкости не будет.

Добавлено через 4 минуты
Цитата Сообщение от asics Посмотреть сообщение
И где тут громоздкость ?
не путай строки со множествами, они могут содержать не только символы.
Pascal
1
if ssLeft in Button then
. Ну ка сделай через строки!
Yandex
Объявления
28.01.2011, 07:02     Есть ли в с++ какой-нибудь аналог in
Ответ Создать тему
Опции темы

Текущее время: 20:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru