Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
#1

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

07.11.2011, 20:59. Просмотров 1211. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2011, 20:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Маленькая проблемка со switch (C++):

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

Оптимальная конструкция switch-case-while / while-switch-case - C++
Имеется конструкция типа: switch() { case 1: while() { ... }

Маленькая ошибка - C++
#include<iostream> #include <stdio.h> #include <string.h> using namespace std; bool myfunc(char x , char x1 ); bool...

Маленькая задачка. - C++
Дано действительное число h. Выяснить, имеет ли уравнение ax2 + bx + c = 0 действительные корни, если ...

Маленькая буква x - C++
Недавно начал изучать С++. Встретил следующий код, не понимаю как он работает. Если кто подскажет, почему из-за буквы "x" выполняется...

Маленькая конструкции с if else - C++
Доброе время суток, товарищи! У меня возник вопрос, как мне в кострукции с if else сделать так, чтобы else были все другие слова, кроме...

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

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

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

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

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

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

осталось только одну деталь уточнить
C++
1
2
3
4
map <string,list<string> > data;
 
        data["maths"].push_back("Sidorov");
        data["physics"].push_back("Ivanov");
data["maths"] - это полноценный список, в нём, например, можно использовать иттераторы списка?
0
LostCoast
82 / 82 / 5
Регистрация: 30.09.2011
Сообщений: 404
Записей в блоге: 6
07.11.2011, 21:48 #14
C++
1
map <string,list<string> >::iterator p;
так имеешь ввиду?
0
IcyWind
8 / 8 / 2
Регистрация: 19.09.2011
Сообщений: 272
07.11.2011, 21:50  [ТС] #15
Нет
так
C++
1
2
list<string>::iterator p;
p = data["math"].begin()
0
07.11.2011, 21:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2011, 21:50
Привет! Вот еще темы с ответами:

Проблемка - C++
Доброго всем времени суток. Подскажите,что это за ошибка и что не так? // linaer_system.cpp : Defines the entry point for the console...

Проблемка - C++
#include &quot;stdafx.h&quot; #include &lt;math.h&gt; #include &lt;iostream&gt; int _tmain(int argc, _TCHAR* argv) { setlocale (LC_ALL,&quot;Russian&quot;);...

Проблемка с g++ - C++
Вот недавно установил винду (раньше была линь), и хотел чтоб всё было привычно, установил g++ компилятор, всё ок, взял написал код самый...

маленькая прожка с ошибкой - C++
компиляция проходит успешно, после запуска выдает ошибку (см вложение) прога открывает файл, посимвольно его читает. если символ есть в...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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