Автор работы: Пользователь скрыл имя, 25 Февраля 2011 в 18:47, контрольная работа
Массив - набор данных одного и того же типа, собранных под одним именем. Каждый элемент массива имеет свой порядковый номер, который называется индексом. Соответственно каждый элемент массива определяется именем массива и порядковым номером элемента. Индекс (номер элемента) в языке Си всегда целое число.
Массив - набор данных одного и того же типа, собранных под одним именем. Каждый элемент массива имеет свой порядковый номер, который называется индексом. Соответственно каждый элемент массива определяется именем массива и порядковым номером элемента. Индекс (номер элемента) в языке Си всегда целое число.
Основная форма объявления массива размерности N (общий случай):
тип
<имя массива>[размер1][
Чаще всего используются одномерные массивы:
тип <имя массива>[размер];
тип - базовый тип элементов массива
размер - количество элементов одномерного массива
Объявление массива numbers на 50 целых чисел имеет вид:
int numbers[50];
Объявление массива A на 10 вещественных чисел:
float A[10];
В языке С индексация массивов начинается с нуля. Если мы объявим массив
int B[50];
это значит, что массив содержит 50 элементов от B[0] до B[49]. Иногда когда говорят про первый элемент массива, под ним подразумевается нулевой. В общем запомните, что индексация массива в С начинается с нуля.
Получить доступ к i-му элементу массива A можно следующим образом: A[i].
Рассмотрим на примере
int A[30];
int x;
x = A[9]; // Доступ к 10-му элементу (так как нумерация с 0)
Размер массива может задаваться только константой. Нельзя задать массив переменного размера. Для этого существует механизм динамического выделения памяти т.е. выделения памяти при работе программы. В этой статье мы рассмотрим только статические массивы т.е. такие массивы память под которые выделяется при запуске программы.
Как уже говорилось память под массив выделяется статически т.е. выделяется при запуске программы. Под массив выделяется сплошной участок памяти. Сплошной в том смысле, что элементы массива располагаются в памяти последовательно.
Для одномерного массива легко подсчитать, сколько байт в памяти он будет занимать:
количество байт = <размер базового типа> * <количество элементов в массиве>.
Например, для int B[100]; количество байт = 2 * 100 = 200 байт. Напомню, что тип int занимает 2 байта памяти.
Память для всех массивов, которые определены как глобальные (объявлены вне функций) сохраняется всё время, пока работает программа.
В языке С не проверяется выход индекса за пределы массива. Так, если вы объявили массив int A[100];, а где-то в программе указали A[200], то сообщения об ошибке не будет! А в качестве значения A[200] будет выдано некоторое число занимающее соответствующие 2 байта.
Напишем программу, показывающую как можно работать с одномерным массивом. При запуске программа попросит ввести массив целых чисел, после этого программа выведет его на экран.
#include <stdio.h>
#define N 5 // Определение константы
void main(void)
{
int A[N]; // Объявление массива размера N
int i;
printf("Введите массив из %d чисел:\n", N);
// Заполнение массива
for(i=0;i<N;i++)
{
printf("A[%d]=",i);
scanf("%d",&A[i]);
}
printf("Введеный массив:\n");
// Вывод массива
for(i=0;i<N;i++)
printf("A[%d]=%d\n",i,A[i]);
}
Во многих языках программирования, например в паскале, существует специальный тип данных - строка (string). В языке C такого типа данных нет. Строки в С реализуются с помощью одномерных массивов символов. Строка представляется как символьный массив типа char, заканчивающийся нулевым байтом. Нулевой байт или управляющий символ '\0' - признак конца строки, его часто называют нуль-терминатор. Массив символов в таком формате часто называют ASCIIZ строкой. Многие строковые функции С требуют для нормальной работы нулевой байт в конце строки. Поэтому при описании массива символов следует учитывать место для нулевого байта. Так, если ваша строка должна содержать N символов, то вы должны зарезервировать память для N+1 символа.
Например, объявление:
char str[11];
предполагает, что строка содержит 10 символов, а последний байт зарезервирован под нулевой байт.
Хотя в языке С нет строкового типа, язык допускает строковые константы. Строковая константа - это список литер заключенных в двойные кавычки.
Например,
"Это
строковая константа" или "
В конец строковой константы не обязательно ставить символ '\0' - это сделает компилятор, и строка "Привет мир!" в памяти будет выглядеть так:
П | р | и | в | е | т | м | и | р | ! | \0 |
Рассмотрим пример программы показывающей как можно вводить строки с клавиатуры.
#include <stdio.h>
#define N 30
void main(void)
{
char str[N]; // Объявление массива
printf("Введите вашу строку:");
gets(str); // Ввод строки
printf("Вы ввели %s",str);
}
Функция gets(), как и функция scanf() ставит в конец строки нулевой байт.
Двумерный массив можно рассматривать как массив одномерных массивов.
B0, B1, ..., Bi, ....,Bm-1 - это одномерные массивы размерности n.
A[m] - одномерный
массив размера m из одномерных
массивов Bi[n]. Таким образом двумерный
массив можно рассматривать
Например, для A[4][3] таблица будет выглядеть следующим образом
A[0][0] | A[0][1] | A[0][2] |
A[1][0] | A[1][1] | A[1][2] |
A[2][0] | A[2][1] | A[2][2] |
A[3][0] | A[3][1] | A[3][2] |
Число строк m = 4, число столбцов n = 3.
Первый индекс в двумерном массиве - это номер строки, второй - это номер столбца. Если вы хотите получить значение элемента массива, который находится в 6 строке и 3 столбце, то вы должны написать x = A[5][2] (индексация начинается с 0).
Как уже говорилось выше, память под массив выделяется непрерывным участком. Двумерный массив в памяти компьютера располагается непрерывно по строкам т.е.
A[0][0], A[0][1], A[0][2], A[1][0], A[1][1], A[1][2], A[2][0], A[2][1], A[2][2], A[3][0], A[3][1], A[3][2]
так будет выглядеть массив A[4][3].
A[0][0], A[0][1], A[0][2] - это первая строка
A[1][0], A[1][1], A[1][2] - это вторая строка
A[2][0], A[2][1], A[2][2] - это третья строка
A[3][0], A[3][1], A[3][2] - это четвёртая строка.
Рассмотрим пример. Программа ограничивает значения элементов массива. После ввода массива начинается его обработка. Каждый элемент массива проверяется на условие array[i][j] > MAX. Если значение элемента массива больше MAX, то оно принимается равным MAX. Таким образом мы анализируем входные данные и исправляем их в соответствии с условием. Далее программа выводит на экран исправленный массив.
#include <stdio.h>
// определение констант
#define M 3
#define N 3
#define MAX 100 // наше ограничение
void main(void)
{
int array[M][N]; // Объявление двумерного массива
int i, j;
// Ввод массива
for(i=0;i<M;i++) // цикл по строкам
{
for(j=0;j<N;j++) // цикл по элементам строки
{
// Ввод значения элемента массива
printf(" A[%d][%d]=", i, j);
scanf("%d",&array[i][j]);
}
printf("\n");
}
// Обработка массива
for(i=0;i<M;i++) // цикл по строкам
{
for(j=0;j<N;j++) // цикл по элементам строки
{
// Проверка на условие
if(array[i][j] > MAX) array[i][j] = MAX;
}
}
// Вывод массива на экран
for(i=0;i<M;i++) // цикл по строкам
{
for(j=0;j<N;j++) // цикл по элементам строки
{
// Вывод значения элемента массива
printf(" A[%d][%d] = %4d", i, j, array[i][j]);
}
printf("\n");
}
} // Конец функции main()
Так как базовый тип массива - int, то значения элементов, которые вы вводите должны быть в интервале от -32768 до +32767. Если вы уёдёте за этот интервал, то программа будет работать с ошибками.
В играх, например, двумерный массив можно использовать как карту. Значение элемента двумерного массива будет соответствовать определённому объекту, который находиться в "клетке" с номером i,j. Например,
значение 0 - дорога
значение 1 - лес
значение 2 - река
и т.д.
Инициализация массива - это определение начальных значений элементов массива. Самый простой способ инициализации следующий: в процессе объявления массива можно указать в фигурных скобках {} список инициализаторов:
float farr[6] = {1.1, 2.2, 3.7, 4.2, 5, 6};
или так
int a[2][4]={3, 5, 6, 2, 7, 3, 2, 8};
3, 5, 6, 2 - Первая строка
7, 3, 2, 8 - Вторая строка
Многомерные массивы, в том числе и двумерные массивы, можно инициализировать, рассматривая их как массив массивов.
Две следующих инициализации - эквивалентны
int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};