русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Объявление одномерных массивов


Дата добавления: 2015-08-14; просмотров: 5386; Нарушение авторских прав


Тема 8. Массивы

Массив (array) в программировании - это упорядоченная совокупность однотипных элементов. Массивы широко используют для хранения и обработки однородной информации, например, таблиц, векторов, матриц и др.

Каждый элемент массива однозначно определяется именем и индексами. Имя массива (идентификатор) подбирают по тем же правилам, что и для переменных. Индексы определяют местоположение элемента в массиве. Например, элементы вектора имеют один индекс - номер по порядку; элементы матриц и таблиц имеют по два индекса: первый определяет номер строки, второй - номер столбца. Количество индексов определяет размерность массива. Например, векторы в программах - это одномерные массивы, матрицы - двумерные. Пока будут рассматриваться только одномерные массивы.

Объявление одномерных массивов

Одномерный массив объявляется в программе следующим образом:

тип_данных имя_массива [размер_массива];

Имя­­_массива - это идентификатор массива. Тип_данных задает тип элементов объявляемого массива. Размер_массива в квадратных скобках задает количество элементов массива. В отличие от языка Pascal, в С не проверяется выход за пределы массива, поэтому, чтобы избежать ошибок в программе, нужно следить за размерами описанных массивов.

Используя имя массива и индекс, можно адресоваться к элементам массива:

имя массива [ значение_индекса ]

Значения индексов должны лежать в диапазоне от нуля до величины, на единицу меньшей чем размер массива, указанный при его описании, поскольку в языке C++ нумерация индексов всегда начинается с нуля.

Например:

int A[10];

объявляет массив с именем А, содержащий 10 целых чисел. А[0] - значение первого элемента, А[1] - второго, А[9] - последнего.

Типу массива соответствует память, которая требуется для размещения всех его элементов. Элементы массива с первого до последнего запоминаются в последовательных возрастающих адресах памяти. Между элементами массива в памяти разрывы отсутствуют. Элементы массива запоминаются друг за другом поэлементно. Так, под размещение элементов одномерного массива int В[5] выделяется по 4 байта под каждый из 5-ти элементов массива - всего 20 байтов.



 

Элементы В[0] В[1] В[2] В[3] В[4]
Байты
                                         

Таким образом, чтобы получить доступ к i-тому элементу массива В, можно написать В[і]. При этом величина i умножается на размер типа int и представляет собой адрес і-го элемента массива В от его начала, после чего осуществляется выборка элемента массива В по сформированному адресу.

Идентификатор, объявляемый как массив, представляет указатель, значение которого является адресом первого элемента массива. Отметим, что адрес массива не может быть изменен во время выполнения программы, хотя значение отдельных элементов может изменяться.

Вот несколько примеров описания массивов:

char N [ 20 ];

int grades [ 125 ];

float mass [ 30 ];

double vector[ 1500 ];

Первый из массивов N содержит 20 символов. Обращением к элементам массива может быть N[0], N[1], ..., N[19].

Второй массив grades содержит 125 целых чисел. Обращением к элементам массива может быть grades [0], grades [1], ..., grades[124].

Третий массив mass содержит 30 вещественных чисел. Обращением к элементам массива может быть mass[0], mass[1], ..., mass[1499].

При объявлении массивов можно элементам массива (необязательно всем) присваивать первоначальные значения, которые в дальнейшем в программе могут быть изменены. Если количество инициализируемых значений меньше, чем размерность массива, то всем остальным элементам массива присваивается значение 0.

Например:

int a[5] = {9, 33, -23, 8, 1}; // а[0]=9, а[1]=33, а[2]=-23, а[3]=8, а[4]=1

float Q[10] = {1.5, -3.8, 10}; // Q[0]=1.5, Q[1]= -3.8, Q[2]=10, Q[3]=Q[4]= ...=Q[9]=0

В последнем примере указаны только три первых элемента, соответственно, все остальные до конца массива будут равны 0.

Примеры задач с использованием массивов

Задача 1. Ввести одномерный массив из 8 вещественных элементов в Мемо и вычислить сумму всех элементов массива.

Пример формы с результатами работы приведен на рисунке 1. На форме расположены компоненты Memo1, Edit1, Label 1, Button1, Button2, Button3. Кнопки «Очистка» и «Выход» не рассматриваем, так как их код уже использовался в предыдущих темах.

Рисунок 1 – Форма программы

Текст программы:

void fastcall TForm1::Button1Click(TObject *Sender) // Кнопка «Сумма»

{ float A[8], sum = 0; // объявляем массив из 8 элементов типа float и сумму

for (int i = 0; i < 8; i++) // создаем цикл для считывания каждого элемента массива. Еще //один вариант записи цикла такой: for (int i=0; i<=7; i++). На выбор один из двух //вариантов

{ A[i] = StrToFloat(Memo1->Lines->Strings[i]); // сам процесс считывания значения i-го // элемента массива из i-ой (соответствующей) строки Мемо, т.е. судя по форме, A[0]=1.3, // A[1]=0.137 и т.д.

sum += A[i]; } // добавляем к сумме i-ый элемент массива и завершаем тело цикла

Edit1->Text = FormatFloat("0.000", sum) ; } // выводим сумму

Задача 2. Создать одномерный массив из 15 элементов по формуле Ai = lg(i) + tg(2i) , где і = 1, 2, ..., 15 и вывести их на форму, а также определить минимальный элемент и его порядковый номер.

Схема алгоритма программы и пример вида формы с результатами работы приведены на рисунках 2, 3 и 4. На форме расположены компоненты Memo1, Edit1, Button1, Button2.

Рисунок 2 – Форма программы

Текст программы:

float A[15]; int i; // объявляем массив и индекс его элементов. Объявляется ДОкнопок

void fastcall TForm1::Button1Click (TObject*Sender) // Кнопка «Вычисление вектора»

{Memo1->Clear(); //эта запись очищает поле Мемо перед использованием (необязательно)

for (i = 0; i < 15; i++) // цикл для создания массива

{ A[i] = log10(i + 1) + tan(pow(2, i+1)); // вычисление i-го элемента по формуле. Здесь //используется i+1 вместо i, потому что индекс в С++ начинается с 0, но соответствует //первому элементу массива (i=1 математически). Поэтому i увеличивается на 1.

Memo1->Lines->Add(FormatFloat("0.000", A[i]));}//выводим (добавляем) посчитанный i-ый //элемент массива в Мемо

}// конец функции кнопки

После нажатия этой кнопки, создастся массив в памяти программы ( а также выведется в Мемо, чтобы пользователь видел его элементы, иначе массив будет существовать, но мы не будем знать его элементы) и будет там храниться, пока программа не будет закрыта, т.е. любые последующие кнопки (будь то ода кнопка, две, три и т.д.) могут использовать этот массив без его объявления в самой кнопке, т.к. они будут знать, что он существует, и будут к нему обращаться.

void fastcall TForm1::Button2Click(TObject *Sender) // Кнопка «Минимальный элемент»

{ float min = A[0]; // объявляем переменную под мин. элемент и даем ей значение первого //элемента, чтобы было от чего отталкиваться

int ind = 0; //объявляем переменную под индекс и присваиваем ей индекс первого элемента

for (i = 1; i < 15; i++) // создаем цикл для нахождения мин. элемента, но уже не с 0, а с 1, //т.к. значение первого элемента уже хранится в переменной min

{if (min > A[i]) // условие проверки на минимальность. Если i-ый элемент меньше min, то //логично, что min уже не минимальный, поэтому мы выполняем следующую строку

{ min=A[i]; ind=i; }}//присваиваем значение i-го элемента переменной min, т.е. теперь i-ый //элемент будет минимальным, ну и, соответственно, индекс минимального эл. будет i

Edit1->Text = FormatFloat("0.000", min) + " индекс - " + IntToStr(ind + 1);} // выводим //минимальный элемент в Эдит вместе с его индексом. Можно также вывести индекс в //отдельный Эдит. Мы выводим не просто ind, а ind+1 потому, что мы найдем индекс мин. элемента, но этот индекс С++овский, а реальный индекс на 1 больше.

Рисунок 3 – Схема для кнопки «Вычисление вектора»

Рисунок 4 – Схема для кнопки «Минимальный элемент»

Задача 3. Ввести массив из N целых элементов в Мемо. Все нечетные элементы (по значению, а не по индексу) заменить единицами, а четные элементы - нулями.

Схема алгоритма программы представлена на рисунке 5.

Текст программы:

void fastcall TForm1::Button1Click(TObject *Sender)

{ int V[50]; // объявляем массив из 50 элементов, ведь мы не знаем, какое будет N, а //программа должна выделить определенное количество памяти под массив для хранения //его элементов, поэтому задаем любое значение размерности. Но теперь N должно быть //меньше или равно 50, чтобы не было ошибок.

int N=StrToInt(Edit1->Text); // задаем размер массива (N<=50)

for (int i = 0; i < N; i++) // создаем цикл для считки элементов

{ V[i] = StrToInt(Memo1->Lines->Strings[i]); // процесс считывания

if (V[i] % 2==0) // ставим условие на четность

{V[i] = 0; } // если i-ый элемент – четный, то он равняется 0

else {V[i]=1;} // иначе i-ый элемент будет равен 1

Memo2->Lines->Add(IntToStr(V[i]));} // выводим уже замененный элемент в новое Мемо

}

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

Рисунок 5 – Схема программы

Задача 4. Создать массив изN элементов (до 30) по формуле vi = 3 cos(4i) + е-2i и вывода их на форму проекта в компонент Memo. Найти:

1) произведение ненулевых элементов вектора;

2) количество отрицательных элементов вектора;

3) поменять местами первый элемент вектора с минимальным

Для решения поставленных задач разработать отдельные кнопки для вычисления определенной задачи. Форма проекта с результатами и схемы алгоритмов для всех кнопок показаны на рисунках 6 – 8.

Рисунок 6 – Форма программы

Текст программы:

float v[30]; int i, N; // создаем глобальные переменные (ДОкнопок), чтобы все кнопки //могли пользоваться этими переменными

void fastcall TForm1::Button1Click(TObject *Sender) // Кнопка «Вектор»

{ Memo1->Clear();

N = StrToInt(Edit1->Text); // Ввод количества элементов массива

for(i = 0; i < N; i++)

{ v[i] = 3 * cos(4 * (i + 1)) + exp(-2 * (i + 1)); //вычисление элементов по формуле (не //забываем, что здесь не просто i, а i+1)

Memo1->Lines->Add(FormatFloat("0.000", v[i])); //вывод на форму

}

//---------------------------------------------------------------------------------------------------------------

void fastcall TForm1::Button2Click(TObject *Sender)// Кнопка ««Произведение ненулевых //элементов»

{ float P = 1; // перед произведением переменная Р=1

for(i = 0; i < N; i++)

{if(v[i] != 0)

{P *= v[i];}} // в Р накапливаем произведение ненулевых v[i]

Edit2->Text = FloatToStr(P); // Вывод результата

}

//----------------------------------------------------------------------------------------------------------

void fastcall TForm1::Button3Click(TObject *Sender)//Кнопка «Количество элементов < 0»

{ int kol = 0; // вначале переменная kol=0

for(i = 0; i < N; i++)

{if(v[i] < 0)

{kol++;}} // если элемент отрицательный, k увеличивается на 1

Edit3->Text=IntToStr(kol); // Вывод результата

}

//------------------------------------------------------------------------------------------------------------------

void fastcall TForm1::Button4Click(TObject *Sender) // Кнопка «Перестановка»

{ float min=v[0], temp; // Вначале считаем, что первый элемент является минимальным. //Также создаем переменную под временное хранения элемента массива (для замены)

int ind=0; // И его индекс нулевой

for(i = 1; i < N; i++) // В цикле, начиная со второго элемента, проверяем условие

{if (v[i] < min) // если найден элемент меньше,

{ ind = i; // запоминаем индекс (расположение) элемента

min = v[i]; }} // и его значение.

temp = v[0]; // Храним в переменной temp значение первого элемента

v[0] = min; // На месте первого элемента будет уже минимальный элемент

v[ind] = temp; // А минимальному присваиваем значение первого элемента (temp хранит)

for(i = 0; i < N; i++)

{Memo2->Lines->Add(FormatFloat("0.000", v[i]));} // Вывод массива

}

Рисунок 7 – Схема для кнопки «Вектор»

Рисунок 8 – Схемы для кнопок: а) «Произведение …», б) «Количество…»,

в) «Перестановка»

 

Д/з

1. Ввести массив из 11 целых чисел через Мемо. Найти среднее арифметическое всех элементов.

2. Создать массив из 10 элементов по формуле: Вi = . Найти максимальный элемент.

3. Ввести массив из N целых чисел через Мемо. Найти количество элементов, которые больше 3.

4. Ввести массив из R вещественных чисел через Мемо. Если какой-то из элементов массива равен 0 (предполагаем что может быть только один нулевой элемент или вообще ни одного), вывести сообщение: «Элемент с индексом … равен 0». Иначе вывести сообщение: «В массиве нет нулевых элементов!».

5*. Создать массив из 25 элементов по формуле: fi = . Найти произведение нечетных элементов (по индексам, непо значениям). Заменить максимальный элемент массива на среднее арифметическое всех элементов и вывести полученный массив в другое Мемо.

Примечание. Нечетный элемент – это элемент с математическимииндексами i=1,3,5,7…25.

Удачи!

И да прибудет с вами сила)



<== предыдущая лекция | следующая лекция ==>
Сравнимость по модулю | Введение.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.116 сек.