Освоение работы в интегрированной среде программирования

Освоение работы в интегрированной среде программирования

Цель работы:приобретение практических навыков работы в интегрированной среде (ИС) программирования Borland C.

Назначение и режимы работы ИС

ИС программирования Borland C предназначена для создания, редактирования и запуска в работу программ, написанных на языке программирования Си и С++. В ней пользователь получает ряд услуг, упрощающих процесс создания и отладки программ. В системе имеется развитая система помощи, которая позволяет получить справочную информацию по всем вопросам программирования. Она предоставляет такие возможности как многооконный режим работы, поддержка работы с мышью, возможность быстрого перехода к другим программам и быстрого возврата, наличие макроязыка редактора и др.

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

Запуск среды TURBO

Войти в ИС программирования можно двумя путями:

1) найти на рабочем столе ярлык системы Turbo C++ и щелкнуть по нему левой кнопкой мыши два раза;

2) в среде NC найти каталог TURBO C++ , в подкаталоге BIN выбрать команду

bc.exe

и нажать клавишу <Enter>.

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

Выход из системы

Чтобы окончательно покинуть систему можно воспользоваться командой QUIT в меню FILE или нажать комбинацию клавиш ALT+X. Для временного выхода в операционную систему (чтобы выполнить какую-либо команду DOS), оставив при этом программу в памяти машины, используется опция DOS Shell меню FILE. Для возврата в систему требуется набрать в командной строке DOS команду Exit.

Работа с окнами

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

Каждое окно имеет свой номер. Переход в другое окно (когда работа ведется с несколькими окнами) осуществляется нажатием клавиш ALT+N, где N – цифра, определяющая номер окна.

Операции с окнами могут выполняться с помощью меню, мыши, либо с помощью «горячих» клавиш. Описание команд меню приведено в[2].

Задание на выполнение работы

1.Загрузите интегрированную среду Turbo C++. Ознакомтесь с окнами и пунктами главного меню. Откройте новое окно с помощью пункта меню File/New.

В появившееся окно наберите демонстрационную программу (задается преподавателем). Набор текста осуществляется обычным набором средств, знакомых вам по работе с текстовыми редакторами. Запишите набранную программу под своим оригинальным именем в каталог, указанный преподавателем. Для этого выберите в меню команду File/Save as. В появившемся окне наберите путь, имя файла и нажмите клавишу <Enter>.

2. Откройте следующее окно. Используя директивы редактора для работы с блоками текста, выделите часть текста программы. Для этого установите курсор в начало блока текста и, используя директиву Ctrl+KB, выделите начало блока, а затем, установив курсор в конец блока текста директивой Ctrl+KK – конец блока. Сразу же после выделения текст высветится в инверсном изображении. С выделенным блоком текста можно осуществлять операции копирования, перемещения, удаления и т. д.

Скопируйте выделенный блок в подготовленное вами пустое окно редактора. Для этого следует выбрать пункт меню Edit/Copy, с помощью которого выделенный текст будет скопирован в карман. Затем следует перейти в нужное окно редактора и, используя пункт меню Edit/Paste, вставить текст из кармана в окно на позицию, указанную курсором.

Отмените выделение текста директивой Ctrl+KH (повторное выполнение директивы снова выделит текст).

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

Выделение блока происходит также в том случае, если при нажатой клавише Shift нажимаются клавиши: стрелки перемещения курсора и клавиши Home, End, PgUp, PgDn. Кроме команд редактирования, удобно использовать следующие директивы для работы с выделенными блоками текста.

Директива Функция

Ctrl+Del удаление выделенного блока,

Ctrl+Ins копирование выделенного блока в карман,

Shift+Del перемещение выделенного блока в карман,

Shift+ Ins вставка выделенного блока из кармана.

Проведите выделение текста и манипуляции с текстом с использованием указанных клавиш.

4. Использование мыши для работы с текстом. Использование мыши значительно упрощает работы с окнами и текстом. Для перехода из одного окна в другое необходимо щелкнуть левой кнопкой мыши в площади нужного окна. Изменить размеры окна можно «протаскиванием» правого нижнего угла окна. Перемещение окна осуществляется «протаскиванием» в нужное место поля заголовка.

Расположите с помощью мыши два окна таким образом, чтобы они занимали одинаковую площадь и располагались вертикально по всей длине экрана.

Для фиксации курсора в нужной позиции установите в нее указатель мыши и нажмите ее левую кнопку.

Протаскивание мыши с нажатой левой кнопкой приводит к такому же выделению блока текста, как и использование рассмотренных ранее директив.

Повторите действия выделения, копирования и перемещения текста с использованием мыши и меню Edit.

5. Компиляция и выполнение программы. Откройте окно с исходной программой. Если программа подверглась модификации, то загрузите ее снова с помощью меню File/Open. Для компиляции программы необходимо, чтобы текст находился в активном окне. Компиляция осуществляется с помощью пункта меню Compile и может производиться в режимах Compile, Make, Build. Компиляция в режиме Compile завершается созданием файла с расширением .obj , а компиляция в режимах Make и Build заканчивается формированием файла с расширением .exe (выполняемый файл).

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

6. Запуск в работу программы. Выберите меню Ran и откройте его подменю. Выбор команды Ran приведет к немедленному выполнению всей программы. Сначала осуществляется компиляция программы в режиме Make , а затем ее запуск на выполнение. Нажатие клавиш Ctrl+F9 из активного окна вызывает аналогичные действия.

Выполнение программы приводит к активизации окна программы, в котором вы видите результаты ее работы. Для возвращения в окно программы необходимо нажать клавиши Alt+F5. Повторное нажатие клавиш вернет вас в окно редактора. Убедитесь в этом.

Для отладки программы удобно использовать пошаговое выполнение команд программы. Для этого в меню Run выбрать пункт Step Over. Нажимая клавишу F8, можно по шагам выполнить программу. Убедитесь в этом.

7. Модификация программы. В соответствии с указанием преподавателя модифицируйте исходную программу. После модификации проведите повторную ее компиляцию и запуск на выполнение. При необходимости устраните допущенные во время редактирования ошибки.

Модифицированная программа должна быть записана под оригинальным именем в каталог, созданный для группы, а также выведена на принтер (опция File/Print) и представлена в отчете.

Содержание отчета

1. Краткое изложение назначения и возможностей ИС Turbo C++.

2. Эскиз экрана с указанием основных компонентов (полей).

3. Раскрыть назначение пунктов главного меню.

4. Распечатка текста программы.

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

1. Назовите основные пункты подготовки и решения задачи в среде Turbo C++.

2. Поясните назначение основных пунктов меню Edit.

3. Раскройте назначение функциональных и «горячих» клавиш при работе с программой.

Лабораторная работа №2

Базовые операции языка Cи

Цель работы:приобретение навыков программирования линейных процессов. Освоить функции ввода/вывода данных, оператора присваивания.

Рис. 2.1

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

Тип Имя_Переменной;

Объявление переменной можно совместить с ее инициализацией. В этом случае объявлений переменной записывают следующим способом:

Тип Имя_Переменной= Начальное_значение;

В последнем выражении знак “=” обозначает инструкцию присваивания. Она предназначена для изменения значения переменных, в том числе и для вычислений по «формуле». В отличие от других языков программирования в Си и C++ инструкция присваивания, выполняющая некоторое действие, может быть записана несколькими способами. Например, вместо x = x + dx можно записать x + = dx, а вместо i= i+1 воспользоваться оператором инкремента и записать i++.

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

Для ввода исходных данных с клавиатуры предназначена функция scanf(), первым параметром которой является управляющая строка, остальные параметры – адреса переменных, значения которых были введены. (Использование имени переменной, а не ее адреса в качестве параметра функции scanf() является типичной ошибкой начинающих программистов).

Для иллюстрации действия указанных операций рассмотрим следующий пример.

Пример №1:Введем программу, печатающую на экране: “Сейчас 2001 год”.

#include<stdio.h>

/* пример к лаб. работе №1*/

main ( )

{

int year, month;

year = 2001;

printf (“Сейчас % d год\n”, year);

}

Рассмотрим эту программу. Первая строка #include <stdio.h> подключает стандартный файл ввода/вывода языка Cи. Это так называемый заголовочный файл (header files). В файле stdio.h находится информация о стандартной функции вывода printf (), которую мы используем.

Вторая строка /*Пример…*/ – комментарий. Строка main() – определяет имя функции. Строка: { - содержит открывающую скобку, обозначающую начало тела функции main(). Строка: int year, month; объявляет (декларирует) переменные year и month и сообщает компилятору, что они целые (int).

Строка: year = 2000; является оператором присваивания.

Строка: printf (“сейчас %d год \ n” year); является вызовом стандартной функции printf(), которая выводит на экран некоторую информацию. Она состоит из двух частей: имени функции printf() и двух её аргументов “сейчас %d год \ n” и year, разделённых запятой. Первый аргумент называется управляющей строкой (Control String). Она может содержать любые символы или спецификации формата, начинающиеся с символа %. Спецификация %d указывает, что будет выводиться целое число. Комбинация символов “\n” сообщает функции printf() о необходимости перехода каретки на новую строку.

Последняя строка программы “}” содержит закрывающую фигурную скобку тела функции main().

Если программа не содержит ошибок, то после компиляции и выполнения её на экране появится сообщение: Сейчас 2000 год. Если была допущена ошибка, то после компиляции, строка, в которой эта ошибка была допущена, будет подсвечена. Переход к предыдущей ошибке осуществляется комбинациями клавиш ALT+F7, а к последующей ALT+F8.

Пример №2.Требуется вычислить длину окружности.

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

/* ПРОГРАММА*/

#include <stdio.h>

/*Вычисление длины окружности */

main ()

{

int radius;

float length;

printf (“Введите значение радиуса :\n”);

scanf (“%d”, &radius);

length = 3.1415*2*radius;

printf (“Радиус–%d\n длина – %f\n,” radius, length);

}

Отличие этого примера от предыдущего заключается в том, что:

1) объявлены две переменные разных типов: radius – типа целое (int); length – типа с плавающей точкой (float);

2) используется функция scanf() для ввода с клавиатуры значения радиуса окружности.

Первый аргумент функции scanf()- “%d” указывает, что будет вводиться целое десятичное число, второй аргумент указывает имя переменной, которой будет присвоено введённое значение.

В языке Си имеются специальные унарные и бинарные операторы, из которых наиболее хорошо известны положительное приращение (++) и отрицательное приращение (--), позволяющие с помощью единственного оператора добавить 1 или вычесть 1 из любого значения. Сложение и вычитание допускаются в середине выражения. Кроме того, можно задавать операции приращения до, и после вычисления самого выражения.

Пример №3.

sum=a+b++;

sum=a+++b;

Первый оператор суммирует a и b, затем результат присваивает sum, и потом значение b увеличивается на 1. Во втором выражении b увеличивается на 1, затем суммируются a и b, и далее результат присваивается sum.

Задание на выполнение работы

1) Ввести программу примера №1, провести её компиляцию и выполнение.

2) Ввести программу примера №2, провести отладку и запустить на выполнение.

3) Модифицировать программу примера №2 таким образом, чтобы она вычисляла длину окружности и площадь круга для любых радиусов.

4) Ввести программу и проверить действие операторов присваивания:

#include <stdio.h>

main ( )

{

int a, b, sum;

char *format;

format=”a=%d b=%d sum=%d\n”;

a=b=5;

sum=a+b printf(format, a, b, sum);

sum=a+++b; printf (format, a, b, sum);

sum=++a+b; printf (format, a, b, sum);

sum=--a+b; printf (format, a, b, sum);

sum=a--+b; printf (format, a, b, sum);

sum=a+b; printf (format, a, b, sum).

}

Отчёт должен содержать:

1) Тексты выполняемых программ.

2) Результаты расчётов.

Лабораторная работа № 3

Задание на выполнение работы

1. Ввести программу примера 5, осуществить ее отладку и работу.

2. Составить программу и произвести вычисления для одного из следующих вариантов:

1) S= S (x+1)k *cos(x/k)/(k+1)! , x=p/2

k =1

2) S= S (sinx)k /k ! , x=p/4

k=1

3) S= S(cosx)k/k! , x=p/4

k=2

4) S= S (sinx)i/ i!, x=p/4

i=1

5) S= S (ex - i)/(i+1)! , x=1.0

i=2

6) S= S (ex/i+ e-x/i )/(i+2)4 , x=1.0

i=1

7) S= S ln(x*i)/(i+2) , x=2.0

i=1

8) S= S xi+5/ (i+7)! , x=2.0

i=-5

9) P= Пxi/i! , x=5.0

i=5

10) Р= П(x+i) i+1/(i-2)! , x=4.0

i=5

11) Освоение работы в интегрированной среде программирования - student2.ru ),

12) Освоение работы в интегрированной среде программирования - student2.ru , N<=5

13) Освоение работы в интегрированной среде программирования - student2.ru , N>m

14) Освоение работы в интегрированной среде программирования - student2.ru ,

15) Освоение работы в интегрированной среде программирования - student2.ru

16) Освоение работы в интегрированной среде программирования - student2.ru N=4; S=6,212;

17) Освоение работы в интегрированной среде программирования - student2.ru ,

18) S= Освоение работы в интегрированной среде программирования - student2.ru ,

19) Освоение работы в интегрированной среде программирования - student2.ru при Освоение работы в интегрированной среде программирования - student2.ru xi = (1+i), y = 1/i;

20) Освоение работы в интегрированной среде программирования - student2.ru Освоение работы в интегрированной среде программирования - student2.ru ,

21) Освоение работы в интегрированной среде программирования - student2.ru , где Освоение работы в интегрированной среде программирования - student2.ru ,

N – натуральное, а x - вещественное число.

22) Освоение работы в интегрированной среде программирования - student2.ru N – натуральное; f – вещественное;

23) Освоение работы в интегрированной среде программирования - student2.ru ; N>2;

24) Освоение работы в интегрированной среде программирования - student2.ru ,

25) Освоение работы в интегрированной среде программирования - student2.ru ; N- натуральное; x- вещественное;

26) Освоение работы в интегрированной среде программирования - student2.ru ; N>5

27) Освоение работы в интегрированной среде программирования - student2.ru ; N – натуральное; f – вещественное;

28) Освоение работы в интегрированной среде программирования - student2.ru ;

29) Освоение работы в интегрированной среде программирования - student2.ru ;

30) Освоение работы в интегрированной среде программирования - student2.ru ; N – натуральное; x- вещественное;

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

Содержание отчета

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

2. Алгоритм вычисления заданного преподавателем математического уравнения.

3. Программу вычислений.

4. Распечатку результатов.

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

1.Назовите основные операторы циклических процессов.

2. Назовите основные параметры цикла.

3. Как образуется бесконечный цикл и как выйти из него?

Лабораторная работа №4

Условные операторы и операторы выбора

Цель работы: изучение трех форм управления процессом выполнения программ:

1) выполнение последовательности операторов;

2) выполнение определенной последовательности операторов до тех пор, пока некоторое условие истинно;

3) использование проверки истинности условия для выбора между различными, возможными способами действия.

Основное задание:

1. Составить программу решения квадратного уравнения вида:

AX2 + BX + C = 0 (1)

с полным анализом возможных решений (дискриминант D<0, D=0, D>0) на основе конструкций if и if-else.

2. Разработать диалоговую программу, позволяющую получать решения квадратного уравнения (1) при различных значениях коэффициентов A, B, C, а также выхода из программы по запросу, используя конструкции while или do-while (по выбору).

3. Разработать диалоговую программу, позволяющую в зависимости от значений коэффициентов получать то или иное решение, используя оператор выбора:

а) если A=0; B и C не равны нулю;

б) если B=0; A и C не равны нулю;

в) если C=0; B и A не равны нулю;

г) другие возможные сочетания коэффициентов A, B, C.

Программа должна вычислять как действительные, так и комплексные корни.

4. Вывести на экран сведения об авторе, исходные значения коэффициентов, значение дискриминанта и результаты решения.

Рекомендации по программированию

1. При выполнении п.1 основного задания необходимо использовать:

- файл заголовка math.h, который позволит Вам вычислить корень квадратный из дискриминанта (sqrt(D));

- конструкцию вида:

if (выражение)

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

Пример:

// подразумевается, что комплексных корней нет

if (D>0)

printf (“Решения нет \n”);

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

Пример:

if (D<0)

printf (“Решения нет \n”)

else

printf (“Решение есть \n”);

Операторы if и else могут быть вложенными.

2. При выполнении п. 2 основного задания необходимо использовать:

дополнительно к предыдущей программе конструкцию вида:

while (выражение) оператор.

Ключевое слово while позволяет выполнять оператор или блок до тех пор, пока условие не перестанет быть истинным. Оператор или тело блока, связанного с while, не будет выполнять, если выражение изначально ложно.

Пример:

сhar vych='d';

:

:

while(vych= ='d')

{

:

: // группа операторов

printf(''Продолжать решение? (d/n)\n");

cscanf("%c",vych);

}

В этом фрагменте программы блок команд будет выполняться до тех пор, пока символьной переменной не будет присвоено значение 'd'.

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

switch ( выражение_1)

{

case константа 1: оператор или группа операторов

блока 1;

break;

:

:

case константа I: оператор или группа операторов блока I;

break;

default: оператор или группа операторов;

}

При выполнении оператора switch сначала вычисляется значение выражения_1, стоящего в скобках оператора switch. Тип значения должен быть одним из целых: char, int, unsigned int, long int и long unsigned. Вычисленное значение сравнивается со значениями констант операторов case.

При совпадении значения выражения_1 с i-й константой выполняется оператор или группа операторов i-го блока. Затем управление передается на следующий (после switch) оператор, если в i-й ветви присутствует оператор break.

Если значение выражения_1 не совпало ни с одной из констант, выполняется оператор или группа операторов, помеченных default. При ее отсутствии выполняется следующий после switch оператор.

Пример:

int var;

:

:

if (A1=0)

var=1;

else

var=2;

:

:

switch(var)

{

case 1: {printf (“Решение уравнения \n”); …

x1 = …………;

x2 = …………;

:

break;

case 2: {printf (“Решение уравнения \n”); …

x1 = …………;

:

:

break;

default: puts (“ Ошибка \а \n”);

}

Если значение D<0 (корни комплексные), то предусмотрите изменение знака D перед вычислением квадратного корня, иначе будет зафиксирована ошибка.

4. Выведите результаты расчетов и распечатайте программу.

Содержание отчета

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

2. Формализация задачи.

3. Структурные схемы алгоритмов решения задачи.

4. Распечатки текстов программ с комментариями.

5. Ответы на контрольные вопросы.

6. Выводы по работе.

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

1. Какие управляющие средства выполнения программ существуют в языке Си? Объясните их синтаксис.

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

3. Какие операции используются в управляющих средствах выполнения программ.

4. Объясните различия между циклами while и do … while.

5. Для каких целей используется оператор switch ?

Лабораторная работа № 5

Рекомендации по программированию

1. В начале программы предусмотрите ввод значений количества строк, столбцов матрицы M[N][N].

Пример:

m1: cprintf ("Введи значение количества строк и столбцов матрицы \n");

cscaf ("%d", &N);

В случае, когда N<2 или N>6, вывести сообщение об этом и повторить ввод N.

Пример:

if (N<2||N>6)

{

cprintf ("Неправильно введено значение N \n");

goto m1;

}

где оператор goto m1 обозначает безусловный переход к оператору с меткой

m1.

Затем определите характер заполнения матрицы: автоматическое или ручное. Это можно сделать с помощью операторов:

printf ( “ Определите характер заполнения: 1- ручное, 2- автоматическое”); и

switch(w), где w равно 1 или 2. Для генерации псевдослучайных чисел в качестве элементов матрицы воспользуйтесь функцией rand(), инициализированной директивой препроцессора

#define RND ((float) rand () /32768.0)

…………………………………………

x[ i ][ j ] =RND*( целое число);

2. Для ввода элементов матрицы M[N][N] следует использовать конструкцию вида:

for (инициализация_1; условное выражение_1; конечное выражение_1)

for (инициализация_2; условное выражение_2; конечное выражение_2)

оператор или блок операторов // двойной цикл.

В круглых скобках содержится три выражения, разделенные символом точка с запятой. Первое из них служит для инициализации счета. Она осуществляется только один раз, когда цикл for начинает выполняться. Второе выражение – для проверки условия (она производится перед каждым возможным выполнением цикла). Когда выражение становится ложным (или в общем случае равным нулю), цикл завершается. Третье выражение вычисляется в конце каждого выполнения тела цикла.

Пример:

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

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

cscanf("%f", &M[i][j]);

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

Пример:

ans=2;

for(n=3;ans<=15;)

{

ans=ans*n;

cprintf("+ans=%f"\n", ans);

}

3. Для создания диалогового режима в программе можно применить конструкции операторов цикла: while; do- while. Операторы while и do- while рассмотрены в предыдущей работе.

Пример:

char answer; int N;

do

{

:

/*группа операторов */

printf (“Хотите завершить задачу ?”);

answer= getch();

}

while ( answer != ‘Y’ || answer != ‘y’);

printf (“Сделано %d – раз вычислений \n”,N);

В этом случае выход из цикла будет осуществлен при вводе с клавиатуры (операторы getch) букв Y или y.

4. Для выполнения п.3 основного задания воспользуйтесь частью результатов, полученных в работах 3 и 4.

Содержание отчета

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

2.Схема алгоритмов.

3.Распечатки текстов программы с комментариями.

4.Ответы на контрольные вопросы.

Вывод по работе.

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

1. Назовите операторы цикла, использованные Вами в программе.

2. Назовите операторы выхода из цикла и поясните их назначение.

3. Опишите примененный Вами алгоритм преобразования матрицы.

Лабораторная работа №6

Рекомендации по программированию

Рассмотрим пример функции, которая вводит с клавиатуры матрицу размером m x n : m – количество строк, n - количество столбцов, выделяет необходимую область памяти для размещения ее элементов и осуществляет ввод их значений в память ПЭВМ.

int ** input(int n, int m)

{

int i,j;

int **a;

//Выделение динамической памяти для элементов матрицы

a= (int**)malloc(n*sizeof(int*));

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

{

a[i]=(int*)malloc(n* sizeof(int*));

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

{

a[i][j]=0;

}

}

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

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

{

printf(“\nВведите элемент матрицы A(%d,%d) элемент массива:” ,i+1,j+1);

scanf(“%d”,&a[i][j]);

}

return a;

}

Для динамического выделения свободной памяти в данном фрагменте программы используется функция malloc(). Она возвращает указатель типа void. Для правильного использования значение этой функции надо преобразовать к указателю на соответствующий тип. При успешном выполнении операции malloc() возвращает указатель на первый байт свободной памяти требуемого размера. Если достаточного количества памяти нет, то возвращается значение 0 (нулевой указатель). Чтобы определить количество байт, необходимых для переменной, используют операцию sizeof.

Для освобождения динамической памяти используют функцию free с прототипом void *free(void *p); где *p – указатель на первый байт выделенной памяти. Прототипы обеих функций находятся в заголовочном файле STDLIB.H.

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

Для выделения динамической памяти можно так же использовать функцию

new тип [количество элементов].

Рассмотрим теперь функцию, осуществляющую вывод матрицы на экран дисплея.

void output(int **z,int m, int n)

{

int i,j;

printf(“\n Результирующая матрица\n”);

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

{

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

printf(“%8d”,z[I][j] ) ;

printf(“\n”);

}

}

Следует заметить, что введенная матрица представлена в памяти как линейный массив, т.е. здесь отсутствует разбиение на строки и столбцы. В связи с этим вам самим следует позаботиться о том, чтобы операции совершались с требуемыми элементами, т.е. индексы элементов должны соответствующим образом вычисляться. Так, например, если вы ввели матрицу размером 4х4, то элемент a[3,3] будет расположен на десятой позиции в массиве, считая с нуля.

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

Примерный вид функции main().

#include(stdio.h)

#include(conio.h)

#include(alloc.h)

int **input_mat(int,int);

//Объявление функций обработки, использующих функцию input

int fproi(int**,int**,int,int);

……………………………

void ouput( int**,int,int);

void main(void)

{

int m,n;

int **p, **q;

clrscr();

puts(“ Введите размер исходной матрицы”);

printf(“число строк=”);

scanf(“%d”,&m);

printf(“число столбцов=”);

scanf(“%d”,&n);

p= input_mat(m,n);

output_mat(p,m,n);

q= input_mat(m,n);

output_mat(p,m,n);

fproi(p,q,m,n);

……………..

}

При составлении программы воспользуйтесь разработками предыдущей лабораторной работы № 5.

Варианты заданий

1. T,U,S В вариантах заданий использованы следующие

2 .MQB обозначения:

3. S,M,T Т- транспонирование матрицы.

4. B,U,C С- вычисление следа матрицы.

5. Q,S,N U- умножение матрицы на число.

6. C,Q,T M- перемножение матриц.

7. U,T,N Q- возведение матрицы в квадрат.

8. S,N,U S- сложение матриц

9. C,N,T B- вычитание матриц.

10. M,N,Q N- вычисление нормы матрицы.

11. C,N,T

12. B,N,M,

13. C,S,T

14. Q,C,B

15. Сравнить суммы элементов главных диагоналей.

16. Сравнить суммы элементов двух столбцов.

17. Сравнить суммы элементов двух строк.

18. Проверить: является ли матрица магическим квадратом?

Содержание отчета

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

2.Схемы алгоритмов функций.

3.Распечатки текстов программы с комментариями.

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

1. В чем состоит отличие объявление функции от ее определения?

2. Как объявить функцию с переменным числом параметров?

3. Какие типы объектов могут быть использованы в качестве формальных параметров?

4. Что такое локальные объекты? Какова их область видимости и «время жизни»?

5. В чем состоит отличие автоматических переменных от статических?

6. Объясните механизм передачи параметров по значению, по указателю, по ссылке.

7. Какой массив называется динамическим?

Лабораторная работа № 7

Задание на выполнение работы

1. Создать файл в директории группы.

2. Введите программу примера 1. Выполните действия с заполнением и считыванием символов и строк.

3. Составить программу обработки текстового файла в соответствии с заданием:

3.1.В текстовом файле подсчитать количество строк, которые оканчиваются заданной буквой (задается преподавателем).

3.2. Найти максимальную длину строки в текстовом файле и распечатать все строки файла, имеющие такую длину.

3.3. Подсчитать количество пустых строк в файле.

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

Содержание отчета

1. Краткие теоретические сведения о методах обработки потоков данных.

2. Программа обработки, распечатки файлов с данными.

3. Комментарии к программе и полученным результатам

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

1. Что такое поток данных?

2. В чем состоит различие ввода данных в стандартном потоке и с внешнего устройства?

3. Напишите команды открытия файла для чтения и записи, закрытия файла.

4. В чем состоит различие команд fputs() и fgets()?

Лабораторная работа №8

Обработка списков

Цель работы: освоение методов обработки линейных и дважды связанных списков, приобретение навыков составления и отладки соответствующих программ

Struct vklad

{

char family[12];

float sum;

}

Пусть стоит задача разместить вклады в алфавитном порядке вкладчиков. Операции, которые надо произвести в программе, следующие: во-первых, нужно определить: имеется ли вкладчик с данной фамилией (НАЙТИ), во-вторых, включить новый вклад (ВКЛЮЧИТЬ), в-третьих, вычеркнуть вклад из системы (ИСКЛЮЧИТЬ).

Для обработки данных обо всех вкладах можно использовать массив вкладов:

strukt vklad array [1000],

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

Однако, операция ВКЛЮЧИТЬ в общем случае требует сдвига части

массива. Удаление вклада приводит либо к незаполненным «окнам», когда информация стирается (например, поле family элемента массива array заполняется пробелами), либо опять требует сдвига части массива. Сдвиг массива – это нежелательное действие, которое занимает время, пропорциональное длине массива К.

Разрешить возникшую проблему выполнения операции ВКЛЮЧИТЬ и

ИСКЛЮЧИТЬ можно в результате отказа от статического размещения элементов массива (вкладов) и организации динамического списка. Список состоит из элементов, каждый из которых в общем случае является структурой, в которой выделены содержательная и вспомогательная части. Вспомогательная часть используется для организации связей между элементами списка и содержит одно или несколько полей ссылочного типа.

В программе учета вкладов, использующей динамические списки, содержательная часть элементов остается такой же, как указано выше, и к ней добавляется в простейшем случае одно поле для указания следующего элемента списка (sled). Переменные - указатели sled должны быть переменными ссылочного типа. Элементы списка можно представить в виде следующего описания:

Strukt vklad

{

char family[12];

float sum;

strukt vklad sled;

}

Тогда информацию, например о четырех вкладах, можно представить в виде списка. Переменная top типа strukt vklad* указывает на первый элемент списка, а поле sled в последнем элементе имеет значение NULL.

Сформировать такой список можно с помощью программы включающей следующий фрагмент:

strukt vklad *top;

strukt vklad *p;

……………..

top=NULL;

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

{

p = ( strukt vklad *) malloc((sizeof (strukt vklad )));

p--> sled=top;

printf(“Введите фамилию вкладчика:”) ;

gets(p-->family);

printf(“Введите сумму вклада:”);

scanf(“%f”,p->sum);

top=p;

}

Рассмотрим поиск элемента списка с заданным значением одного из полей. Пусть, например, необходимо увеличить сумму вклада кладчика А. Для этого рассмотрим еще одну переменную типа strukt vklad *pt, которая будет перемещаться по списку до обнаружения нужной фамилии:

pt=top;

while(pt-> family !=A)

pt=pt->sled;

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

Приведенный фрагмент будет решать задачу ПОИСК только в том случае, когда можно гарантировать, что человек с фамилией А имеет в системе учета некоторый вклад.

Если это не так, то, «подойдя» к последнему элементу списка, переменная pt приобретает значение NULL, и на следующем шаге выполнения цикла обращение к полю pt--> family вызовет аварийное окончание программы, так как требуемого элемента просто не существует.

Опознать конец списка можно попытаться так:

pt=top;

while( pt!=0 && (pt--> family !=A))

pt=pt->sled;

Это решение в общем случае не устранит аварийное окончание по той же самой причине : в конце списка pt==NULL и элемента pt-> с полем family, который требуется для выполнения операции сравнения с А в программе учета не со

Наши рекомендации