Массив – это расположенные вплотную друг за другом в памяти элементы одного и того же типа. Каждый массив имеет имя. Доступ к отдельным элементам массива осуществляется по имени массива и индексу (порядковому номеру) элемента.
Основные свойства массива:
1) все элементы массива имеют один и тот же тип;
2) все элементы массива расположены в памяти друг за другом; индекс первого элемента равен 0.
Признаком массива при описании является наличие парных квадратных скобок [ ]. Константа или константное выражение в квадратных скобках задает число элементов массива.
Например:
int x[10]; // определяет массив типа int из 10 элементов x[0], x[1], //…, x[9]
float a[5]; // определяет массив типа float из 5 элементов a[0], a[1], //…, a[4]
Пример 5_1. В целочисленный массив m из 7 элементов ввести значения с клавиатуры, вычислить сумму всех элементов массива и вывести на экран исходный массив и результат расчета
#include "stdafx.h"
using namespace System;
int main()
{
int m[7];
int i, sum;
Console::WriteLine("Вводим данные в массив m:");
for (i = 0; i < 7; i++)
{
Console::Write("m[{0}]=", i);
m[i] = Convert::ToInt32(Console::ReadLine());
}
// расчет суммы всех элементов
sum = 0;
for (i = 0; i < 7; i++)
sum += m[i];
//вывод исходного массива и результата
Console::WriteLine("\n\nИсходный массив m");
for (i = 0; i < 7; i++)
Console::Write("{0,6}", m[i]);
Console::WriteLine("\nСумма элементов равна " + sum);
Console::ReadLine();
return 0;
}
Результаты работы программы:
m[0] = 100
m[1] = 1
m[2] = 2
m[3] = 3
m[4] = 10
m[5] = 20
m[6] = 300
<здесь одна пустая строка>
Исходный массив m
100 1 2 3 10 20 300
Сумма элементов равна 436
Вариант решения предыдущего примера в виде приложения Windows Forms
Создайте проект типа приложения Windows Forms и спроектируйте форму, представленную на рис.12 (все используемые компоненты подписаны)[2]
Рис. 12. Вид формы для решения задачи
Вид формы показывает, как работает программа. Очевидно, что пользователь должен ввести в поля редактирования значения элементов массива и сделать щелчок на кнопке «Сумма элементов». Для выхода из программы следует сделать щелчок на кнопке «Выход». Щелчок на изображении командной кнопки – это пример того, что называется событием.
Событие (Events) – это то, что происходит во время работы программы. Например, щелчок кнопкой мыши – это событие Click, двойной щелчок мышью – событие DbClick.
Реакцией на событие должно быть какое-либо действие. В Visual C++ реакция на событие реализуется как функция обработки события. Таким образом, для того чтобы программа в ответ на действия пользователя выполняла некоторую работу, программист должен написать функцию обработки соответствующего события.
Чтобы создать функцию обработки события, сначала надо выбрать компонент, для которого создается функция обработки события, затем в окне Свойств (Properties) щелчком на кнопке События (Events) , нужно открыть вкладку События. Далее на открывшейся вкладке выбрать нужное событие (сделать щелчок мышью на имени события).
Определите событие Click (щелчок кнопкой мышки) для кнопок «Сумма элементов» и «Выход». В результате этих действий в модуль формы (h-файл) будут добавлены функции обработки события:
Рис.13. Вид форма с заполненными исходными данными
Рис.14. Вид формы с вычисленным результатом
В соответствии с синтаксисом С++ в языке существуют только одномерные массивы, однако элементами одномерного массива, в свою очередь, могут быть массивы [3]. Поэтому двумерный массив определяется как массив массивов.
Например: float d[4][3];
В данном примере объявлен массив d из 4 элементов-массивов, каждый из которых, в свою очередь, состоит из 3 элементов типа.
При определении массивов возможна их инициализация [3], т.е. присваивание начальных значений их элементам. По существу (точнее, по результату), инициализация – это объединение определения объекта с одновременным присваиванием ему конкретного значения. Использование инициализации позволяет изменить формат определения массива. Например, можно явно не указывать количество элементов одномерного массива, а только перечислить их начальные значения в списке инициализации:
float f[ ] = { 1.0, 2.3, 2.7, -6.2, 9.3};
В данном примере длину массива компилятор вычисляет по количеству начальных значений, перечисленных в фигурных скобках. После такого объявления элемент f[0] равен 1.0, f[1] равен 2.3, f[2] равен 2.7 и т.д.
Если в определении массива явно указан его размер, то количество начальных значений не может быть больше количества элементов в массиве. Если количество начальных значений меньше, чем объявленная длина массива, то начальные значения получат только первые элементы массива (с меньшими значениями индекса):
int m[10] = { 8, 1, -2, 4};
В данном примере определены значения только элементов m[0], m[1], m[2] и m[3], равных соответственно 8, 1, -2 и 4. Элементы m[4], …, m[9] не инициализируются.
Правила инициализации многомерных массивов соответствуют определению многомерного массива как одномерного, элементами которого служат массивы, размерность которых на единицу меньше, чем у исходного массива. Одномерный массив инициализируется заключением в фигурные скобки списком начальных значений. В свою очередь, начальное значение, если оно относится к массиву, также представляет собой заключенный в фигурные скобки список начальных значений.
Элементы многомерных массивов хранятся в памяти в порядке возрастания самого правого индекса (или, как иногда говорят, по строкам). Список начальных значений, задаваемых при описании массива, соответствует порядку элементов в памяти.
Например, int x[3][4]; // объявили массив х целого типа, в котором 3 строки и 4 столбца:
Для обращения к элементу двумерного массива используются номера строки и столбца. В представленном массиве элементу x[1][2] присвоено число 15.
Пример 5_2. В целочисленный массив с размерностью 3 на 5 ввести значения с клавиатуры, вычислить сумму всех элементов массива и вывести на экран исходный массив и результат расчета using System;
#include "stdafx.h"
using namespace System;
int main()
{
int c [3][5];
int i, j;
int sum = 0;
Console::WriteLine("Вводим данные в массив c:");
for (i = 0; i < 3; i++)
for (j = 0; j < 5; j++)
{ Console::Write("c[{0}][{1}]=", i, j);
c[i][j] = Convert::ToInt32(Console::ReadLine());
}
// расчет суммы всех элементов
sum = 0;
for (i = 0; i < 3; i++)
for (j = 0; j < 5; j++)
sum += c[i][j];
//вывод исходного массива и результата
Console::WriteLine("\n\nИсходный массив c");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
Console::Write("{0,8}", c[i][j]);
Console::WriteLine();
}
Console::WriteLine("\nСумма элементов равна " + sum);
Console::ReadLine();
return 0;
}
Результат работы программы:
Вводим данные в массив с:
c[0,0]= 1
…
c[2,4]= 2
Исходный массив с
1 1 100 1 1
20 30 1 1 1
100 200 1 1 2
Сумма элементов равна 461
Для инициализации многомерного массива достаточно заключить в фигурные скобки список инициализаторов каждого его размера.
Пример 5_3. Демонстрация инициализации двумерного массива при создании.
#include "stdafx.h"
using namespace System;
int main()
{
int x[2][3] = { {100, 2, 30} , { 4, 50, 6 } };
int i, j, sum=0;
for (i = 0; i < 2; i++)
for(j=0; j < 3; j++)
sum += x[i][j];
Console::WriteLine("Исходный массив x");
for (i = 0; i < 2; i++)
{
for (j = 0; j < 3; j++)
Console::Write("{0,6}", x[i][j]);
Console::WriteLine();
}
Console::WriteLine("\nСумма элементов равна {0}", sum);
Console::ReadLine();
return 0;
}
Результат работы программы:
Исходный массив x
100 2 30
4 50 6
Сумма элементов массива равна 192
Строки
Строка является упорядоченной коллекцией символов Юникода, используемой для представления текста. Для работы со строками в CLR-проекте используется класс String.
String ^str = “Работа со строками в С++”; // здесь объявлена ссылочная
Compare(String ^s1, String ^s2); - сравнивает s1 и s2 и возвращает целое число, которое показывает их относительное положение в порядке сортировки:
меньше нуля - значение параметра s1 меньше значения параметра s2.
0 - значения параметров s1 и s2 равны.
больше нуля - значение strA больше значения strB.
Пример 5_5. Сравнение строк
#include "stdafx.h"
using namespace System;
int main()
{
String ^s1="ABC", ^s2="ADC";
int k;
k=String::Compare(s1,s2);
Console::WriteLine("k="+k);
Console::ReadLine();
return 0;
}
Результат работы со строками:
k=-1
IndexOf(String ^s1, int); - Возвращает индекс с отсчетом от нуля первого вхождения значения указанной строки s1 в данном экземпляре. Поиск начинается с указанной позиции знака (если позиция не указана, то отсчет начинается с нуля).
LastIndexOf(String ^s1, int); - Возвращает индекс с отсчетом от нуля последнего вхождения значения указанной строки s1 в данном экземпляре. Поиск начинается с указанной позиции знака (если позиция не указана, то отсчет начинается с нуля).
Пример 5_6. Поиск подстроки в строке.
#include "stdafx.h"
using namespace System;
int main()
{
String ^s1="Программирование";
int first, last, x;
first=s1->String::IndexOf("р");
last=s1->String::LastIndexOf("р");
Console::WriteLine("Определение позиций буквы \'р\'в слове " +
"\"программирование\" ");
Console::WriteLine("Позия первой буквы \'р\' = " + first);
Console::WriteLine("Позия последней буквы \'р\' = " + last);
x=s1->String::IndexOf("р",(first+1));
Console::WriteLine("Позиция 2-й буквы \'р' = " + x);
Console::ReadLine();
return 0;
}
Результат работы со строками:
Определение позиции буквы 'р' в слове "программирование"