Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272

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

07.11.2011, 20:59. Показов 2110. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема - невозможность использование перемнной типа 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
глобальную замену слова "математика"
как быть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.11.2011, 20:59
Ответы с готовыми решениями:

маленькая маленькая консультация, не сложная работа
почему эта прога не компилируется? #include<iostream.h> #include<string.h> #include<math.h> int main() { string...

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

3х колоночній макет(класика) 1 маленькая проблемка...
Всем доброго времени суток у меня самый бічній 3х колоночнй макет без всякого выпендрежа все с ним нормально кроме одного при...

23
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:09
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) {}
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
07.11.2011, 21:14  [ТС]
Если так рассуждать дальше, то можно можно просто делать что-то типо.
C++
1
2
switch((int)pred[0]){
}
Но всё-равно это как-то натянуто...я пойму, а вот тот, кто будет это читать) умрёт со словам: "НА КОЙ ЧЁРТ ОН ЭТО ДЕЛАЕТ?!". Условие написание данной программы - доступность и понятность даже в ущерб быстродействию
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
07.11.2011, 21:17
в таком случае обычно используют перечисления
C
1
enum { maths, physics, biology, ... };
только тут это ваще не строки.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:17
IcyWind, по моему это доступно и понятно), да и к тому же если тебе нужно будет вводить разное количество предметов, то лучше будет записывать названия через цикл в двумерный массив, чем писать 5 и более определений n.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
07.11.2011, 21:21
Со строками через switch работать нельзя
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
07.11.2011, 21:25  [ТС]
Я понял, что нужно немножко "добавить информации"
есть файл - вида

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

предметы - это математика/физика/биология/химия
Первоначальная цель - рассувать фамилии по контейнерам, типа "list<string>"
таких списков будет столько же, сколько и предметов.
Алгоритм:
Берём 2 переменные типа стринг - в первую записываем фамилию, во вторую - предмет
Сравниваем значение второй переменной и известных мне констант ("математика", "физика"...) чтобы знать в какой из существующих списков добавить студента с данной фамилией.
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:27
IcyWind, и ты думаешь конечный пользователь поймет твою задумку, нежели массив?)
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
07.11.2011, 21:28
мне кажется лучше всего сделать так:
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...
ясна задумка?
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
07.11.2011, 21:35  [ТС]
К сожалению, не знаком с контейнером map

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

Добавлено через 1 минуту
Цитата Сообщение от LostCoast Посмотреть сообщение
IcyWind, и ты думаешь конечный пользователь поймет твою задумку, нежели массив?)
Да, там просто несколько строк с ручным переопределением строк предметов в целые числа, а дальше очень понятный свитч)
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:39
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;
}
пример из книжки
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
07.11.2011, 21:42
Цитата Сообщение от IcyWind Посмотреть сообщение
Но как я понял, обращение
data["maths"]
можно использовать как
да, конечно.

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

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

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

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

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

ну вот как-то так.
1
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
07.11.2011, 21:45  [ТС]
Спасибо, сам уже успел разобраться
хотел написать то же самое, чтобы вы подтвердили))

осталось только одну деталь уточнить
C++
1
2
3
4
map <string,list<string> > data;
 
        data["maths"].push_back("Sidorov");
        data["physics"].push_back("Ivanov");
data["maths"] - это полноценный список, в нём, например, можно использовать иттераторы списка?
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:48
C++
1
map <string,list<string> >::iterator p;
так имеешь ввиду?
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
07.11.2011, 21:50  [ТС]
Нет
так
C++
1
2
list<string>::iterator p;
p = data["math"].begin()
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:56
вот так точно можно
C++
1
2
3
string str;
cin >> str;
p = data.find(string(str));
Добавлено через 3 минуты
в str напишешь "math" и поидее можно будет вывести "Sidorov"
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
07.11.2011, 21:56  [ТС]
Вы не так понимаете вопрос
меня структура 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());
0
 Аватар для OstapBender
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
07.11.2011, 21:58
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;
}


0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
07.11.2011, 22:03  [ТС]
Ещё один вопросик - не будет ли он ругаться, если
C++
1
2
setlocale(0, "Rus");
data[НА РУССКОМ].pushback("odin");
0
82 / 82 / 24
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 22:04
IcyWind, зависит от проги на которой пишешь.Вообще не должно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2011, 22:04
Помогаю со студенческими работами здесь

Switch . Как присвоить переменной значение из Switch в default
Добрый день подскажите как реализуется данный код . Как взять значение switch если выпал default ? public int Parse() { int...

Как сделать чтобы Switch работал в другом Switch'e?
Как сделать что бы Switch работал в другом Switch'e? Вот допустим выбираем один пункт и в зависимости от выбранного нами пункта последующие...

Рефакторинг switch внутри switch в static классе
Добрый день. Подскажите, как корректно обойти конструкцию switch case внутри switch case в статическом классе. Наткнулся на stackoverflow...

Подключить switch к другому switch
Ребята у меня такая просьба. У меня сеть на 10 компьютеров они все подключены через switch, но мне надо к этому switch подключить еще один...

Power Switch и Reset Switch
Здравствуйте. Покажите мне пожалуйста на этой материнской плате где находится power switch пин и reset switch... Благодарю от всей души.


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru