cout<<"Введите info.check:";
cin>>info.check;//введя чек тем самым удаляем номер карты
switch(type){
case CARD: cout<<info.card<<endl;break;
case CHECK: cout<<info.check<<endl;break;
}
char z;
cin>>z;
}
Вот результат
Полученное значение 90 говорит о том, что результат обращения к элементу объединения не определен. Кстати, 90 это не код ошибки. Просто это случайное число. Вместо него могут быть какие-то символы.
/////////////////////////////////////////////////////////////
#include<iostream>
#include<windows>
using namespace std;
void main(){
enum paytype{CARD,CHECK};
paytype type;
//Обявление переменной типа объединение
union payment{ char card[25]; long check;} info;
// card - Имя карты
// check - Номер чека
// info – имя переменной типа payment
type=CARD;
SetConsoleOutputCP(1251);
cout<<"Введите info.check:";
cin>>info.check; /*В данном случае происходит обращение к элементу, который был последним размещен в памяти*/
cout<<"Введите ifo.card:";
cin.getline(info.card,25);
switch(type){
case CARD: cout<<info.card<<endl;break;
case CHECK: cout<<info.check<<endl;break;
}
char z;
cin>>z;
}
Множества
Множество — это группа элементов, которая ассоциируется с ее именем и с которой можно сравнивать другие величины, чтобы определить, принадлежат ли они этому множеству. Как частный случай, множество может быть пустым. Множество реализовано в C++Builder как шаблон класса, определенный в головном файле vcl/sysdefs.h.
Объявляется множество оператором:
Set <type, minval, maxval> переменные;
Параметр type определяет тип элементов множества. Обычно это порядковые типы int, char или перечислимый. Параметры minval и maxval типа unsigned char определяют минимальное и максимальное значения элементов множества. Минимальное значение должно быть не меньше 0, максимальное - не более 255. Приведем примеры объявления множеств.
Объявление переменной s1 как множества всех заглавных латинских букв имеет вид:
Set <char, 'A', 'Z'> s1;
Следующий оператор объявляет множество Ch, содержащее все символы:
Set <char, 0, 255> Ch;
Следующие операторы объявляют тип UPPERCASESet множества всех заглавных латинских букв и объявляют переменные s2 и s3 этого типа:
typedef Set <char, 'R.','Z'> UPPERCASESet;
UPPERCASESet s2, s3;
Следующие операторы определяют множество S, элементами которого являются данные перечислимого типа Е: red, yellow, green:
enum E { white, red, yellow, green };
Set <E, red, green> S;
Объявление переменной типа множества Set не инициализирует ее какими-то значениями. Инициализацию можно делать с помощью описанной ниже операции <<, которая означает добавление элементов в множество.
Для множесва определены следующие операции (в описании операций словами «данное множество» обозначается левый операнд):
Операция | Определение | Описание |
- | Set fastcall operator-(const Set& rhs) const; | данное множество равно разности двух множеств: данного и rhs (операция хоr с их элементами) |
-= | Set& fastcall operator- =(const Set& rhs); | создание нового множества, определенного разностью двух множеств: данного и rhs (операция хоr с их элементами) |
* | Set& fastcall operator*=(const Set& rhs); | создание нового множества, определенного пересечением двух множеств: данного и хоr (операция and с их элементами) |
*= | Set fastcall operator*(const Set& rhs) const; | данное множество равно пересечению двух множеств: данного и rhs (операция and с их элементами) |
Рассмотрим примеры работы с множествами. Пусть вы задаете в программе некоторый вопрос, подразумевающий ответ типа «Yes/No». Тогда можные символы, вводимые пользователем в качестве ответа, являются множеством, содержащим символы «у», «Y», «n» и «N». Сформировать такое множество
можно операторами:
Set <char, 0, 255> TrueKey;
...
TrueКеу << 'у1' << 'r' << 'n' << 'N';
Тогда проверить, принадлежит ли введенный пользователем символ Key множеству допустимых ответов, можно с помощью метода Contains:
if (!TrueKey.Contains(Key))
ShowMessge("Вы ввели ошибочный ответ");
Else...
Рассмотрим еще один пример. Пусть вы хотите, чтобы в окне редактирования Edit1 пользователь мог вводить только число, т.е. только цифры от 0 до 9. Это можно сделать, включив в обработчик события OnKeyPress этого окна операторы:
Set <char, '0', '9'> Dig;
Dig << '0' << '1'<< '2' << '3' << '4' << '5'
<<'6' << '7' << '8' << '9';
if (!Dig.Contains(Key))
{Key = 0; BeepO; }
При попытке пользователя ввести символ, отличный от цифры, раздастся звук (его обеспечит функция Веер) и символ не появится в окне.
4. Структуры
Массив это упорядоченная совокупность однородных элементов. Иначе говоря, все элементы должны иметь одинаковый тип. Ну, а что делать, если нужно в массив записать элементы разного типа? Например, необходимо хранить вместе номер квартиры, ее площадь и имя хозяина. Первая величина целая, вторая действительная, а третья вообще строка. необходимо сравнить доход от хранения денег на банковских счетах в разных банках. Для этого нужно знать начальную сумму, процентную ставку и количество периодов начисления процентов. Первые две величины это числа с дробной частью, например типа double, последнее целое число, например, int. Конечно, эти величины можно записать в разные переменные, но С++ позволяет их агрегировать, т.е. рассматривать совокупность нескольких величин разного типа, как одну переменную. Такие агрегированные (объединенные) переменные называются структурами. Структура это упорядоченная совокупность элементов разного типа. Упорядоченность, в отличие от массива, заключается не в присвоении номера элементу, а в присвоении имени.
Прежде чем раасказать о том как создать структуру и как с ней работать заметим, что С++ работает не только с базовыми типами данных, но так же позволяет определить новый тип данных. Делается это с помощью оператора typedef. Например, известно, что в программе будут использованы строковые массивы для хранения фамилий. Фамилии хранятся в виде строк. Для того чтобы каждый раз не определять строковый массив, можно определить его один раз как новый тип.
typedef char name[50];
Теперь можно пользоваться новым типом name. Рассмотрим пример, в котором принято такое объявление.
#include <iostream>
using namespace std;
Int main(void)
{
typedef char name[50];
name n1,n2;
cin>>n1>>n2;
cout<<n1<<endl<<n2;
char z;
cin>>z;
return 0;
}
На самом деле, typedef не определяет новый тип, а просто дает имя шаблону (для существующих типов), по которому нужно строить или хранить данные. А вот теперь рассмотрим как, на самом деле, можно создать новый тип данных. Для этого вернемся к объявленной теме.
Описание структуры, а точнее структурного типа, выглядит следующим образом:
struct Имя_структуры структурного типа
// к имени структуры предъявляются обычные,
// для имен переменных, требования
{