Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
I_semestr.doc
Скачиваний:
6
Добавлен:
23.09.2019
Размер:
356.35 Кб
Скачать

8.1. Описание массива

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

Примеры:

int n=10;

int a[100],b[2*40];

double M[n]; //в некоторых компиляторах использование переменной в качестве размера массива допускается. Однако как поведет себя компилятор в этой ситуации зависит от программы.

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

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

8.2. Ввод – вывод массивов

Язык С не имеет встроенных средств для ввода и вывода массивов целиком. Эти действия осуществляются поэлементно с помощью циклов.

Пример:

double a[100];

int n,i;

printf(“VVedi kol-vo ilimentov”);

scanf(“%d”,&n);

if(n>sizeof(a)/sizeof(a[0]))

{

printf(“/nPloxoe znachenie n”);

}

else

{

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

{

printf(“/nVvedite a[%d]=”,i);

scanf(“%lf”,&a[i]);

}

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

{

printf(“%lf ”,a[i]);

}

}

Часто бывает удобно возложить подсчет элементов на программу, как в следующем примере:

double b[100],temp;

int n,end;

for(end=n=0;n<sizeof(b)/sizeof(b[0]))

{

printf(“b[%d]=”,n);

scanf(“%lf”,&temp);

if(temp>=1e300)

{

n=1;

break;

}

else

{

b[n]=temp;

}

}

if(!end)

{

printf(“Massiv ogranichen, vi previsili kol-vo ilimentov”);

}

else

{

//обработка массива

}

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

В случае если массивы выводятся неоднократно, удобно написать функции для обработки массивов.

void PrintArray(double A[],int n)

{

for(int i=0;i<n;i++)

{

printf(“%lf ”,a[i]);

}

}

Вызывать эту функцию можно следующим образом

double a[10],b[15];

...

printf(“/nMassiv a”)

PrintfArray(A,10);

printf(“/nMassiv b”)

PrintArray(B,15);

Замечания:

  1. В списке формальных параметров (те которые в заголовке функции) количество элементов не указывается, т.к. массив не копируется, а передается по указателю. Это означает, что все изменения внутри функции этого массива отразятся на пользовательском оригинале.

  2. Приходится дополнительно передавать размер массива.

8.3. Инициализация массива

Инициализация – присвоение значений, вместе с описанием данных (int a=5)

int A[5]={1,2,5,8,3}; //инициализирующие значение записываются в скобках через запятую

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

int B[6]={1,2};//{1,2,0,0,0,0}

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

double C[]={5.3,1.3,5.67};//массив из 3 элементов

double D[3]={1,2,5,8,3};//синтаксическая ошибка

char S[20]={‘f’,’r’,’d’,’b’,’c’,’e’...’/0’};//пример не удобен и лучше пользоваться сокращенным синтаксисом инициализации строк

char s2[]={“Это тоже строка”};

8.4. Функция вычисления длины строки

Часто приходится вычислять длину строки символов. Для этого можно использовать стандартную функцию strlen. Рассмотрим описание аналогичной функции:

int StrLen(char const S[])

{

int i;

for(i=0;S[i];i++);//не опечатка, в теле цикла ничего не надо

return i;//не в цикле

}

8.5. Сортировка массивов

Сортировка – процесс расположения элементов в определенном порядке. Выделяют следующие виды порядка сортировки массивов:

  • по возрастанию (для любых i от 1 до n каждый m[i]>m[i-1])

  • по убыванию (каждый m[i]>m[i-1])

  • по не убыванию каждый m[i]>=m[i-1])

  • по не возрастанию каждый m[i]<=m[i-1])

8.5.1. Виды сортировок

В литературе рассматривается множество различных алгоритмов сортировки. Однако можно условно можно разделить их на 3 группы:

  • сортировка перестановками

  • сортировка вставками

  • сортировка выбором

8.5.2. Пузырьковая сортировка

Относится к группе сортировок перестановками и является одной из самых не эффективных. Но при этом самой наглядной и распространенной. Алгоритм можно представить следующим образом:

  1. Осуществляется N-1 проходов по массиву

  2. На каждом проходе:

    1. Сравниваются поочередно пары соседних элементов, кроме самых правых (больших) элементов

    2. Если порядок неправильный, то переставляются местами

Рассмотрим применение пузырьковой сортировки:

13 5 8 1 23

Отсортируем по возрастанию

  1. 5 13 8 1 23

  2. 5 8 13 1 23

  3. 5 8 1 13 23

  4. 5 8 1 13 23

  1. 5 8 1 13 23

  2. 5 8 1 13 23

  3. 5 1 8 13 23

  4. 5 1 8 13 23

  5. 5 1 8 13 23

  1. 1 5 8 13 23

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

Рассмотрим функцию сортировки массива:

void BubleSort(double A[],int n)

{

int i,j,f;

double temp;

//перебор проходов

for(j=0;j<n-1;j++);

{

f=0;//перестановок не было

for(i=0;i<n-j-1;i++);

{

if A[i]>A[i+1] //если плохой порядок

{

f=1;//фиксируем факт перестановки

temp=A[i];

A[i]=A[i+1;

A[i+1]=temp;

}

}

if(f==0)//если на проходе не было перестановок

break;

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]