Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
1

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

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

Author24 — интернет-сервис помощи студентам
В паскале можно привести типы:
Pascal
1
2
3
type
  ts = 0..9;
  chislo = array[1..nmax] of ts;
Как это сделать на С++?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.05.2012, 10:23
Ответы с готовыми решениями:

Приведение типов
Есть ли какая-нибудь разница в следующих выражениях: float a = 123.4f и float a =...

Приведение типов
в GUI ни int str = static_convert<int>(Edit1->Text) ни int str = (int)Edit1->Text не...

Приведение типов.
Столкнулся с задачей считывания данных из символьного массива с дальнейшим отбором из всего этого...

Приведение типов
Доброго времени суток. Данный кусок кода выделяет целую часть. Потом, вычитая из исходного числа...

19
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
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");
}
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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/... 707c0ef999
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 12:02 4
Приведение типов в с++ намного, намного более мощное и запутанное чем в паскале, однако множеств в языке нету(ибо не нужны).
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
13.05.2012, 14:14 5
Цитата Сообщение от diagon Посмотреть сообщение
однако множеств в языке нету(ибо не нужны).
А как же std::set?
0
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:17 6
Цитата Сообщение от go Посмотреть сообщение
А как же std::set?
Это просто класс, реализованный стандартными средствами. В паскале же множества прямо в язык встроены.
Да и вообще это разные вещи, множества в паскале нужны для упрощения записи, а set в с++ это отсортированный контейнер с уникальными значениями
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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
};
Я считаю это почти одно и тоже
0
Higher
1953 / 1219 / 120
Регистрация: 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]
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
13.05.2012, 14:33 9
Цитата Сообщение от go Посмотреть сообщение
Я считаю это почти одно и тоже
Отнюдь,
digit=9;
написать нельзя.
Придется писать
digit=nine;
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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/... 7e46b6b753
В плюсах вот так
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/... 428b0191cc
Просто привели тип.
1
Higher
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2012, 14:39 11
Цитата Сообщение от zss Посмотреть сообщение
Отнюдь,
digit=9;
написать нельзя.
Придется писать
digit=nine;
Неправда, можно писать digit = 9
Хотя стоп, вроде нельзя. А вроде и можно было >_<''
Если явно привести тип, то точно можно.
Ну да, можно явно сравнивать с числами, а вот присваивать нельзя.

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

Цитата Сообщение от diagon Посмотреть сообщение
Однако в с++ нельзя так удобно оперировать с множествами, как в паскале(задавать с помощью [a..b], пересекать с помощью оператора сложения и т.д.).
Ну как это нельзя??? Чуть-чуть извернутся, то и получится.
0
Higher
1953 / 1219 / 120
Регистрация: 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() ) //...
0
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
07.07.2012, 21:42  [ТС] 14
Ладно, например я хочу получить не __int64 (до 264-1), а до 2128-1; Умельцы на хабе делали так, но как это сделать вообще?
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
07.07.2012, 22:06 15
SeryZone, именно int - через длинку. Можно float/double, но вычисления будут происходить дольше.
0
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
08.07.2012, 14:27  [ТС] 16
soon, напиши проще, я в С++ вообще очень мало понимаю.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.07.2012, 17:01 17
SeryZone, если нужен целочисленный тип, то через длинную арифметику. В противном случае можно воспользоваться вещественными типами данных, но вычисления будут происходить дольше.
0
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
08.07.2012, 18:59  [ТС] 18
Блин... Я пробовал длиннную арифметику, но здесь её просто нет: http://habrahabr.ru/post/121950/
0
2554 / 1319 / 178
Регистрация: 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 битную целочисленную переменную - непонятно.
0
56 / 28 / 18
Регистрация: 09.03.2012
Сообщений: 726
Записей в блоге: 1
08.07.2012, 19:43  [ТС] 20
А, понятно...
0
08.07.2012, 19:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2012, 19:43
Помогаю со студенческими работами здесь

Приведение типов
Доброго времени суток. Пусть имеются две структуры struct Student { string FirstName;...

Приведение типов
Как привести наследника ко второму родителю? class Parent1 { public: int a; int b; ...

Приведение типов
Всем привет) Есть массив int a = {2 ,4 ,5 ,6 ,256} Числа располагаются по байтам в памяти так:...

Приведение типов
Делаю программу, которая кроме всего прочего должна отсортировать массив. Использую для этого...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru