Программирование на языке высокого уровня си
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
«ПРИДНЕСТРОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
им. Т. Г. ШЕВЧЕНКО»
ПГУ им. Т.Г.Шевченко
Рыбницкий филиал
Кафедра физики, математики и информатики
Часть II
практикум
Рыбница, 2010
УДК 681.3.06
ББК 32.973.2-018
П 78
Программирование на языке высокого уровня СИ. Часть II: практикум/
Сост. О. В. Шестопал, О. В. Сташкова. – Тирасполь, 2010. – 83 с.
Практикум составлен в соответствии с учебной программой по дисциплинам «Программирование на языке высокого уровня» для студентов 1 курса специальности «Программное обеспечение вычислительной техники и автоматизированных систем».
Практикум (II часть) включает в себя 5 лабораторных работ по структурированным типам данных: массивы, строки, перечисляемый и диапазонный типы данных, структуры и объединения, файлы. Особое внимание уделено вопросам программирования рекурсивных алгоритмов. Каждая из лабораторных работ включает теоретический материал, экспериментальный и самостоятельный разделы. Порядок расположения материала соответствует последовательности его изучения.
Основные цели предлагаемого практикума – придать курсу программирования научно-обоснованный базис, сформировать на его основе определенную культуру проектирования и разработки программ.
Рецензенты:
В.Е. Лозовский, учитель высшей категории, директор МОУ «Рыбницкая средняя образовательная школа №6 с лицейскими классами»
А.Б. Глазов, ст. преп. кафедры «ФМИ»
Рекомендовано Научно-методическим советом ПГУ им. Т.Г. Шевченко
Протокол № _______от ____________ 2010 г.
© Составление О.В. Шестопал, О.В.Сташкова, 2010 г.
Содержание
Работа 1. ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ В СИ 4
Работа 2. СТРУКТУРИРОВАННЫЙ ТИП ДАННЫХ МАССИВ 17
35
Работа 3. СИМВОЛЬНЫЙ И СТРОКОВЫЙ ТИПЫ ДАННЫХ 36
Работа 4. СТРУКТУРЫ 50
Работа 5. РАБОТА С ФАЙЛАМИ 62
СПИСОК ЛИТЕРАТУРЫ 77
Работа 1. Пользовательские функции в си
Цель работы:
– изучить суть работы с подпрограммами;
– изучить правила описания подпрограмм и обращения к подпрограммам;
– изучить понятие и виды рекурсии;
– научиться решать задачи с использованием подпрограмм;
– научиться применять рекурсию для решения задач.
I. Теоретический раздел работы
1. Функции
Любая Си-программа составляется из «строительных блоков», именуемых функциями. Функция — это подпрограмма, которая содержит одну или несколько Си-инструкций и выполняет одну или несколько задач. Хороший стиль программирования на Cи предполагает, что каждая функция выполняет только одну задачу.
Каждая функция имеет имя, которое используется для ее вызова. Своим функциям программист может давать любые имена за исключением имени main (), зарезервированного для функции, с которой начинается выполнение программы.
В Cи ни одна функция не может быть встроена в другую: все функции рассматриваются как отдельные компоненты. (Безусловно, одна функция может вызывать другую.)
Прототип объявляет функцию до ее первого использования.
Общий формат Си-функций
Общий формат Си-функций:
тип_возвращаемого_значения имя (список_параметров)
{
тело функции
}Рассмотрим подробно все элементы, составляющие функцию.
С помощью элемента тип_возвращаемого_значения указывается тип значения, возвращаемого функцией. Если функция не возвращает никакого значения, необходимо указать тип void. Если функция действительно возвращает значение, оно должно иметь тип, совместимый с указанным в определении функции.
Каждая функция имеет имя. Оно, как нетрудно догадаться, задается элементом имя. После имени функции между круглых скобок указывается список параметров, который представляет собой последовательность пар (состоящих из типа данных и имени), разделенных запятыми. Если функция не имеет параметров, элемент список_параметров отсутствует, т.е. круглые скобки остаются пустыми.
В фигурные скобки заключено тело функции. Тело функции составляют Си-инструкции, которые определяют действия функции. Функция завершается (и управление передается вызывающей процедуре) при достижении закрывающей фигурной скобки или инструкции return.
studfiles.net
3. Область применения и системы программирования языка Си.
Си – универсальный язык программирования. Не рассчитан на какую-то конкретную область применения. Первоначально Си задумывался как заменитель Ассемблера для написания операционных систем. Текст операционной системы оказывался легко переносимым с одной платформы на другую. Первой операционной системой, написанной практически целиком на Си, была система Unix. В настоящее время почти все используемые операционные системы написаны на Си. Тем не менее, область применения языка Си не ограничилась разработкой операционных систем. Язык Си оказался очень удобен в программах обработки текстов и изображений, в научных и инженерных расчетах.
Системы программирования – системы для разработки новых программ.
Системы программирования обычно включают компилятор, осуществляющий преобразование программ на языке программирования в программу в машинных кодах, или интерпретатор, осуществляющий непосредственное выполнение программы на языке программирования, редактор текстовых программ, библиотеки полезных подпрограмм, отладчики и др. Для языка Си имеется множество систем программирования, позволяющих создавать программы, работающие в среде DOS, Windows и др.
Системы программирования языка си: Visual C++, Visual Basic, Турбо-Си, разработанная фирмой Borland.
4. Исходные и объектные модули, процессы компиляции и связывания.
Исходный модуль (source code) – это текст программы на языке программирования.
Объектный модуль (objectcode) – результат обработки компилятором исходного модуля. Объектный модуль не может быть выполнен. Это незавершенный вариант машинной программы.
Исполняемый модуль создает компоновщик, объединяя в один общий модуль объектные модули, реализующие отдельные части алгоритма. На этом этапе к машинной программе подсоединяются необходимые функции стандартной библиотеки.
Стандартная библиотека – набор программных модулей, выполняющих наиболее часто встречающиеся в программировании задачи: ввод, вывод данных, вычисление математических функций, сортировки и т.д.
Есть два способа выполнения программы компилятором: она может быть подвергнута компиляции или интерпретации. Программа, написанная на любом языке программирования, может как компилироваться, так и интерпретироваться, однако многие языки изначально созданы для выполнения преимущественно одним из этих способов. И хотя интерпретаторы С существуют и доступны для программистов, С разрабатывался преимущественно для компиляции.
В простейшем случае интепретатор читает исходный текст программы по одной строке за раз, выполняет эту строку и только после этого переходит к следующей. Компилятор читает сразу всю программу и конвертирует ее в объектный код, то есть транслирует исходный текст программы в форму, более пригодную для непосредственного выполнения компьютером. Объектный код также называют двоичным или машинным кодом. Когда программа скомпилирована, в ее коде уже нет отдельных строк исходного кода.
В общем случае интерпретируемая программа выполняется медленнее, чем скомпилированная. Необходимо помнить, что компилятор преобразует исходный текст программы в объектный код, который выполняется компьютером непосредственно. Значит, потеря времени на компиляцию происходит лишь единожды, а в случае интерпретации – каждый раз при очередной интерпретации фрагмента программы в процессе ее выполнения.
При вызове библиотечной фукнции компилятор “запоминает» ее имя. Потом компоновщик связывает код исходной программы с объектным кодом, уже найденным в стандартной библиотеке. Этот процесс называется компоновкой.
studfiles.net
Модульное программирование на Си. Классы памяти и области действия переменных
Модульное программирование на Си
Файл Си-программы как элемент модульного программирования
Модульное программирование – это процесс разработки программы, состоящей из нескольких логически завершенных и взаимосвязанных единиц – модулей.
Классически, в Си, завершённый модуль – функция.
На более глобальном (макро) уровне,
модуль – текстовый файл программы, объединяющий некоторое количество функций, определений типов данных и переменных.
Использовать принцип модульного программирования на уровне файлов –значит:
— получить возможность разделить полный текст программы на несколько файлов;
— транслировать их независимо друг от друга;
— использовать как заготовки для других программ, т.е., фактически, применять объектный подход на более примитивном, низком или логическом уровне.
Например, схема:
main.c |
||||
menu.c |
data_mod.c |
|||
transfer.c |
edit_mod.c |
демонстрирует применение модульного подхода при программировании элементарной базы данных, где каждый файл – законченный элемент логической структуры программы.
Изменяем наполнение модулей – создаём новые варианты уже готовой задачи.
Пишем новый код – используем стандартные функции S в готовых модулях, например в menu.c.
Частным, часто используемым случаем модульного программирования является использование библиотечных функций, т.к. библиотеки представляют собой аналогичные Си-программы, независимо оттранслированные и помещенные в каталог библиотек.
В данной лекции, нас, прежде всего, будет интересовать, какими свойствами обладают переменные и функции, определенные в различных точках модуля – файла,
и
как они «узнают» о существовании друг друга, каким образом взаимодействуют между собой.
Для начала сформулируем ряд необходимых терминов:
МОДУЛЬ – файл Си-программы, транслируемый независимо от других файлов (модулей)
ОПРЕДЕЛЕНИЕ ПЕРЕМЕННОЙ ИЛИ ФУНКЦИИ – процесс создания программного эквивалента переменной или функции транслятором по их описанию в программе (трансляция во внутреннее представление)
Несколько отойдём от непосредственно модульного подхода в программировании и поговорим о необходимой составляющей этого процесса
определении переменных и функций в модулях и их взаимосвязи в многомодульном варианте программы.
Определение функции включает в себя её заголовок и тело.
Определение переменной – обычное контекстное определение и, возможно, её инициализация.
Рассмотрим подробнее на примерах:
int strcmp(char *s, char *d)
{ … }
В определении функции:
— задан тип результата;
— задано имя функции;
— задан список формальных параметров и их типов;
— транслируется тело функции;
— для вызова функции из других модулей в текущем модуле может быть создана точка входа.
int a = 5, B[10]={1,6,3,6,4,6,47,55,44,77};
В определении переменной:
— задан тип переменной;
— задано имя переменной;
— определяется размерность и резервируется память. Размерность массивов в определении обязательно должна быть задана;
— производится инициализация памяти;
— для доступа к переменной из других модулей в текущем модуле может быть создана точка входа.
ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ ИЛИ ФУНКЦИИ – информация транслятору о том, что указанные переменная или функция где-то определены, но неизвестны в данный момент транслятору
Например, определение размещается далее по тексту в текущем модуле или находится в другом модуле.
Переменная или функция при объявлении во внутреннее представление не переводятся, транслятору сообщается лишь факт их существования, имя и тип. Это необходимо для формирования правильного обращения к переменной или к функции.
extern int a, B[];
В объявлении переменной:
— задан тип переменной;
— задано имя переменной;
— запоминается факт наличия переменной с указанными именем и типом. Размерность массивов в объявлении может отсутствовать.
int strcmp();
int strcmp(char*, char*);
extern int strcmp();
extern int strcmp(char*, char*);
B объявлении функции:
— задается тип функции;
— задается имя функции;
— может быть задан список типов формальных параметров (прототип).
— запоминается факт наличия функции с указанными именем, результатом и, возможно, параметрами.
Различия между определением и объявлением принципиальны!
vunivere.ru
Ускоренный курс языка Си [Robotic & Microcontroller Educational Knowledgepage
Структура программы
В принципе программу на языке Си можно написать в любом виде, даже однострочном, так как компилятор предполагает только следование правилам синтаксиса. В то же время, в целях ясности и простоты, следует всё же уделять внимание и стилю написания программного кода. Типичная структура программы на языке Си:
/* Включение заголовочных файлов */ #include <avr/io.h> #include <stdio.h> /* Макродекларации */ #define PI 3.141 /* Определение типа данных*/ typedef struct { int a, b; } element; /* Глобальные переменные */ element e; /* Функции */ int main(void) { // Локальные переменные int x; // Программа printf("Здравствуй мир!\n"); }
Комментарии
Программисты могут вписывать текст для заметок или объяснений, который не компилируется. Также комментарии могут быть использованы для временного исключения программных отрезков. Примеры двух методов комментариев:
// Однострочный комментарий // Комментарием считается текст, находящийся после двух наклонных черт /* Многострочный комментарий Начало и конец комментария прописывается наклонными чертами и звёздочками */
Данные
Типы данных
Базовые типы данных языка Си:
Тип | Минимум | Максимум | Bitte | Baite |
---|---|---|---|---|
(signed) char | -128 | 127 | 8 | 1 |
unsigned char | 0 | 255 | 8 | 1 |
(signed) short | -32768 | 32767 | 16 | 2 |
unsigned short | 0 | 65535 | 16 | 2 |
(signed) long | -2147483648 | 2147483647 | 32 | 4 |
unsigned long | 0 | 4294967295 | 32 | 4 |
float | -3.438 | 3.438 | 32 | 4 |
double | -1.7308 | 1.7308 | 64 | 8 |
Слово “signed”, находящееся в скобках, использовать не обязательно, так как по умолчанию типы данных биполярные.
AVR на микроконтроллере int = short
На персональном компьютере int = long
На языке Си отсутствует специальный текстовой тип данных. Вместо этого используются массивы типа char (их описание последует далее) и «алфавит» ASCII, где у каждой буквы и знака имеется свой порядковый номер.
Переменные
В программе можно использовать определённые гнёзда для модуля памяти – переменные. Имена переменных могут содержать буквы латинского алфавита, номера и символ подчёркивания. Имя не может начинаться с цифры. При декларировании переменной перед ней пишется тип данных. При присвоении значения переменной используется знак равно (=). Пример использования переменных:
// декларирование переменной с типа char char c; // Присвоение c значения переменной. c = 65; c = 'A'; // A в системе знаков ASCII также имеет значение 65 // Декларирование и инициализация переменной типа int i20 int i20 = 55; // Декларирование нескольких переменных типа unsigned short unsigned short x, y, test_variable;
Константы
Константы декларируются также как и переменные, но перед типами данных добавляется ключевое слово const. Значения констант не меняются в течение программы. Пример использования:
// назначение константы типа int const int x_factor = 100;
Структуры
При помощи ключевого слова struct можно формировать структуры из базовых типов данных. Структура является комбинированным типом данных. Тип декларируется ключевым словом typedef. Пример структуры при создании и использовании типа данных:
// Декларирование нового пункта типа данных typedef struct { // координаты x и y и цветовой код int x, y; char color; } point; // Декларирование пункта переменной point p; // Задавание координат пункта p.x = 3; p.y = 14;
Массивы
Из типа данных можно создавать массивы. Массивы могут быть многомерными (таблица, куб и т.д.) Пример использования одно- и многомерных массивов:
// Декларирование одно- и многомерного массива char text[3]; int table[10][10]; // Создание текста из массива знаков text[0] = 'H'; // Буква text[1] = 'i'; // Буква text[2] = 0; // Признак окончания текста (нулевой байт) // Изменение одного элемента таблицы table[4][3] = 1;
Выражения
При помощи переменных, констант и функций, возвращающих значение можно составлять выражения (действия). Значения выражений могут быть присвоены переменным, их так же можно использовать в качестве параметров функции, а так же в различных условных предложениях.
Арифметические операции
Язык Си поддерживает следующие арифметические операции: сложение (+), вычитание (-), умножение (*), деление (/) и возведение в модуль (%). Примеры использования арифметических операций:
int x, y; // Возведение в модуль, умножение и присвоение значения // x получает значение 9 x = (13 % 5) * 3; // Оператор присваивания сложения // x получает значение 14 x += 5; // Суффиксный декремент // x получает значение 13 x--;
Логические операторы
Логические операторы: логическое отрицание NOT (!), логическое И (&&) и логическое ИЛИ (||). Примеры использования:
bool a, b, c; // Инициация a = true; b = false; // Отрицание // c получит значение false, потому что а имеет значение true c = !a; // Логическое И // c получит значение false, так как один из операндов неверный c = a && b; // Логическое ИЛИ // c получит значение true, так как один из операндов верный c = a || b;
NB! Тип данных bool происходит из языка Си++ и в языке Си он отсутствует потому, что вместо него используются целые числа, где 0 имеет значение false и любое другое число значение true. Но для удобства в библиотеке Домашней Лаборатории используется всё же boolи определяется как unsigned char. Константа true имеет значение 1 и false значение 0.
Операторы сравнения
Для сравнения числовых значений получают логические значения. Операторами сравнения являются: равенство (==), неравенство (!=), больше (>), больше или равно (>=), меньше (<) и меньше или равно (⇐). Примеры использования:
int x = 10, y = 1; // Больше, чем оператор сравнения, что true // Скобки вокруг оператора только для ясности bool b = (5 > 4); // Неравенство // Результат false b = (4 != 4); // Арифметический, логический операторы и оператор сравнения // b получится false, так как операнд первого логического И неверный b = (x + 4 > 15) && (y < 4);
Побитовые операторы
Побитовые операторы используются для манипуляций с данными в бинарных цифровых системах. Побитовые операторы схожи с логическими операторами, но отличаются тем, что операции выполняются с каждым битом отдельно, а не со всем числом. В языке Си побитовыми операторами являются инверсия (~), И (&), ИЛИ (|), исключающее ИЛИ (^), левый сдвиг («) и правый сдвиг (»).
// Декларирование 8 битной переменной без знака типа char // Значение переменной в десятичной системе – 5, в двоичной системе - 101 unsigned char c = 5; // Переменная с с оператором ИЛИ и числом 2 (в двоичной системе 010) // c получит значение 7 (в двоичной системе 111) c = c | 2; // Побитовый сдвиг влево на 2 // c получит значение 28 (в двоичной системе 11100) c = c << 2;
Побитовые операции крайне необходимы при использовании регистров микроконтроллеров. Подробнее о них расскажет глава регистров AVR.
Функции
Функция – это отрезок программы, который можно вызвать по имени. У функции могут быть параметры, и она может вернуть одно значение. Если функция не возвращает значение, её тип — void. Если у функции нет параметра, следует при использовании старого компилятора языка Си, прописать void вместо декларации параметров. Пример функции сложения и функции без возвращения:
// Декларация функции с двумя параметрами типа int // Функция возвращает значение типа int int sum(int a, int b) { // Сложение двух чисел и возвращение суммы return a + b; } // Функция без параметров и возвращаемого значения void power_off(void) { }
Для использования функции следует её вызвать. В программном коде функция должна быть задекларирована до места вызова. Пример вызова функции сложения:
int x; int y = 3; // Вызов функции сложения // Параметрами является переменная и значение константы x = sum(y, 5); // Вызов функции отключения // Параметры отсутствуют power_off();
Заполнение программы языка Си начинают с функции main, что делает её обязательной функцией.
Выражения
Условные операторы «if» и «else»
Условный оператор, при помощи верного выражения в скобках, позволяет выполнить или не выполнить выражение или отрезок программы, следующие за условием. Ключевым словом условного оператора является if. Пример использования:
// Выражение верное и оператор будет выполнен, // так как 2 + 1 больше, чем 2 if ((2 + 1) > 2) x = 5; // Если x равен 5 и y 3, то выполняется следующий отрезок программы if ((x == 5) && (y == 3)) { // Случайное действие y = 4; my_function(); }
Условный оператор может быть длиннее и содержать выражение или отрезок программы, которые выполняются в случае неверности выражения. Для этого требуется использовать ключевое слово else после условного оператора if.
// Х равен 5? if (x == 5) { // Случайное действие z = 3; } // Если x не был равен 5, равен ли тогда x 6? else if (x == 6) { // Случайное действие q = 3; } // Если х не был равен 5 и 6... else { // Случайное действие y = 0; }
Оператор ветвления
Если выражение требует сравнения с несколькими различными значениями, то используется оператор ветвления с ключевым словом switch. Пример использования:
int y; // Оператор ветвления для сравнения y switch (y) { // y равен 1? case 1: // Случайное действие function1(); break; // y равен 2? case 2: // Случайное действие function2(); break; // Все другие случаи default: // Случайное действие functionX(); // выражение break не требуется, // так как сравнение заканчивается }
Оператор цикла
При помощи данного оператора программный отрезок можно выполнять несколько раз.
while
Это оператор цикла, повторяющий одно и то же действие, пока условие продолжения цикла остаётся истинным.
int x = 0; // Цикл длится до тех пор, пока x меньше чем 5 while (x < 5) { // Прибавление единицы к x x++; }
for
Цикл с ключевым словом for схож с циклом while, но отличается тем, что в скобках приведены выражения, выполняемые до и во время каждого цикла.
Пример:
int i, x = 0; // Вначале i объявляется нулём. Цикл выполняется до тех пор, пока // i меньше, чем 5. В конце каждого цикла i увеличивается на единицу for (i = 0; i < 5; i++) { // увеличение x на 2 единицы x += 2; } // Здесь значением x будет 10
Движения в цикле
Циклы while и for можно прервать оператором break. Оператор continue начинает следующий цикл без выполнения последующего кода. Например:
int x = 0, y = 0; // Бесконечный цикл, так как 1 является логической истиной while (1) { // Из цикла выходят, если x приобретает значение 100 if (x >= 100) break; // увеличение x, чтобы цикл когда-нибудь закончился x++; // Если x равен 10 или меньше, тогда начинается следующий цикл if (x <= 10) continue; // увеличение y y++; } // Здесь значение y 90
Обработка текста
Функции обработки текста в микроконтроллерах нужны, прежде всего, для отображения текста на экране LCD и его передачи/принятия посредством коммуникационного интерфейса.
Функция sprintf
Функция sprintf идентична распространенной в языке Си функции printf. Различием является то, что вывод производится в массив, указанный аргументом buffer, а не в стандартный выход (в микроконтроллерах это обычно последовательный интерфейс). У функции имеется меняющееся количество аргументов, которые форматируются в соответствии с форматом.
Пример 1:
#include <stdio.h> char buffer[20]; int a = 1, b = 2; int len = sprintf(buffer, "%d плюс %d равно %d", a, b, a + b); // Результатом являются текстовые строки "1 плюс 2 равно 3"
Например, функция sprintf прописывает текст в массив buffer, который составлен из трёх аргументов и форматируется в соответствии с текстовой строкой формата. В текстовой строке формата маркер (англ. specifier) обозначает %d аргумента типа целых чисел, которые следует заменить в тексте. В конец составленного текста автоматически добавляется нулевой байт, который обозначает окончание текстовой строки. Пользователь должен обеспечить, чтобы длинна составляемого текста и нулевого байта не превышала длину массива. Функция sprintf облегчает составление фраз и предложений из переменных разного типа. Функция возвращает длину текста, сохранённого в массиве (длина не содержит нулевой байт). В случае ошибки возвращается отрицательное число.
Пример 2:
#include <stdio.h> char x[20]; sprintf(x, "%s on %d aastat vana", "Juku", 10); // Тот же результат можно достигнуть и: char x[] = "Juku on 10 aastat vana";
Во втором примере в формате текстовой строки маркер %s заменяется первым аргументом текстового типа и маркер %d – вторым аргументом типа целого числа. Количество маркеров должно совпадать с числом аргументов и их типы должны сочетаться. Так же аргументы должны быть представлены в том же порядке, что и маркеры. Для аргументов различного типа существуют маркеры соответствующего формата:
Маркер | Описание | Пример |
---|---|---|
%c | Char | ‘a’ |
%i или %d | Integer | 123 |
%f | Real number | 3.14f |
%s | Text | «пример» |
%X | Hexadecimal number | 0x3F |
Утилиты общего назначения
В библиотеке стандартных функций stdio.h, stdlib.h и string.h имеются различные функции для проведений разных текстовых операций. Например, с их помощью можно преобразовывать текст в числа, соединять тексты и сравнивать их и многое другое.
Случайная функция
Генерирование случайных чисел нелегко для микроконтроллера AVR. Сначала следует ввести число в генератор случайных чисел, на основании которого будет сгенерирован массив случайных чисел. Массив, основанный на одном номере, всегда одинаковый. Чтобы получить более случайный результат, функция может быть введена из значения, взятого из разъединенного АЦП.
Пример генерирования случайного числа в промежутке от 1 до 16 (включительно).
#include <stdlib.h> srand(100); // Случайное число int x = 1 + (rand() % 16);
Более подробное описание функций языка программирования Си на английском языке можно найти по адресу:http://www.cplusplus.com/reference/clibrary/
home.roboticlab.eu
Егорова. Программирование на языке Си
Окончательная формулировка задачи: разработать программу для вычисления величины V по формулам (1), (2), если заданы значения a,b,c,l.
1.1.3 Алгоритм решения задачи
Алгоритм решения задачи — это система правил (в виде последовательности арифметических и логических правил), однозначно определяющих процесс преобразования исходных данных в искомые результаты, то есть за конечное число шагов приводящих к решению поставленной задачи.
При составлении алгоритма следует использовать метод пошаговой разработки. Суть метода: алгоритм разрабатывается «сверху вниз», начиная со списка входных и выходных данных; на каждом шаге принимается небольшое число решений, приводящих к постепенной детализации алгоритма.
Итак, на начальном этапе необходимо разобраться с данными, используемыми в задаче.
В вычислительных задачах чаще всего используются два вида данных: числовые константы и переменные.
Константа не изменяет своего значения при выполнении программы. В тексте программы задается или явно в виде своего значения (например, числом: 2; 0.5; -1.73и т.д.), или обозначается именем, которое должно быть предварительно объявлено (например, в языке Паскаль — в разделе объявления констант const, в языке Си — с помощью директивы define).
Переменная может изменять свое значение при выполнении программы. В тексте программы любая переменная обозначается именем, которое должно быть до использования объявлено с указанием типа. По возможности стремятся к тому, чтобы в условии задачи, в описании алгоритма и в тексте программы одинаковые по смыслу переменные обозначались одним именем (или похожими именами, если, например, в условии задачи используется греческий алфавит, а текст программы оформляется с помощью латинского алфавита).
Переменные должны иметь конкретный тип, и этот вопрос программист должен продумать до разработки алгоритма, опираясь на условие задачи. Тип в первую очередь определяет, какие значения допустимо присваивать переменной в программе. В языках программирования обычно предусмотрено три основных типа данных. Это — два числовых типа: целый (integer — в Паскале, int — в Си) и вещественный (real — в Паскале, float — в Си) и символьный тип (char).
Опишем данные, используемые в нашей задаче. Это переменные a, b, c, l, V, p, S. Все переменные по смыслу задачи должны быть вещественного типа, то есть в программе они могут принимать значения дробных чисел.
Исходные данные: a,b,c — стороны треугольника, l — высота призмы.
Результаты: V — объем призмы.
Промежуточные данные: p — полупериметр треугольника, S — площадь треугольника.
Словесное описание алгоритма обычно громоздко и неудобно для последующего программирования. Для наглядного графического изображения алгоритма часто используется структурная схема (СС). СС состоит из отдельных блоков (геометрических фигур), соединенных между собой. Форма геометрической фигуры характеризует функции, выполняемые соответствующим блоком. Внутри фигуры словесно или с помощью формул эти функции конкретизируются.
studfiles.net
Структура программы на языке Си
Программа (Си — программа), написанная на языке Си, состоит из подпрограмм, которые в языке Си называются функциями. Точкой входа в Си – программу является функция main(). Отличие этой функции от других функций состоит в следующем:
● Выполнение Си — программы всегда начинается с первой инструкции функции main().
● Завершение работы функции main()приводит к окончанию работы всей программы.
В отличие от некоторых других языков программа, написанная на языке Си, должна содержать, по крайней мере, одну подпрограмму (функцию). Такой функцией и является функция main().
Функция в языке Си является основным строительным элементом, который используется при написании программ. На практике количество функций в программе может оказаться очень большим. В связи с этим возникает необходимость в объединении логически связанных функций. Такое объединение реализуется с помощью так называемых модулей. Под модулем в языке Си понимается один файл исходного текста с расширением .с.
В общем случае Си – программа имеет многомодульную структуру. На начальном этапе изучения языка Си ограничимся программами, исходный текст которых находится в одном файле. Такие программы являются одномодульными. Рассмотрим структуру простейших одномодульных программ.
Структура простейшей одномодульной программы
Как отмечалось выше, весь исходный текст одномодульной программы должен находиться в одном файле. Выделим среди одномодульных программ класс простейших одномодульных программ. К этому классу программ будем относить программы, состоящие только из одной функции main().В настоящей части пособия будут рассматриваться только такие программы. Отметим еще одно ограничение приводимых программ – в них будут отсутствовать так называемые внешние переменные. Внешними переменными называются переменные, которые объявляются вне функций. Программы, приводимые в настоящей части пособия, содержат три структурных компонента:
● Комментарий, относящийся ко всей программе в целом.
● Директивы препроцессора.
● Определение функции main().
Остановимся на каждом из этих компонентов подробнее.
Комментарии в программе на языке Си
Комментарии используются для целей документирования программ. Комментарии не влияют на выполнение программы. При компиляции они удаляются из программы. Стандарт С99 позволяет использовать в программах комментарии двух видов:
● Комментарии, традиционные для языка Си.
● Однострочные комментарии, заимствованные из языка С++.
Традиционный комментарий в языке Си – это последовательность символов, входящих в его алфавит, которая начинается двумя символами “/*” и заканчивается этими же символами, следующими в обратной последовательности “*/.”. Такой комментарий может располагаться на нескольких строках. Приведем пример традиционного комментария.
/* Лабораторная работа № 1 Программирование линейных вычислительных процессов */
Однострочный комментарий начинается с двух символов косая черта “//”. Такой комментарий включает в себя все символы текущей строки, следующие за этими символами. Ниже приводится пример применения однострочных комментариев.
// Лабораторная работа № 2 // Программирование разветвляющихся вычислительных процессов
Следует учитывать, что не все компиляторы языка Си, используемые на практике, поддерживают однострочные комментарии.
studfiles.net