Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Любое другое значение  (Прочитано 1050 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Tobyan

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • C++.
    • Просмотр профиля
Любое другое значение
« : 26 Октября 2011, 21:26:54 »
У меня вот тут небольшой трабл возник. Есть значит-с задача. Нужно преобразовать слова в цифры, типа "нуль" это "0" и т.д. до "четырёх". Это просто. Далее сказано, что при любом другом значении строкового литерала, помимо пяти указанных, нужно, что бы программа дала ответ, что не знает, что это за число.
 Вопрос: Как указать " любое другое значение? "
                                                   Прошу простить, если вопросы глупые, начинающего программиста и проявить снисхождение.
Язык: С++
 
« Последнее редактирование: 26 Октября 2011, 21:29:15 от Tobyan »

Оффлайн arrecck

  • Старожил
  • *
  • Сообщений: 1725
    • Просмотр профиля
Re: Любое другое значение
« Ответ #1 : 26 Октября 2011, 21:32:29 »
switch case 0 1 2 3 4 default (в default указываешь для всех остальных)

Оффлайн Tobyan

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • C++.
    • Просмотр профиля
Re: Любое другое значение
« Ответ #2 : 26 Октября 2011, 22:10:48 »
Я тут обнаружил, что в switch можно добавлять только переменные типа char, и что со string не проканывает. А мне нужно как раз из символьного массива в один символ. Решил с помощью if, но спасибо за ценный комментарий.
#include<iostream>
#include<fstream>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<string>
#include<list>
#include<vector>
#include<algorithm>
#include<stdexcept>

using namespace std;

int main ()
{
        while(true)
        {
            cout << "Пожалуйста, введите число в буквенном эквиваленте :\n";
            string ch;
            cin >> ch;

            if (ch == "нуль")
                {cout << "0\n";}
            else
            if (ch == "один")
                {cout << "1\n";}
            else
            if (ch == "два")
                {cout << "2\n";}
            else
            if (ch == "три")
                {cout << "3\n";}
            else
            if (ch == "четыре")
                {cout << "4\n";}
            else  cout << "Не знаю такое число\n";
        }

}

Оффлайн S_F_H

  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Любое другое значение
« Ответ #3 : 27 Октября 2011, 02:10:44 »
ОМГ!!! есть намного приятнее запись

int chislo = (str == "один" ? 1
           : str == "два" ? 2
           : str == "три" ? 3
           : str == "четыре" ? 4 : -1);
if (chislo == -1)
    cout << "Число не определено";

на мой взгляд глаза не мозолит по крайней мере

Оффлайн Tobyan

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • C++.
    • Просмотр профиля
Re: Любое другое значение
« Ответ #4 : 27 Октября 2011, 10:41:17 »
ОМГ!!! есть намного приятнее запись

int chislo = (str == "один" ? 1
           : str == "два" ? 2
           : str == "три" ? 3
           : str == "четыре" ? 4 : -1);
if (chislo == -1)
    cout << "Число не определено";

на мой взгляд глаза не мозолит по крайней мере

Мало опыта у меня пока что. Да и изощрённые методы записи кода пока не знаю, поэтому юзаю как умею.

andrey_p

  • Гость
Re: Любое другое значение
« Ответ #5 : 27 Октября 2011, 11:40:44 »
if ...
...
else if ...
else if ...
else
нормальная конструкция, ей и пользуйся (пока). Только идиоматически else if пишется на одной строке и или используй фигурные скобки всегда, или пропускай их в случае одной инструкции тоже всегда. И да, они на одной строке режут глаз, лучше
if (...) {
  ...
}
else if (...) {
...
}
else {
...
}

Оффлайн abr_ubuntu

  • Участник
  • *
  • Сообщений: 102
    • Просмотр профиля
Re: Любое другое значение
« Ответ #6 : 27 Октября 2011, 13:12:11 »
switch уже отменили в C++ ?
switch (val) {
0: cout << "zero";
break;
1: cout << "one";
break;
2: cout << "two";
break;
3: cout << "three";
break;
4: cout << "four";
break;
default: cout << "Sho za nah?";
}

Оффлайн S_F_H

  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Любое другое значение
« Ответ #7 : 27 Октября 2011, 20:11:56 »
свитч не поддерживает строковые литералы, внимательнее тему читайте, там надо перевести слово в цифру

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Любое другое значение
« Ответ #8 : 28 Октября 2011, 06:13:53 »
сделай изврат с map'ом
#include <iostream>
#include <string>
#include <map>

std::map< std::string, int > nums;

void init_nums()
{
  nums["zero"] = 0;
  nums["one"]  = 1;
  nums["two"]  = 2;
  nums["three"]= 3;
  nums["four"] = 4;
  nums["five"] = 5;
  //...
}


#include <boost/algorithm/string/trim.hpp>

void trim(std::string &str)
{
   // тут должна быть реализация отбрасывания всех лидирующих и
   // конечных пробельных символов (которые is_space() == true)
   // можно воспользоваться реализацией
   boost::trim(str);
}

int main()
{
  init_nums();
  std::string line;
  while (std::getline(std::cin, line)) {
    trim(line);
    std::map< std::string, int >::const_iterator iter = nums.find(line);
    if (iter != nums.end())
        std::cout << iter->second << std::endl;
    else
        std::cout << "unknown number" << std::endl;
  }
}
« Последнее редактирование: 28 Октября 2011, 06:40:52 от Yurror »

Оффлайн Tobyan

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • C++.
    • Просмотр профиля
Re: Любое другое значение
« Ответ #9 : 28 Октября 2011, 19:09:49 »
Извращения с мапом произойдут только после того, как я его изучу :) А пока его принцип мне не понятен, не буду, ка в лес подремучее заходить... Заблужусь же.

Пользователь решил продолжить мысль 28 Октября 2011, 19:12:32:
if ...
...
else if ...
else if ...
else
нормальная конструкция, ей и пользуйся (пока). Только идиоматически else if пишется на одной строке и или используй фигурные скобки всегда, или пропускай их в случае одной инструкции тоже всегда. И да, они на одной строке режут глаз, лучше
if (...) {
  ...
}
else if (...) {
...
}
else {
...
}
Спасибо, к моменту выхода данного коментария уже использовал идиоматически корректную конструкцию else if. И еще спасибо за то, что решили мои сомнения по поводу использования фигурных скобок. Теперь буду юзать вами указанный вариант.
« Последнее редактирование: 28 Октября 2011, 19:12:32 от Tobyan »

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Любое другое значение
« Ответ #10 : 28 Октября 2011, 19:12:59 »
Писать, писать и ещё раз писать, и переписовать.

Оффлайн Tobyan

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • C++.
    • Просмотр профиля
Re: Любое другое значение
« Ответ #11 : 28 Октября 2011, 19:22:18 »
Писать, писать и ещё раз писать, и переписовать.
Солидарен, коллега :)

Оффлайн Señor_Gaga

  • Забанен
  • Активист
  • *
  • Сообщений: 878
  • Ubuntu 12.04LTS & Linux Mint 13LTS "Maya"
    • Просмотр профиля
Re: Любое другое значение
« Ответ #12 : 28 Октября 2011, 19:51:56 »
Писать, писать и ещё раз писать, и переписовать.
Солидарен, коллега :)

Программированием с детства занимаюсь. Интересы - компиляторы и логические игры.
Если интересно - могу вам дать ссылки в личку.

Оффлайн Tobyan

  • Автор темы
  • Новичок
  • *
  • Сообщений: 15
  • C++.
    • Просмотр профиля
Re: Любое другое значение
« Ответ #13 : 28 Октября 2011, 20:37:45 »
Писать, писать и ещё раз писать, и переписовать.
Солидарен, коллега :)

Программированием с детства занимаюсь. Интересы - компиляторы и логические игры.
Если интересно - могу вам дать ссылки в личку.
Заинтересован, посылайте :)

andrey_p

  • Гость
Re: Любое другое значение
« Ответ #14 : 28 Октября 2011, 20:43:11 »
Цитировать
мои сомнения по поводу использования фигурных скобок.
Для начала (да и потом) очень полезно пропускать свой код через indent. Этот стиль называется "kr", поэтому - indent -kr prog.cpp

 

Страница сгенерирована за 0.02 секунд. Запросов: 22.