Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Начальная инициализация массива.
Напишем простую программу. Создадим массив, после чего найдём его максимальный элемент.
#include <conio.h> #include <stdio.h>
void main() { int a[10] = {1, 2, 5, 3, 9, 6, 7, 7, 2, 4}; unsigned i; int max;
max = a[0]; for (i = 1; i<10; i++) { if (a[i] > max) { max = a[i]; } }
printf("max element is %d", max); getch(); }
Разберём пример. Сначала мы создаём массив и инициализируем его при создании. После этого присваиваем максимальному найденному элементу значение первого элемента массива.
max = a[0];
После чего проходим по массиву. Так как мы уже просмотрели первый элемент (у него индекс 1), то нет смысла снова его просматривать. Тот же пример, только теперь пользователь вводит значения.
#include <conio.h> #include <stdio.h>
void main() { int a[10]; unsigned i; int max;
printf("Enter 10 numbers\n"); for (i = 0; i<10; i++) { printf("%d. ", i); scanf("%d", &a[i]); }
max = a[0]; for (i = 1; i<10; i++) { if (a[i] > max) { max = a[i]; } }
printf("max element is %d", max); getch(); }
В том случае, если при инициализации указано меньше значений, чем размер массива, остальные элементы заполняются нулями.
#include <conio.h> #include <stdio.h>
void main() { int a[10] = {1,2,3}; unsigned i;
for (i = 0; i<10; i++) { printf("%d ", a[i]); }
getch(); }
Если необходимо заполнить весь массив нулями, тогда пишем
int a[10] = {0};
Можно не задавать размер массива явно, например
int a[] = {1, 2, 3};
массив будет иметь размер 3 Размер массива Массив в си должен иметь константный размер. Это значит, что невозможно, например, запросить у пользователя размер, а потом задать этот размер массиву.
printf("Enter length of array "); scanf("%d", &length);
{ float x[length]; }
Создание динамических массивов будет рассмотрено дальше, при работе с указателями и памятью. В некоторых случаях можно узнать размер массива с помощью функции sizeof.
#include <conio.h> #include <stdio.h>
void main() { int A[57]; //sizeof возвращает размер всего массива в байтах //Для определения количества элементов необходимо //разделить размер массива на размер его элемента int size = sizeof(A) / sizeof(int);
printf("Size of array equals to %d", size); getch(); }
Но это вряд ли будет полезным. При передаче массива в качестве аргумента функции будет передаваться указатель, поэтому размер массива будет невозможно узнать. Статические массивы удобны, когда заранее известно число элементов. Они предоставляют быстрый, но небезопасный доступ до элементов.
Переполнение массива Пускай у вас есть такой код
int A[10]; int i;
for (i=0; i<=10; i++) { A[i] = 1; }
Здесь цикл for задан с ошибкой. В некоторых старых версиях компиляторов этот код зацикливался. Дело в том, что переменная i располагалась при компиляции сразу за массивом A. При выходе за границы массива счётчик переводился в 1. Массивы небезопасны, так как неправильная работа с индексом может приводить к доступу к произвольному участку памяти (Теоретически. Современные компиляторы сами заботятся о том, чтобы вы не копались в чужой памяти). Если вы работаете с массивами, то необходимо следить за тем, чтобы счётчик не превышал размер массива и не был отрицательным. Для этого, как минимум: · Используйте тип size_t для индексирования. Он обезопасит вас от отрицательных значений и его всегда хватит для массива любого размера. · Помните, что массив начинается с нуля. · Последний элемент массива имеет индекс (размер массива - 1) Никаких полноценных способов проверки, вышли мы за пределы массива или нет, не существует. Поэтому либо мы точно знаем его размер, либо храним в переменной и считываем при надобности. Пример с одномерным массивом Теперь несколько типичных примеров работы с массивами
#include <conio.h> #include <stdio.h>
//Это макрос. SIZE в коде будет заменено на 10u #define SIZE 10u
void main() { int A[SIZE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; unsigned i, j; //счётчики unsigned half; //середина массива unsigned tmp; //временная переменная для обмена значениями
half = SIZE / 2; //Один счётчик идёт слева напрво, другой справа налево for (i = 0, j = SIZE - 1; i < half; i++, j--) { tmp = A[i]; A[i] = A[j]; A[j] = tmp; }
for (i = 0; i < SIZE; i++) { printf("%d ", A[i]); }
getch(); }
Здесь незнакомая для вас конструкция
#define SIZE 10u
макрос. Во всём коде препроцессор автоматически заменит все вхождения SIZE на 10u.
|
|||||
Последнее изменение этой страницы: 2017-01-20; просмотров: 269; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.83.150 (0.006 с.) |