Лабораторная работа № 2. Программирование с использованием ветвлений
Основы алгоритмизации
Электронное учебное издание
Методические указания по выполнению Лабораторных работ № 2-9
по дисциплине «Информатика»
Москва
(С) 2016 МГТУ им. Н.Э. БАУМАНА
УДК 004.432
Рецензент: доцент кафедры ИУ7 к.т.н. Новик Н.В..,
Т.Н. Ничушкина
Основы алгоритмизации. Методические указания по выполнению лабораторных работ № 2-9 по дисциплине «Информатика» -М.: МГТУ имени Н.Э. Баумана, 2015. 10 с.
Методические указания содержат теоретические сведения об основах алгоритмизации. Рассмотрены основные приемы программирования. Приведены примеры разработки алгоритмов при использовании различных приемов и их реализация на языке С++.
Для студентов МГТУ имени Н.Э. Баумана, обучающихся по программе бакалавриата по направлению «Математика и компьютерные науки»
Рекомендовано Учебно-методической комиссией НУК «Информатика и системы управления» МГТУ им. Н.Э. Баумана
Электронное учебное издание
Ничушкина Татьяна Николаевна
Основы алгоритмизации
Методические указания по выполнению лабораторных работ № 2-9 по дисциплине «Информатика»
© Т.Н. Ничушкина, 2016
© МГТУ имени Н.Э. Баумана, 2016
Московский государственный технический университет
Содержание
Содержание. 3
Введение. 3
Лабораторная работа № 2. 4
Программирование с использованием ветвлений. 4
Цель работы: изучение операторов организации ветвления, приемов создания программ, обеспечивающих выполнение альтернативных действий. 4
Лабораторная работа № 3. 8
Программирование с использованием циклов. 8
Цель работы: изучение операторов организации циклов, приемов создания программ, обеспечивающих выполнение циклических процессов. 8
Лабораторная работа № 4. 15
Обработка одномерных массивов. 15
Цель работы: изучение приемов обработки одномерных массивов. 15
Лабораторная работа № 5. 20
Обработка матриц. 20
Цель работы: изучение приемов обработки матриц в программах. 20
Лабораторная работа № 6. 24
Обработка строк. 24
Цель работы: изучение приемов обработки текстовой информации. 24
Лабораторная работа № 7. 29
Программирование с использованием подпрограмм.. 29
Цель работы: изучение соглашений о передаче параметров и средств организации передачи управления и данных 29
Лабораторная работа № 8. 34
Программирование с использованием динамической памяти. 34
Цель работы: изучение приемов и средств, обеспечивающих хранение данных на дисках и их обработку. 34
Лабораторная работа № 9. 40
Программирование с использованием файлов. 40
Цель работы: изучение средств языка и приемов работы со списками, размещенными в динамической памяти. 40
Заключение. 46
Список литературы. 46
Введение
Лабораторная работа № 2. Программирование с использованием ветвлений
Цель работы: изучение операторов организации ветвления, приемов создания программ, обеспечивающих выполнение альтернативных действий
Объем работы:2 часа
Теоретическая часть
Ветвлением в программировании называют конструкцию обеспечивающую выполнение различных действий в зависимости от результатов проверки некоторого условия.
Для программирования ветвлений, т. е. ситуаций, когда возникает необходимость при выполнении условия реализовывать одни действия, а при нарушении – другие, используют оператор условной передачи управления. Условие записывают в виде выражения, заключенного в круглые скобки. В зависимости от результата этого выражения осуществляется выбор одной из ветвей: если результат выражения «не ноль», то выполняется оператор, следующий за условным выражением, иначе – оператор, следующий за служебным словом else.
Синтаксис оператора ветвления:
if (<Выражение>) <Оператор;> [ else <Оператор;>]
где:
Оператор– любой оператор С++.
Выражение – любое выражение, соответствующее правилам составления выражений С++.
В каждой ветви допускается запись одного оператора, в том числе и другого условного оператора.
Если по алгоритму решения задачи необходимо в ветвях размещать более одного оператора, используют составные операторы.
Составным оператором в С++ называют последовательность операторов, заключенную в операторные скобки ( {……}). Операторы последовательности отделяют друг от друга точкой с запятой. Перед закрывающей скобкой (}) блока, точку с запятой также обязательно ставить. Так как точка с запятой является неотъемлемой частью оператора, то перед else точка с запятой обязательна. Исключением является составной оператор, так как в нем точка с запятой уходит внутрь блока.
В соответствии с синтаксисом оператора ветвления, допускается использовать оператор условной передачи управления с пропущенной (пустой) ветвью else. Такой оператор называется укороченным.
Так как в качестве оператора ветви по синтаксису может быть использован условный оператор, как в полной, так и укороченной форме, то при реализации такой конструкции могут возникнуть неоднозначности. Для этого необходимо использовать правило вложения. Это правило гласит:ветвь else всегда относится к ближайшему if.
Правило вложения продемонстрируем на примере нижеприведенных фрагментов алгоритмов:
Рисунок 1 –Варианты алгоритмов неоднозначных ветвлений
Следуя правилу вложения, для реализации варианта а подойдет следующий фрагмент программы на языке С++:
if <Условие1> then
if <Условие2> then <Действие1>
else <Действие 2>
Для реализации варианта б следует использовать составной оператор {…}:
if <Условие1>
{
if <Условие2> <Действие1>
}
else <Действие 2>
В этом случае укороченный вложенный ifвойдет внутрь составного оператора, а else,по правилам вложения, будет отнесен к внешнемуif, так как он в этом случае будет ближайшим.
Пример 1. Разработать программу, которая вычисляет значение функции, заданной следующим образом:
ì |x|, при |x| £ 1;
y = í x2, при 1 < |x| £ 2;
î 4, иначе.
Программа должна начинаться с ввода значения аргумента. Затем проверяем введенное значение, и в зависимости от того, в какой интервал оно попадает, вычисляем значение функции по одному из заданных выражений. Для того чтобы проверить попадание в три указанных диапазона необходимо выполнить две проверки.
Алгоритм решения данной задачи представлен на рис. 2.
Рисунок 2 - Схема алгоритма программы вычисления функции, заданной на отрезках, в заданной точке
Текст программы имеет следующий вид:
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
int main()
{
float x,y;
puts("Input x: ");
scanf("%f",&x);
if(fabs(x)<=1)
{
y=fabs(x);
puts("y=|x|");
}
else
if(fabs(x)<=2)
{
y=x*x;
puts("y=x^2");
}
else
{
y=4;
puts("y=4");
}
printf("For x=%6.2f y=%7.2f\n",x,y);
return 0;
}
Пример 2. Разработать программу, которая определяет можно ли из трех отрезков, представленных действительными числами x,y,z, вводимыми с клавиатуры, построить треугольник. Как известно, основные правила существования треугольника следующие: ни одна сторона не должна быть равна нулю, а суммы двух сторон должна быть больше третьей. Таким образом, нам нужно проверить шесть условий:
x, y, z не равны 0;
x+y>z; y+z>x; x+z>y.
Для реализации проверок следует использовать операторы условной передачи управления.
Текст программы приведен ниже.
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
int main()
{float x,y,z;
puts("Input x,y,z: ");
scanf("%f %f %f",&x,&y,&z);
printf(" x=%6.2f y=%7.2f z=%7.2f\n",x,y,z);
if((x!=0)&&(y!=0)&&(z!=0))
if(((x+y)>z)&&((y+z)>x)&&((z+x)>y))
puts("Treangle is exzist");
else
{
puts("Treangle no exzist, one side > summy other side");
printf(" x=%6.2f y=%7.2f z=%7.2f\n",x,y,z);
}
else
{ puts("Treangle no exzist, is 0 side");
printf(" x=%6.2f y=%7.2f z=%7.2f\n",x,y,z);
}
return 0;
}
Другие примеры программ, содержащих ветвления, приведены в [1].
Порядок выполнения работы
1. Прочитать и проанализировать задание в соответствии со своим вариантом.
2. Разработать схему алгоритма решения задачи.
3. Написать программу.
4. Вызвать среду программирования Visual Studio 2008 , создать новый проект консольного приложения и ввести текст программы в редактор среды программирования.
5. Подобрать тестовые данные (не менее 3-х вариантов).
6. Отладить программу на выбранных тестовых данных.
7. Продемонстрировать работу программы преподавателю.
8. Составить отчет по лабораторной работе.
9. Защитить лабораторную работу преподавателю, ответив на контрольные вопросы.
Требования к отчету
Отчет должен быть выполнен на бумаге формата А4 или А5 в том числе в тетрадях или на тетрадных листах. Если отчет выполняется на отдельных тетрадных листах, то они должны быть аккуратно обрезаны по линии подшивки и скреплены. Неаккуратно выполненные, оборванные или грязные отчеты не принимаются.
Все записи в отчете должны быть либо напечатаны на принтере, либо разборчиво выполнены от руки синей или черной ручкой (карандаш – не допускается). Схемы также должны быть напечатаны при помощи компьютера или нарисованы с использованием чертежных инструментов, в том числе карандаша.
Каждый отчет должен иметь титульный лист, на котором указывается:
а) наименование факультета и кафедры;
б) название дисциплины;
в) номер и тема лабораторной работы;
г) фамилия преподавателя, ведущего занятия;
д) фамилия, имя и номер группы студента;
е) номер варианта задания.
Кроме того, отчет по лабораторной работе должен содержать:
1) схему алгоритма, выполненную вручную или в соответствующем пакете;
2) текст программы;
3) результаты тестирования, которые должны быть оформлены в виде таблицы вида:
Исходные данные | Ожидаемый результат | Полученный результат |
4) выводы.
1.4. Контрольные вопросы
1. Что такое «ветвление»? В каких случаях используется эта конструкция?
2. Как показать ветвление на схеме алгоритма?
3. Какой оператор реализует ветвление в программе?
4. Какой синтаксис имеет этот оператор?
5. Объясните, почему в вашей программе следует использовать ветвление?
6. Как подбирают тесты для отладки программ, содержащих ветвления?
Объем работы: 4 часа
Теоретическая часть
Циклическая структура процесса вычислений определяет, что для получения результата некоторые действия необходимо выполнить несколько раз.
Для реализации циклических процессов используют операторы циклов. В теории программирования выделяют несколько основных видов циклических конструкций:
· счетный цикл (рисунок 3,а);
· цикл-пока (рисунок 3, б);
· цикл-до (рисунок 3, в).
Рисунок 3 - Структура циклов, реализованных в С++:
счетный цикл (а), цикл-пока (б) и цикл-до (в)
Счетный цикл. Счетными называются циклы, в которых количество повторений заранее известно или легко определяется. Примерами подобных циклов являются определение значения степени числа, факториала некоторого числа, суммы определенного числа членов некоторой последовательности и т.д.
В С++ оператор счетного цикла for имеет следующий систаксис:
for (<Выражение1>;<Выражение2>;<Выражение3>)<Оператор>;
где:
Выражение1 – инициализирующее выражение; представляет собой последовательность описаний, определений и выражений, разделенных запятыми. Выполняется только один раз в начале цикла и задает начальные значения переменным цикла. Может отсутствовать, при этом точка с запятой остается.
Выражение2 –выражение условия; определяет условие завершения цикла, в частности, предельное значение параметра цикла. Может отсутствовать, при этом точка с запятой остается.
Выражение3 – список выражений, которые выполняются на каждой итерации цикла после тела цикла, но до следующей проверки условия. Обычно определяют изменение параметра цикла. Может отсутствовать.
Оператор – тело цикла. Может быть любым оператором С++, в том числе и составным оператором (блоком операторов). Составной оператор применяется, если тело цикла содержит более одного простого оператора. Оператор тела цикла может отсутствовать, в этом случае вмесо него ставится точка с запятой.
Примеры операторов счетного цикла
1. for(int i=0,float s=0; i<n; i++,s+=i); - отсутствует тело цикла
2. for(int i=0,float s=0;i<n;i++)s+=i; - есть все компоненты
3. int i=0;float s=0;
for(;i<n;s+=i++); - отсутствует инициализирующее выражение и тело цикла
4. for(;i<n;)s+=i++; ++); - отсутствует инициализирующее выражение
5. int i;float s; s=0;
for(i=n; i>0;i--) s=s+i;
6. for(;;); - бесконечный цикл.
Пример 1. Разработать программу вычисления суммы n первых натуральных чисел. n вводится с клавиатуры.
Сумма определяется методом накопления. Количество суммируемых чисел известно, поэтому используем цикл с заданным количеством повторений. На каждой итерации цикла к сумме будем добавлять переменную цикла, которая будет изменяться от 1 до n. Перед циклом переменную суммы необходимо обнулить. На рисунке 4 приведена схема алгоритма программы.
Рисунок 4 – Схема алгоритма вычисления суммы n натуральных чисел
Текст программы приведен ниже:
#include "stdafx.h"
#include <stdio.h>
int main()
{ int i,n,s;
puts(“Input n”);
scanf(“%d”,&n);
for (i=1,s=0;i<=n;i++) s+=i;
printf("Sum=%5d n=%4d\n",s,n);
return 0;
}
Итерационные циклы.Итерационными называются циклы, в которых количество повторений заранее неизвестно, а определяется некоторой целевой функцией. В частности, это может быть точность вычислений. Примерами подобных циклов являются нахождение суммы бесконечного ряда, значения интеграла на отрезке, длины кривой и т.д. В С++ итерационные циклы реализуются с помощью двух видов циклов: цикла-пока и цикла-до.
Порядок выполнения работы
1. Прочитать и проанализировать задание в соответствии со своим вариантом.
2. Разработать схему алгоритма решения задачи.
3. Написать программу.
4. Вызвать среду программирования Turbo Delphi, создать новый проект консольного приложения и ввести текст программы в среду программирования.
5. Подобрать тестовые данные (не менее 3-х вариантов).
6. Отладить программу на выбранных тестовых данных.
7. Продемонстрировать работу программы преподавателю.
8. Составить отчет по лабораторной работе.
9. Защитить лабораторную работу преподавателю.
Требования к отчету
Отчет должен быть выполнен на бумаге формата А4 или А5 в том числе в тетрадях или на тетрадных листах. Если отчет выполняется на отдельных тетрадных листах, то они должны быть аккуратно обрезаны по линии подшивки и скреплены. Неаккуратно выполненные, оборванные или грязные отчеты не принимаются.
Все записи в отчете должны быть либо напечатаны на принтере, либо разборчиво выполнены от руки синей или черной ручкой (карандаш – не допускается). Схемы также должны быть напечатаны при помощи компьютера или нарисованы с использованием чертежных инструментов, в том числе карандаша.
Каждый отчет должен иметь титульный лист на котором указывается:
а) наименование факультета и кафедры;
б) название дисциплины;
в) номер и тема лабораторной работы;
г) фамилия преподавателя, ведущего занятия;
д) фамилия, имя и номер группы студента;
е) номер варианта задания.
Кроме того отчет по лабораторной работе должен содержать:
1) схему алгоритма, выполненную вручную или в соответствующем пакете, для решения вашей задачи с одним из трех циклов;
2) текст программы для лучшего с вашей точки зрения варианта;
3) результаты тестирования, которые должны быть оформлены в виде таблицы вида:
Исходные данные | Ожидаемый результат | Полученный результат |
4) выводы.
2.4. Контрольные вопросы
1. Что такое «цикл»? В каких случаях используется эта конструкция?
2. Как показать циклический процесс в схеме алгоритма?
3. Какие операторы реализуют ветвление в программе?
4. Какой синтаксис имеют эти операторы?
5. Объясните, почему в вашей программе следует использовать цикл?
6. Почему вы выбрали именно такой тип цикла?
Теоретическая часть
Массивы в С++ представляют собой последовательность ячеек базового типа, доступ к которым может осуществляться либо с указанием индексов (целого или символьного типов), либо с использованием возможностей адресной арифметики.
Согласно правилам С++ все массивы состоят из смежных ячеек памяти. Младший адрес соответствует первому элементу массива, а старший – последнему. Индексы массива всегда начинаются с 0.
Массивы и указатели тесно связаны между собой Трудно описать массивы и обрабатывать их не используя указателей.
Объявление массива:
<Тип элемента> <Имя> [<Размер1>] [= {<Список значений >}];
Количество индексов задает размерность массива. Каждому элементу массива соответствует один или несколько индексов, определяющих положение элемента в массиве.
Тип индекса – порядковый – определяет доступ к элементу.
Нумерация индексов ВСЕГДА начинается с 0.
Размер – определяет количество элементов по данному индексу.
Тип элемента – любой кроме файла, в том числе, другой массив.
Массив в памяти не может занимать более 2 Гб.
Объявление одномерных массивов:
1) Статически
int a[10]; - массив на 10 целых чисел;//индекс меняется 0 - 9
float mas[20] – массив на 20 вещественных чисел;
char sim[8] – массив на 8 символов;
double massiv[30] – массив на 30 вещественных чисел двойной точности;
unsigned int koord[10] – массив целых беззнаковых чисел .
2) Динамически
int *dinmas; указатель на целое;
dinmas=new int [100]; массив на 100 элементов целого типа.
Индекс меняется от 0 до величины, на 1 меньшей указанной в размере
Внешние и статические массивы можно инициализировать при объявлении.
int a[5]={0,-36,78,3789,50};
float b[10]={0,-3.6,7.8,3.789,5.0,6.1,0,-6.5,8.9,3.0};
long double c[4]={7.89L,6.98L,0.5L,56.8L};
short *m={2,3,5,8,12,0,56};
По правилам С++ имя массива является его адресом.
Поэтому для адресации элементов массива независимо от способа описания можно использовать адресную арифметику.
Пример.Разработать программу определения максимального элемента массива A(5) и его номера.
Вначале элементы массива необходимо ввести. Для выполнения этой операции используем цикл с заданным числом повторений.
Поиск максимального элемента требует дополнительных переменных: amax – для хранения текущего и найденного максимального значения и imax – для хранения номера текущего и найденного максимального значения. Саму операцию поиска выполним следующим образом.
Запомним в качестве текущего максимального, т. е. запишем в amax первый элемент и зафиксируем в imax его номер. Затем будем последовательно просматривать элементы массива, сравнивая их со значением, хранящимся в amax. Если очередной элемент больше значения в amax, то сохраняем его в качестве максимального в amax и запоминаем его номер в imax (рис. 7).
Рисунок 7 - Поиск максимального элемента массива: состояние на момент проверки четвертого элемента массива (а), изменение текущего значения максимального элемента и его номера по результатам проверки четвертого элемента массива (б)
Для организации последовательного просмотра используем цикл с заданным числом повторений, изменяя переменную цикла от 1 до 4, так как первый элемент мы уже учли. Просмотрев все элементы массива, найдем максимальный элемент и его номер. После этого необходимо вывести на экран исходный массив, максимальный элемент и его номер.
На рис. 8 представлена схема алгоритма программы. Поскольку операции ввода-вывода массивов выполняют однотипно, на схеме алгоритма соответствующих циклов, так же как и запросов на ввод данных, обычно не показывают. Вместо этого в схему вставляют блок операции ввода/вывода, в котором указано имя массива и количество элементов, участвующих в операции.
Рисунок 8 - Схема алгоритма поиска максимального элемента массива
Ниже приведен текст программы.
#include “stdafx.h”
#include <stdio.h>
int main(int argc, char* argv[])
{float a[5], amax; int i, imax;
puts(“Input 5 values:”);
for(i=0;i<5;i++)
scanf(“%f “,&a[i]);printf(“\n”);
amax=a[0];
imax=0;
for(i=1;i<5;i++)
if(a[i]>amax)
{ amax=a[i]; imax=i;}
puts(“Values:“);
for(i=0;i<5;i++)
printf(“%7.2f ”,a[i]);
printf(“\n”);
printf(“Max = %7.2f number = %5d\n”,amax, imax);
return 0; }
Другие примеры программ, содержащих обработку массивов, приведены в [1].
Порядок выполнения работы
1. Прочитать и проанализировать задание в соответствии со своим вариантом.
2. Разработать схему алгоритма решения задачи.
3. Написать программу.
4. Вызвать среду программирования Turbo Delphi, создать новый проект консольного приложения и ввести текст программы в среду программирования.
5. Подобрать тестовые данные (не менее 3-х вариантов).
6. Отладить программу на выбранных тестовых данных.
7. Продемонстрировать работу программы преподавателю.
8. Составить отчет по лабораторной.
9. Защитить лабораторную работу преподавателю.
Требования к отчету
Отчет должен быть выполнен на бумаге формата А4 или А5 в том числе в тетрадях или на тетрадных листах. Если отчет выполняется на отдельных тетрадных листах, то они должны быть аккуратно обрезаны по линии подшивки и скреплены. Неаккуратно выполненные, оборванные или грязные отчеты не принимаются.
Все записи в отчете должны быть либо напечатаны на принтере, либо разборчиво выполнены от руки синей или черной ручкой (карандаш – не допускается). Схемы также должны быть напечатаны при помощи компьютера или нарисованы с использованием чертежных инструментов, в том числе карандаша.
Каждый отчет должен иметь титульный лист, на котором указывается:
а) наименование факультета и кафедры;
б) название дисциплины;
в) номер и тема лабораторной работы;
г) фамилия преподавателя, ведущего занятия;
д) фамилия, имя и номер группы студента;
е) номер варианта задания.
Кроме того отчет по лабораторной работе должен содержать:
1) схему алгоритма, выполненную вручную или в соответствующем пакете;
2) текст программы;
3) результаты тестирования, которые должны быть оформлены в виде таблицы вида:
Исходные данные | Ожидаемый результат | Полученный результат |
4) выводы.
3.4. Контрольные вопросы
1. Что такое «массив»? В каких случаях используется эта структура данных?
2. Как показать операции с массивом на схеме алгоритма?
3. Какой объявить массив в программе?
4. Как осуществляется ввод и вывод элементов массива?
5. Объясните, почему в вашей программе следует использовать массив?
6. Как подбирают тесты для отладки программ, содержащих массивы? Какие недостатки и достоинства имеет использование для заполнения массивов датчиков случайных чисел?
Теоретическая часть
Матрицей называют двумерный массив, т.е. массив, для которого объявлены два индекса. Индексы массива всегда начинаются с 0
Объявление матрицы:
<Тип элемента><Имя>[<Размер1>][<Размер2>]...[={<Список значений >}];
Тип индекса – порядковый – определяет доступ к элементу.
Нумерация индексов ВСЕГДА начинается с 0.
Размер – определяет количество элементов по данному индексу.
Тип элемента – любой кроме файла, в том числе, другой массив.
Массив в памяти не может занимать более 2 Гб.
Описание матриц:
1) Статически, на этапе компиляции
int a[4][5] – матрица целого типа из 4 строк и 5 столбцов индексы меняются первый от 0 до 3, второй от 0 до 4
float matr[10][20] – матрица вещественного типа из 10 строк и 20 столбцов
double x[10][10] – матрица вещественного типа с двойной точностью из 10 строк и 10 столбцов
2) С помощью указателей.
Память под такую матрицу выделяется:
А) статически при инициализации
short **r={{3,5,9,7},{1,4,7,0},{12,5,90,3}} – под массив будет выделена память по количеству определенных элементов (три строки по 4 элемента)
Б) динамически во время выполнения
float **c;
c=new float * [4];
for (int i=0;i<4; i++) c[i]= new float [5];
под массив будет выделена память 4 строки по 5 элементов.
Матрицы расположены в памяти “построчно”, т.е. правые индексы меняется быстрее, чем расположенные левее.
Например: Матрица А[3][4] в памяти выглядит так:
Если количество индексов превышает 2, массив называют многомерным.
Точно так же, как и в одномерных массивах для адресации элементов многомерного массива независимо от способа описания можно использовать адресную арифметику.
Пример.Разработать программу вычисления сумм элементов строк матрицы A(4,5). Полученные суммы записать в новый массив B.
Итак, задана матрица, имеющая 4 строки и 5 столбцов (рис. 1, а). Требуется сформировать одномерный массив B из четырех элементов, который будет содержать суммы элементов строк (рис. 1, б). Распечатать результат лучше так, чтобы суммы были выведены после соответствующей строки матрицы, как на рис. 9.
Рисунок 9 – Исходные данные (а) и результат (б) примера
Программа должна начинаться со ввода матрицы. Основной цикл программы – цикл по строкам. Переменная цикла i в этом цикле будет изменяться от 0 до 4. Для каждой i-й строки в этом цикле должно выполняться суммирование элементов. Суммирование будем осуществлять методом накопления, для чего перед суммированием обнулим соответствующий i-й элемент массива B, а затем в цикле выполним добавление элементов строки. После завершения цикла суммирования эту строку и ее сумму можно сразу выводить. На рис. 10 представлена схема алгоритма программы (пунктиром выделено суммирование элементов i-й строки).
Рисунок 10 – Схема алгоритма программы нахождения сумм элементов строк (пунктиром выделено суммирование элементов i-ой строки)
Ниже приведен текст программы.
#include “stdafx.h”
#include <stdio.h>
int main(int argc, char* argv[])
{float a[4][5], b[4]; int i, j;
puts(“Enter a matrix in the lines:”);
for (i=0;i<4;i++) // вводим матрицу
for (j=0;j<5;j++) scanf(“%f “,&a[i]);printf(“\n”);
for (i=0;i<4;i++) // для каждой строки
{ b[i]=0; //обнуляем накапливаемую сумму
for (j=1;j< 5;j++)
B[i]=B[i]+A[i][j]; //суммируем элементы строки
for (j=1;j< 5;j++)
printf(“%7.2f ”,a[i][j]); //выводим строку
printf(“The sum is equal: %7.2f ”, b[i]); } //выводим сумму
return 0; }
Другие примеры программ, содержащих обработку матриц, приведены в [1].
Порядок выполнения работы
1. Прочитать и проанализировать задание в соответствии со своим вариантом.
2. Разработать схему алгоритма решения задачи.
3. Написать программу.
4. Вызвать среду программирования Turbo Delphi, создать новый проект консольного приложения и ввести текст программы в среду программирования.
5. Подобрать тестовые данные (не менее 3-х вариантов).
6. Отладить программу на выбранных тестовых данных.
7. Продемонстрировать работу программы преподавателю.
8. Составить отчет по лабораторной работе.
9. Защитить лабораторную работу преподавателю.
Требования к отчету
Отчет должен быть выполнен на бумаге формата А4 или А5 в том числе в тетрадях или на тетрадных листах. Если отчет выполняется на отдельных тетрадных листах, то они должны быть аккуратно обрезаны по линии подшивки и скреплены. Неаккуратно выполненные, оборванные или грязные отчеты не принимаются.
Все записи в отчете должны быть либо напечатаны на принтере, либо разборчиво выполнены от руки синей или черной ручкой (карандаш – не допускается). Схемы также должны быть напечатаны при помощи компьютера или нарисованы с использованием чертежных инструментов, в том числе карандаша.
Каждый отчет должен иметь титульный лист, на котором указывается:
а) наименование факультета и кафедры;
б) название дисциплины;
в) номер и тема лабораторной работы;
г) фамилия преподавателя, ведущего занятия;
д) фамилия, имя и номер группы студента;
е) номер варианта задания.
Кроме того отчет по лабораторной работе должен содержать:
1) схему алгоритма, выполненную вручную или в соответствующем пакете;
2) текст программы;
3) результаты тестирования, которые должны быть оформлены в виде таблицы вида:
Исходные данные | Ожидаемый результат | Полученный результат |
4) выводы.
4.4. Контрольные вопросы
1. Что такое «матрица»? В каких случаях используется эта структура данных?
2. Как показать обработку матриц в схеме алгоритма?
3. Какие приемы обработки матриц вы знаете?
4. Какой синтаксис имеет описание матриц?
5. Объясните, почему в вашей программе следует использовать матрицу?
6. Как подбирают тесты для отладки программ, содержащих обработку матриц?
Теоретическая часть
Подпрограмма – это относительно самостоятельный фрагмент алгоритма, соответствующим образом оформленный и снабженный именем.
В зависимости от способа описания и вызова, известны подпрограммы двух видов процедуры и функции.
Процедуры предназначены для выполнения некоторых действий (например, печать строки), а функция – позволяет получить некоторую величину, которую возвращает в качестве результата.
Однако, принципы программирования С++ основаны на понятии функции. Поэтому, в С++ нет процедур, как элементов языка, однако средства языка позволяют создавать функции, которые не возвращают значения и реализуют конструкцию, аналогичную процедурам
Данные для обработки процедуры и функции получают из вызвавшей их основной программы или подпрограммы. Для размещения рабочих полей подпрограммы могут объявлять новые типы и переменные в собственном разделе описаний. Результаты же они обычно должны возвращать вызвавшей программе или подпрограмме.
Описание функций:
1. Каждая программа обязательно должна включать единственную функцию с именем main (главная функция).
2.В программу может входить произвольное количество функций, выполнение которых прямо или косвенно инициируется функцией main.
3. Для доступности в программе, функция должна быть в ней определена или описана до первого вызова.
4. В определении функции указывается последовательность действий, выполняемых при ее вызове, имя функции, тип функции (тип возвращаемого ею результата ) и, если необходимо, список параметров (для обмена данными между подпрограммами.
<Тип результата> <Имя > ([<Список параметров>])
{ [< Объявление локальных переменных и констант >]
<Операторы> }
По правилам С++ подпрограмму можно описывать в любом месте программы и даже в другом файле, но только не внутри другой функции.
При описании функции после функции main или другой функции, в которой она используется, необходимо в начале программы описать прототип этой функции или подключить файл с описанием прототипа. Прототип представляет собой заголовок функции, завершающийся точкой с запятой. Обычно все прототипы функций собирают в начале программы.
Подпрограмма может получать данные двумя способами:
а) неявно – с использованием глобальных переменных;
б) явно – через параметры.
Неявная передача:
1) приводит к большому количеству ошибок;
2) жестко связывает подпрограмму и данные.
При использовании явной передаче данных через параметры существует два способа передачи аргументов в подпрограммы. Первый из них известен как передача параметров по значению. В этом случае в подпрограмму передаются копии фактическихпараметров, и никакие изменения этих копий не возвращаются в вызывающую программу.
Второй способ называют передачей параметров по ссылке. При использовании этого метода в подпрограмму передаются адреса фактических параметров, соответственно, все изменения этих параметров в подпрограмме происходят с переменными основной программы. По умолчанию в языке С++ применяется передача по значению.
Формальныминазываются параметры, определенные в заголовке функции при ее описании.
Каждый формальный параметр не только перечисляется (именуется), но и специфицируется (для него задается тип).
Совокупность формальных параметров определяет сигнатуру функции.
Сигнатура функции зависит от количества параметров, их типа и порядка размещения в спецификации формальных параметров.
Спецификация формальных параметров это либо пусто, либо void либо список отдельных параметров.
Примеры:
float max(float a,float b){….}
int fun1() {…..}
char F2(void) {…..}
Фактическиминазываются параметры, задаваемые при вызове функции.
Формальные и фактические параметры должны совпадать:
- по количеству;
- по типу;
- по порядку следования.
Однако, имена формальных и фактических параметров могут не совпадать.
Пример:
int k,l,n=6; float d=567.5,m=90.45
void fun2(int a,float c,float b){….} // описание функции fun2
fun2(n,d,m); // Правильный вызов
fun2(4,8.7); // Ошибка в количестве параметров
fun2(4.67, 5,7); // ошибка в типах параметров
fun2(3,m,d); // ошибка в порядке следования контролируется пользователем
Если в качестве параметров передаются параметры значения, то в качестве фактических можно передавать переменные, константы и выражения.
Существует два способа завершить выполнение подпрограммы и вернуть управление вызывающей подпрограмме. В первом случае функция полностью выполняет свои операторы и достигает закрывающей скобки, после чего управление автоматически передается в точку вызова. Такая подпрограмма должна либо не возвращать никаких данных либо должна возвращать результаты через параметры. В этом случае необходимо использовать ссылки или указатели.
Пример.Разработать программу, которая определяет площадь четырехугольника по заданным длинам сторон и диагонали.
Будем считать площадь четырехугольника как сумму площадей двух треугольников, определенных по формуле Герона. Вычисление площади треугольника оформим как подпрограмму. Исходные данные такой подпрограммы – длины сторон треугольника. Подпрограмма не должна менять значения параметров, поэтому их можно передать как параметры-значения или параметры-константы. Результат работы этой подпрограммы – скалярное значение, значит, она может быть реализована как функция. Однако ее также можно реализовать как процедуру, которая возвращает результат через параметр-переменную. Схемы алгоритма <