Си. Массивы: объявление массивов 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Си. Массивы: объявление массивов



Массив – это совокупность данных, которая обладает следующими свойствами: все элементы массива имеют один и тот же тип; массив имеет одно имя для всех элементов; доступ к конкретному элементу массива осуществляется по индексу (индексам).

1. Объявление массива

Объявление массива имеет следующий синтаксис:

<спецификация типа> <имя> [<константное выражение>];

<спецификация типа> <имя> [ ];

Здесь квадратные скобки являются элементом синтаксиса, а не признаком необязательности конструкции.

Объявление массива может иметь одну из двух синтаксических форм, указанных выше. Квадратные скобки, следующие за именем, – признак того, что переменная является массивом. Константное выражение, заключенное в квадратные скобки определяет число элементов в массиве. Индексация элементов массива в языке C++ начинается с нуля. Таким образом, последний элемент массива имеет индекс на единицу меньше, чем число элементов массива.

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

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

<спецификация типа> <имя> [<константное выражение>][<константное выражение>]...;

Каждое константное выражение определяет количество элементов в данном измерении массива, поэтому объявление двумерного массива содержит два константных выражение, трехмерного – три и т.д.

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

Примеры объявлений массивов:

int x[10]; // Одномерный массив из 10 целых чисел. Индексы меняются от 0 до 9.
double y[2][10]; // Двумерный массив вещественных чисел из 2 строк и 10 столбцов.

Инициализация массивов

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

Наличие списка инициализаторов в объявлении массива позволяет не указывать число элементов по его первой размерности. В этом случае количество элементов в списке инициализаторов и определяет число элементов по первой размерности массива. Тем самым определяется размер памяти, необходимой для хранения массива. Число элементов по остальным размерностям массива, кроме первой, указывать обязательно.

Если в списке инициализаторов меньше элементов, чем в массиве, то оставшиеся элементы неявно инициализируются нулевыми значениями. Если же число инициализаторов больше, чем требуется, то выдается сообщение об ошибке.

Примеры инициализации массивов:

nt a[3] = {0, 1, 2}; // Число инициализаторов равно числу элементов
double b[5] = {0.1, 0.2, 0.3}; // Число инициализаторов меньше числа элементов
int c[ ] = {1, 2, 4, 8, 16}; // Число элементов массива определяется по числу инициализаторов
int d[2][3] = {{0, 1, 2}, {3, 4, 5}}; // Инициализация двумерного массива. Массив состоит из двух строк, // в каждой из которых по 3 элемента. Элементы первой строки // получают значения 0, 1 и 2, а второй – значения 3, 4 и 5.
int e[3] = {0, 1, 2, 3}; // Ошибка – число инициализаторов больше числа элементов

Обратите внимание, что не существует присваивания массиву, соответствующего описанному выше способу инициализации.

int a[3] = {0, 1, 2}; // Объявление и инициализация
a = {0, 1, 2}; // Ошибка

Си. Примеры работы с одномерными массивами: ввод/вывод

 

В языке C нет возможности вводить и выводить весь массив одним оператором ввода/вывода. Можно вводить и выводить только один элемент массива. Следовательно, для того чтобы ввести весь массив, надо использовать цикл.

int a[10], n; printf("Введите количество элементов массива (от 0 до 9): "); // Объявляем массив и переменную для количества элементов массива
scanf("%d", &n); // Ввод количества элементов массива
if (n < 0 || n > 9) { printf("Количество элементов массива должно быть от 0 до 9!\n"); return; } // Если входные данные// то печатаем соответствующее сообщение и выходим из программы
for (i = 0; i < n; i++) // Ввод массива по одному элементу
scanf("%d", &a[i]); // Можно использовать scanf("%d", a + i)

Вывод также осуществляется в цикле.

for (i = 0; i < n; i++) printf("a[%d] = %3d\n", i + 1, a[i]);  

В результате на экране мы увидим примерно следующий текст:

a[1] = 4

a[2] = 15

a[3] = -2

...

 

Си. Примеры работы с одномерными массивами: суммирование значений

Даны три массива разной размерности. Определить в каком массиве больше сумма элементов.

#include <cstdio> #include <locale.h>   const int nmax = 100;  
int ArrayInput(int *n, double x[], char *fname); // Функция ввода массива из файла
double Sum(double x[], int n);   void main(int argc, char *argv[]) { double a[nmax], b[nmax], c[nmax]; double sa, sb, sc, max; int na, nb, nc;   setlocale(LC_ALL, "rus"); // Функция поиска суммы элементов массива     // Меняем кодировку для консольного приложения
if (argc < 4) { printf("Недостаточно параметров!\n"); return; } if (!ArrayInput(&na, a, argv[1])) return; if (!ArrayInput(&nb, b, argv[2])) return; if (!ArrayInput(&nc, c, argv[3])) return;   sa = Sum(a, na); sb = Sum(b, nb); sc = Sum(c, nc);   max = sa; if (sb > max) max = sb; if (sc > max) max = sc;   if (sa == max) printf("Массив А имеет максимальную сумму элементов: %9.3lf\n", max); if (sb == max) printf("Массив B имеет максимальную сумму элементов: %9.3lf\n", max); if (sc == max) printf("Массив C имеет максимальную сумму элементов: %9.3lf\n", max); }   double Sum(double x[], int n) { double s = 0;   for (int i = 0; i < n; i++) s += x[i];   return s; }   int ArrayInput(int *n, double x[], char *fname) { FILE *file;   if ((file = fopen(fname, "r")) == NULL) { printf("Невозможно открыть файл '%s'\n", fname); return 0; } if (fscanf(file, "%d", n) < 1) { printf ("Ошибка чтения из файла '%s'\n", fname); fclose(file); return 0; } if (*n < 0 || *n > nmax) { printf("Кол-во эл-тов массива должно быть от 1 до %d! (файл '%s')\n", nmax, fname); return 0; } for (int i = 0; i < *n; i++) if (fscanf(file, "%lf", &x[i]) < 1) { printf ("Ошибка чтения из файла '%s'\n", fname); fclose(file); return 0; } fclose(file); return 1; }

 

Си. Примеры работы с одномерными массивами: нахождение максимального элемента

#include <iostream>

using namespace std;

int main()

{

int m[10],I, min,max;

for(i=0;i<10;i++){

cin>>m[i];

}

max=m[0];

for(i=1;i<10;i++){

if(max<m[i])max=m[i];

}

min=m[0];

for(i=1;i<10;i++){

if(min>m[i]) min = m[i];

}

cout<<"min = "<<min<<endl;

cout<<"max = "<<max;

 

system("PAUSE");

return 0;

}


Си. Примеры работы с одномерными массивами: циклический сдвиг

 

//Cдвигает элементы массива на 1 влево

 

#include <iostream>

#include <iterator>

#include <algorithm>

 

 

int main() {

std::size_t const arraySize = 10;

int array[arraySize] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

 

std::rotate(array, array + 1, array + arraySize);

 

std::copy(array, array + arraySize, std::ostream_iterator<int>(std::cout, " "));

std::cout << std::endl;

}

 

Си. Примеры работы с одномерными массивами: поиск элемента

/* Бинарный поиск */

#include

main()

{

int k[100],v,i,j,m;

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

scanf("%d",&k[i]);

scanf("%d",&v);

i=0; j=100; m=50;

while (k[m]!=v)

{

if (k[m] < v) i+=m;

else j=m-i;

m=(i+j)/2;

}

printf("%d %d",v,m);

}

 

 

Си. Примеры работы с одномерными массивами: алгоритмы сортировки массивов

Сортировка выбором

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

template< class T >

void selectSort(T* arr, int size)

{

T tmp;

for(int i = 0; i < size; ++i) // i - номер текущего шага

{

int pos = i;

tmp = arr[i];

for(int j = i + 1; j < size; ++j) // цикл выбора наименьшегоэлемента

{

if (arr[j] < tmp)

{

pos = j;

tmp = arr[j];

}

}

arr[pos] = arr[i];

arr[i] = tmp; // меняем местами наименьший с a[i]

}

}



Поделиться:


Последнее изменение этой страницы: 2017-01-25; просмотров: 456; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 54.89.70.161 (0.024 с.)