Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Одномерные массивы: объявление, инициализация, задачи поиска, замены и перестановок элементов массива↑ Стр 1 из 5Следующая ⇒ Содержание книги
Поиск на нашем сайте
Одномерные массивы: объявление, инициализация, задачи поиска, замены и перестановок элементов массива Массив – именованная последовательность областей памяти, хранящих однотипные элементы. Каждая такая область памяти называется элементом массива. Массивы обладают размерностью (большей или равной единице), которой задается число элементов, содержащихся в них, а также измерением, что предполагает возможность описания в программе одно- и многомерных массивов. Количество элементов в массиве называется его размером. Простейшим аналогом двумерного массива может быть таблица, а трехмерного – несколько таблиц одинакового размера. Математические объекты типа вектор и матрица – примеры аналогов (соответственно одно- и двумерных) массивов. Тип элемента массива может быть одним из базовых (скалярных), типом другого массива, типом указателя, типом структуры или объединения. Элементы массива в С++ нумеруется, начиная с нуля. У одномерных массивов после его имени указывается один индекс (порядковый номер), заключенный в прямоугольные скобки [ ], а у многомерных – несколько, каждый из которых заключается в [ ]. Последнее означает, что многомерный массив создается путем определения массива из элементов типа массив. Все элементы массива имеют одно имя – имя массива и отличаются индексами – порядковыми номерами в массиве. В определении массива можно задать его размерность по каждому измерению. Допустимо явное задание массива либо с помощью указателя (объекта, хранящего адрес начала области набора значений). Резервирование памяти для массива выполняется на этапе компиляции программы. При объявлении массива компилятор выделяет для него последовательность ячеек памяти, для обращения к которым в программе применяется одно и то же имя. В то же время массив позволяет получить прямой доступ к своим отдельным элементам. 1. Объявление одномерных массивов. Синтаксис определения массива без дополнительных спецификаторов и модификаторов имеет два формата: Тип ИмяМассива[ВыражениеТипаКонстанты]; или Тип ИмяМассива[]; ИмяМассива – идентификатор массива. Тип – тип элементов объявляемого массива. Элементами массива не могут быть функции, файлы и элементы типа void. ВыражениеТипаКонстанты – задает количество элементов (размерность) массива. Выражение константного типа вычисляется на этапе компиляции. Данное константное выражение может быть опущено в случаях если: · при объявлении массив инициализируется; · массив объявлен как формальный параметр функции; · массив объявлен как ссылка на массив, явно определенный в другом файле. Например: 1.int a[100]; //массив из 100 элементов целого типа 2.double d[14]; // массив из 14 элементов типа double 3.char s[]="Программирование"; // символьный массив 4. const int t=5, k=8; 5. float wer[2*t+k]; 6. //массив из 2*t+k элементов вещественного типа 7. int sample[853]; 8. /*массив из элементов sample[0], sample[1], 9. sample[2],...,sample[852] типа int*/ равносильно объявлению const int N_max=853; int sample[N_max]; равносильно объявлению #define N_max 853 ... int sample[N_max]; В языке С++ не производится проверки границ массивов: таким образом, исполнение кода не остановится при выходе за границы массива. Если переполнение массива происходит во время выполнения оператора присваивания, то лишние значения могут присвоиться другим переменным или включиться в текст программы. С другой стороны, можно объявить массив размером N и указать индекс элемента, выходящий за пределы N, что не приведет к появлению сообщений об ошибке, как на шаге компиляции, так и на шаге выполнения, даже если это послужит причиной аварийного завершения программы. Пример 1. Определение размера памяти одномерного массива. #include "stdafx.h"#include <iostream>using namespace std;#define v 4#define p 3 int _tmain(int argc, _TCHAR* argv[]){ const int q=4, r=1; int i_mas[10]; int k=sizeof(i_mas); cout << "i_mas[10] занимает " << k << " байт\n"; float f_mas[7]={2.0,4.5,8.3,7.0,1.0}; int t=sizeof(f_mas); cout << "f_mas[7]={2.0,4.5,8.3,7.0,1.0} занимает "<< t <<"байт\n"; double d_mas[2*q-r]; int w=sizeof(d_mas); cout << "d_mas[2*q-r] занимает " << w << " байт\n"; double d1_mas[2*v/p]; int w1=sizeof(d1_mas); cout << "d1_mas[2*v/p] занимает " << w1 << " байт\n"; char c_mas[]="Программирование"; int s=sizeof(c_mas); cout << "c_mas[]=\"Программирование\"занимает"<< s <<"байт\n"; system("pause"); return 0;}Результат выполнения программы: i_mas[10] занимает 40 байт – 4 байта (тип int) * 10 (количество элементов массива) f_mas[7] = {2.0,4.5,8.3,7.0,1.0} занимает 28 байт – 4 байта (тип float) * 7 (объявленное количество элементов массива) d_mas[2*q-r] занимает 56 байт – 8 байт (тип double) * 7 (вычисленное через формулу количество элементов массива) d1_mas[2*v/p] занимает 16 байт – 8 байт (тип double) * 2 (вычисленное через формулу количество элементов массива) c_mas[]="Программирование" занимает 17 байт – 1 байт (тип char) * 17 (16 знаков + нулевой байт '\0') Вывод одномерных массивов Вывод массивов также целесообразно оформлять в виде отдельной функции. Так как функция вывода не изменяет значения элементов массива, то в качестве одного из параметров такой функции выступает сам массив или указатель на массив. Одномерные массивы удобно выводить в строку или в столбец в зависимости от задачи (Пример 3 и 4). Для организации вывода также используют цикл по индексам элементов или арифметические операции с указателем на массив. Пример 3. /*Генерация целочисленного массива числами с клавиатуры и вывод массива в строку*/ #include "stdafx.h" #include <iostream> using namespace std; #define max 20
void gen (int k,int *pp);//прототип функции генерации массива void out (int k,int x[max]);//прототип функции вывода массива
int _tmain(int argc, _TCHAR* argv[]){ int a[max],n,*p; do { printf("\nВведите количество элементов массива n (n<=20):"); scanf ("%d",&n); } while (n>max); //проверка выхода за границы массива p=a; gen(n,p); out(n,a); system("pause"); return 0; }
//Описание функции генерации массива с клавиатуры void gen(int k,int *pp){ /*передача указателя как параметра позволяет вернуть сформированный массив в основную программу*/ int i; printf("\nВведите значения %d элементов массива: \n",k); for (i=0;i<k;i++){ printf("x[%d]= ",i); scanf("%d",pp++); } }
//Описание функции вывода массива в строку void out (int k,int x[max]){ int i; printf("\nВывод значений %d элементов массива в строку: \n",k); for (i=0;i<k;i++) printf("%d\t",x[i]); }
Пример 4. /*Описание функции генерации массива значениями элементов арифметической прогрессии*/ void gen(int k,int x[max]) { int i,d; printf ("\nВведите нулевой элемент прогрессии: "); scanf("%d",&x[0]); printf ("\nВведите разность прогрессии: "); scanf("%d",&d); for (i=1;i<k;i++) x[i]=x[i-1]+d; } Пример 5. //Описание функции вывода массива в столбец void out (int k,int x[max]){ int i; printf("\nВывод значений %d элементов массива в столбец: \n",k); for (i=0;i<k;i++) printf("x[%i]= %d\n",i,x[i]); } Для использования функции генерации случайных чисел необходимо подключить библиотеку <time.h>. Для написания кода генерации массива случайными целыми числами используется: 1.Функция srand(). Синтаксис: void srand(unsigned seed); – функция устанавливает свой аргумент как основу (seed) для новой последовательности псевдослучайных целых чисел, возвращаемых функцией rand (). Сформированную последовательность можно воспроизвести. Для этого необходимо вызвать srand() с соответствующей величиной seed. Для использования данной функции необходимо подключить библиотечный файл <stdlib.h>. 2.Функция rand (). Синтаксис: int rand(void); – функция возвращает псевдослучайное число в диапазоне от нуля до RAND_MAX. Для использования данной функции необходимо подключить библиотечный файл <stdlib.h>. 3.Константа RAND_MAX определяет максимальное значение случайного числа, которое может быть возвращено функцией rand (). Значение RAND_MAX – это максимальное положительное целое число. 4.Часто в задачах требуется выполнить генерацию массива на произвольном промежутке [a,b). Для этого используются следующие выражения: 5. //генерация случайных целых чисел на [a,b) 6. x[i]=rand()%(b-a)+a; 7. //генерация случайных вещественных чисел на [a,b) y[i]= rand()*1.0/(RAND_MAX)*(b-a)+a; Пример 6. /*Описание функции генерации массива случайными вещественными числами на[a,b)*/void gen(int k,int a, int b, float x[max]){ int i; srand(time(NULL)*1000); //устанавливает начальную точку генерации случайных чисел for (i=0;i<k;i++){ x[i]=(rand()*1.0/(RAND_MAX)*(b-a)+a); //функция генерации случайных чисел на [a,b) }}Задачи поиска в массивах Решение задач данного вида сводится к установлению того, как обрабатывается каждый элемент или указанные элементы. Затем подбирается подходящая схема перебора, в которую вставляются операторы обработки элементов массива. Пример 7. Найдем минимальный элемент в одномерном целочисленном массиве, заданном случайными числами на промежутке [-100; 100). Один из алгоритмов поиска минимального элемента в массиве таков. Будем формировать значение минимального элемента в переменной min. Предположим, что минимальный элемент массива равен нулевому (min=x[0]). Затем выполним просмотр массива с первого элемента до последнего (for (i=1;i<k;i++)). Каждый элемент массива сравниваем со значением переменной min. Если значение очередного i -го элемента массива меньше min, то выполняем присваивание min=x[i]. //Поиск наименьшего элемента в массиве #include "stdafx.h"#include <iostream>using namespace std;#include <time.h> //подключение модуля для генератора случайных чисел#define max 100 void gen (int k,int a, int b,int x[max]); //прототип функции генерации массиваvoid out (int k,int x[max]);//прототип функции вывода массиваint minimum (int k,int x[max]); //прототип функции поиска минимального элемента int _tmain(int argc, _TCHAR* argv[]){ int mas[max],n; do { printf("\nВведите количество элементов массива n (n<=100):"); scanf ("%d",&n); } while (n>max); gen(n,-100,100,mas); out(n,mas); printf ("\nНаименьший элемент в массиве равен %d", minimum(n,mas)); system("pause"); return 0;} //Описание функции генерации массиваvoid gen(int k,int a, int b, int x[max]){ int i; srand(time(NULL)*1000); //устанавливает начальную точку генерации случайных чисел for (i=0;i<k;i++){ x[i]= rand()%(b-a)+a; //функция генерации случайных чисел на [a,b) }}//Описание функции вывода массива в строкуvoid out (int k,int x[max]){ int i; printf("\nВывод значений %d элементов массива в строку: \n",k); for (i=0;i<k;i++) printf("%-6d",x[i]);}//Описание функции поиска минимального элементаint minimum (int k,int x[max]) { int i,min=x[0]; for (i=1;i<k;i++) if (min>x[i]) min=x[i]; return min;}Пример 8. Найдем среднее арифметическое элементов одномерного вещественного массива, заданного с клавиатуры. //Поиск среднего арифметического элементов массива#include "stdafx.h"#include <iostream>using namespace std;#include <time.h>//подключение модуля для генератора случайных чисел#define max 100 void gen (int k, float x[max]); //прототип функции генерации массиваfloat sred_arifm (int k, float x[max]); /*прототип функции поиска среднего арифметического элементов массива*/ int _tmain(int argc, _TCHAR* argv[]){ float mas[max]; int n; do { printf("\nВведите количество элементов массива n (n<=100):"); scanf ("%d",&n); } while (n>max); gen(n,mas); printf ("\nСреднее арифметическое массива равно %f", sred_arifm(n,mas)); system("pause"); return 0;} //Описание функции генерации массива с клавиатурыvoid gen(int k, float x[max]){ int i; printf("\nВведите значения %d элементов массива: \n",k); for (i=0;i<k;i++){ printf("x[%d]= ",i); scanf("%f",&x[i]); }}/*Описание функции поиска среднего арифметического элементов массива*/float sred_arifm (int k, float x[max]) { int i; float sum=0.0; for (i=0;i<k;i++) sum+=x[i]; //вычисление суммы элементов массива return sum/k;}Задачи замены в массивах предполагают решение задачи на поиск с последующим изменением найденных значений. В основе решения таких задач лежат поисковые алгоритмы с выбором подходящей схемы перебора. Пример 9. Дан одномерный целочисленный массив, заданный случайными числами на промежутке [-50; 50). Заменить в массиве все отрицательные элементы на элементы им противоположными. Для решения задачи выполним просмотр массива с начала. Каждый элемент сравним с нулем, при этом отрицательные значения элементов заменим им противоположными (if (x[i]<0) x[i]=-x[i]). В данной задаче целесообразно выполнить вывод массива дважды: до и после замены. //Замена отрицательных значений элементов противоположными#include "stdafx.h"#include <iostream>using namespace std;#include <time.h>//подключение модуля для генератора случайных чисел#define max 100 void gen (int k, int a, int b,int x[max]); //прототип функции генерации массиваvoid out (int k, int x[max]); //прототип функции вывода массиваvoid zamena (int k, int x[max]);//прототип функции замены int _tmain(int argc, _TCHAR* argv[]){ int mas[max]; int n; do { printf("\nВведите количество элементов массива n (n<=100):"); scanf ("%d",&n); } while (n>max); gen(n,-50,50,mas); printf("Вывод сгенерированного массива из %d элементов: \n", n); out(n,mas); zamena (n,mas); printf("\nВывод массива после замены отрицательных элементов на протипоположные:\n"); out(n,mas); system("pause"); return 0;} //Описание функции генерации массива void gen(int k,int a, int b, int x[max]){ int i; srand(time(NULL)*1000); for (i=0;i<k;i++){ x[i]=rand()%(b-a)+a; }}//Описание функции вывода массива в строкуvoid out (int k,int x[max]){ int i; for (i=0;i<k;i++) printf("%-6d",x[i]);} //Описание функции заменыvoid zamena(int k,int x[max]){ int i; for (i=0;i<k;i++) if (x[i]<0) x[i]=-x[i];}Задания для выполнения 1. Объявите одномерный вещественный массив, в котором 10 элементов. Выполните генерацию массива, используя закономерность: 0; 0,1; 0,12; 0,123,… Выведите массив на экран в столбик. Оформите генерацию и ввод массива с помощью функций. 2. Объявите одномерный целочисленный массив, в котором 15 элементов. Выполните генерацию массива первыми 15 числами Фибоначчи. Выведите массив на экран в строку. Оформите генерацию и ввод массива с помощью функций. 3. Даны два натуральных числа a и b (a<b). Объявите одномерный целочисленный массив, в котором 10 элементов. Выполните генерацию массива первыми десятью цифрами дробной части частного a/b. Выведите массив на экран в столбец. Оформите генерацию и ввод массива с помощью функций. Например, для a =7, b =23 значениями элементов массива будут числа: 3 0 4 3 4 7 8 2 6 0. 4. Объявите одномерный целочисленный массив, в котором не более 100 элементов. Выполните генерацию массива первыми 100 простыми числами. Выведите массив на экран в строку (или в строки по 10 элементов в каждой). Оформите генерацию и вывод массива с помощью функций. 5. Дан одномерный целочисленный массив из N элементов, заданных с клавиатуры. Найти: количество и процентное соотношение положительных, отрицательных и нулевых элементов. 6. Дан одномерный целочисленный массив из N элементов, заданных случайными числами на промежутке [a; b). Заменить все элементы массива, кратные 3, на сумму их цифр. 7. Дан одномерный вещественный массив из N элементов (N – нечетное), заданных случайными числами на промежутке [a; b). Поменять местами элементы симметричные относительно центрального. 8. Дан одномерный целочисленный массив из N элементов, заданных случайными числами на промежутке [a; b). Поменять местами первый минимальный и последний максимальный элементы. 9. Дан одномерный вещественный массив из N элементов, заданных случайными числами на промежутке [a; b). Выполните циклический сдвиг элементов с n -ой позиции вправо на k позиций. 10. Индивидуальное задание. Дан одномерный целочисленный массив из N элементов, заданных случайными числами на промежутке [a; b). Оформите генерацию, вывод массива с помощью функций.
Одномерные массивы: объявление, инициализация, задачи поиска, замены и перестановок элементов массива Массив – именованная последовательность областей памяти, хранящих однотипные элементы. Каждая такая область памяти называется элементом массива. Массивы обладают размерностью (большей или равной единице), которой задается число элементов, содержащихся в них, а также измерением, что предполагает возможность описания в программе одно- и многомерных массивов. Количество элементов в массиве называется его размером. Простейшим аналогом двумерного массива может быть таблица, а трехмерного – несколько таблиц одинакового размера. Математические объекты типа вектор и матрица – примеры аналогов (соответственно одно- и двумерных) массивов. Тип элемента массива может быть одним из базовых (скалярных), типом другого массива, типом указателя, типом структуры или объединения. Элементы массива в С++ нумеруется, начиная с нуля. У одномерных массивов после его имени указывается один индекс (порядковый номер), заключенный в прямоугольные скобки [ ], а у многомерных – несколько, каждый из которых заключается в [ ]. Последнее означает, что многомерный массив создается путем определения массива из элементов типа массив. Все элементы массива имеют одно имя – имя массива и отличаются индексами – порядковыми номерами в массиве. В определении массива можно задать его размерность по каждому измерению. Допустимо явное задание массива либо с помощью указателя (объекта, хранящего адрес начала области набора значений). Резервирование памяти для массива выполняется на этапе компиляции программы. При объявлении массива компилятор выделяет для него последовательность ячеек памяти, для обращения к которым в программе применяется одно и то же имя. В то же время массив позволяет получить прямой доступ к своим отдельным элементам. 1. Объявление одномерных массивов. Синтаксис определения массива без дополнительных спецификаторов и модификаторов имеет два формата: Тип ИмяМассива[ВыражениеТипаКонстанты]; или Тип ИмяМассива[]; ИмяМассива – идентификатор массива. Тип – тип элементов объявляемого массива. Элементами массива не могут быть функции, файлы и элементы типа void. ВыражениеТипаКонстанты – задает количество элементов (размерность) массива. Выражение константного типа вычисляется на этапе компиляции. Данное константное выражение может быть опущено в случаях если: · при объявлении массив инициализируется; · массив объявлен как формальный параметр функции; · массив объявлен как ссылка на массив, явно определенный в другом файле. Например: 1.int a[100]; //массив из 100 элементов целого типа 2.double d[14]; // массив из 14 элементов типа double 3.char s[]="Программирование"; // символьный массив 4. const int t=5, k=8; 5. float wer[2*t+k]; 6. //массив из 2*t+k элементов вещественного типа 7. int sample[853]; 8. /*массив из элементов sample[0], sample[1], 9. sample[2],...,sample[852] типа int*/ равносильно объявлению const int N_max=853; int sample[N_max]; равносильно объявлению #define N_max 853 ... int sample[N_max]; В языке С++ не производится проверки границ массивов: таким образом, исполнение кода не остановится при выходе за границы массива. Если переполнение массива происходит во время выполнения оператора присваивания, то лишние значения могут присвоиться другим переменным или включиться в текст программы. С другой стороны, можно объявить массив размером N и указать индекс элемента, выходящий за пределы N, что не приведет к появлению сообщений об ошибке, как на шаге компиляции, так и на шаге выполнения, даже если это послужит причиной аварийного завершения программы.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2021-07-18; просмотров: 128; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.186.132 (0.008 с.) |