Программирование на языке С в среде Borland 3.1

Программирование на языке С в среде Borland 3.1

Учебное пособие и

методические указания

к лабораторным работам

по дисциплине “Программирование”

Санкт-Петербург

УДК 004.438

Автор: Грушвицкий Р. И.

Описана методика разработки алгоритмов для решения задач на ЭВМ. Приведены указания по составлению программ на языке С в среде Borland 3.1 и правила хорошего стиля программирования. Даны варианты заданий к лабораторным работам для первого и второго семестра и методические указания к их выполнению. Рассмотрены проект программы и основные функции и режимы оболочки Borland C 3.1.

Пособие органически включает материалы методических указаний:

Программирование на языке С в среде Borland 3.1: Методические указания к лабораторным работам по дисциплинам “Информатика”, “Программирование” /Сост.: Хигай А.Г., Зуев И.С., Грушвицкий Р.И. СПб.: Изд-во СПбГЭТУ “ЛЭТИ”, 2006.

Предназначено для бакалавров СПбГЭТУ “ЛЭТИ” специальности 22.01.00 дневной и вечерней форм обучения.

СПбГЭТУ “ЛЭТИ”, 2011

ВВЕДЕНИЕ

Дорогие наши первокурсники! Поздравляем вас с началом обучения в нашем университете.

Дисциплина “Программирование” являются базовой для специальности 22.01.00 “Вычислительные машины, комплексы и сети”. Навыки программирования на языке С будут необходимы вам на протяжении всего обучения. Это как буква “А” в алфавите нашей специальности. Отнеситесь к изучению этой дисциплины самым серьезным образом. Но самое важное в программировании это умение создавать эффективные алгоритмы, а не процедура кодирования алгоритма ориентированная на тот или иной язык. Именно на это и направлено обучение в первом и втором семестре по дисциплине “Программирование”.

Главное – это с самого начала изучать дело самостоятельно, используя рекомендованную литературу и тренируясь на заданных вам примерах. А задача данного пособия соответствующих курсов лекций – помочь Вам в этом нелегком труде.

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

Желаем успехов!

Особенности решения вычислительных задач на ЭВМ

Решение задач на ЭВМ имеет целый ряд особенностей. На рис. 1 приведен порядок решения задач связанных с математическими вычислениями.

Программирование на языке С в среде Borland 3.1 - student2.ru

Рис. 1. Порядок решения задач на ЭВМ

Пример простейшей программы

Приступим

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

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

Рассмотрим первую программу. Ниже приведён её текст.

#include <stdio.h>

void main(void)

{

// Простейшая программа суммирования двух чисел

int a, b, c;

a = 5;

b = 7;

c = a+b;

printf("Сумма = %d\n", c);

}

Давайте разберём программу построчно.

В строке #include <stdio.h>производится подключение библиотеки stdio.h к нашей программе. Библиотека – это набор предварительно реализованных функций, служащих для определённых целей. Библиотека stdio.h содержит основные функции по вводу и выводу, о чём можно судить исходя из названия (STanDart Input/Output – стандартный ввод/вывод).

Строка void main(void) описывает главную функцию. Именно с неё начинается выполнение любой программы, написанной на языке С. Затем идёт открывающаяся скобка, которая говорит о начале кода программы. Обратите внимание, что в конце программы стоит закрывающаяся скобка. Именно так компилятор понимает, что ему выполнять и до каких пределов.

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

Далее идёт строка int a, b, c;. Она означает объявление целочисленных переменных с именами a, b и c и выделение под них памяти. Обратите внимание, что язык С чувствителен к регистру и переменные a и A – это разные переменные.

Следующие две строки: a = 5; и b = 7; одинаковы по смыслу, но различны по содержанию. Здесь осуществляется присвоение переменным a и b значений соответственно 5 и 7.

В строке c = a+b; осуществляется вычисление результата сложения значений переменных a и b, с последующим присвоением этого значения переменной c.

Последняя значащая строка программы printf("Сумма = %d\n", c); нуждается в гораздо большем пояснении. Именно ради этой строки, а, точнее говоря, ради функции printf мы подключали стандартную библиотеку ввода-вывода. Данная функция предназначена для вывода на экран информации, представленной в определённом виде. За формат представления информации отвечает первый параметр "Сумма = %d\n". Здесь все символы означают сами себя за исключением двух групп: %d и \n. Группа %d означает, что значение соответствующего параметра функции printf будет отображаться в форме целого числа (d - digit - цифра) – в данном случае таковым параметром является переменная c; \n означает, что встретив такую группу курсор перейдёт на начало следующей строки и вся последующая информация будет выводиться с первой позиции новой строки.

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

Естественно, что многие аспекты текста программы остались за рамками данного описания. Их всегда можно посмотреть в соответствующей литературе, например [1, 2, 4].

Расширяем функциональность

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

#include <stdio.h>

void main(void)

{

// Программа суммирования двух чисел

int a, b, c;

printf("Ведите два числа - целых\n");

scanf("%d %d", &a, &b);

c = a+b;

printf("Сумма = %d\n", c);

}

Жирным здесь выделены те места, которые изменены по сравнению с предыдущей версией. Как видно, изменений не так много. Но они достаточно существенны.

В строке printf("Ведите два числа - целых\n"); вряд ли мы сможем найти для себя что-нибудь новое, поэтому сразу же перейдём дальше по изменениям. Стоит лишь оговорится, что правильное пояснение предполагаемых действий пользователя является важной задачей программиста: вряд ли кому-нибудь захочется работать с продуктом, где ничего не ясно.

В строке scanf("%d %d", &a, &b); происходит вызов функции scanf. Эта функция, так же, как и функция printf, содержится в библиотеке stdio. Назначение функции – ввод данных пользователем с клавиатуры. Данные вводятся в соответствующем формате, описанном первым параметром. Помещаются данные в переменные, указанные в качестве остальных параметров.

Обратите внимание, что переменные в таком обращении указываются со знаком &. Это означает передачу указателя на переменную (ее адреса). Подробнее об этом вы узнаете позднее или прочтёте в соответствующей литературе, а сейчас стоит просто это учитывать.

Итог

Мы спроектировали программу Вашей лабораторной работы №1. Не правда ли, текст программы на языке С выглядит просто и понятно для человека-проектировщика. Простота и наглядность текста – это то, к чему Вы и в дальнейшем должны стремиться.

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

Настоящее пособие не призвано заменять какую-либо книгу, подробно описывающую язык С. Язык программирования следует изучать по оригиналу (такому как [1]) самостоятельно, что Вы и должны уже сейчас начать делать. А задача преподавателей, читающих лекции и ведущих практические занятия как раз и заключается в том, чтобы помочь Вам разобраться во всех тонкостях предмета. Если Вы чувствуете трудности в освоении языка, то целесообразно воспользоваться учебником [2].

Задание

Разработать программу для определения суммы трёх чисел a+b+c.

Методическое указание

Внимательно изучите простейший пример из раздела 2. Третья программа этого раздела будет служить вам заготовкой для проектирования последующих своих программ.

С самого начала беритесь за дело грамотно. Составьте проект в среде Borland C 3.1 (смотрите раздел 5.1), откомпилируйте и выполните программу (смотрите раздел 5.2), установите точку останова на выделенную строку и проинспектируйте в пошаговом режиме значения переменных a, b, c. Это позволит вам на практике ознакомится с простейшими способами отладки программ в среде Borland C 3.1.

Попробуйте что-нибудь изменить в программе. Введите какую-нибудь ошибку и наблюдайте за реакцией компилятора. Встав на строку сообщения об ошибке, нажмите клавишу [Enter] – компилятор автоматически найдет соответствующую строку в исходном тексте.

При разработке любой программы необходимо четко представлять допустимый диапазон значений исходных, промежуточных и результирующих данных. Каждая программы имеет свои границы таких данных. Границы данных должны согласовываться с заказчиком программного продукта и указываться как в техническом задании на проект, так и документах сопровождающих разработанный проект. При разработке, а затем и при тестировании программ необходимо проверять поведение программы при выходе данных за заданные границы. В рассматриваемой задаче введите, например, значение числа a большее 33000 и проверьте, какой результат будет получен. Такая проверка называется проверкой исключительных ситуаций. Другой проверкой исключительных ситуаций будет проверка сложения двух чисел, сумма которых превышает допустимый диапазон представления данных типа INTEGER (а именно от -32 768 до 32 767).

Результаты проверки исключительных ситуаций должны приводиться в документации на разработанную программу. В нашем случае это отчет о лабораторной работе № 1.

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

Задание

Разработать программу для решения уравнения вида Программирование на языке С в среде Borland 3.1 - student2.ru в области действительных чисел (опорный алгоритм приведен на рисунке 2).

Решение уравнения должно быть получено при любых действительных значениях коэффициентов a, b, c (в том числе нулевых).

Обратите внимание, что в программе целесообразно изменить тип переменных с целочисленного int на float в строке float a, b, c, …;. Это тип переменной с плавающей точкой. Он позволяет хранить дробные числа. Согласитесь, что программа, работающая только с целыми данными, не так уж и полезна.

Такое изменение вызывает ряд связанных с ним изменений:

во-первых, к программе необходимо подключить библиотеку математических функций: #include < math.h>;

во-вторых, заменить в функциях ввода\вывода определения формата данных с %d на %f;

в-третьих, использовать в соответствующих выражениях присваивания имена функций извлечения квадратного корня и получения абсолютного значений подкоренного выражения, например, sqrt(fabs(d/(2*a);

и наконец, использовать общий вид условного оператора –

if ( <выражение условия> { <операторы> } else {<операторы>}

Программирование на языке С в среде Borland 3.1 - student2.ru

Рис. 2. Опорный алгоритм решения задачи

Методические указания

Обратите внимание на три аспекта представленного на рисунке 2 опорного алгоритма:

1. Данная схема выполнена с некоторыми отступлениями от рекомендаций по реализации схем алгоритма. В частности, она изобилует подробностями, которые не должны присутствовать на функциональной схеме. Это связано с необходимостью представить исчерпывающий материал для разработки в одной схеме, не создавая дополнительных объяснений;

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

3. Схема алгоритма не отражает возможность равенства нулю некоторых коэффициентов уравнения. Например, при а=0 последствия выполнения соответствующей программы становятся просто катастрофическими: деление на 0 вызывает ее грубое прерывание вместо определения корней. Вам необходимо соответственно доработать алгоритм, представленный на рис. 2.

При создании тестовых примеров необходимо заранее знать результаты правильно работающей программы. Для нашей программы мы должны задать такие значения a, b, c для которых заранее известен результат. Например, мы хотим получить корни -5 и 3. Уравнение для таких корней выглядит следующим образом: Программирование на языке С в среде Borland 3.1 - student2.ru . Приведя его к форме квадратного уравнения, получаем следующее уравнение, а значит и исходные коэффициенты для нашей программы: Программирование на языке С в среде Borland 3.1 - student2.ru .

При выборе исходных данных целесообразно избегать для них значений 1 и 0 вследствие того, что мы не сможем определить, не произошло ли умножение на 1 и не выполнено ли сложение с 0. Поэтому выберем, например, a = 2, b=4, c=-30.

Для полноценного тестирования программы необходимо учесть все возможные варианты развития действий, то есть все ветви алгоритма. Выполнение определенных ветвей алгоритма происходит при появлении соответствующих условий. Исходя из опорного алгоритма к работе, у нас есть 3 ветви, но при дальнейшей разработке их количество может увеличиться. В нашей программе учтена возможность вычисления уточненных значений корней. Поэтому необходимо задать такие значения коэффициентов уравнения, которые позволят убедиться в достижении заданного результата. Например, введем значения в = 1.0 E 10, a = 1.0 E-10, то есть b существенно больше 4ac.

За основу циклической части программы могут быть взяты операторы первой лабораторной работы, отвечающие за проверку повтора программы.

Задание

Разработать программу, определяющую попадание точки с координатами Программирование на языке С в среде Borland 3.1 - student2.ru и Программирование на языке С в среде Borland 3.1 - student2.ru в область, которая образуется в результате пересечения множеств:

1) круг с радиусом Программирование на языке С в среде Borland 3.1 - student2.ru и с центром, расположенном в начале координат;

2) полуплоскость по одну из сторон от прямой Программирование на языке С в среде Borland 3.1 - student2.ru ;

3) полуплоскость, ограниченная осями координат.

Варианты расположения плоскости представлены ниже:

1. Внутри круга, ниже прямой, правее оси ординат.

2. Внутри круга, ниже прямой, левее оси ординат.

3. Внутри круга, ниже прямой, выше оси абсцисс.

4. Внутри круга, ниже прямой, ниже оси абсцисс.

5. Внутри круга, выше прямой, выше оси абсцисс.

6. Внутри круга, выше прямой, ниже оси абсцисс.

7. Внутри круга, выше прямой, левее оси ординат.

8. Внутри круга, выше прямой, правее оси ординат.

9. Внутри круга, ниже прямой, правее оси ординат и выше оси абсцисс.

10. Внутри круга, ниже прямой, левее оси ординат и ниже оси абсцисс.

11. Внутри круга, выше прямой, левее оси ординат и выше оси абсцисс.

12. Внутри круга, выше прямой, правее оси ординат и ниже оси абсцисс.

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

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

· Перед вводом координат точки, для которой будет осуществляться проверка на принадлежность области, проверяется существование области (по введённому значению Программирование на языке С в среде Borland 3.1 - student2.ru при всех прочих известных условиях). В случае отсутствия области ввод точки не производится, а осуществляется вывод соответствующего сообщения с предложением повторного ввода Программирование на языке С в среде Borland 3.1 - student2.ru .

· Для одной введённой области необходимо осуществлять проверку точек до тех пор, пока пользователь не откажется от продолжения.

· Аналогичное условие должно быть осуществлено для ввода области.

· Необходимо учитывать попадание точки на границу области.

Методические указания

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

Далее следует перейти к анализу взаимного расположения области и точки с вводимыми координатами X и Y. По желанию пользователя анализ может быть повторён для точек с другими координатами X и Y, если перебор точек для данной области закончен, то пользователю предлагается, либо вернуться к определению параметров образующих область графических объектов, либо завершить работу с программой.

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

Решение данной задачи требует построения алгоритма с различными вариантами последовательности действий. Такие алгоритмы носят название ветвящихся алгоритмов.

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

Граничные условия при подобной постановке задачи не могут быть разрешены обычным равенством вследствие того, что в компьютерном понимании числа 10 и 10,0000001 – это всё-таки разные числа. Поэтому нецелесообразно использовать в программах условные выражения, содержащие при сравнении вещественных данных операции их равенства. Данная проблема решается введением, так называемой ширины границы. То есть при вычислении попадания считается не равенство координат точек и ограничивающих прямых (x=2 и y=5), а нахождение их вблизи данной границы (|x–2| < Eps и |y–5| < Eps), где Eps – малая ширина границы.

Рекомендуется прочесть разделы дополнительной литературы относительно пользовательских функций в языке C и применить полученные знания.

Задание

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

Варианты:

Программирование на языке С в среде Borland 3.1 - student2.ru Программирование на языке С в среде Borland 3.1 - student2.ru
Программирование на языке С в среде Borland 3.1 - student2.ru Программирование на языке С в среде Borland 3.1 - student2.ru
Программирование на языке С в среде Borland 3.1 - student2.ru Программирование на языке С в среде Borland 3.1 - student2.ru
Программирование на языке С в среде Borland 3.1 - student2.ru Программирование на языке С в среде Borland 3.1 - student2.ru
Программирование на языке С в среде Borland 3.1 - student2.ru Программирование на языке С в среде Borland 3.1 - student2.ru
Программирование на языке С в среде Borland 3.1 - student2.ru Программирование на языке С в среде Borland 3.1 - student2.ru

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

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

· Программа фиксирует количество членов ряда, необходимое для достижения заданной точности.

Методические указания

Значок «!» означает факториал. Простой пример:

5! = 1*2*3*4*5,

12! = 1*2*3*4*5*6*7*8*9*10*11*12,

при этом 0! и 1! равны 1.

Обратите внимание на тот факт, что при вычислении отдельно числителя и знаменателя достаточно быстро происходит переполнение типа данных. Например, 12!=479 001 600, что превышает ограничения сразу нескольких типов данных, таких как int и прочие.

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

Для того чтобы избежать этих проблем, необходимо использовать специальную методику. Попробуем показать эту методику на примере нахождения значения ряда Программирование на языке С в среде Borland 3.1 - student2.ru с заданной погрешностью.

1. Выстраиваем ряд в следующем представлении: Программирование на языке С в среде Borland 3.1 - student2.ru (3.1)

2. Определяем формулу перехода для (N+1)-ого члена ряда в формате: Программирование на языке С в среде Borland 3.1 - student2.ru

Дальнейшая работа по вычислению ряда будет выглядеть следующим образом: вычисляем первый член ряда исходя из известных данных. В нашем случае Программирование на языке С в среде Borland 3.1 - student2.ru . Второй член ряда равен Программирование на языке С в среде Borland 3.1 - student2.ru исходя из правил вычисления

Программирование на языке С в среде Borland 3.1 - student2.ru . (3.2)

Таким образом, можно вычислить сумму ряда до определённого значения M. Погрешность вычисления может определяться по тому, насколько большим получился очередной вычисленный член ряда. Известно, что для знакопеременных рядов абсолютное значение последнего учтенного члена ряда больше суммы всех последующих членов ряда. Для сходящихся рядов с одинаковыми значениями знаков членов ряда необходимо суммирование производить до тех пор, пока абсолютная величина последнего учтенного члена ряда не станет в три раза меньше значения заданной погрешности.

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

Тестирование данной работы должно проходить в 2 этапа:

· Тестирование итерационного механизма;

· Общее тестирование.

Проверка итерационного механизма заключается в тестировании:

· правильности входа: определения начальных значений;

· правильности перехода от N-го к (N+1)-у члену ряда;

· правильности выхода из суммирования.

Для проверки целесообразно выбрать значение X таким, чтобы было просто вычислять первые несколько членов ряда (например, X=2.0 или X=½). По формуле, полученной в соответствии с (3.1) фиксируем вычисленные значения: номера очередного члена ряда, величины очередного члена ряда и полученного в результате этого шага значения суммы ряда. Для проверки итерационного механизма достаточно вычислить значения трех, четырех первых членов ряда.

Далее необходимо использовать соответствующие средства отладки:

· установить точку прерывания (breakpoint), где либо внутри тела цикла вычисления членов ряда (лучше всего до оператора вычисления нового значения суммы ряда, но после вычисления нового члена ряда);

· в окне наблюдений значений переменных (watch) выбрать переменные ответственные за порядковый номер члена ряда, значение очередного члена ряда, суммы ряда и требуемой погрешности;

· осуществлять запуск программы на исполнение не менее 3 раз;

· сверить совпадение данных, получаемых в результате выполнения программы, с тестовыми значениями.

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

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

Задание

Разработать программу, обрабатывающую элементы двумерного массива размером n*m в соответствии с вариантом и прилагаемым рисунком. Размерность массива n и его элементы должны вводиться пользователем с клавиатуры. Исходный и преобразованный массивы должны быть выведены на экран после обработки.

Программирование на языке С в среде Borland 3.1 - student2.ru Варианты:

1. Обнулить элементы, рис. 3.a;

2. Изменить знак на противоположный, рис. 3.б;

3. Сложить с заданным числом, рис. 3.в;

4. Вычесть заданное число, рис. 3.г;

5. Умножить на заданное число, рис. 3.д;

6. Обнулить элементы, рис. 3.е;

7. Изменить знак на противоположный, рис. 3.а;

8. Сложить с заданным числом, рис. 3.б;

9. Вычесть заданное число, рис. 3.в;

10. Умножить на заданное число, рис. 3.г.

11. Обнулить элементы, рис. 3.д;

12. Изменить знак на противоположный, рис. 3.е;

Методические указания

Исходно программа должна строиться для заранее не определенных значений размерности массива n и m. По правилам построения простых программ на языке Си размерность массива должна определяться сразу. Обычно размерности массива задается определенной величины (например, 10 на 10). Однако, реальные значения n и m (но не более заданной ранее величины – у нас 10) вводятся в качестве исходных данных. Чтобы можно было работать с заранее неопределенными размерностями, будем пользоваться переменными, определяемыми директивой define (подстановкой в программе), например, как показано ниже.

#define n 8

#define m 6

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

Для упрощения проектирования на первом этапе массив для тестирования можно взять, например, размером 4*4 элемента. Подобный подход позволит отладить основные функции программы и не усложнит дальнейшее усовершенствование.

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

int A [10][10] = {{11, 12, 13, 14},{21, 22, 23, 24},{31, 32, 33, 34},{41, 42, 43, 44}};

В приведенном примере в массиве А с размерностью 10 на 10 заполнены фиксированными данными только четыре первых столбца первых четырех строках. Поэтому, если задаться величинами m и n равными 4, то обработке может подвергаться матрица с заранее предопределенными и фиксированными значениями (значение каждого элемента есть номер строки и номер столбца).

Для будущего тестирования перед исполнением программы необходимо вручную вычислить значения результирующего массива. При работе с элементами двумерного массива следует использовать метод полного перебора строк, а внутри перебора по столбцам на основе вложенных конструкций for, как показано ниже на примере вывода таблицы 4*4

printf(“вывод массива \n”);

for (i = 1; i < n; i++)

{

for (j= 1; j < m; j++) printf(“%d “, A[i][j]);

printf(“\n”);

}

Алгоритм решения задач данной работы можно представить в виде приведенном ниже.

Программирование на языке С в среде Borland 3.1 - student2.ru

Рис. 3. Алгоритм обработки массива.

Как видно из алгоритма, в программе определены два массива одинокого размера: исходный массив (у нас A) и его копия (например, B). Обработке вначале подвергается копия с вычислением нового значения на основе исходного массива и лишь тогда, когда обработка будет закончена, осуществляется требуемая замена значений исходного массива на новые значения. Хотя подобная организация требует удвоения памяти для хранения обрабатываемого массива, выгодой является простота построения алгоритма и программы.

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

Семестр 2

Лабораторная работа №1.

Обработка массивов символов

Задание

Разработать программу, обрабатывающую содержимое строки символов в соответствии с заданием. Строка содержат слова, которые разделяются символом пробел ‘ ‘.

Варианты:

1. Вывести на экран длины слов в строке;

2. Вывести на экран слова и их длины, содержащие заданный символ;

3. Определить и вывести на экран первое слово в строке с минимальной длиной;

4. Определить и вывести на экран последнее слово в строке с минимальной длиной;

5. Определить и вывести на экран последнее слово в строке с максимальной длиной;

6. Удалить из строки слова, содержащие заданный символ. Исходную и преобразованную строки вывести на экран;

7. Удалить из строки слова, следующие за словами, содержащими заданный символ. Исходную и преобразованную строки вывести на экран;

8. Удалить из строки слова, предшествующие строками, содержащими заданный символ. Исходную и преобразованную строки вывести на экран;

9. Вывести на экран упорядоченные в порядке возрастания числа символов строки;

10. Вывести на экран упорядоченные в порядке убывания числа символов строки;

11. Удалить все русские буквы в строке;

12. Удалить все латинские буквы в строке;

13. Удалить символ предшествующий заданному символу;

14. Удалить символ, следующий за заданным символом;

15. Вставить заданный символ перед символом, совпадающим с другим заданным символом;

16. Вставить заданный символ после символа, совпадающего с другим заданным символом;

17. Зафиксировать и вывести на экран порядковые номера первого вхождения заданного символа в слова;

18. Зафиксировать и вывести на экран порядковые номера последнего вхождения заданного символа в слова;

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

Методические указания

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

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

Обработка файлов

Задание

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

Результат обработки должен быть сохранён в отдельном файле. Имена файлов для чтения и записи должны вводится пользователем с клавиатуры.

Места изменений могут быть зафиксированы на экране терминала (не в файле) по желанию пользователя.

В программе должны быть корректно разрешены попытки открытия несуществующего файла.

Варианты:

1. Удалить слова, содержащие заданный символ;

2. Удалить числа, содержащие заданную цифру;

3. Удалить все строчные русские буквы, а все прописные превратить в строчные;

4. Удалить все прописные латинские буквы, а все строчные превратить в прописные;

5. Удалить все русские буквы;

6. Удалить все латинские буквы;

7. Удалить символ предшествующий заданному символу;

8. Удалить символ, следующий за заданным символом;

9. Вставить заданный символ перед символом, совпадающим с другим заданным символом;

10. Вставить заданный символ после символа, совпадающего с другим заданным символом;

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

Методическое указание

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

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

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

Задание

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

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

Варианты:

1. Удалить заданную подстроку;

2. Заменить одну заданную подстроку на другую;

3. Вставить после заданной подстроки другую заданную подстроку;

4. Вставить перед заданной подстрокой другую заданную подстроку;

5. Удалить заданное слово;

6. Заменить одно заданное слово на другое;

7. Вставить после заданного слова другое заданное слово;

8. Вставить перед заданным словом другое заданное слово;

9. Удалить каждое второе вхождение заданного слова в строке;

10. Удалить каждое второе вхождение заданной подстроки в каждом слове текста;

11. Вставить перед вторым вхождением заданного слова другое заданное слово;

12. Вставить перед вторым вхождением заданной подстроки другую заданную подстроку;

Методическое указание

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

Обратите внимание на то, что для полноценной работы со строкой недостаточно просто указать количество элементов в строке. Необходимо также выставить признак конца строки – символ ‘\0’.

Для упрощения проектирования программы рекомендуется представить проводимые алгоритмические операции в графическом виде.

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