Образцы решения задач

Задача № 1. Вставьте в двумерный массив строку из нулей после строки с номером t.

Постановка задачи.

Для решения этой задачи необходимо, первые t строк оставить без изменений, затем все строки после t-ой сдвинуть на одну, а элементам (t+1)-й строки присвоить заданное значение.

Входные данные.

Количество <Строк> и <Столбцов> в массиве соответственно – n, m (целое).

Двумерный <Массив> случайных чисел – А (тип tMatrix).

<Номер> строки после, которой будет вставлена строка из нулей – t (целое).

Выходные данные.

Измененный двумерный массив – А.

Алгоритм.

1. Заполнение <Массива> случайными числами.

2. Сдвиг на одну строк, строк расположенных после строки c <Номером>.

3. Заполнить (t+1)-ю строку нулями.

4. Вывести на печать измененный <Массив>.

Функциональная структура алгоритма

 
 


Текст программы.

Const

n=100; // количество строк

m=80; // количество столбцов

Type

tVector= array [1..n] of integer; // описана строка таблицы

tMatrix= array [1..m] of tVector; // описана матрица состоящая их n строк

Var

A: tMatrix;

t: integer; // номер вставляемой строки

procedure ZapolMatrix(var X: tMatrix; L, H: integer);

{ алгоритм заполнение массива случайным числами из диапазона [L..H]

A – заполняемый массив

L – минимальное значение элементов массива

H – максимальное значение элементов массива

}

Var

i, j: integer; // счетчики циклов

Begin

for i:=1 to n do

for j:=1 to m do

X[i][j]:= (abs(L)+abs(H)+1)-L;

end;

procedure Vivod(X: tMatrix);

Var

i, j: integer;

Begin

f or i:=1 to n do begin // для каждой строки

f or j:=1 to m do // для каждого столбца

Write(X[i][j], ’, ’); // вывод элемента и строки текста ’, ’

Writeln; // перевод курсора на следующую строку экрана

end;

end;

procedure SdvigStr (var A: tMatrix; t: integer);

{сдвиг строк, начиная с указанной

A – матрица

t – номер вставляемой строки

}

Var

i, j: integer;

Begin

for i:=n downto t+1 do // начиная с последней до (t+1)-й строки

for j:=1 to m do //

X[i+1][j]:= X[i][j];

end;

procedure ZapolVector(var A: tVector; val: integer);

{заполнение строки указанным значением

A – строка матрицы

val – указанное значение

}

Var

i: integer;

Begin

for i:=1 to m do

A[i]:=val;

end;

Begin

// ввод исходных данных

ZapolMatrix(A, 10, 20); // заполнили матрицу

Vivod(A); // вывод элементов заполненного массива

Write(’Введите номер строки ’);

ReadLn(t);

// обработка

SdvigStr(A, t); // сдвиг строк, начиная со строки t

ZapolVector(A[t], 0);

// вывод результатов

Vivod(A)

end.

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

Постановка задачи.

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

Входные данные.

<Количество> команд-участниц – n (целое).

Двумерный массив <Резудьтатов> чемпионата– Chemp (тип элементов – 0..2).

Одномерный массив <Названий> команд - Name ( тип - строковый массив ).

Выходные данные.

Итоговые таблицы – Chemp, Name, где команды расположены в порядке убывания завоеванных ими очков.

Алгоритм.

1. Введем <Названия> команд-участниц.

2. Введем <Результаты> чемпионата (0 – поражение, 1 – ничья, 2 – победа).

3. Найдем очков для каждой команды (очки полученные командой будут храниться в дополнительном столбце таблицы <Результаты>).

4. Отсортируем таблицу <Результатов> и <Названий> по количеству очков для того, чтобы команды расположить в порядке убывания завоеванных ими очков.

5. Выведем <Результаты> и <Названия> команд.

Функциональная структура алгоритма


Текст программы.

Const

n=10; //число команд

Type

tKomand= array [1..n+1] of integer; // результаты игр команды и набранные ей очки

tChemp= array [1..n] of tKomand; // таблица результатов чемпионата

tName= array [1..n] of string [30]; // список названий команд (строка текста не более 30 символов)

Var

Name: tName;

Chemp: tChemp; // результаты

procedure ResultChemp(var Ch: tChemp);

{ввод результатов игр

Ch – результаты чемпионата

Результаты симметричны относительно главной диагонали:

если Ch[i][j]=2 (победа), то Ch[j][i]=0 (поражение);

если Ch[i][j]=1 (ничья), то Ch[j][i]=1 (ничья);

если Ch[i][j]=0 (поражение), то Ch[j][i]=2 (победа);

}

Var

i, j: integer;

Begin

for i:=1 to n do // для каждой команды

for j:=i+1 to n do begin // вводим только элементы над главной диагональю

WriteLn(’Результат игры команды’, i, ’ с командой ’, j);

ReadLn(Ch[i][j]);

// заполняем элементы под главной диагональю

Ch[j][i]:=2-Ch[i][j];

End

end;

procedure NameTeam(var Nm: tName);

{ввод названий команд

Nm – список названий команд

}

Var

i: integer;

Begin

for i:=1 to n do // для каждой команды

ReadLn(Nm[i]) // вводим её название

end;

procedure ResultKomand(var Ch: tChemp);

Var

i, j: integer;

Begin

for i:=1 to n do begin // для каждой команды

Ch[i, n+1]:=0; // обнуляем количество очков (очки хранятся в (n+1)-м столбце)

for j:=1 to n do // для каждой игры

Ch [i, n+1]:=Ch [i, n+1]+Ch [i, j] // добавляем результат в очки

end;

end;

procedure SortKomand(var Ch: tChemp; var Teams: tName);

Var

i, j, n_max: integer;

tempGame: integer; // соответствует типу элементов массива tChemp

tempName: string [30]; // соответствует типу элементов массива tName

Begin

for i:=1 to n-1 do begin // для каждой команды, кроме последней

// находим среди оставшихся команду с наибольших количеством очков

nMax:=i+1;

for j:=i+1 to n do

if Ch[j, n+1]>Ch[nMax, n+1] then // очков у j-й команды больше, чем у команды nMax

nMax:=j; // запомнили команду с большим результатом

//меняем названия соответствующих команд

tempName:= Teams [i];

Teams [i]:= Teams [nMax];

Teams [nMax]:= tempName;

//меняем результаты игр соответствующих команд

for j:=1 to n+1 do begin

tempGame:= Ch [i][j];

Ch [i][j]:= Ch [nMax][j];

Ch [nMax][j]:= tempGame

End

End

end;

procedure Vivod (Ch: tChemp; Teams: tName);

Var

i, j: integer;

Begin

WriteLn (’** Итоговая таблица**’);

WriteLn (’ --- ------------------------------ ---’);

WriteLn (’ Команда Очков’);

WriteLn (’--- ------------------------------ ---’);

for i:= 1 to n do

WriteLn(i:2, Teams[i]:30, Ch[i][j]:2);

WriteLn (’ --- ------------------------------ ---’);

end;

Begin

// ввод исходных данных

ResultChemp(Chemp);

NameTeam(Name);

// обработка данных

ResultKomand(Chemp); // Подсчет количества очков

SortKomand(Chemp, Name); // Сортировка таблицы по столбцу с количеством очков

// Вывод результатов чемпионата

Vivod(Chemp, Name);

end.

Задания для самостоятельного решения.

Вариант 1.

1. Дан двумерный массив. Найти сумму и количество элементов в каждом столбце, кратных числам а и b (вводятся с клавиатуры).

2. Дан двумерный массив. Вставьте первую строку после строки, в которой находится первый встреченный минимальный элемент.

3. Известны цены товаров 10-ти наименований в 20-ти городах, а также списки названий этих товаров и городов и “потребительская корзина’, одинаковая для всех городов (т.е. набор чисел, указывающий, сколько потребляют каждого товара). Какой город является наиболее дорогим и наиболее дешевым?

Вариант 2.

1. Дан двумерный массив. Найти сумму и количество элементов в каждом столбце, попадающих в интервал от А до В.

2. Дан двумерный массив. Вставьте второй столбец после первого столбца, в котором все элементы положительны.

3. Известны цены на 10 одинаковых товаров в каждом из 8 магазинов. Для каждого магазина напечатать список 3-х наиболее дорогих товаров.

Вариант 3.

1. Дан двумерный массив. Найти сумму и количество элементов в каждом столбце, являющихся четными числами.

2. Дан двумерный массив. Вставьте нулевую строку перед строкой, в которой находится первый минимальный элемент.

3. Каждое из N предприятий города выпускает 5 наименований продукции. Известен объем выпуска продукции каждого наименования каждым предприятием и стоимость единицы продукции. Для каждого предприятия определить его долю стоимости производимой продукции каждого типа в процентах.

Вариант 4.

1. Дан двумерный массив. Найти сумму и количество элементов в каждом столбце, положительных и лежащих вне главной диагонали.

2. Дан двумерный массив. Вставьте строку после всех строк, в которых находится заданное число А.

3. Завод выпускает 20 наименований продукции. Общее число работников завода — 100 человек. Известны фамилии работников, степень участия каждого работника в выпуске того или иного вида продукции (1 — принимает участие, 0 — не принимает участие), а также их месячная зарплата. Также известен доход, который приносит каждый вид продукции. Расставить фамилии работников в порядке их “ценности’ для предприятия. Ценность работника определяется отношением общего дохода всех видов продукции, выпускаемой при его участии, к его зарплате. Таким образом, задачу можно было бы сформулировать и по-другому: напечатать список претендентов на увольнение с завода.

Вариант 5.

1. Дан двумерный массив. Найти сумму элементов с k1 до k2 строки.

2. Дан двумерный массив. Вставьте второй столбец перед всеми столбцами, в которых нет отрицательных элементов.

3. Известны результаты опроса 200 респондентов о популярности 10-ти политиков. Каждый респондент называл 4-х наиболее популярных, с его точки зрения, политиков. Напечатать рейтинг популярности этих политиков — фамилии и число собранных голосов.

Вариант 6.

1. Дан двумерный массив. Найти номера всех максимальных элементов.

2. Дан двумерный массив. Вставьте первый столбец после всех столбцов, в которых есть отрицательные элементы.

3. В некоторых вида спортивных состязаний выступление каждого сортосмена независимо оценивается несколькими судьями, затем из всей совокупности оценок удаляется наиболее высокая и наиболее низкая, а для оставшихся оценок вычисляется среднее арифметическое, которое и идет в зачет спортсмену. Если наиболее высокую оценку ставят несколько судей, то из совокупности оценок удаляется только одна такая оценка; аналогично поступают с наиболее низкими оценками. Определит оценку, которая пойдет в зачет каждому участнику соревнования, если известно, что в соревнованиях участвовало по N спортсменов в каждом из пяти видов состязаний.

Вариант 7.

1. Дан двумерный массив. Найти номера первых отрицательных элементов каждой строки.

2. Дан двумерный массив. Вставьте столбец из нулей после столбцов с минимальными элементами.

3. Завод выпускает 20 наименований продукции. Про каждый вид продукции известно: сколько единиц этой продукции выпускает завод, себестоимость и отпускная цена единицы продукции, сколько человек занято на выпуске этой продукции. От каких видов продукции завод должен отказаться, чтобы общая производительность труда повысилась вдвое? ({производительность труда} = {доход от продажи продукции} / {количество человек, принимающих участие в ее производстве}).

Вариант 8.

1. Дан двумерный массив. Найти номера последних положительных элементов каждой строки.

2. Дан двумерный массив. Вставьте первую строку между средними строками.

3. Для каждого из пяти автобусных маршрутов известно количество проданных билетов на каждый из семи рейсов. В каждом автобусе K мест. Какие из рейсов на каждом маршруте надо исключить из расписания, чтобы маршруты стали рентабельными. (Маршрут является рентабельным, если общее число проданных на него билетов превосходит 75% от общего числа мест во всех автобусах маршрута).

Вариант 9.

1. Дан двумерный массив. Найти количество элементов в каждой строке, больших среднего арифметического элементов в каждой строке.

2. Дан двумерный массив. Вставьте строку из нулей перед всеми строками, первый элемент которых делится на 3.

3. Имеется каталог на 15 видов с/х машин, где указаны: номер, цена и название. Десять фермерских хозяйств составили приоритетные списки, где указаны по 5 названий машин, которые хотели бы приобрести. Зная количество денег для этих целей в каждом хозяйстве, надо напечатать список номеров машин, которых может приобрести каждое хозяйство (предположить, что хозяйство будет покупать по одной машине каждого типа).

Вариант 10.

1. Дан двумерный массив. В каждой строке замените знак максимального по модулю элемента на противоположный.

2. Для заданного целочисленного двумерного массива найти максимум среди сумм элементов диагоналей, параллельной главной диагонали.

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

Контрольные вопросы:

1. Дайте определение понятию массив.

2. Какими свойствами обладает структура данных массив?

3. Объясните термин и необходимость сортировки.

4. В чем суть алгоритма сортировки?

5. Какие типы массивов существуют, и чем они отличаются друг от друга?

6. Что такое логическое и физическое представление массива?

7. Как осуществляется доступ к элементу двумерного массива?

8. Опишите двумерный массив, состоящий из 100 элементов символьного типа.

9. Можно ли при описании массива инициализировать его элементы?

10. Назовите типовые алгоритмы обработки двумерного массива.

11. В чем суть алгоритма поиска минимального (максимального) элемента?



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: