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



ЗНАЕТЕ ЛИ ВЫ?

Количество индексов массива.

Поиск

Одномерные массивы содержат в описании только один индекс.

Пример2:

unsigned int vector[10]; // массив беззнаковых целых

                        // чисел из 10 элементов

char Control_String[20], Green_Line[5];

Пример3: имеется массив чисел, содержащий средний балл ball успеваемости трёх студентов, массивы mas1 и mas2 содержат отметки двух групп 25 студентов в каждой по математике.

float ball[3];

int mas1[25], mas2[25];

int i,j,k;

i=15;

j=20;

k=8;

ball[0]=4.35;

mas1[i]=mas2[j-k];

mas1[i+1]=mas2[k*2+5];

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

mas1=mas2;

Пример 4:

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

// переменные stroka-массив символов;

//       k-массив количества вхождения букв;

//       i,x -параметры циклов;

//       n-количество обрабатываемых символов

 

#include <stdio.h>

#include <conio.h>

void main()

{

 int i,n,k[26];

 char x,Stroka[200];

 clrscr();

 printf(" введите количество обрабатываемых символов ");

 scanf("%d",&n);

 printf("введите %d латинских букв\n ",n);

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

scanf("%c",&Stroka[i]);

 printf(" в вашем тексте: ");

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

printf("%c",Stroka[i]);

 // обнуление массива k

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

k[i]=0;

 // подсчёт количества символов

 for (i=0; i<n; i++) // индекс эл-та массива находится как

k[Stroka[i]-97]++; // разность кода соотв-его символа и кода

i=0;          // 1-ой строчной  буквы «а», равного 97

 for (x='a'; x<='z'; x++)  

{if (i%3==0) printf("\n");

printf(" число букв %c равно %d",x,k[x-97]);

i++;

}

 getch();

5.2.2 Операция образования массива [ ].

Онаможет быть использована при описании несколько раз. В этом случае объявленный массив называется многомерным. Если число индексов в описании массива равно N, то массив называется N- мерным. Ограничения на число измерений массива отсутствует.

Количество оперативной памяти, занимаемой элементами многомерного массива, определяется произведением величин его размерностей на длину элемента массива, т.е. для массива Object: sizeof(int)*2*15. Во избежания ошибок не следует определять массивы, занимающие более одного сегмента оперативной памяти (более 64 Кбайт).

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

Например, предложение

int Object[2][15];

определяет двумерный массив   Object, состоящий из элементов целого типа.

Двумерные массивы называются также матрицами. Тогда первый размер в описании массива определяет количество строк, а второй - количество столбцов.

Элементы многомерных массивов располагаются в памяти ЭВМ таким образом, что наиболее быстро меняется значение самого последнегоиндекса, т.е. для рассмотренного примера: Object[0][0], Object[0][1], Object[0][2], …, Object[0][14], Object[1][0], Object[1][1], Object[1][2], …, Object[1][14].

Многомерные массивы представляют собой чистую абстракцию, поскольку память у ЭВМ одномерна и многомерные массивы хранятся в ней в виде линейных последовательностей значений. Рассмотрим матрицу А, состоящую из 2х3 элементов.

| а11 а12 а13 |

А= | а21 а22 а23 |.

Элементы этой матрицы размещены в памяти ЭВМ «по строкам», формируемая при этом последовательность будет а11, а12, а13, а21, а22, а23. Переменная А имеет смысл массива из двух строк, в каждую из которых включено по 3 элемента.

Ссылка на элемент матрицы А, лежащий на пересечение i –ой строки и j -ого столбца, может иметь следующий вид: a[i][j].

Пример: массив а[4][3][2] (a[i][j][k])

а000 а001 а010 а011 а020 а021 a100 a101 a110 a111 a120 a121 a311 a320 a321

j=0

j=1

j=2

j=0

j=1

j=2

j=1

j=2

i=0

i=1

i=3

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

Ввод-вывод массивов.

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

 Алгоритм заполнения одномерного массива

Пример 5: Осуществить ввод-вывод элементов массива.

#include <stdio.h>

#include <conio.h>

void main()

{

 int i,j, mas[2][3];

 float v[3][5];

 clrscr();

 randomize();

 // ввод массива

printf("Введите массив mas \n");

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

  for (j=0; j<3; j++)

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

printf("Введите массив v \n");

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

 {for (j=0; j<5; j++)      //заполнение случайным образом

{v[i][j]= random(50)*0.1; //элемента строки, печать

printf(“ v[%d][%d]=%5.1f”,i,j, v[i][j]); // текущего элемента

   }

printf(“\n”); // переход на новую строку

 }

  Пример 6. Ввод и вывод одномерного массива.

#include <stdio.h>

#include <conio.h>

void main()

{

 int i,n;

 int a[100];

 clrscr();

 printf("введите количество элементов массива ");

 scanf("%d",&n);

 printf("введите %d чисел\n ",n);

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

scanf("%f",&a[i]);

 printf(" исходный массив: ");

// вывод массивов

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

printf("a[%d]=%d ",i,a[i]);   

 getchar(); 

}

 

Пример 7: Осуществить ввод-вывод целых вектора V, двумерного массива MAS, символьных массивов S1 и S2.

#include <stdio.h>

#include <conio.h>

#define pr5" "

void main()

{

 char s1[10],s2[10];

 int i,j,v[3],mas[2][3];

 clrscr();

 // ввод массива

 printf("Введите массив v \n");

 scanf("%d %d %d", &v[0],&v[1],&v[2]);

 printf("Введите массив mas \n");

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

for (j=0; j<3; j++)

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

 printf("Введите массивы s1 и s2 \n");

 scanf("%s %s", s1,s2);

 // вывод массивов

 printf("%s %5d %5d %5d \n",pr5,v[0],v[1],v[2]);

 printf("%s Массив mas \n",pr5);

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

{ printf("%s",pr5);

for (j=0; j<3; j++)

printf("%5d",mas[i][j]);

printf("\n");

}

 printf("%s s1=%s %s s2=%s \n",pr5,s1,pr5,s2);

 getchar(); 

}

Пример 8. Написать  программу, которая обеспечивает ввод 10 чисел в одномерный массив, а затем складывает их и выводит результат на экран.

#include <stdio.h>

#include <conio.h>

void main()

{

 int i;

 int s,a[100];

 clrscr();

 printf("введите 10 чисел\n ");

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

scanf("%f",&a[i]);

 printf(" исходный массив: ");

// вывод массивов

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

printf("a[%d]=%d ",i,a[i]);   

 

s=0; /*обнуление ячейки памяти, в которой будет                             накапливаться сумма элементов массива*/for (i=0; i<n; i++) s=s+a [i]; //вычисление суммы элементов массива

 printf("сумма 10 элементов массива a равна %d ",s);   

getchar(); 

} Пример 9. Написать программу, которая обеспечивает ввод 25 чисел в одномерный массив. Запрашивает ввод ещё одного числа, определяет находится ли вновь введённое число в массиве.

#include <stdio.h>

#include <conio.h>

void main()

{

 int i,r,s;

 int a[25];

 clrscr();

 printf("введите 25 чисел\n ");

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

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

printf("введите число, которое следует найти в массиве ");

scanf("%d",&s);

// вывод массивов

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

printf("a[%d]=%d ",i,a[i]);    

 r=0; //количество совпадений числа s с элементами массива

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

 if (a[i]=s) r=r+1; //элемент массива равен s=> r+1

if (r!=0)      //если r не равен 0,то имеются совпадения   printf (“число %d встречается в массиве a %d раз”,s,r); else printf (“число %d не встречается в массиве a \n”,s);

getchar(); 

}

 

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

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

int mas[4]={1,2,3,4};          

int mas[4]={1,2,3}; //недостающий Эл-т будет проинициализирован 0

// массивы str и str1 будут проинициализированы одинаково

char str[3][2]={{‘1’,’2’},{‘3’,’4’},{‘5’,’6’}};

char str1[3][2]={ ‘1’,’2’,‘3’,’4’,‘5’,’6’};

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

 int mas[4]={1,2,3,4,5}; // ошибка

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

int mas[ ]={1,2,3,4}; 

 Следует учитывать, что нет возможности проинициализировать средний или последний элемент массива, не проинициализировав первый.       

 Для удобства работы со строками символов в языке С считается, что символьный массив, оканчивающийся 16-ричным нулём, является символьной строкой. Поскольку символьные строки могут использоваться в тексте программы в качестве констант (в этом случае они заключаются в двойные кавычки), то указанные ниже 2 способа инициализации символьного массива являются равнозначными:

char L[ ]={ ‘С’,’т’,‘р’,’о’,‘к’,’а’,'\0'};

char L[ ]={ «Строка»};

 

Примеры программ с использованием матриц.

Ø Транспонирование матрицы

 Дана квадратная матрица N x N. Транспонировать ее, то есть отразить все элементы относительно главной диагонали, то есть диагонали из левого верхнего угла в правый нижний.

Исходная матрица Вывод:

N = 3

1 2 1      1 2 3

2 3 2      2 3 4

3 4 5      1 2 5

 Эта задача похожа на задачу перестановки элементов массива в обратном порядке. Достаточно менять местами элементы a[i][j] и a[j][i], но делать это нужно только в половине массива. Это можно организовать так.

for (i=0; i<n; i++) for (j=0; j<n; j++) if (j < i)    { t=a[i][j]; a[i][j]=a[j][i]; a[j][i] = t;} Обрабатывается только часть массива, где номер столбца меньше номера строки, то есть элементы, расположенные ниже главной диагонали. Сама главная диагональ (i = j) не подвержена транспонированию.

Того же эффекта можно достичь, если внутренний цикл запустить до i–1 – го элемента: все значения j будут гарантированно меньше i.

for (i=0; i<n; i++) for (j=0; j<i-1; j++) { t=a[i][j]; a[i][j]=a[j][i]; a[j][i] = t;}

Этот способ быстрее, поскольку не делается холостых шагов внутреннего цикла.

Ø Удаление столбца

Рассмотрим задачу: дана матрица M x N. Удалить k-тый столбец.

Пример 5.         Вывод:

M = 3 K = 1

N = 4

1 2 3 4 1 3 4

2 3 4 5 2 4 5

3 4 5 6 3 5 6

Эта задача сводится к удалению второго элемента из каждой строки (строку матрицы можно рассматривать как одномерный массив). После сдвига каждой строки значение n (количества столбцов) нужно уменьшить на 1.

for (i=0;i<m;i++) for (j= K;j< N – 1;j++) a[i][j] = a[i][j + 1]; n = n – 1;

Методы сортировки.

Для решения многих задач необходимо упорядочить исходные данные по определённому признаку. Процесс такого упорядочивания называется сортировкой. Элементы массива можно сортировать:

§ по возрастанию – каждый следующий элемент больше предыдущего: А[0] < А[1]<... <А[N-1];

§ по неубыванию – каждый следующий элемент не меньше предыдущего, т.е. больше или равен ему: А[0] £ А[1] £... £А[N-1];

§ по убыванию – каждый следующий элемент меньше предыдущего: А[0] > А[1] >... >А[N-1];

§ по не возрастанию – каждый следующий элемент не больше предыдущего, т.е. меньше или равен ему: А[0] ³ А[1] ³... ³А[N-1].



Поделиться:


Последнее изменение этой страницы: 2020-12-09; просмотров: 91; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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