Пример 8: найти сумму элементов массива a из N элементов (вариант 1)
define N = 10
...
int a [N], i, s;
...
s = 0;
for (i = 0; i <N; i + +) N- шагов
s + = a [i];
Пример 9: найти сумму элементов массива a из N элементов (вариант 2)
...
for (i = 0; i <= N - 1; i + +) N- шагов
s + = a [i];
Особенности цикла for в Си:
- границы цикла for можно менять внутрi цикла;
- как бы ни закончился цикл, его параметр сохраняет свое значение;
- можно перенести в for все осуществлении операторы тела цикла;
4.6 Операция "," (запятая)
- Используется в операторе for ;
- Пара выражений, разделенных запятыми, вычисляются слева направо;
- в каждом из выражений (вир1, вир2, вир3) можно размещать несколько выражений
Пример 10: поворот строки S на месте - reverse (S).
char s [10];
int r, i, j;
for (i = 0, j = strlen (s) - 1; i <j; i + +, j -)
{
r = s [i];
s [i] = s [j];
s [j] = r;
}
Запятая, разделяющая аргументы функций, переменные в описаниях и т.п., не является операция "запятая", и она не гарантирует вычисление слева направо.
Цикл do - while
Синтаксис
do
<Инструкция>
while (<выр>)
Семантика
1. Выполняется <инструкция>;
2. Выполняется <водоворот>;
3. Если <водоворот> отлично от 0, то снова выполняется пункт 1) и т.д.;
4. Если <водоворот> равно 0, то повторения заканчиваются;
5. <инструкция> цикла do - while всегда выполняется хотя бы один раз.
Пример 11: найти сумму элементов массива a из N элементов (вариант 3)
define N 10
...
int a [N], i, S;
...
S = 0; i = 0;
do
{S + = a [i]; i = i +1;}
while (i <N);
Инструкция break
Оператор break обеспечивает преждевременное прекращение циклов for, while, do - while, также как и переключателя.
Этот оператор вызывает немедленный выход из самого внутреннего из циклов или переключателей.
|
|
Сontinue
Вызывает начало следующего шага цикла while, for, do - while. В циклах while и do - while сразу выполняется часть, проверяет условие продолжения цикла. В цикле for управление передается на этап повторной инициалiзации.
Оператор continue не применяется с переключателями.
Пример 12: обработка только положительных элементов массива
define N 10
...
int a [N], i;
...
for (i = 0; i <N; i + +)
{
if (a [i] <0) / * пропускаем негативные элементы * /
continue;
... / * Обработка положительных * /
}
Переходы и метки
Переход используется, если нужно выйти из структуры с некоторой глубиной вложенности (например, покинуть сразу два цикла).
Пример 13:
for (...)
for (...)
{...
if (<выражение>)
goto <метка>;
...
}
...
<Метка>:
...
Метка имеет вид обычного имени переменной, за которым нужна двоеточие.
Если оператор с данной меткой отсутствует или имеется более одного оператора, помеченного той же меткой, то компилятор сообщает об ошибке.
Нельзя с помощью оператора goto передать управление на конструкции case и default в теле переключателя, на инструкции ветвей "то" или "иначе" конструкций if-else.
|
|
Тема 5. Указатели и массивы
Цель: познакомиться с понятием "указатель", с представлением массивов в памяти ЭВМ, доступ к элементам массива с помощью индексов i указателей, с понятием "адресная арифметика", со способами представления строк в языке Си.
Указатели
Связь указателей и массивов
Связь между адресной арифметикой и индексированием массивов
Различие между именем массива и указателем (в роли именi массива)
Буквенные указатели
Массивы указателей
Инициализация массивов указателей
Многомерные массивы
Указатели вместо многомерных массивов
Функции обработки строк
Функции проверки свойств символов
Функции преобразования строк
Указатели
Указатель - это переменная, значением которой является адрес.
Указатель можно описать в декларации. Организация памяти:
-Номера ячеек - адреса
Компилятор распределяет память по переменным. Память представляет собой последовательность ячеек, которые перенумерованы (проадресованi).
Обработка ячеек памяти может быть выполнена либо отдельными ячейках или группами ячеек (2 байта, 4 байта, 8 байтiв).
|
|
Оператор & (унарный)
- Префiксний;
- высокий приоритет;
- правоасоцiативний.
Этот оператор выдает адрес объекта.
Пример 1:
p = &c;
pi = &i;
В Turbo-C адреса могут быть двух-или чотирьохбайтовi (это зависит от модели памяти).
<Имя операции главного меню> => Options => Compiler => Model (6 моделей памяти)
* р ссылается на переменную (указывает).
pi ссылается на i
- Оператор адреса применяется только к операндов, расположенным в оперативной памяти. Это переменные или элемент массива. Нельзя применять его к констант или выражений.
Унарный оператор *
- Префiксний
- высокий приоритет;
- правоасоцiативнbй;
* - Раскрытие ссылки (розiменування).
Применяется только к указателям и выдает объект, на который ссылается указатель.
- Указатель всегда ссылается на объекты заданного типа (кроме void)
Пример 2:
int a = 1; / * * ip можно использовать везде, где
int * ip; нужно использовать а: * /
ip = &a;
-2 Способы доступа к а
* Ip = * ip +10; / * a = 11 * /
y = * ip +1; / * y = 12 * /
* Ip + = 1; / * a = 12 * /
(* Ip) + +;
! * ip + + происходит изменение самого указателя - перейти к следующему целого значения (+2) - (если тип - указатель на float, то +4) - переход к следующему объекту этого типа
Указатель - это переменная
|
|
Связь указателей и массивов
[ ] = *
Оператор [] в Си эквивалентный работе оператора * (компилятор превращает [] в *).
i-й элемент: а [i]
с указателями:
int * pa;
pa = & a [0]
x = * pa; / * x = a [0] (= -1) * /
Адресная арифметика
Если ра указывает на некоторый элемент, то ра +1 указывает на следующий элемент , pа + i - на i-й элемент после ра , ра-1 - на предыдущей (перед ра) .
Во всех языках программирования команда вырезки элемента из массива ([]) стоит десятки машинных команд, а в языке Си - ни одной лишней команды.
! Если pa = & a [0]
то * (pa + 1) ~ a [1]
pa + i ~ адрес [i]
* (Pa + i) ~ a [i]
Пример 3:
int * pa;
int a [5] = {-1, -10, -100, -1000, -10000};
int a1, a2;
pa = & a [0]; / * pa =- 1 * /
a1 = * (pa +1); / * a1 = a [1] * /
a2 = * (pa +2); / * a2 = a [2] * /
Дата добавления: 2020-04-25; просмотров: 57; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!