- •Подготовка программы к исполнению
- •Директива препроцессора #include
- •Математические функции из библиотеки cmath
- •Заголовок функции main
- •Объявление переменных.
- •Объявление переменных простого типа
- •Объявление констант простого типа
- •Перечисляемые переменные.
- •Логические операции
- •Операторы
- •Операторы сложные
- •Составной оператор
- •Структурированные операторы
- •Условный оператор.
- •Блок-схема оператора разветвления
- •Условная операция.
- •Операция «запятая» в операторе if.
- •Преобразование и привидение типов.
- •Оператор выбора варианта.
- •Блок-схема оператора варианта
- •Цикл по счётчику
- •Цикл c предусловием.
- •Цикл c постусловием.
- •Операторы передачи управления
- •1) Спецификации формата, которые определяются символом % - для выделения, контроля и преобразования соответствующих им введенных значений;
- •2) Любые символы, которые могут быть во входном потоке и которые надо игнорировать:
- •2) Первого символа, который не соответствует формату (например, буква или пробел после выделения числа); .
- •3) Заданной длины поля вводимого значения, если она определена в формате.
- •4.2.2. Форматы вывода данных
- •1) Спецификации формата, которые определяются символом % - для вывода .Значений, определенных списком аргументов, если они есть;
- •2) Любые символы, которые должны быть выведены в выходной поток;
- •2 Позиции отводятся для знака числа и точки.
- •Составные типы данных
- •Обработка двумерного массива
- •Указатели
- •Порядок выполнения операций над указателями
- •Арифметические операции над адресами
- •Операторы распределения памяти new и delete
- •Указатели и динамические массивы
- •Указатели и спецификатор const
- •Массивы указателей
- •Организация динамического двумерного массива
- •Функции работы со строками
- •Действия, производимые над строками и их правила Присвоение
- •Конкатенация строк
- •Копирование строк
- •Определяет длину строки
- •Указатели и строки
- •Введение в класс string
- •Структуры
- •Ссылочные переменные
- •Функции
- •Функции, имеющие возвращаемый параметр с помощью оператора return.
- •Объявление формальных параметров
- •Ввод - вывод записей
- •Дополнительные возможности работы с файлами
- •Работы с файлами и стандартный класс mfc cFileDialog.
- •Работа с файлами с помощью mfc( классы cFile, cStdioFile, ... ) и стандартный класс mfc cFileDialog.
- •Класс cFile
- •Класс cMemFile
- •Класс cStdioFile
- •Примеры записи и чтения из файла
Составные типы данных
Составные типы данных определяют наборы однотипных или разнотипных компонентов. В языке VC++2005 следующие составные типы:
Массивы.
Строки.
Структуры.
Объединения.
Перечисления.
Файлы.
Обработка массивов в VC++
Массив состоит из определенного количества компонентов одного и того же типа. Компоненты могут быть простыми и составными. Доступ к каждому элементу массива осуществляется с помощью индексирования. Индексом может быть произвольное выражение порядкового типа, заключенное в квадратные скобки. Допустимый диапазон индексов определяется в описании массива. Чтобы создать массив необходимо указать три параметра:
Тип значений каждого элемента.
Имя массива.
Количество элементов в массиве.
Формат объявления массива:
Тип идентификатор_массива [количество элементов];
Пример:
int x[100]; //в ОП по адресу х выделяется участок размером 100 умноженное на размер типа int, 4 байта.
float a[200]; //в ОП по адресу a выделяется участок размером 200 умноженное на размер типа float, 4 байта.
Размер массива можно определить:
Число_байтов = sizeof (тип_элемента) * число элементов;
Количество элементов можно определить:
Кол._элем. = sizeof (имя_массива) / sizeof (тип_элемента);
Обязательные условия при объявлении массива:
Размерность – это целое положительное константное выражение.
Тип элемента в одномерном массиве – простой (скалярный).
Количество элементов обязательно надо указать в одномерном массиве, если не проводится инициализация.
В массиве каждый элемент обрабатывается отдельно.
Доступ к каждому элементу массива осуществляется по имени массива и порядковому номеру элемента, указанного в квадратных скобках (индексу).
Пример индексации элементов массива
array [ 2 ] ; // третий элемент массива array
a [ i + 2 ] ; // (i + 2)-ий элемент массива a
Каждому элементу одномерного массива соответствует один индекс.
Одномерный массив имеет одну меру измерения, в нем может быть n элементов, использовать можем k элементов, где n>=k. Каждый элемент стоит на i‑том месте, где i изменяется от 0 до k. Т.Е. 0<=I <= k, где k<=n. Компилятор не контролирует значение индексной переменной, это необходимо делать внутри программы.
Основные операции над массивом – инициализация.
Прежде чем использовать элементы массива в программе, необходимо его инициализировать, т.е. каждый элемент должен получить конкретное значение.
Это можно выполнить в трех случаях:
1. во время объявления;
2. во время присвоения каждому элементу конкретное значение;
3. во время считывания с устройства в/в по адресу элемента массива.
1 случай: инициализация выполняется во время объявления массива по формату: тип имя_массива [ N ] = { элемент0,…,элементN-1};
Пример инициализации одномерного массива простого типа в момент объявления массива
int m [ 3 ] = { 1, 10, 100 } ; //нулевой элемент равен 1, первый – 10. второй – 100.
unsigned short x [ 5 ] = { 3, 5 } ; // нулевой элемент равен 3; первый – 5; элементы, значения которых не указаны, обнуляются, т.е.второй, третий и четвертый элементы равны 0.Чтобы обнулить все элементы массива, достаточно при объявлении массива, нулевому элементу присвоить нуль
int mas [10] = {0};
double y [ ] = { 1.5, 7.38, -8.9, 0.0, 10.5 } ; //в квадратных скобках не указано количество элементов, оно определяется по количеству элементов в фигурных скобках.
char c [ 4 ] = { 'a', 'b', 'c', '\0' } ;
Пример поиска минимального элемента в одномерном массиве простого типа
#include <iostream>
using namespace std ;
int main ( )
{
// объявление и инициализация массива array
int array [ ] = { 5, -10, 123, -7, 25, -3, -77, 1, 7, 3 } ;
// вычисление size — количества элементов в массиве
int size = sizeof ( array ) / sizeof ( array [ 0 ] ) ;
// предположение, что минимальный элемент имеет индекс 0
int jMin = 0 ;
// цикл проверки элементов массива
for ( int j = 1; j < size; j++ )
if ( array [ j ] < array [ jMin ] )
jMin = j ;
// вывод массива
cout << "Elements of array\n" ;
for ( int j = 0; j < size; j++ )
cout << array [ j ] <<" "<< '\t' ;
// вывод минимального значения array [ jMin ]
cout << "\nMinimum = " << array [ jMin ] << endl ;
return 0 ;
}
2 случай: каждому элементу массива присвоить случайно выработанное число
#include <iostream>
using namespace std ;
const int N = 100 ; int fk; // fk – переменная по фактическое количество элементов
int main ( )
{
// объявление массива из 100 элементов целого типа
int array [ N ] ;
do{
cout << "\n Введите фактическое количество элементов \t";
cin >> fk;
}while (fk > N) ;
// цикл ввода элементов массива
for ( int j = 0; j < fk; j++ )
{
cout << "Enter array [" << j << "] -> " ;
array [j] = rand();
cout << array [ j ] <<" "<< '\n' ;
}
// вывод подсказки
cout << "\n\nThe entered array\n" ;
// цикл вывода элементов массива
for ( int j = 0; j < fk; j++ )
cout << array [ j ] <<" "<< '\t' ;
cout << endl ;
for ( int j = 0; j < fk; j++ )
{
cout << "Enter array [" << j << "] -> " ;
array [j] = rand()/N;
cout << array [ j ] <<" "<< '\n' ;
}
return 0 ;
}
3 случай:
Пример ввода/вывода одномерного массива простого типа
#include <iostream>
using namespace std ;
const int N = 100 ; int fk; // fk – переменная по фактическое количество элементов
int main ( )
{
// объявление массива из 100 элементов целого типа
int array [ N ] ;
do{
cout << "\n Введите фактическое количество элементов \t";
cin >> fk;
}while (fk < N) ;
// цикл ввода элементов массива
for ( int j = 0; j < fk; j++ )
{
cout << "Enter array [" << j << "] -> " ;
cin >> array [ j ] ;
}
// вывод подсказки
cout << "\n\nThe entered array\n" ;
// цикл вывода элементов массива
for ( int j = 0; j < fk; j++ )
cout << array [ j ] <<" "<< '\t' ;
cout << endl ;
return 0 ;
}
Пузырьковая сортировка.
#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;
void main ()
{
const int k = 100;
int fk; int i;
do
{
cout <<"fk = ";cin>>fk;
}
while (fk > k);
int mas[k];
// цикл ввода элементов массива
srand(( unsigned)time(NULL));
cout<<"\n isxod mas\n";
for ( i = 0; i < fk ; i++)
{
mas[i] = rand()%15+2;
cout<< mas[i]<<'\t';
}
bool pr = 0; int dmas; //предполагаем, что ряд не отсортирован
while (pr == false) //до тех пор пока ряд не отсортирован - сортируем
{
pr = true; //предположим, что не будет ни одной перестановки
for(i = 0; i < fk-1 ; i++)
{
if (mas[i] < mas[i+1])//если следующий элемент больше предыдущий
{
dmas = mas[i]; //делаем перестановку
//наибольший элемент
//переставляем вперед
mas[i] = mas[i+1];
mas[i+1] = dmas;
pr = false; //принимаем признак ложного ряда
}
}
}
cout<<"\n res mas \n";
for ( i = 0; i < fk ; i++)
{
cout<<mas[i]<<'\t';
}
// TODO: Add your control notification handler code here
}
Недостаток при использовании статического массива заключается в том, что резервируется ОП под массив на наибольшее количество элементов и закрепляется за программой до ее завершения, а используется фактически возможное, что меньше или равно выделенному участку. В результате этого ОП простаивает или используется не экономно.