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

Маленькая проблемка со switch - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
07.11.2011, 20:59     Маленькая проблемка со switch #1
Проблема - невозможность использование перемнной типа string как управляющей в операторе switch.
Цель - сделать некий аналог.
рабочую версию я уже сделал, но она "некрасивая"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string pred;
if (pred == "математика")
                n = 0;
            else
                if (pred == "физика")
                    n = 1;
                else
                    if (pred == "биология")
                        n = 2;
                    else
                        if (pred == "химия")
                            n = 3;
            switch (n)
            {
 
            }
Есть идея сделать что-то типо
#define "математика" 0
глобальную замену слова "математика"
как быть?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2011, 20:59     Маленькая проблемка со switch
Посмотрите здесь:

C++ Маленькая буква x
C++ Ошибочка маленькая и не понятная(((
маленькая ошибка в программе C++
Маленькая задачка. C++
C++ маленькая маленькая консультация, не сложная работа
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:09     Маленькая проблемка со switch #2
C++
1
2
3
4
5
6
7
8
if (pred == "математика")
     n = 0;
else if (pred == "физика")
     n = 1;
else if (pred == "биология")
     n = 2;
else if (pred == "химия")
     n = 3;
ну можно вот так записать(красивей выглядит)
не знаю как со string, но из char можно сделать двумерный массив, так вот, брать его строку за переменную, char[i][80] и писать так switch(i) {}
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
07.11.2011, 21:14  [ТС]     Маленькая проблемка со switch #3
Если так рассуждать дальше, то можно можно просто делать что-то типо.
C++
1
2
switch((int)pred[0]){
}
Но всё-равно это как-то натянуто...я пойму, а вот тот, кто будет это читать) умрёт со словам: "НА КОЙ ЧЁРТ ОН ЭТО ДЕЛАЕТ?!". Условие написание данной программы - доступность и понятность даже в ущерб быстродействию
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
07.11.2011, 21:17     Маленькая проблемка со switch #4
в таком случае обычно используют перечисления
C
1
enum { maths, physics, biology, ... };
только тут это ваще не строки.
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:17     Маленькая проблемка со switch #5
IcyWind, по моему это доступно и понятно), да и к тому же если тебе нужно будет вводить разное количество предметов, то лучше будет записывать названия через цикл в двумерный массив, чем писать 5 и более определений n.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
07.11.2011, 21:21     Маленькая проблемка со switch #6
Со строками через switch работать нельзя
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
07.11.2011, 21:25  [ТС]     Маленькая проблемка со switch #7
Я понял, что нужно немножко "добавить информации"
есть файл - вида

Фамилия Предмет

предметы - это математика/физика/биология/химия
Первоначальная цель - рассувать фамилии по контейнерам, типа "list<string>"
таких списков будет столько же, сколько и предметов.
Алгоритм:
Берём 2 переменные типа стринг - в первую записываем фамилию, во вторую - предмет
Сравниваем значение второй переменной и известных мне констант ("математика", "физика"...) чтобы знать в какой из существующих списков добавить студента с данной фамилией.
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:27     Маленькая проблемка со switch #8
IcyWind, и ты думаешь конечный пользователь поймет твою задумку, нежели массив?)
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
07.11.2011, 21:28     Маленькая проблемка со switch #9
мне кажется лучше всего сделать так:
C++
1
2
3
4
5
6
        std::map <std::string,std::vector<std::string> > data;
 
    data["maths"].push_back("Sidorov");
    data["physics"].push_back("Ivanov");
 
        // etc...
ясна задумка?
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
07.11.2011, 21:35  [ТС]     Маленькая проблемка со switch #10
К сожалению, не знаком с контейнером map

Добавлено через 1 минуту
Но как я понял, обращение
data["maths"]
можно использовать как
C++
1
2
string s
data[s]
можно чуть-чуть по-подробней про map?

Добавлено через 1 минуту
Цитата Сообщение от LostCoast Посмотреть сообщение
IcyWind, и ты думаешь конечный пользователь поймет твою задумку, нежели массив?)
Да, там просто несколько строк с ручным переопределением строк предметов в целые числа, а дальше очень понятный свитч)
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:39     Маленькая проблемка со switch #11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <map>
using namespace std;
 
int main() 
{
    map<char, int> m;
    int i;
    //помещаем пары в отображение
    for(i = 0; i < 10; i++) {
        m.insert(pair<char, int>('A' + i));
    }
    char ch;
    cout << "write key: ";
    cin >> ch;
    map<char, int>::iterator p;
    //находим значение по заданному ключу 
    p = m.find(ch);
    if ( p != m.end())
        cout << p->second;
    else
        cout << "none";
 
    return 0;
}
пример из книжки
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
07.11.2011, 21:42     Маленькая проблемка со switch #12
Цитата Сообщение от IcyWind Посмотреть сообщение
Но как я понял, обращение
data["maths"]
можно использовать как
да, конечно.

Меп - 1 из ассоциативных массивов, предоставляемых стд. библиотекой.
http://ru.wikipedia.org/wiki/%C0%F1%...E0%F1%F1%E8%E2

в кратце - для каждого ключа - есть какое то значение. в данном случае удобно сделать для ключа <название предмета> сделать значение <список студентов>.

также оператор [] имеет для мепа особый смысл. обращение идёт как вы заметили по типу ключа а не обычного индекса от 0... и если ключа не было - то он добавляется в меп и создается значение.

т.е такая запись:
data["maths"]; - создаст по ключу "maths" пустой список (в данном случае пустой, т.к нет оператора '=' и т.п.) - значение по умолчанию.

data["physics"].push_back("123"); - создаст (если еще не создан) по ключу "phisycs" список (вектор), затем добавит в него "123".

ну вот как-то так.
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
07.11.2011, 21:45  [ТС]     Маленькая проблемка со switch #13
Спасибо, сам уже успел разобраться
хотел написать то же самое, чтобы вы подтвердили))

осталось только одну деталь уточнить
C++
1
2
3
4
map <string,list<string> > data;
 
        data["maths"].push_back("Sidorov");
        data["physics"].push_back("Ivanov");
data["maths"] - это полноценный список, в нём, например, можно использовать иттераторы списка?
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:48     Маленькая проблемка со switch #14
C++
1
map <string,list<string> >::iterator p;
так имеешь ввиду?
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
07.11.2011, 21:50  [ТС]     Маленькая проблемка со switch #15
Нет
так
C++
1
2
list<string>::iterator p;
p = data["math"].begin()
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:56     Маленькая проблемка со switch #16
вот так точно можно
C++
1
2
3
string str;
cin >> str;
p = data.find(string(str));
Добавлено через 3 минуты
в str напишешь "math" и поидее можно будет вывести "Sidorov"
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
07.11.2011, 21:56  [ТС]     Маленькая проблемка со switch #17
Вы не так понимаете вопрос
меня структура map - не интересует. Мне достаточно того, что если ключ существует, то она добавит в контейнер с именем ключа, а если не существует, то создаст пустой контейнер и имя будет его, как у ключа.
теперь забыли про map

вопрос - нет ли каких-нибудь ограничений на использование какого-нибудь контейнера из map
C++
1
2
3
4
map <string,list<string> > data;
 
        data["maths"].push_back("Sidorov");
        data["physics"].push_back("Ivanov");
в нашем случаи - списка. Могу ли я НАПРЯМУЮ с ним работать. Менять данные, добалять новые и т.д.
например
C++
1
2
list<string> s = data["maths"];
copy(data["biology"].begin(),data["biology"].end(), s.begin(), s.end());
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
07.11.2011, 21:58     Маленькая проблемка со switch #18
IcyWind, можно) и нужно)

...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
bool checkValidaty(std::string s) {
 
    std::string subjects[] = {"maths","physics","biology","chemistry"};
    size_t sz = sizeof(subjects)/sizeof(subjects[0]);
 
    if (std::find(subjects,subjects+sz,s)!=subjects+sz)
        return true;
 
    return false;
 
}
 
 
int main() {
 
    std::ifstream ifs("1.txt");
 
    std::map<std::string,std::vector<std::string> > data;
 
    std::string subj, student;
 
    while (ifs) {
 
        ifs >> subj >> student;
 
 
 
        if (checkValidaty(subj)==false) {
 
            std::cout << "Unknown subject: \'" << subj << "\'\n";
 
        }
        else {
 
            data[subj].push_back(student);
 
        }
 
        if (ifs.eof()) break;
 
    }
 
    std::cout << "\n--- List --- \n";
    std::map<std::string,std::vector<std::string> >::iterator it;
 
    for (it=data.begin(); it!=data.end(); it++) {
 
        std::cout << it->first << ": ";
 
        for (int i=0; i<it->second.size(); i++)
            std::cout << it->second[i] << ' ';
 
        std::cout << '\n';
 
    }
 
 
 
 
 
 
 
    getch();
    return 0;
}


IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 268
07.11.2011, 22:03  [ТС]     Маленькая проблемка со switch #19
Ещё один вопросик - не будет ли он ругаться, если
C++
1
2
setlocale(0, "Rus");
data[НА РУССКОМ].pushback("odin");
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2011, 22:04     Маленькая проблемка со switch
Еще ссылки по теме:

C++ Маленькая доработка программы
Маленькая ошибка C++
Маленькая конструкции с if else C++

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

Или воспользуйтесь поиском по форуму:
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 22:04     Маленькая проблемка со switch #20
IcyWind, зависит от проги на которой пишешь.Вообще не должно.
Yandex
Объявления
07.11.2011, 22:04     Маленькая проблемка со switch
Ответ Создать тему
Опции темы

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