Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Вставка элемента b в упорядоченный массив X, не нарушив его упорядоченности



Пусть массив Х(N) упорядочен по возрастанию, необходимо в него вставить элемент b, не нарушив упорядоченности массива.

int main()

{

float x[20], b;

int i, j, n;

cout< < " n=";

cin> > n;

cout< < " Massiv x\n";

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

cin> > x[i];

cout< < " b=";

cin> > b;

if (b> =x[n-1])

x[n]=b;

else

{

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

if (x[i]> b)

{j=i; break; }

for(i=n; i> j; i--)

x[i]=x[i-1];

x[j]=b;

}

n++;

cout< < " Massiv x\n";

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

cout< < " x(" < < i< < " )=" < <

x[i]< < " \t";

cout< < endl;

return 0;

}

Найдем максимальный элемент главной диагонали двумерного целочисленного массива размерностью nxn, заданного случайными числами на промежутке [-100; 100).

/*Описание функции поиска максимального элемента главной диагонали*/

int maxi(int str, int slb, int m[max_x][max_y]){

int i, j, e_max=m[0][0];

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

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

if((i==j)& & (m[i][j]> e_max))

e_max=m[i][j];

return e_max;

}

Пример 5. Найдите сумму элементов столбца двумерного массива, номер которого задается с клавиатуры.

/*Описание функции суммирования элементов заданного номера столбца матрицы*/

int summa(int str, int slb, int nom, int m[max_x][max_y]){

int i, j, sum=0;

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

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

if(j==nom-1) sum+=m[i][j];

return sum;

}

Пример 6. Дан двумерный вещественный массив размерностью nxn, заданный случайными числами на промежутке [-100; 100). Замените все элементы выше главной диагонали на 1.1 и ниже ее на 0.0.

//Описание функции замены

void zamena (int str, int slb, double m[max_x][max_y]) {

int i, j;

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

for (j=0; j< slb; j++) {

if (i> j) m[i][j]=0.0;

if (i< j) m[i][j]=1.1;

}

}

Сортировка в двумерном целочисленном массиве элементов k-той строки по невозрастанию.

void sort_dn(int k, int slb, int m[max][max]) {

int i, j, buf;

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

for (j=slb-1; j> i; j--)

if (m[k][j]> m[k][j-1]){

//фиксированная строка с номером k

buf= m[k][j];

m[k][j]= m[k][j-1];

m[k][j-1]=buf;

}

}

Для поиска максимальных (минимальных) элементов с целью их дальнейшего упорядочивания удобно выделять отдельно одномерный массив, в котором хранить не значения элементов, а номера столбцов или строк, в которых они располагаются. Например, чтобы найти минимальные элементы в каждом столбце массива n x m отдельно, удобно выделить одномерный массив min[m], в котором число элементов равно числу столбцов. Значениями элементов такого массива будут номера строк, в которых располагаются минимальные элементы каждого столбца. Если же минимальных элементов в столбце несколько, то будет найден первый (или последний) минимальный, что не скажется на значении.

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

void minimum(int str, int slb, int m[max][max], int min[max_y]){

int i, j;

for (j=0; j< slb; j++){//фиксируем номер столбца

min[j]=0;

for (i=1; i< str; i++)

//пробег по столбцу, меняется номер строки

if (m[i][j]< m[min[j]][j]) min[j]=i;

}

}

В данном примере min[max_y] – это массив, значениями которого будут номера строк, в которых располагается первый минимальный элемент столбца. Так для min[j] начальное значение инициализируется как 0, то есть предполагается, что минимальный элемент расположен в строке с номером 0. Обращение m[min[j]][j] понимается так: элемент массива m, расположенный в строке с номером min[j] и столбце с номером j. Но в строке min[j] для столбца j как раз и находится минимальный элемент.

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

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

void obmen(int strslb, int m[max][max]) {

int i, buf, t;

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

//номера строки и столбца элемента главной диагонали равны

buf= m[i][i];

//t-номер столбца соответствующего элемента побочной диагонали

t= abs(strslb-i-1);

m[i][i]= m[i][t];

m[i][t]=buf;

}

}

Пример 4. Дана квадратная матрица размера n x n, заполненная с клавиатуры целыми числами так, что в каждой строке и каждом столбце ровно по одному нулевому элементу. Переставьте строки матрицы так, чтобы нулевые элементы были расположены вдоль главной диагонали. Выведите массив на экран в виде таблицы дважды – до и после перестановки. Оформите генерацию, вывод массива и перестановку строк с помощью функций.

#include " stdafx.h"

#include < iostream>

using namespace std;

#define max 10

 

void gen (int k, int x[max][max]);

void out (int k, int x[max][max]);

void change (int k, int x[max][max]);

 

int _tmain(int argc, _TCHAR* argv[]) {

int a[max][max];

int n;

do {

printf(" \nВведите количество элементов массива n (n< =%d): ",

max);

scanf (" %d", & n);

}

while (n> max);

gen(n, a);

out(n, a);

change(n, a);

out(n, a);

system(" pause" );

return 0;

}

 

void gen (int k, int x[max][max]){

int i, j;

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

printf(" \nВведите значения элементов %d-й строки

массива: \n", i);

for (j=0; j< k; j++){

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

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

}

}

}

 

void out (int k, int x[max][max]){

int i, j;

printf(" \nВывод значений %d элементов массива в строку: \n", k);

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

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

printf(" \t%d", x[i][j]);

printf(" \n" );

}

}

 

void change (int k, int x[max][max]){

int i, j, buf;

int zero[max]; //массив номеров столбцов нулевых элементов

for (i=0; i< k; i++) //инициализация массива

zero[i] = -1;

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

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

/*генерация массива номерами столбцов, в которых

расположены нулевые элементы*/

if (x[i][j]==0) {

zero[i]=j;

j=k;

}

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

for (j=0; j< k; j++){

/*обмен значениями элементов текущей строки с

соответствующей, чтобы нулевой элемент занял место на

главной диагонали*/

buf=x[i][j];

x[i][j]=x[zero[i]][j];

x[zero[i]][j]=buf;

/*после перестановки строк изменяется номер столбца

нулевого элемента*/

zero[zero[i]]=zero[i];

}

}

В данном примере zero[max] – это массив, значениями которого будут номера столбцов, в которых располагается нулевой каждой строки (по условию задачи, такой элемент в каждом столбце и каждой строке единственный). Обращение x[zero[i]][j] понимается так: элемент массива x, расположенный в строке с номером zero[i] и столбце с номером j. Но для строки с номером i нулевой элемент располагается в столбце с номером zero[i]. Для каждого элемента главной диагонали индексы строки и столбца равны, поэтому нулевой элемент из столбца zero[i] должен быть перемещен в строку с аналогичным номером (вместе со всеми элементами этой же строки). Обращение zero[zero[i]] означает, что после перестановки строк с номерами i и zero[i] нулевой элемент строки zero[i] будет находиться в столбце с номером zero[zero[i]].

 

Примеры

 

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

Пример 1

/*обращение массива*/ #include < stdio.h> main() { int p, i=0; Static a[10]={10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; while(i< 10/2) { p=a[i]; a[i]=a[9-i]; a[9-i]=p; i++; } i=0; while(i< 10) printf(" %d", a[i++]); }  

Пример2. Найти среднее арифметическое элементов заданного массива.

#include< stdio.h>
#define TEN 10 //так объявляются константы. Менять значения TEN после этого объявления мы не имеем права
//Здесь же константе TEN мы присвоили значение 10

Void main()

{
float a[TEN], s=0; //мы объявили массив типа float из TEN(десяти) элементов и переменную s

Int i; //переменная цикла

printf(" Введите массив: " );

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

scanf(" %d", m[i]); /*последовательный ввод массива*/

for(i=0; i< TEN; i++)
s = s+a[i]; /*нахождение суммы элементов*/

s=s/TEN; //нахождение среднего арифметического делением суммы на TEN, то есть на 10
printf(" s = %8.2f", s);
}

 

Приведем несколько примеров, в которых ведется обработка двумерных массивов. Но прежде одну полезную возможносить языка Си. Речь идет о препроцессорном утверждении #dеfine, позволяющем присваивать символические имена константам.

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

#define строка1 строка2(точка с запятой не ставится).


Прежде чем исходный текст программы будет передан компилятору, он обрабатывается препроцессором, котоый всюду в исходном текстезаменит вхождение " строка1" на " строка2". Например, строка #difine max 80, записанная в начале программы, обеспечит всюду замену указанного имени maxна соответствующую константу. Замена имени связана не только числами, но и текстами.

А теперь вернемся к примерам. В следующей программе (пример 3) строится единичная матрица a[m][m], размер которой определяется с помощью конструкции #difine m 5.Сам алгоритм вычисления элементов матрицы основан на возведении (i/j)*(j/i)равно единице тогда и только тогда. когда iравно j.В остальных случаях оно равно нулю.

Пример 3

#define M 5 #include < stdio.h> main() { int a[M][M]; int j, i=0; while(i< M) { j=1; while(j< M) { a[i][j]=(i/j)*(j/i); printf(" %d", a[i][j]); j++; } i++; printf(" \n" ); } }

 


Поделиться:



Популярное:

  1. CEМEЙНOE КОНСУЛЬТИРОВАНИЕ, ЕГО ОСОБЕННОСТИ
  2. Cистемы зажигания двигателей внутреннего сгорания, контактная сеть электротранспорта, щеточно-контактный аппарат вращающихся электрических машин и т. п..
  3. Cистемы зажигания двигателей внутреннего сгорания, контактная сеть электротранспорта, щеточно–контактный аппарат вращающихся электрических машин и т. п..
  4. Ex. Переведите, обратив внимание на перевод инфинитива, определите его функцию.
  5. I) индивидуальная монополистическая деятельность, которая проявляется как злоупотребление со стороны хозяйствующего субъекта своим доминирующим положением на рынке.
  6. I. Если глагол в главном предложении имеет форму настоящего или будущего времени, то в придаточном предложении может употребляться любое время, которое требуется по смыслу.
  7. I. Теоретические основы экономического воспитания детей старшего дошкольного возраста посредством сюжетно-ролевой игры
  8. I.3. ВОЗРАСТНЫЕ ИЗМЕНЕНИЯ В ОРГАНИЗМЕ ЛЮДЕЙ СТАРШЕГО ВОЗРАСТА И ПУТИ ИХ ПРОФИЛАКТИКИ
  9. II РАЗДЕЛ ДЕЯТЕЛЬНОСТЬ ШЕСТИЛЕТНЕГО РЕБЕНКА
  10. II семестр – срок сдачи контрольных работ до 1 апреля текущего учебного года.
  11. II. Принятие решения о проведении таможенного досмотра и организация его проведения
  12. II. Система обязательств позднейшего права


Последнее изменение этой страницы: 2017-03-08; Просмотров: 1347; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.031 с.)
Главная | Случайная страница | Обратная связь