Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_по_программированию.doc
Скачиваний:
80
Добавлен:
02.04.2015
Размер:
4.77 Mб
Скачать
        1. Обозначение элементов массива

Описание массива позволяет использовать в программе любой из его элементов. Для обозначения элементов массива в Си используются индексированные переменные.

Индексированная переменная (индексное выражение)– обозначение ячейки для хранения элемента массива. Именуется указанием идентификатора массива и индекса (индексов) элемента.

  • Внимание ! Особенность обозначения элементов массива в Си - нумерация индексов от 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.

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

        1. Составление программ решения задачи

Выполним идентификацию всех переменных алгоритмов: вещественной переменной про, целой 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. - значения вводимых переменных.

Вопросы для контроля

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

  2. Что такое цикл, тело цикла, параметр цикла?

  3. Каковы обязательные элементы цикла?

  4. На какие виды подразделяются арифметические циклы?

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

  6. Какова структура оператора цикла с предусловием, как он выполняется?

  7. В чем заключаются правила записи и выполнения оператора while?

  8. Какова структура оператора цикла с постусловием, как он выполняется?

  9. В чем заключаются правила записи и выполнения оператора do ... while?

  10. Какова структура пошагового оператора цикла, как он выполняется?

  11. Как формируются выражения оператора пошагового цикла?

  12. В чем заключаются правила записи и выполнения оператора for?

  13. Как принудительно выйти из любого цикла?

  14. Как выглядит табличное изменение аргумента?

  15. Что такое массив, какими параметрами он характеризуется?

  16. Что такое одномерный массив и чем отличаются многомерные массивы?

  17. Что определяет размер массива?

  18. Что является параметром цикла при табличном задании и почему?

  19. Что такое описание массива и как оно выполняется?

  20. Как обозначаются элементы массива в Си?

  21. Как распределяется память для хранения одномерных массивов?