- •1. Основные этапы разработки программных продуктов
- •1.1 Постановка задачи
- •Словесная формулировка
- •Формульная постановка задачи
- •1.2 Создание программного продукта
- •1.2.1.Формирование математической модели
- •Формирование исходных данных
- •Составление расчётных зависимостей
- •Правила формирования математической модели.
- •1.2.2.Алгоритмизация задачи
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •1.2.3. Реализация программного продукта
- •1.2.4. Работа с результатами
- •1.2.5.Анализ результатов решения
- •1.2.6.Принятие решения
- •1.2.7.Составление технической документации
- •1.3.Полная обработки задачи пользователя
- •1.4.Обеспечение эффективности разработки программных продуктов
- •2.5 Идентификаторы
- •2.6 Описание операций
- •2.6.1 Унарные операции
- •2.6.2 Бинарные операции
- •2.6.3 Пунктуаторы
- •Программирование простых ветвлений
- •4.1.5. Программирование задачи
- •Правила составления и использования
- •4.1.5.2. Операторы условной передачи управления
- •Укороченный оператор условного перехода
- •Правила записи и выполнения
- •Условная операция
- •Технология программирования арифметических циклов
- •Циклы с аналитическим заданием аргумента
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма
- •Оператор цикла с предусловием
- •Правила записи и выполнения
- •Оператор цикла с постусловием
- •Правила записи и выполнения
- •Оператор пошагового цикла for
- •Правила записи и выполнения
- •Программа по алгоритму цикла с предусловием
- •Программа по алгоритму цикла с постусловием
- •Программа по алгоритму цикла с параметром
- •Циклы с табличным заданием аргумента
- •Описание массивов
- •Описатель имя[размер];
- •Обозначение элементов массива
- •Имя[индекс]
- •Описатель имя[разм_1] …[разм_i]… [разм_n];
- •Постановка задачи
- •Математическая формулировка
- •Выбор метода решения
- •Составление алгоритма решения
- •Алгоритмизация структурой цикла с предусловием
- •Алгоритмизация структурой цикла с постусловием
- •Алгоритмизация структурой цикла с параметром
- •Программирование задачи
- •Описание массивов
- •Обозначение элементов массива
- •Составление программ решения задачи
- •Улучшение качества программных продуктов
- •Организация ввода-вывода Использование укороченных спецификаторов
- •Ввод переменных
- •Вывод переменных
- •Организация ввода в диалоге
- •Варианты ввода массивов
- •Оформление выводимых величин
- •Управление выполнением программ Использование составных присваиваний
- •Выбор устройства вывода
- •Повторение расчётов
- •Приостановка вывода
- •Очистка экрана
- •Позиционирование курсора
- •Пример улучшения качества
- •Программирование с использованием подпрограмм
- •Имя (фактические параметры)
- •Подпрограмма с одним результатом
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Подпрограмма с аргументом – одномерным массивом
- •Постановка задачи примера
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Подпрограмма с несколькими результатами
- •Постановка задачи
- •Формирование математической модели
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Подпрограмма с результатом – массивом
- •Постановка задачи
- •Математическая формулировка
- •Выбор метода решения
- •Составление алгоритма решения
- •Программирование задачи
- •Обработка текстовой информации в Си Символьные строки
- •Определение значения символьной строки
- •Массивы строк
- •Ввод строки
- •Выделение памяти
- •Функции ввода символьной строки
- •Функция ввода символьной строки gets( )
- •Функция ввода символьной строки scanf( )
- •Преобразование символьных строк
- •Функцияatoi( )
- •Функцияatol( )
- •Функцииatof( ) иatold( )
- •Методика ввода числовых данных с использованием функцииgets( )
- •Вывод строки
- •Вывод строки функциями printf( ) и fprintf( )
- •Вывод строки функциямиputs( ) и fputs( )
- •Перевод чисел в формат символьной строки
- •Обработка символьных строк
- •Определение длины строки
- •Объединение строк
- •Копирование строк
- •Сравнение строк
- •Функции по работе с датой и временем.
- •Структуры.
- •Работа с дисками.
- •Ввод-вывод потока.
- •Открытие потока.
- •Объектно−ориентированное программирование
- •Классы ObjectWindows
- •Приложение коды клавиш
- •Краткий справочник по Си
- •Оператор вывода на принтер
- •Структура оператора
- •Структура оператора
- •Структура оператора
- •Библиографический список
Обозначение элементов массива
Описание массива позволяет использовать в программе любой из его элементов. Для обозначения элементов массива в Си используются индексированные переменные.
Индексированная переменная (индексное выражение)– обозначение ячейки для хранения элемента массива. Именуется указанием идентификатора массива и индекса (индексов) элемента.
Внимание ! Особенность обозначения элементов массива в Си - нумерация индексов от 0, а не от 1. Поэтому индексы в Си на единицу меньше заданных математически. Это обстоятельство должно учитываться в программе, особенно при формировании условия повторения (выхода из) цикла.
Схема распределения памяти для хранения одномерного массива такова:
|
индекс 0 |
индекс 1 |
индекс 2 |
|
|
|
индекс i-1 |
|
|
|
индекс n-2 |
индекс n-1 |
|
|
1-й элемент |
2-й элемент |
3-й элемент |
.. |
.. |
.. |
i-й элемент |
.. |
.. |
.. |
n-1-й элемент |
n-й элемент |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Длина ячейки для хранения каждого элемента определяется типом массива:
символьный – 1 байт;
целочисленный – 2 байта;
вещественный – 4 байта;
двойной точности – 8 байт.
Структура обозначения индексированной переменной одномерного массива:
имя[индекс]
, где имя – идентификатор массива;
индекс – операнд целого типа, определяющий номер элемента в ряду других, составляющих массив;
[ ] – ограничители индекса.
Например, в описанном ранее массиве D(16) первый элемент обозначается индексным выражениемd[0], второй –d[1], текущий –d[i], предпоследний –d[14] и последний –d[15].
При необходимости индекс может задаваться арифметическим выражением. Например, d[i+2] илиd[jx5+3]. В любом случае на момент использования переменной индекс должен быть определен (рассчитан) и полученное значение должно укладываться в заданный описателем диапазон.
Рассмотренный пример идентификации элементов массива Dприменим к любому из описанных одномерных массивов.
Индексированные переменные позволяют осуществить программную реализацию алгоритмов с использованием элементов массивов. При этом для одномерного массива индексированная переменная позволяет определить конкретный адрес каждого элемента.
Адрес любой переменной определяется операцией & . Следовательно, у элемента d[0] адрес – &d[0], уd[i] – &d[i], т.е. все элементы массива располагаются в оперативной памяти линейно, начиная с адреса &d[0].
В языке Си идентификатор одномерного массива однозначно определяет адрес его первого элемента. Например, c&c[0],d&d[0].
Адрес каждого элемента одномерного массива выражается зависимостью имя+индекс (индекс определяет сдвиг элемента относительно первого на указанное им количество элементов). Например, &c[i] (адресi-го элемента массива С) вычисляется какc+i.
Таким образом, индексное выражение полностью определяет конкретную ячейку хранения соответствующего элемента.
Составление программ решения задачи
Выполним идентификацию всех переменных алгоритмов: вещественной переменной про, целой iи двух вещественных массивов:
исходного С(7);
расчетного П(7).
Идентификация переменных имеет вид табл. 5.3.
Таблица 5.3
Обозначение в алгоритме |
c1 |
c2 |
c3 |
... |
c6 |
c7 |
про |
пi |
ci |
i |
Обозначение в программе |
c[0] |
c[1] |
c[2] |
... |
c[5] |
c[6] |
pro |
p[i] |
c[i] |
i |
В соответствии с таблицей расположение элементов исходного массива в оперативной памяти представлено схемой:
|
c[0] |
c[1] |
c[2] |
c[3] |
c[4] |
c[5] |
c[6] |
|
|
c1 |
c2 |
c3 |
c4 |
c5 |
c6 |
c7 |
|
|
4 байта |
4 байта |
4 байта |
4 байта |
4 байта |
4 байта |
4 байта |
|
Для расчетного массива П(7) распределение оперативной памяти аналогично представленному для массива С.
Выполним программы с различными операторами цикла.
Внимание! Формирование начального значения параметра и логического выражения операторов цикла должно учитывать уменьшение индексов в Си на единицу по отношению к указанным в алгоритме.
Программа по алгоритму цикла с предусловием
Вариант программы:
/* Программа с использованием цикла с предусловием */
#include <stdio.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float c[7], p[7], pro; /* описание вещественных массивов и переменной */
int i; /* описание целой переменной */
scanf("%3f%4f%4f%4f%4f%4f%4f%4f",&pro,&c[0],&c[1],
&c[2],&c[3],&c[4],&c[5],&c[6]); /* ввод переменных */
fprintf(stdprn,"pro=%8.2f\n\n",pro); /* вывод переменнойpro*/
i=0; /* формирование начального значения параметра цикла */
while( i < 7 ) /* заголовок цикла */
{
p[ i ] = ( c[ i ] * pro ) / 100.; /* вычисление текущего значения функции */
fprintf(stdprn," %8.2f %7.2f\n", c[ i ], p[ i ] );
i=i+1; /* закон изменения параметра цикла */
}
}
25.492.503.948.738.892.320.250. – значения вводимых переменных.
Программа по алгоритму цикла с постусловием
Вариант программы имеет вид
/* Программа с использованием цикла с постусловием */
#include <stdio.h> /* директивы */
#include <math.h> /* препроцессора */
main() /* заголовок основной функции */
{
float c[7], p[7], pro; /* описание вещественных массивов и переменной */
int i; /* описание целой переменной */
scanf("%3f%4f%4f%4f%4f%4f%4f%4f",&pro,&c[0],&c[1],
&c[2],&c[3],&c[4],&c[5],&c[6]); /* ввод переменных */
fprintf(stdprn,"pro=%8.2f\n\n",pro); /* вывод переменнойpro*/
i=0; /* формирование начального значения параметра цикла */
do/* заголовок цикла */
{
p[ i ] = ( c[ i ] * pro ) / 100.; /* вычисление текущего значения функции */
fprintf(stdprn," %8.2f %7.2f\n", c[ i ], p[ i ] );
i=i+1; /* закон изменения параметра цикла */
}while( i < 7 ); /* условие повторения цикла */
}
25.492.503.948.738.892.320.250. -значения вводимых переменных.
Программа по алгоритму цикла с параметром
Вариант программы имеет вид
/* Программа с использованием цикла с параметром */
#include <stdio.h> /* директивы */
#include <math.h> /* препроцессора */
#include<stdlib.h>
main() /* заголовок основной функции */
{
float c[7], p[7], pro; /* описание вещественных массивов и переменной */
int i; /* описание целой переменной */
scanf("%3f%4f%4f%4f%4f%4f%4f%4f",&pro,&c[0],&c[1],
&c[2],&c[3],&c[4],&c[5],&c[6]); /* ввод переменных */
fprintf(stdprn,"pro=%8.2f\n\n",pro); /* вывод переменнойpro*/
for( i=0 ; i < 7 ; i=i+1 ) /* заголовок цикла */
{
p[ i ] = ( c[ i ] * pro ) / 100.; /* вычисление текущего значения функции */
fprintf(stdprn," %8.2f %7.2f\n", c[ i ], p[ i ] );
}
}
25.492.503.948.738.892.320.250. - значения вводимых переменных.
Вопросы для контроля
Какой вычислительный процесс называется циклическим?
Что такое цикл, тело цикла, параметр цикла?
Каковы обязательные элементы цикла?
На какие виды подразделяются арифметические циклы?
Как графически обозначаются структуры циклов?
Какова структура оператора цикла с предусловием, как он выполняется?
В чем заключаются правила записи и выполнения оператора while?
Какова структура оператора цикла с постусловием, как он выполняется?
В чем заключаются правила записи и выполнения оператора do ... while?
Какова структура пошагового оператора цикла, как он выполняется?
Как формируются выражения оператора пошагового цикла?
В чем заключаются правила записи и выполнения оператора for?
Как принудительно выйти из любого цикла?
Как выглядит табличное изменение аргумента?
Что такое массив, какими параметрами он характеризуется?
Что такое одномерный массив и чем отличаются многомерные массивы?
Что определяет размер массива?
Что является параметром цикла при табличном задании и почему?
Что такое описание массива и как оно выполняется?
Как обозначаются элементы массива в Си?
Как распределяется память для хранения одномерных массивов?