Цель работы: изучить понятия, особенности внутреннего представления способы генерации и вывода многомерных массивов, научиться выполнять объявление, инициализацию, генерацию и вывод двумерных массивов, использование алгоритмов поиска, замены и суммирования в двумерных массивах при решении задач на языке C++.
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, которая получает на входе числовые данные (в зависимости от постановки задачи), выполняет генерацию и вывод двумерного массива указанного типа . В каждой задаче необходимо выполнить обработку двумерного массива. Для этого необходимо разработать алгоритм (поиска, замены или суммирования в двумерных массивах) и реализовать его в виде отдельной функции. Ввод данных осуществляется с клавиатуры с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные является диапазон используемого числового типа данных в языке С++ и максимально допустимый размер объявляемого двумерного массива.
Двумерные массивы в Си: обычные и динамические
Теоретические сведения.
Ознакомьтесь с материалом лекции 13.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
. Распечатайте его в виде таблицы с точностью до 4 знаков после запятой. Найдите в каждом столбце наибольший элемент. Распечатайте найденные элементы под соответствующим столбцом.
Сумма элементов 0-й строки равна . Сумма элементов 1-й строки равна .
. Распечатайте его в виде таблицы с точностью до 3 знаков после запятой. Найдите в каждом столбце среднее арифметическое элементов. Распечатайте найденные средние арифметические под соответствующим столбцом с той же точностью.
ВЫВОД ДВУМЕРНОГО МАССИВА СИ ШАРП | C# ОТ НОВИЧКА К ПРОФЕССИОНАЛУ | УРОК # 31
Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами объявления, генерации и вывода двумерных массивов в языке С++. Обработку данных необходимо выполнить, используя алгоритмы поиска, замены и суммирования данных в двумерных массивах. При разработке программного кода требуется использовать метод процедурной абстракции и комментировать фрагменты кода.
Следует реализовать каждое задание в соответствии с приведенными этапами:
- изучить словесную постановку задачи, выделив при этом все виды данных;
- сформулировать математическую постановку задачи;
- выбрать метод решения задачи, если это необходимо;
- разработать графическую схему алгоритма;
- записать разработанный алгоритм на языке С++;
- разработать контрольный тест к программе;
- отладить программу;
- представить отчет по работе.
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
- Титульный лист.
- Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
- Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
- Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
- Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
- Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
- Выводы по лабораторной работе.
- Ответы на контрольные вопросы.
Контрольные вопросы
- Почему в программе на С++ при объявлении двумерного массива необходимо, чтобы был известен размер по каждому измерению массива?
- Можно ли выполнить прямое присваивание двумерных массивов?
- Когда, с какой целью и почему возможно объявление безразмерных массивов? С одним безразмерным измерением?
- В чем отличие обращения к элементам двумерного массива с помощью индексированного имени и посредством арифметики с указателями?
- Эквивалентны ли для массива mas следующие обращения и почему: mas и mas[0] ? Почему?
- Приведите возможные обращения к элементу двумерного массива, аналогичные обращению mas[i][j] .
- Какие ограничения распространяются на тип массива?
- Каким образом можно определить объем памяти, выделяемой под двумерный массив ?
Источник: intuit.ru
Lesson 9
Двумерные списки (массивы)
1. Вложенные списки: обработка и печать
В реальном мире часто задачам приходится хранить прямоугольную таблицу данных. [скажем больше об этом!] Такие таблицы называются матрицами или двумерными массивами. В Python любая таблица может быть представлена как список списков (список, где каждый элемент, в свою очередь, является списком). Например, вот программа, которая создает числовую таблицу с двумя строками и тремя столбцами, а затем выполняет некоторые манипуляции с ней:
None
a = [[1, 2, 3], [4, 5, 6]] print(a[0]) print(a[1]) b = a[0] print(b) print(a[0][2]) a[0][1] = 7 print(a) print(b) b[2] = 9 print(a[0]) print(b)
Первый элемент a здесь — a[0] — это список чисел [1, 2, 3] . Первый элемент этого нового списка — a[0][0] == 1 ; кроме того, a[0][1] == 2 , a[0][2] == 3 , a[1][0] == 4 , a[1][1] == 5 , a[1][2] == 6 .
Для обработки двумерного массива обычно используются вложенные циклы. Первый цикл повторяется через номер строки, второй цикл проходит через элементы внутри строки. Например, так вы показываете двумерный численный список на экране по строкам, разделяя числа пробелами:
None
a = [[1, 2, 3, 4], [5, 6], [7, 8, 9]] for i in range(len(a)): for j in range(len(a[i])): print(a[i][j], end=’ ‘) print()
5.3 Программирование обработки двумерных массивов
Двумерные массивы обозначаются переменными с двумя индексами и используются для представления матриц. Например, массив А(3,5) можно представить в виде таблицы: А(1,1) А(1,2) А(1,3) А(1,4) А(1,5) А(2,1) А(2,2) А(2,3) А(2,4) А(2,5) А(3,1) А(3,2) А(3,3) А(3,4) А(3,5) Первый индекс в обозначении элемента массива является номером строки, а второй — номером столбца матрицы. Так же как и одномерные массивы, размеры двумерных массивов должны быть определены в начале программы. Причем для статически размещаемых массивов следует указать предельные значения номеров строк и столбцов массива. Например, оператор
Dim MAMI(4,6), A2(4,-3 To 3), B_matr(3 To 7, 6) определяет три двумерных массива, содержащих по 35 элементов в каждом и имеющих 5 строк и 7 столбцов. Для массива MAMI номера строк должны изменяться в диапазоне от 0 до 4, столбцов — в диапазоне от 0 до 6. Для массива A2 номера строк изменяются в том же диапазоне, а номера столбцов должны изменяться в диапазоне от-3 до 3. В матрице B_matr номера строк должны быть от 3 до 7, а столбцов от 0 до 6. Расположение многомерных массивов в памяти ЭВМ в стандарте языка VBA не оговариваются. В отличие от одномерных массивов, где конкретный элемент массива определяется одним индексом, при обработке двумерных массивов следует сформировать все возможные сочетания численных значений двух индексов. Это реализуется с помощью двух цикловодин по индексам строк, другой по индексам столбцов. В зависимости от того, какой из этих циклов будет внешним, различают две схемы обработки двумерных массивов — по строкам, когда внешним является цикл по номерам строк, и по столбцам, когда внешним является цикл по номерам столбцов.
‘ схема обработки массива | ‘ схема обработки массива |
‘ по строкам | ‘ по столбцам |
For i=1 To N ‘ внешний цикл | For j=1 To M |
For j=1 To M ‘ внутренний цикл | For i=1 To N |
‘ обработка элемента А(i,j) | ‘обработка элемента А(i,j) |
Next ‘конец внутреннего цикла j | Next ‘ внутр. цикл i |
Next ‘конец внешнего цикла i | Next ‘ внешний цикл j |
При написании операторов Next для наглядности можно дописать имена индексов соответствующего цикла. Однако, если их перепутать, то при выполнении программы будет выдано сообщение об ошибке.
Схема обработки по строкам заключается в следующем. Сначала индексы i и j получают значение единицы и происходит обработка элемента А(1,1). После этого индекс j увеличивается на единицу, а индекс i остается прежним. В результате происходит последовательная обработка элементов 1-ой строки: А(1,2), А(1,3), А(1,4), . , А(1,M).
После завершения внутреннего цикла увеличивается значение переменной i, и при выполнении цикла по индексу j осуществляется обработка 2-ой строки матрицы и т.д. Аналогичный процесс происходит при обработке по столбцам, только здесь изменяется индекс i при фиксированном номере столбца j. Ввод-вывод двумерных массивов может быть организован такими же способами, что и ввод-вывод одномерных массивов.
Однако при вводе-выводе двумерных массивов переменной длины, когда при составлении программы неизвестно количество строк и столбцов, их количество должно быть определено перед началом работы с массивом. Пример 5.8 . Написать фрагмент программы для определения сумм элементов каждого столбца матрицы М(5,7) и записи полученных значений в одномерный массив.
Исходная матрица расположена на активном листе таблицы Excel. Полученный массив с суммами столбцов поместить в восьмую строку этой же таблицы. В этой программе следует использовать схему обработки двумерного массива по столбцам. Сумма элементов каждого столбца формируется в переменной S и записывается в одномерный массив Summa, содержащий 7 элементов. Option Explicit ‘ запрет на использование необъявленных переменных Sub Пример_5_8() Dim Mas(4, 6) As Single Dim Summa(6) As Single, S As Single Dim i As Integer, j As Integer ‘ ввод массива из таблицы Excel по строкам
For i = 1 To 5 For j = 1 To 7 Mas(i — 1, j — 1) = Cells(i, j ) Next Next For j = 0 To 6 ‘ внешний цикл по столбцам S = 0 ‘ подготовка переменной для накапливания суммы For i = 0 To 4 ‘ внутренний цикл по строкам S = S + Mas(i, j) ‘ вычисление суммы j-го столбца Next ‘ конец внутреннего цикла по параметру i Summa(j) = S ‘ запись суммы столбца в одномерный массив Next ‘ конец внешнего цикла по параметру j Cells(7, 1) = «Сумма элементов по столбцам» For i = 1 To 7 Cells(8,i)=Summa(i-1) ‘ запись массива Summa в 8-ю строку таблицы Next End Sub Тестовые данные и результат отладки программы показаны на рисунке 5.3. Рисунок 5.3 — Данные и результат отладки программы «Пример_5_8» Пример 5 . 9. Написать фрагмент программы транспонирования массива T размером N×N.
For i=1 To N–1 For j=i+1 To N ‘ перестановка элементов T(i,j) и T(j,i) R = T(i, j) T(i, j)=T(j, i) T(j, i)=R Next Next Этот фрагмент программы переставляет местами строки и столбцы матрицы с одинаковыми номерами. При такой перестановке элементы T(i,j) и T(j,i) должны поменяться местами, например, Т(1,3) должен занять место Т(3,1) и наоборот.
Перестановка элементов строки и столбца массива с одинаковыми номерами осуществляется во внутреннем цикле, а во внешнем цикле обеспечивается переход к следующей строке. Так как начальное значение параметра внутреннего цикла j равно i+1 , перестановка элементов новой строки начинается не с первого элемента строки, а с элемента T(i,i+1) и продолжается от этого элемента вправо по строке. Элементы строки, расположенные левее главной диагонали, уже переставлены. Для перестановки двух элементов местами целесообразно ввести дополнительную переменную соответствующего типа, а саму перестановку осуществлять по следующей схеме: 1-й шаг — значение первого элемента присваивается рабочей переменной (например «R»); 2-ой шаг — значение второго элемента записывается в первый элемент (при этом старое значение первого элемента пропадает, поэтому оно предварительно было сохранено в рабочей переменной); 3-ий шаг — старое значение первого элемента из рабочей переменной R записывается во второй элемент.
Пример 5.10 . Написать фрагмент программы формирования единичной матрицы размером 5×5. Отличительной особенностью такого класса задач является то, что требуется записать в массив данные, подчиняющиеся какому-то закону. В этом случае следует запрограммировать закон создания такого массива, а не задавать эти значения оператором ввода. ‘ Фрагмент программы формирования единичной матрицы ‘ E(i,j)=1, если i=j и E(i,j)=0, если i не равно j For i=1 To 5 For j=1 To 5 E( i, j )=0. ‘ записываем в строку i нули Next E(i,i)=1 . ‘ записываем в элемент главной диагонали единицу Next Пример 5.11 . Написать программу перестановки минимального положительного и максимального отрицательного элементов матрицы размером 6×5. Исходные данные прочитать из текстового файла, а полученную матрицу вывести в другой текстовый файл. Option Explicit ‘ запрет на использование в программе ‘ необъявленных переменных Sub Пример_5_11() Dim Mas(5, 4) As Single Dim Min_E As Single ‘ минимальное положительное число в массиве Dim i_Min As Integer , j_Min As Integer ‘ его индексы Dim Max_E As Single ‘ максимальное отрицательное число в массиве Dim i_Max As Integer , j_Max As Integer ‘ его индексы Dim i As Integer , j As Integer ‘ рабочие переменны е ‘ ввод массива из файла Open «dat2.txt» For Input As #1 ‘ открываем файл для ввода Open «res2.txt» For Output As #2 ‘ открываем файл для вывода Print #2, «Исходная матрица Mas(6,5)» For i = 0 To 5 For j = 0 To 4
If EOF(1) = True Then ‘ вывод сообщения об ошибке в диалоговое окно Excel и файл вывода MsgBox «В файле «»dat2.txt»» мало данных: i=» «, j p609 ft4»> Print #2, Chr(13), «Вфайле»»dat2.txt»» малоданных: i=»; i; «, j p587 ft3»>GoTo 99 End If Input #1, Mas(i, j) ‘ считываем из файла очередной элемент Print #2, Mas(i, j), ‘ выводим очередной элемент в файл, ‘ но не закрываем строку Next j Print #2, Chr(13) ‘ заканчиваем вывод строки матрицы Next i ‘ поиск индексов мин. полож. и макс. отрицательного элементов Min_E = 10000000000# ‘ задаем начальное значение +1.е10 Max_E = -10000000000# ‘ задаем начальное значение -1.е10 For i = 0 To 5 ‘ внешний цикл по строкам For j = 0 To 4 ‘ внутренний цикл по столбцам If Mas(i, j) > 0 And Mas(i, j) < Min_E Then Min_E = Mas(i, j) i_Min = i: j_Min = j ‘ запоминаем индекс миним. полож. числа End If If Mas(i, j) < 0 And Mas(i, j) >Max_E Then Max_E = Mas(i, j) i_Max = i: j_Max = j ‘ запоминаем индекс макс. отриц. числа End If Next j ‘ конец внутреннего цикла по параметру j Next i ‘ конец внешнего цикла по параметру i ‘ проверка If Min_E = 10000000000# Or Max_E = -10000000000# Then ‘ нужных чисел нет If Min_E = 10000000000# Then ‘ нет положительных чисел MsgBox «В массиве нет положительных чисел» Print #2, «В массиве нет положительных чисел» End I f ‘ конец If Min_E = +1e10 If Max_E = -10000000000# Then ‘ нет отрицательных чисел MsgBox «В массиве нет отрицательных чисел» Print #2, «В массиве нет отрицательных чисел» End If ‘ конец If Max_E = -1e10 Else
‘ в массиве есть положительные и отрицательные числа Print #2, «Минимальное положительное число Mas(«; i_Min + 1;_ «,»; j_Min + 1; «) p621 ft4»> Print #2, «Максимальное отрицательное число Mas(«; i_Max + 1;_ «,»; j_Max + 1; «) p622 ft204»>Mas(i_Min, j_Min) = Max_E ‘ меняем элементы местами Mas(i_Max, j_Max) = Min_E ‘ выводим полученную матрицу Print #2, «Получення матрица Mas(6,5)» For i = 0 To 5 For j = 0 To 4 Print #2, Mas(i, j), ‘ выводим очередной элемент в файл, ‘ но не закрываем строку Next Print #2, Chr(13) ‘заканчиваем вывод очередной строки матрицы Next i End If ‘ конец оператора If Min_E = 1.t10 Or Max_E = -1.10 ‘ метка «99» — аварийное завершение программы, если в файле «dat2.txt» мало данных 99: Close ‘ закрываем все открытые файлы End Sub Для данных, представленных на рисунке 5.4, программой будет получен файл, показанный на рисунке 5.5.
1.1 | 1.2 | 1.3 | 1.4 | 1.5 | |
2 | 0.5 | 2.3 | -2.4 | 2.5 | |
-3 | -13 | -0.5 | 3.4 | 3 |
4.1 -4.2 4.3 -4.4 4.5
0.51 0.52 -0.53 0 | 4.9 |
0.61 0 -0.63 0.64 1.1 Рисунок 5.4 — Пример тестовых данных для отладки программы …..
Исходная | матрица | Mas(6,5) | ||
1,1 | 1,2 | 1,3 | 1,4 | 1,5 |
2 | 0,5 | 2,3 | -2,4 | 2,5 |
-3 | -13 | -0,5 | 3,4 | 3 |
4,1 | -4,2 | 4,3 | -4,4 | 4,5 |
0,51 | 0,52 | -0,53 | 4,9 | |
0,61 | -0,63 | 0,64 | 1,1 |
Минимальное положительное число Mas( 2 , 2 )= 0,5 Максимальное отрицательное число Mas( 3 , 3 )=-0,5
Получення матрица Mas(6,5) | ||||
1,1 | 1,2 | 1,3 | 1,4 | 1,5 |
2 | -0,5 | 2,3 | -2,4 | 2,5 |
-3 | -13 | 0,5 | 3,4 | 3 |
4,1 | -4,2 | 4,3 | -4,4 | 4,5 |
0,51 | 0,52 | -0,53 | 4,9 | |
0,61 | -0,63 | 0,64 | 1,1 |
Рисунок 5.5 — Текст файла «dat2.txt» В текст файла «dat2.txt» элементы, которые меняются местами, выделены жирным шрифтом. В данной программе для этой операции используются два оператора, но она может быть оформлена и «классическим» способом тремя операторами
R | = Mas(i_Min, j_Min) | |
Mas(i_Min, j_Min) = Mas(i_Max, j_Max) | ||
Mas(i_Max, j_Max) = | R |
6 Задания к лабораторным и расчетно-графическим работам В данном разделе приведены основные правила оформления и базовые задания к лабораторным и расчетно-графическим работам. В задания могут быть внесены изменения, поэтому студентам рекомендуется действующие варианты заданий скачивать с сайта кафедры. При этом следует учитывать свою специальность.
Из-за различий в учебных планах разных специальностей задания могут отличаться. В базовой версии заданий, приведенных в пособии, различия по специальностям не учитываются. Лабораторные работы выполняются на компьютере без текстового оформления. Результаты выполненной работы показываются преподавателю.
Расчетно-графические работы оформляются на листах писчей бумаги формата А4 (можно в клеточку или линованной). Текст пишется с одной стороны листа. На первом листе указывается номер расчетно-графической работы, ее название, фамилия студента с указанием группы и номера варианта работы.
Далее записывается краткий конспект по работе – 2-3 страницы рукописного текста с определением основных понятий данной работы. После конспекта записывается условие задания, тестовые данные для отладки программы и текст программы на языке VBA. К каждой работе прикладывается копия первого листа соответствующей лабораторной работы с заполненными полями: фамилия студента и дата выполнения работы. Первый лист лабораторной работы следует скопировать с сайта кафедры. В конспект первой работы рекомендуется включить: — правила записи констант и переменных на VBA; — типы переменных VBA; — старшинство арифметических операций;
Источник: studfile.net