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

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РОССИЙСКОЙ ФЕДЕРАЦИИ

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ТЕХНОЛОГИЙ И УПРАВЛЕНИЯ им. К.Г. РАЗУМОВСКОГО

ФИЛИАЛ в г. ВЯЗЬМЕ СМОЛЕНСКОЙ ОБЛАСТИ

КУРСОВАЯ РАБОТА

Дисциплина: «Программирование на ЯВУ»

Тема: «Работа с массивами»

Специальность: 230102 «Автоматизированные системы обработки информации и управления»

Форма обучения: Очная

Курс: 2

Студент: Абрамов Константин Алексеевич

Преподаватель: Коростелёв Михаил Кириллович

Вязьма

2012

Содержание

Введение

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

  2. Однородные структуры данных. Массивы и матрицы.

  3. Интерфейс программы 3

  4. Прокомментированный текст программы 6

  5. Алгоритмизация

Заключение

Список литературы 10

Введение

C# (произносится Си-Шарп) - это новый язык программирования от компании Microsoft. Он входит в новую версию Visual Studio - Visual Studio.NET. Кроме C# в Visual Studio.NET входят Visual Basic.NET и Visual C++. Одна из причин разработки нового языка компанией Microsoft - это создание компонентно-ориентированного языка для новой платформы .NET. Другие языки были созданы до появления платформы .NET, язык же C# создавался специально под эту платформу и не несет с собой груза совместимости с предыдущими версиями языков. Хотя это не означает, что для новой платформы это единственный язык. Еще одна из причин разработки компанией Microsoft нового языка программирования - это создание альтернативы языку Java. Как известно, реализация Java у Microsoft не была лицензионно чистой - Microsoft в присущей ей манере внесла в свою реализацию много чего от себя. Компания Sun, владелица Java, подала на Microsoft в суд, и Microsoft этот суд проиграла. Тогда Microsoft решила вообще отказаться от Java, и создать свой Java-подобный язык, который и получил название C#. Если перевести слова NET Runtime на русский язык, то мы получим что-то вроде «Среда выполнения». Именно вы этой среде и выполняется код, получаемый в результате компиляции программы написанной на C#. NET Runtime основын не на ассемблере (т. е. не на коде, родном для процессора), а на некотором промежуточном коде. Отдаленно он напоминает виртуальную Java машину. Только если в случае Java у нас был только один язык для виртуальной машины, то для NET Runtime таких языков может быть несколько. Теоретически программа для среды NET Runtime может выполняться под любой операционной системой, в которой NET Runtime установлена. Но на практике пока единственная платформа для этого - это Windows. Учитывая перечисленные достоинства языка С#, он был выбран мною для решения поставленной задачи.

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

Заполнить матрицу А(N,N) числами натурального ряда в последовательности, указанной на рисунке и найти их сумму. Вывести матрицу на печать. Предусмотреть возможность открытия файла с диска и сохранения файла на диск.

  1. Однородные структуры данных. Массивы и матрицы.

Массивы есть во всех современных языках программирования. За исключением экзотичных, предназначенных для узких областей применения. Массивы служат для реализации такого фундаментального математического объекта, как матрицы. После простых переменных это наиболее известное и используемое понятие. Массивы привычны, их используют не задумываясь. Ведь даже самый короткий курс по программированию или вычислительной технике обязательно включает их изучение. Но так ли просты массивы на самом деле? Ведь даже простые типы данных оказались не такими простыми.

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

Давайте сначала посмотрим, как реализованы массивы в некоторых языках программирования. Будем рассматривать Fortran, Algol60, Basic, PL/I, C, Pascal. Выбор именно этих языков продиктован тем, что в них видны практически все варианты реализации понятия массива.

Реализация массивов в языках программирования

  • Язык Fortran. Один из первых ввел в обиход понятие массива. Первые версии языка позволяли организовывать только числовые массивы. Впрочем, и сам язык появился как средство описания вычислительных задач математики (FORTRAN=FORmula TRANslation). Более поздние версии языка значительно расширили понятие массива.

Массивы в языке Fortran могут иметь произвольное количество индексов, или размерностей. Однако конкретные трансляторы могут накладывать ограничения. Изменить размер однажды созданого массива невозможно. Первый элемент массива всегда имеет индекс 1. Примеры описания массивов:

DIMENSION A(30)

REAL B(50)

INTEGER C(10,20,30)

Примеры обращения к массивам:

DO 5 I=1,20

5 C(5,I,10)=A(i)+B(I+10)*4

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

SUBROUTINE NEG(A,N)

INTEGER A(N)

DO 1 I=1,N

1 A(I)=-A(I)

END

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

SUBROUTINE NEG(A,N)

INTEGER A(1)

DO 1 I=1,N

1 A(I)=-A(I)

END

Странно, не правда ли? Объявляется массив из одного элемнта, а обращаются к нескольким. Дело в том, что первые трансляторы не только не допускали указания переменной при объявлении массива, но и не контролировали индексы. Поэтому объявление массива из одного элемента указывало транслятору, что в качестве параметра передается массив, и ни чего более. А раз это массив, то строка, в которой меняется знак элемента массива никаких претензий у транслятора не вызывала. Более современные трансляторы стали контролировать индексы, а для сохранения возможности написания процедур общего вида разрешили использование переменной при описании параметров процедур.

  • Язык PL/I. Задумывался как язык для решения задач ВСЕХ типов. Обладает огромной гибкостью. Но эта гибкость привела к существенному усложнению синтаксиса языка, что отразилось на времени компиляции. Кроме того поддержка времени выполнения оказалась очень громоздкой. Большое число неявных преобразований типов данных и соглашений затрудняло отладку и написание программ. Поэтому мало кто знал и тем более использовал все возможности этого языка. А возможности были впечатляющими, для своего времени. Динамические массивы, структуры, процедурный тип данных, перехват исключительных ситуаций, работа с битами, гибкий ввод-вывод, вырезки из массивов. Не удивительно, что он составил серьезную конкуренцию Fortran. Однако, с исчезновением, по крайней мере в нашей стране, компьютеров серии ЕС (IBM), этот язык канул в лету. Тогда как Fortran, безусловно утратив свои былые позиции, нашел свою нишу на персональных компьютерах.

Поскольку PL/I практически мертвый язык, я не буду сильно вдаваться в подробности работы с массивами в этом языке. Одной из уникальных возможностей, так и не появившихся в других языках, была возможность формирования вырезок из массивов. Насколько эта возможность была важна сказать трудно. Я не видел ни одной программы, где бы эта возможность использовалась. Разновидность вырезок есть в языке Algol68, но это тема отдельного и очень долгого разговора. Приведу пример описания массивов на языке PL/I:

DECLARE A(50) FIXED(5);

DECLARE B(30) FLOAT;

  • Язык Algol60. Язык легенда. Предназначеный больше для описания алгоритмов, чем для практического применения, этот язык опередил свое время по богатству возможностей и логичности построения. Основной проблемой этого языка было отсутствие стандартизованности ввода-вывода. Кроме издания огромного количества алгоритмов, язык нашел и практическое применение. Причем во многих странах даже более широкое, чем Fortran.

Наиболее важным и заметным, с точки зрения массивов, является возможность задания нижнего значения индекса. Массивы, передаваемые в качестве параметров в процедуры, можно описывать без указания размерности. Поскольку язык Algol60 ввел понятие блока begin..end, в котором можно описывать свои внутренние переменные, описание массивов с вычисляемыми границами индексов не вызывает затруднений. Приведу комплексный пример:

real procedue pr(a,n);

value n; integer n;

array a;

begin

real array b[-n:n];

real r;

integer i,j;

for i:=-n step 1 until n do

for j:=-n step1 until n do

b[i]:=b[i]+a[i,j];

end j;

end i;

for i=-n step 1 until n do

if b[i]>0 then r:=r+b[i];

end i;

pr:=r;

end pr;

Этот пример не более чем способ показать основные правила работы с массивами в языке Algol60.

  • Язык Pascal. Был разработан Н.Виртом как язык для обучения программированию. Базовым языком послужил Algol60. Все сложные и неоднозначные конструкции Algol были выброшены. Были добавлены недостающие элементы, такие как пользовательские типы данных. Процедуры и методы ввода-вывода стали частью стандарта языка. В результате получился компактный, наглядный и надежный язык программирования. Достаточно быстро Pascal стал популярен не только как язык обучения, но и как язык прикладного программирования. Дальнейшим развитием языка Pascal стали языки Modula и Oberon. Эти языки менее известны, в первую очередь из-за того, что Pascal был поддержан фирмой Borland. Кроме трансляторов Turbo Pascal и Borland Pascal эта фирма выпустила продукт, который стал бестселлером. Речь идет о Delphi. Правда Pascal в продуктах Borland давно перестал быть Pascal Вирта, теперь это Object Pascal, но основные идеи остались прежними. Modula и Oberon не получили такой поддержки от крупных разработчиков трансляторов, а жаль.

  • program test;

  • const

  • Size=30;

  • type

  • Color=(Red,Green,Blue);

  • var

  • CrtPixels : array [0..Size] of Color;

  • i : integer;

  • begin

  • for i:=0 to Size do begin

  • case i mod 3 of

  • 0: CrtPixels[i]:=Red;

  • 1: CrtPixels[i]:=Green;

  • 2: CrtPixels[i]:=Blue;

  • end;

  • end;

  • end.

Этот пример очень простой. Да сложнее и не требуется. Видно, что работа с массивами в языке Pascal очень похожа на работу с массивами в языке Algol60. Есть и отличия. Это первый пример, в котором массив не числовой, а определяемого пользователем перечислимого типа. И тем не менее работа с таким массивом не отличается от работы с обычным массивом целых чисел. Это важный момент.

Стандарт языка, предложенный Виртом, не допускал создания динамических массивов. Это было сделано намеренно. Однако массивы переменного, или, по крайней мере вычисляемого размера, были необходимы при написании серьезных программ. Естественно это было реализовано в коммерческих трансляторах. Так в Borland Pascal можно объвить массив, при описании функции, как array of без указания размера, но с обязательным указанием типа. Получить значения нижнего и верхнего индксов можно функциями Low и High. Более того, можно указать факт передачи массива без указания не только размеров, но и типа. Использовать такой параметр в функции можно только с помощью явного приведения типа.

Для работы с динамическими массива стали использовать тип ptr of, т.е. указатель. Вместе с функциями работы с памятью, предоставляемыми, например, операционной системой, это дает возможность создавать динамический массив, изменять размер или удалять его.

  • Язык Basic. Язык для начинающих, так он по крайней мере задумывался. В оригинале, простой язык программирования, интерпретируемый а не транслируемый, требующий минимальной поддержки и минимальных ресурсов, соответственно предоставляющий минимум средств для написания программы. Любимый язык фирмы Microsoft и самого Билла Гейтса. Ведь именно с интерпретатора этого языка начинал Билл, успешная реализация которого и послужила причиной создания фирмы Microsoft.

В понимании Microsoft язык Basic вовсе не простейший язык, а мощный современный язык программирования, включающий в себя поддержку объектноориентированного подхода, OLE, средств визуального проектирования. Это Visual Basic.

Оригинальный Basic допускал только однобуквенные переменные. Массивы были только статические, и только одномерные. Причем если объявлялся массив без указания размерности, то считается, что массив состоит из 10 элементов. При развитии языка первыми ликвидированными ограничениями стали длинна имен переменных и количество индексов массива. В дальнейшем, при активном участии Microsoft стали допустимы и динамические массивы. Нижнее значение индекса фиксированно, и равно 0.

DIM Arr[30,30]

DIM Matrix()

REDIM Matrix(30,10,30)

FOR I=30 TO 0 STEP -1

Matrix[I,0,I]=I

Arr[I,I]=Matrix[I,I,I]

NEXT

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

  • Язык С. Один из самых популярных языков программирования, особенно в варианте С++. Большую свободу самовыражения дает только Assembler. Несмотря на то, что им пугают начинающих программистов, достаточно простой язык. К тому же чрезвычайно мощный, компактный и выразительный. Не зря его используют даже для написания операционных систем, например Unix и Windows. Позволяет программисту контролировать абсолютно все. Однако именно эта возможность и требует учитывать все тонкости и детали, например управления памятью. Небрежность оборачивается трудноуловимыми ошибками.

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

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

Позволю себе не углубляться дальше в тонкости языков С и С++, так как эта статья совсем о другом. Скажу лишь, что нижняя граница индексов массивов в языке С всегда 0.

#include <stdlib.h>

void func(int* a) {

int* b;

int c[10,5];

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

int i;

b=malloc(10*sizeof(int));

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

a[i]=d[i/2]*i;

*(b+i)=a[i];

c[i,i]=a[i]+d[i/2];

}

free(b);

}

Обратите внимание на *(b+i), это эквивалент b[i], и демонстрирует возможность смешивания указателей и массивов.