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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.76
kilik
5 / 5 / 1
Регистрация: 15.11.2010
Сообщений: 58
#1

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

26.01.2011, 23:02. Просмотров 3057. Ответов 11
Метки нет (Все метки)

Есть ли в с++ какой-нибудь аналог 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.
Если буква принадлежит к гласным, количество гласных букв плюс один.
в с++ я не нашел ничего подобного и код получается очень громоздким.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2011, 23:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть ли в с++ какой-нибудь аналог in (C++):

Есть ли какой-нибудь аналог c# using или python with в c++ ? - C++
В C# (using pattern) и python есть специальные конструкции которые позволяют не следить за закрытием файла после окончания блока. using...

А есть какой нибудь широкий аналог std::ofstream? - C++
Ну чтоб wchar_t и указатель на wchar_t принимал. Хоть в какой нибудь уникодовой кодировке.

Какой есть аналог isalpha для работы с русским алфавитом? - C++
Использую string и нужно проверять записан ли внутри текст или число. Какими средствами можно это сделать? Обычный isalpha(str.c_str())...

Какой есть аналог CreateGraphics из C#? - C++
Доброго времени суток. Собственно проблема возникла во время конвертации кода с C# на C++. Есть шарповский код: Graphics g =...

Как изменить расширение файлов в папке средствами C++ (возможно, есть какой-то аналог changefileext из делфи)? - C++
Всем здравствуйте! Я пришёл к вам за помощью!) Подскажите пожалуйста как можно изменить расширение файлов в папке. Точнее говоря, у...

Есть ли в Windows какой-нибудь стандартный "загрузчик dll"? - C++
у меня всю задачу выполняет DLL... есть ли в виндовс какойнить файл который позволяет загрузть DLL чтобы не писать прогу которая ее...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
asics
Freelance
Эксперт С++
2846 / 1783 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
26.01.2011, 23:08 #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 #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
Модератор
Эксперт CЭксперт С++
9531 / 5524 / 932
Регистрация: 25.07.2009
Сообщений: 10,611
26.01.2011, 23:43 #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 #5
можно через std::set решить задачу. получится очень кратко.
easybudda
Модератор
Эксперт CЭксперт С++
9531 / 5524 / 932
Регистрация: 25.07.2009
Сообщений: 10,611
27.01.2011, 00:17 #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
1933 / 1542 / 141
Регистрация: 31.05.2009
Сообщений: 2,912
27.01.2011, 00:53 #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 #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
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
27.01.2011, 15:20 #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 #11
ну, можно и так. просто set как раз и есть аналог паскалевских множеств. да, и set будет гораздо быстрее работать - он упорядочен в памяти и оптимизирован под работу с поиском.
есть ещё бустовские решения, более изящные. но буст далеко не все используют, ну и это не совсем решение в рамках языка.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
28.01.2011, 07:02 #12
kilik, объяви класс множества с функцией - членом IsMember, так, чтоб
C++
1
a.IsMember(b)
было эквивалентно
Pascal
1
b in a
и никакой громоздкости не будет.

Добавлено через 4 минуты
Цитата Сообщение от asics Посмотреть сообщение
И где тут громоздкость ?
не путай строки со множествами, они могут содержать не только символы.
Pascal
1
if ssLeft in Button then
. Ну ка сделай через строки!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.01.2011, 07:02
Привет! Вот еще темы с ответами:

помогите хоть с какой-нибудь.. - C++
не знаю как решать, направте пожалуйста

Какой аналог в С++ библиотеке dlfcn.h - C++
Добрый день, есть ли что-то подобное сишной dlfcn.h для с++, библиотека, похоже, не совместима с плюсами.

Какой в С++ аналог ф-ции InputBox? - C++
Какой в С++ аналог ф-ции InputBox?

Проверка на то, запущен ли какой-нибудь процесс - C++
Здравствуйте! Скажите, пожалуйста, какой функцией в C++ можно проверить, запущен ли какой-нибудь процесс (Skype или Notepad) на...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.01.2011, 07:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru