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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
SeryZone
56 / 28 / 5
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
#1

Приведение типов - C++

13.05.2012, 10:23. Просмотров 1483. Ответов 19
Метки нет (Все метки)

В паскале можно привести типы:
Pascal
1
2
3
type
  ts = 0..9;
  chislo = array[1..nmax] of ts;
Как это сделать на С++?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2012, 10:23     Приведение типов
Посмотрите здесь:

C++ Приведение типов
Приведение типов C++
Приведение типов. C++
Приведение типов C++
Приведение типов C++
C++ Приведение типов
C++ Приведение типов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6240 / 5843 / 1890
Регистрация: 18.12.2011
Сообщений: 14,960
Завершенные тесты: 1
13.05.2012, 11:33     Приведение типов #2
В С++ есть оператор typedef.
Однако именно для такого случая
(ограничение диапазона значений переменной)
простого решения в голову не приходит.
Можно сделать контейнерный класс,
в котором задать эти ограничения
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
#include <iostream>
using namespace std;
class ts
{
private:
unsigned short val;
public:
    ts():val(0){}
ts& operator=(ts& a){val=a.val;return *this;} 
ts& operator=(int a)
{
    if(a<0)a=0;
    else if(a>9)a=9;
    val=a;
    return *this;
}
friend ostream& operator<<(ostream& os,ts& a)
{
    os<<a.val;
    return os;
}
};
int main(int argc, char *argv[])
{
    const int nmax=2;
    ts chislo[nmax];
    chislo[0]=10;
    chislo[1]=chislo[0];
    cout<<chislo[0]<<" "<<chislo[1];
    system("pause");
}
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 11:54     Приведение типов #3
SeryZone, Вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
enum dig 
   {
      zero, one, two, three, four, five, six, seven, eight, nine
   };
  
dig digit;
 
int main()
{
    digit = one;
    std::cout << digit << std::endl;
}
http://liveworkspace.org/code/272844...5f69707c0ef999
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 12:02     Приведение типов #4
Приведение типов в с++ намного, намного более мощное и запутанное чем в паскале, однако множеств в языке нету(ибо не нужны).
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 14:14     Приведение типов #5
Цитата Сообщение от diagon Посмотреть сообщение
однако множеств в языке нету(ибо не нужны).
А как же std::set?
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:17     Приведение типов #6
Цитата Сообщение от go Посмотреть сообщение
А как же std::set?
Это просто класс, реализованный стандартными средствами. В паскале же множества прямо в язык встроены.
Да и вообще это разные вещи, множества в паскале нужны для упрощения записи, а set в с++ это отсортированный контейнер с уникальными значениями
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 14:23     Приведение типов #7
Цитата Сообщение от diagon Посмотреть сообщение
Это просто класс, реализованный стандартными средствами. В паскале же множества прямо в язык встроены.
Это стандартный класс. Чего вы от него хотите? string в паскале что это?

Цитата Сообщение от diagon Посмотреть сообщение
Да и вообще это разные вещи, множества в паскале нужны для упрощения записи, а set в с++ это отсортированный контейнер с уникальными значениями
Цитата Сообщение от SeryZone Посмотреть сообщение
ts = 0..9;
Цитата Сообщение от go Посмотреть сообщение
enum dig
{
zero, one, two, three, four, five, six, seven, eight, nine
};
Я считаю это почти одно и тоже
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:31     Приведение типов #8
Хотя нет, это не множества, а просто перечисляемый тип.

Цитата Сообщение от go Посмотреть сообщение
Я считаю это почти одно и тоже
Так что да, это почти одно и тоже.

А множества, это, к примеру, вот
Pascal
1
if 3 in [1..9] + [20..30]  //если 3 лежит в диапазоне [1..9] или в диапазоне [20..30]
zss
Модератор
Эксперт С++
6240 / 5843 / 1890
Регистрация: 18.12.2011
Сообщений: 14,960
Завершенные тесты: 1
13.05.2012, 14:33     Приведение типов #9
Цитата Сообщение от go Посмотреть сообщение
Я считаю это почти одно и тоже
Отнюдь,
digit=9;
написать нельзя.
Придется писать
digit=nine;
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 14:38     Приведение типов #10
Цитата Сообщение от diagon Посмотреть сообщение
А множества, это, к примеру, вот
Множество там и там одиново.
Pascal
1
set of char {например, так}
C++
1
std:;set<char>
Я не вижу разницы. Хотя функциональность явно в С++ повыше.

Добавлено через 2 минуты
Цитата Сообщение от zss Посмотреть сообщение
Отнюдь,
digit=9;
Но все Си это возможно
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
enum dig 
   {
      zero, one, two, three, four, five, six, seven, eight, nine
   };
  
enum dig digit;
 
int main()
{
    digit = 9;
    printf("%d\n", digit); 
}
http://liveworkspace.org/code/2e8813...54677e46b6b753
В плюсах вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
enum dig 
   {
      zero, one, two, three, four, five, six, seven, eight, nine
   };
  
dig digit;
 
int main()
{
    digit = static_cast<dig> (9);
    std::cout << digit << std::endl;
}
http://liveworkspace.org/code/ee6c5b...1fbf428b0191cc
Просто привели тип.
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:39     Приведение типов #11
Цитата Сообщение от zss Посмотреть сообщение
Отнюдь,
digit=9;
написать нельзя.
Придется писать
digit=nine;
Неправда, можно писать digit = 9
Хотя стоп, вроде нельзя. А вроде и можно было >_<''
Если явно привести тип, то точно можно.
Ну да, можно явно сравнивать с числами, а вот присваивать нельзя.

Цитата Сообщение от go Посмотреть сообщение
Я не вижу разницы. Хотя функциональность явно в С++ повыше.
Однако в с++ нельзя так удобно оперировать с множествами, как в паскале(задавать с помощью [a..b], пересекать с помощью оператора сложения и т.д.). Аналог того условия, что я привел выше, на с++ будет занимать ~10 строк.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2012, 14:43     Приведение типов #12
Цитата Сообщение от diagon Посмотреть сообщение
Если явно привести тип, то точно можно.
В С++ только так все и делается. Ведь 9 это целое число. http://liveworkspace.org/code/ee6c5b...1fbf428b0191cc

Цитата Сообщение от diagon Посмотреть сообщение
Однако в с++ нельзя так удобно оперировать с множествами, как в паскале(задавать с помощью [a..b], пересекать с помощью оператора сложения и т.д.).
Ну как это нельзя??? Чуть-чуть извернутся, то и получится.
diagon
Higher
1924 / 1190 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:52     Приведение типов #13
Цитата Сообщение от go Посмотреть сообщение
Ну как это нельзя??? Чуть-чуть извернутся, то и получится
Чуть-чуть? :)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    std::set< int > first; //[0..9]
    for (int i = 0; i <= 9; ++i)
        first.insert(i);
        
    std::set< int > second; //[20..30]
    for (int i = 20; i <= 30; ++i)
        second.insert(i);
        
    std::set< int > third; //[0..9] + [20..30]
    std::set_union
    (
        first.begin(), first.end(),
        second.begin(), second.end(),
        std::inserter< std::set< int > > (third, third.begin() )
    );
    
    int x = 3;
    
    if ( third.find(x) != third.end() ) //...
SeryZone
56 / 28 / 5
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
07.07.2012, 21:42  [ТС]     Приведение типов #14
Ладно, например я хочу получить не __int64 (до 264-1), а до 2128-1; Умельцы на хабе делали так, но как это сделать вообще?
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.07.2012, 22:06     Приведение типов #15
SeryZone, именно int - через длинку. Можно float/double, но вычисления будут происходить дольше.
SeryZone
56 / 28 / 5
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
08.07.2012, 14:27  [ТС]     Приведение типов #16
soon, напиши проще, я в С++ вообще очень мало понимаю.
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 17:01     Приведение типов #17
SeryZone, если нужен целочисленный тип, то через длинную арифметику. В противном случае можно воспользоваться вещественными типами данных, но вычисления будут происходить дольше.
SeryZone
56 / 28 / 5
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
08.07.2012, 18:59  [ТС]     Приведение типов #18
Блин... Я пробовал длиннную арифметику, но здесь её просто нет: http://habrahabr.ru/post/121950/
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 19:36     Приведение типов #19
Цитата Сообщение от SeryZone Посмотреть сообщение
Я пробовал длиннную арифметику, но здесь её просто нет: http://habrahabr.ru/post/121950/
Тут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    typedef unsigned char   u8;
    typedef unsigned short u16;
    typedef unsigned int   u32;
 
    u16 a = 1000;
    u16 b = 2000;
    u32 r = 0;
 
    u8  * a_ptr = (u8*)&a;
    u8  * b_ptr = (u8*)&b;
    u16 * r_ptr = (u16*)(void*)&r;
 
    Karatsuba_multiply(a_ptr, b_ptr, r_ptr);
 
    cout << r;
}
фактически создается переменная типа u32, а в функцию передается указатель на эту переменную, но с типом u16. Остальные также урезаны вдвое. Каким макаром вы собрались делать 128 битную целочисленную переменную - непонятно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.07.2012, 19:43     Приведение типов
Еще ссылки по теме:

Приведение типов C++
Приведение типов C++
Приведение типов C++
Приведение типов C++
C++ Приведение типов

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

Или воспользуйтесь поиском по форуму:
SeryZone
56 / 28 / 5
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
08.07.2012, 19:43  [ТС]     Приведение типов #20
А, понятно...
Yandex
Объявления
08.07.2012, 19:43     Приведение типов
Ответ Создать тему
Опции темы

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