- •Оглавление
- •Введение
- •Общие положения
- •Структура рабочего стола среды программирования
- •Главное окно
- •Некоторые замечания
- •О рабочем столе
- •О справочной системе Help
- •Структура программ в VC++
- •Переход к созданию консольного приложения
- •Программа с оператором while
- •Имена и типы переменных
- •Оператор while
- •Оператор for
- •Символические константы
- •Глава 2. Программы для работы с символьными данными
- •Программа копирования символьного файла. Вариант 1
- •Программа копирования символьного файла. Вариант 2
- •Подсчет символов в файле. Вариант 1
- •Подсчет символов в файле. Вариант 2
- •Подсчет количества строк в файле
- •Подсчет количества слов в файле
- •Глава 3. Работа с массивами данных
- •Одномерные массивы
- •Многомерные массивы
- •Глава 4. Создание и использование функций
- •Создание некоторых функций
- •Ввод строки с клавиатуры
- •Функция выделения подстроки из строки
- •Функция копирования строки в строку
- •Внешние и внутренние переменные
- •Область действия переменных
- •Как создать свой внешний файл
- •Атрибут static
- •Рекурсивные функции
- •Некоторые итоговые данные по изучению функций
- •Перегрузка функций
- •Использование шаблонов функций
- •Создание простого шаблона функции
- •Шаблоны, которые используют несколько типов
- •Глава 5. Функции для работы с символьными строками
- •Основные стандартные строковые функции
- •Функция sprintf()
- •Функция strcpy()
- •Функция strcmp()
- •Функция strcmpi()
- •Функция strcat()
- •Функция strlen()
- •Пример программы проверки функций
- •Новые типы переменных
- •Константы
- •Новые операции
- •Преобразование типов данных
- •Побитовые логические операции
- •Операции и выражения присваивания
- •Условное выражение
- •Операторы и блоки
- •Конструкция if-else
- •Конструкция else-if
- •Переключатель switch
- •Уточнение по работе оператора for
- •Оператор continue
- •Оператор goto и метки
- •Глава 7. Работа с указателями и структурами данных
- •Указатель
- •Указатели и массивы
- •Операции над указателями
- •Указатели и аргументы функций
- •Указатели символов и функций
- •Передача в качестве аргумента функции массивов размерности больше единицы
- •Массивы указателей
- •Указатели на функции
- •Структуры. Объявление структур
- •Обращение к элементам структур
- •Структуры и функции
- •Программы со структурами
- •Функция возвращает структуру
- •Функция возвращает указатель на структуру
- •Программа упрощенного расчета заработной платы одному работнику
- •Рекурсия в структурах
- •Битовые поля в структурах
- •Категории памяти
- •Глава 8. Классы в С++. Объектно-ориентированное программирование
- •Классы
- •Принципы построения классов
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Примеры создания классов
- •Пример 1
- •Пример 2
- •Пример 3
- •Конструктор класса
- •Деструктор класса
- •Классы и структуры в среде CLR
- •Классы и структуры
- •Абстрактные классы
- •Статические функции и элементы данных
- •Частные и общие данные. Интерфейсные функции
- •Использование оператора глобального разрешения для элементов класса
- •Глава 9. Ввод и вывод в языках С и С++
- •Ввод и вывод в С
- •Ввод/вывод файлов
- •Основные функции для работы с файлами
- •Стандартный ввод/вывод
- •Функции стандартного ввода/вывода
- •Ввод/вывод в С++
- •Общие положения
- •Ввод/вывод с использованием разных классов
- •Пространства имен
- •Работа с классом fstream
- •Работа с классом ofstream
- •Работа с классом ifstream
- •Работа с бинарным файлом
- •Стандартный ввод/вывод в С++
- •Общие положения
- •Стандартный вывод cout
- •Стандартный ввод cin
- •Глава 10. Продолжение изучения среды Visual C++
- •Создание проекта
- •Некоторые файлы проекта
- •Окно сведений об объекте
- •Вкладка Events
- •Вкладка Property Pages
- •Работа с окном сведений об объекте
- •Контекстное меню редактора кода
- •Суфлер кода (подсказчик)
- •Настройка редактора кода
- •Управление окнами редактора
- •Изменение шрифта и цвета
- •Начало редактирования кода программного модуля
- •Компоненты среды программирования VC++
- •Класс Form
- •Дизайнер форм
- •Помещение компонента в форму
- •Другие действия с дизайнером форм
- •Контекстное меню формы
- •Добавление новых форм к проекту
- •Организация работы с множеством форм
- •Вызов формы на выполнение
- •Cвойства формы
- •События формы
- •Некоторые методы формы
- •Рисование графиков в форме
- •Глава 11. Компоненты, создающие интерфейс между пользователем и приложением
- •Пространство имен System
- •Работа с переменными некоторых типов
- •Компонент Button
- •Свойства Button
- •События Button
- •Методы Button
- •Компонент Panel
- •Некоторые свойства Panel
- •Некоторые события Panel
- •Компонент Label
- •Некоторые свойства Label
- •События Label
- •Компонент TextBox
- •Некоторые свойства TextBox
- •События TextBox
- •Некоторые методы TextBox
- •Компонент MenuStrip
- •Некоторые свойства MenuStrip
- •События MenuStrip
- •Компонент ContextMenuStrip
- •Компонент ListView
- •Некоторые свойства ListView
- •События ListView
- •Компонент WebBrowser
- •Компонент ListBox
- •Как работать с ListBox
- •Свойства ListBox
- •Как использовать ListBox
- •Как формировать список строк
- •Компонент СomboBox
- •Свойства ComboBox
- •События ComboBox
- •Некоторые методы ComboBox
- •Примеры использования ComboBox
- •Пример 1
- •Пример 2
- •Пример 3
- •Компонент MaskedTextBox
- •Свойства MaskedTextBox
- •Компонент СheckedListBox
- •Пример: домашний телефонный справочник
- •Компоненты CheckBox и RadioButton
- •Компонент GroupBox
- •Компонент LinkLabel
- •Компонент PictureBox
- •Некоторые свойства компонента PictureBox
- •Компонент DateTimePicker
- •Форматные строки даты и времени
- •Стандартное и пользовательское форматирование
- •Некоторые сведения о работе с датами
- •Компонент TabControl
- •Как задавать страницы
- •Некоторые методы TabControl
- •Некоторые свойства страницы TabPage
- •Как защитить страницу от неавторизованного доступа
- •Задача регистрации пользователя в приложении
- •Компонент Timer
- •Компонент ProgressBar
- •Компонент OpenFileDialog
- •Компонент SaveFileDialog
- •Компонент ColorDialog
- •Компонент FontDialog
- •Компонент PrintDialog
- •Компонент ToolStrip
- •Некоторые свойства ToolStrip
- •Использование ToolStrip
- •Глава 12. Работа с наборами данных. Общие сведения о базах данных
- •Проектирование баз данных
- •Модель базы данных
- •Структура проектирования базы данных
- •Идентификация сущностей и атрибутов
- •Проектирование таблиц
- •Определение неповторяющихся атрибутов
- •Набор правил при разработке таблицы
- •Определение ограничений на целостность данных
- •Принудительное обеспечение целостности данных
- •Выбор индексов
- •Язык SQL
- •Примеры оператора SELECT
- •Наборы данных (компонент DataSet)
- •Общая технология организации работы с базой данных в приложении
- •Пример работы с базой данных
- •Глава 13. Управление исключительными ситуациями
- •Операторы try, catch и throw
- •Пример 1
- •Пример 2
- •Классы типов исключений
- •Пример 3
- •Функции, выдающие исключения
- •Пример 1. Перевод строки String ^ в ASCII-строку
- •Пример 2. Перевод ASCII-строки в строку String ^
- •Пример 3. Преобразование строки String ^ в строку wchar_t
- •Пример 4. Преобразование строки wchar_t в строку String ^
- •Пример 5. Маршалинг native-структуры
- •Пример 6. Работа с массивом элементов native-структуры в managed-функции
- •Пример 7. Доступ к символам в классе System::String
- •Пример 10. Преобразование String в string
- •Пример 11. Преобразование string-строки в String-строку
- •Пример 12. Объявление дескрипторов в native-типах
- •Пример 13. Работа с дескриптором в native-функции
- •Предметный указатель
122 |
Часть I. Изучение языка С/С++ |
|
|
При объявлении шаблона структуры, члены-данные структуры объявляются такого же формата, как если бы они были вне структуры: тип, имя, точка с запятой.
Приведем пример вложенной структуры, т. е. такой структуры, которая является членом другой структуры:
struct date { |
|
|
|
|
int day; |
//день недели |
|||
int month; |
//номер месяца |
|||
int year; |
//год |
|
|
|
char monthname[4]; |
//название месяца |
|||
}; |
|
|
|
|
struct person { |
|
|
|
|
char name[30]; |
//имя |
|
||
char adress[70]; |
//домашний адрес |
|||
long mailcod; |
//почтовый код |
|||
float salary; |
//заработная плата |
|||
struct date birthdate; |
//дата рождения |
|||
struct date hiredate; |
//дата поступления на работу |
|||
}emp[1000],*p; |
|
|
|
Это типичный пример объявления личной карточки работника (реальная карточка содержит намного больше данных). Здесь объявлен указатель на структуру и массив структур шаблона person. Если такой массив заполнить, то получим данные на 1000 работников.
Указатель на структуру — это не экземпляр структуры (экземпляр структуры объявляется как emp[]), а указатель, которому в дальнейшем будет присвоен адрес некоторой структуры, с ее элементами можно будет работать через указатель.
Обращение к элементам структур
Мы видели, что после объявления структуры (а это фактически тип данного, имя которого равно имени структуры) можно объявить некую переменную типа этой структуры или указатель этого типа (указатель на эту структуру).
Если вы объявили переменную типа структуры, то чтобы обратиться к элементам структуры, надо после имени переменной поставить точку, а если вы объявили указатель на структуру, то после имени указателя на данную структуру надо поставить стрелку вправо (->). Затем нужно к этим именам приписать имя члена структуры, к которому надо обратиться. Если требуется обратиться к членам вложенной структуры, то следует продолжить операции с точкой или стрелкой вправо с именем подструктуры, а затем с именем ее члена. Примеры обращения к членам экземпляров структуры:
emp[0].name, emp[521].salary, emp[121].hiredate.year
Глава 7. Работа с указателями и структурами данных |
123 |
Допустим, p=&emp[1]. В этом случае p->adress — это адрес работника, который содержится в экземпляре структуры emp[1], а год поступления на работу — p-> hiredate->year. Однако существуют некоторые ограничения:
членом структуры может быть любой тип данных (int, float, массив, структура), но элемент структуры не может иметь тот же тип, что и сама структура. Например:
struct r {int s; struct r t};
Такое объявление структуры неверно, т. к. t не может иметь тип r. При этом указатель на тот же тип разрешен. Например:
struct r {int s; struct r *t};
Такое объявление верно;
в языке С членом структуры не может быть функция, а указатель на функцию может быть членом структуры. Например:
struct r
{
int s;
(*comp)(char *a,char *b); };
Такое объявление верно;
в С++ функция может быть членом структуры. Дело в том, что в С++ структуры рассматриваются как класс, т. е. для членов структуры могут быть определены спецификации доступа к памяти, определяемые для членов класса: public (всегда определена по умолчанию), protected и private (их мы рассмотрим при изучении классов).
В листинге 7.6 приведен текст простейшей программы, в которой функция является членом структуры (результат работы этой программы показан на рис. 7.6);
Листинг 7.6
// 7.6_2011.cpp
#include "stdafx.h" #include <stdio.h> #include <conio.h> using namespace System;
//------------------------------------------------------------- |
|
int main() |
|
{ |
|
struct aaa |
|
{ |
|
public: |
//определена по умолчанию (приведена для примера) |
124 |
Часть I. Изучение языка С/С++ |
|
|
int i;
int f(int a) //функция-член структуры
{ //объявлена прямо в структуре return(-a);
};
}bbb; int a;
a=bbb.f(15);
printf("a=%d\n",a); _getch();
}
Рис. 7.6. Результат работы программы из листинга 7.6
в языке С внешнюю или статическую структуру можно инициализировать. Например, имеем шаблон:
struct |
date { |
|
int |
day; |
//день недели |
int |
month; |
//номер месяца |
int |
year; |
//год |
char monthname[4]; //название месяца
};
В этом случае можем инициализировать структуру:
struct date d1={4,5,2003,sept};
Инициализация массива структур будет задаваться так:
struct a {char *s; int i;}m[3]={"u1",0, "u2",0,
"u3",0
};
присваивать значения одной структуры другой разрешено только для экземпляров одной структуры. Например, существует структура:
struct A {int i; char d}a,a1; и struct B{int i; char d}b;
В этом случае можно выполнить a=a1; или a1=a;. Но операцию a=b; выполнить нельзя, т. к. а и b считаются относящимися к шаблонам разного типа (у их шаблонов разные имена и этого достаточно, чтобы считать их разными, хотя по структуре они совпадают).