- •Основы программирования на языке С
- •Введение
- •1. Базовые понятия программирования
- •1.1. Алгоритмизация задачи
- •1.2. Схема алгоритма программы
- •1.3. Пример алгоритмизации
- •1.4. Этапы трансляции программы
- •2. Особенности языка С
- •2.1. Характеристики языка
- •2.2. Элементы языка
- •2.3. Стандартные типы данных
- •2.4. Компоненты простой программы
- •Вопросы для самопроверки
- •3. Выражения и операции
- •3.1. Операция и выражение присваивания
- •3.2. Бинарные арифметические операции
- •3.3. Операции увеличения (++) и уменьшения (--)
- •3.4. Преобразования типов при вычислении арифметических выражений
- •3.5. Тернарная или условная операция
- •3.6. Логические операции и операции отношения
- •3.7. Поразрядные (побитовые) операции
- •3.8. Операции сдвига
- •3.9. Операция sizeof
- •3.10. Операция следования
- •3.11. Сводная таблица операций языка С
- •Вопросы для самопроверки
- •4. Операторы
- •4.1. Оператор выражение
- •4.2. Пустой оператор
- •4.3. Объявления и составной оператор
- •4.4. Условный оператор
- •4.5. Оператор выбора switch
- •4.6. Циклы
- •4.7. Оператор break
- •4.8. Оператор безусловного перехода goto
- •4.9. Оператор continue
- •4.10. Оператор return
- •Вопросы для самопроверки
- •5. Массивы
- •5.1. Одномерные статические массивы
- •5.2. Объявление массива. Обращение к элементу массива
- •5.3. Инициализация массива
- •5.4. Многомерные массивы
- •5.5. Выход индекса за границы массива
- •5.6. Приемы работы с массивами в вычислительных задачах
- •5.7. Строка как массив символов
- •Вопросы для самопроверки
- •6. Указатели и ссылки
- •6.1. Понятие указателя
- •6.2. Операция получения адреса &
- •6.3. Операция разыменования (*)
- •6.4. Арифметика указателей
- •6.5. Применение указателей в выражениях
- •6.6. Указатели и массивы
- •6.7. Ссылочный тип данных
- •Вопросы для самопроверки
- •7. Время жизни и область видимости переменной
- •7.1. Общие понятия
- •7.2. Классы памяти
- •7.3. Вложенные блоки в программе
- •8. Функции
- •8.1. Общие понятия
- •8.2. Определение функции
- •8.3. Прототип функции
- •8.4. Переменные в функции
- •8.5. Передача параметров в функцию
- •Вопросы для самопроверки
- •9. Пользовательские типы данных
- •9.1. Структурный тип данных
- •9.2. Битовые поля
- •9.3. Объединения или смеси
- •9.4. Перечисления
- •Вопросы для самопроверки
- •10. Динамическая работа с памятью
- •10.1. Универсальный указатель void
- •10.2. Принципы работы с динамическими массивами
- •Вопросы для самопроверки
- •11. Ввод-вывод данных
- •11.2. Функции ввода-вывода библиотеки iostream
Пример: Написать программу, которая вычисляет стоимость междугородного телефонного разговора. Исходными данными для программы являются код города, тариф звонка и длительность разговора. Ниже в таблице 4.1. приведены коды некоторых.
Таблица 4.1
|
|
|
|
|
|
|
|
|
|
Город |
|
Код |
|
|
Цена минуты (руб.) |
|
|
|
|
|
|
|
|
|
|
Владивосток |
|
423 |
|
|
2,2 |
|
|
|
|
|
|
|
|
|
|
Москва |
|
095 |
|
|
1,0 |
|
|
|
|
|
|
|
|
|
|
Мурманск |
|
815 |
|
|
1,2 |
|
|
|
|
|
|
|
|
|
|
Самара |
|
846 |
|
|
1,4 |
|
|
|
|
|
|
|
|
|
#include <stdio.h> |
|
|
|
|
|
|
|
#include <conio.h> |
|
|
|
|
|
|
|
void main() |
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
int kod; |
// код города |
|
|
|
|
|
|
float cena; |
// цена минуты |
|
|
|
|
|
|
int dlit; |
// длительность разговора |
|
|
|
|
|
|
float suram; // стоимость разговора |
|
|
|
|
|
||
printf("Введите исходные данные:\n"); |
|
|
|
|
|
||
printf("Длительность разговора ->"), |
|
|
|
|
|
||
scanf("%i", &dlit); |
|
|
|
|
|
||
printf("Код города:"); |
|
|
|
|
|
||
printf("Владивосток\t432"); |
|
|
|
|
|
||
printf("MocKBa\t\t095"); |
|
|
|
|
|
||
printf("MypMaнск\t815"); |
|
|
|
|
|
||
printf("Caмapa\t\t846"); |
|
|
|
|
|
||
printf("\n->"); |
|
|
|
|
|
|
|
scanf("%i", &kod); |
|
|
|
|
|
||
printf("Город: "); |
|
|
|
|
|
||
switch (kod) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
case 432: |
printf("Владивосток"); cena = 2.2; break; |
|
|||||
case 95: printf("Москва"); cena = 1; break; |
|
|
|
|
|
||
case 815: |
printf("Мурманск"); cena = 1.2; break; |
|
|||||
case 846: |
printf("Самара"); cena = 1.4; break; default: |
printf("неверно введен код."); |
|||||
|
|
cena = 0; |
|
|
|
|
|
}
if (cena != 0}
{
suram = cena * dlit;
printf("Цена минуты: %i руб.\n", cena); printf("Стоимость разговора: %3.2f руб.\n", suram); } printf("\nДпя завершения нажмите <Enter>");
}
4.6. Циклы
При программировании, часто возникает потребность выполнить несколько раз одни и те же действия, но с разными исходными данными. Чтобы решить эту проблему, программист организует цикл – многократное повторение какого-то участка кода, каждый такой повтор называют итерацией. При этом необходимо в той или иной форме задать условие выхода из цикла.
В общем случае можно организовать повтор выполнения участка программы с помощью оператора goto (безусловный переход на метку), а условие выхода из цикла – с помощью оператора if.
Пример: Ввод чисел с клавиатуры и их суммирование до тех пор пока сумма не превысит 100. #include <stdio.h>
void main() { int x,s=0;
M:if (s<100)
{printf("x=");
scanf("%d",&x);
s=s+x;
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
goto M;//переход на следующий проход цикла
} |
|
else goto K; |
// выход из цикла |
K: printf(("s=%d", s); |
|
} |
|
Такой подход не всегда удобен, противоречит принципам модульного программирования и чреват возможными ошибками, поэтому в любом языке программирования предусматриваются специальные конструкции для организации циклов.
В языках С/С++ таких циклов три – это операторы while, do-while и for. Кроме того, специально для расширения возможностей этих трех операторов, в языке предусмотрены еще два оператора – continue и break (с оператором break мы уже познакомились, рассматривая возможности оператора switch, по сути в обоих случаях он делает одно и то же).
4.6.1. Цикл с предусловием while
Цикл while используется в том случае, когда не известно точное число повторов (итераций). Оператор цикла с предусловиемпредставлен на рис. 4.4. и имеет вид:
while (выражение) оператор
В качестве выражения допускается использовать любое выражение языка С, а в качестве тела любой оператор, в том числе пустой или составной.
Схема выполнения оператора while следующая:
1.Вычисляется выражение.
2.Если выражение ложно, то выполнение оператора while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполняется тело оператора while.
3.Процесс повторяется с пункта 1.
Важно отметить, что выражение вычисляется до начала и после каждого прогона цикла. Цикл не выполняется ни разу, если выражение ложно (равно 0).
Поскольку в операторе while вначале происходит проверка условия, его удобно использовать в ситуациях, когда тело оператора не всегда нужно выполнять.
Пример: вычисление суммы чисел от 0 до 9 #include <stdio.h>
void main()
|
Рис. 4.4. Схема цикла с предусловием |
{ |
|
int i=0, sum=0; |
|
while (i++ < 10) |
// условие выполнения тела цикла |
{ |
|
printf("Значение counter\n"); |
|
sum += i; |
//аналог: sum= sum + i |
} |
// конец тела цикла |
printf("Значение суммы=%d\n",sum);
}
В выражении (i++ < 10) сначала выполняется операция инкремент i++, а затем – проверка i< 10. С помощью оператора while легко организовать бесконечный цикл.
Пример: Бесконечный цикл. while (1)
{операторы цикла
…
break;
...
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
}
Условие в скобках – константа, всегда истинно, поэтому естественного выхода из цикла нет. Такие циклы следует использовать в тех случаях, когда заранее не известно условие выхода из цикла, и оно формируется в теле цикла в процессе работы программы.
4.6.2. Цикл с постусловием do-while
Этот оператор цикла проверяет условие окончания в конце цикла, то есть после каждой итерации, поэтому тело цикла выполняется, по крайней мере, один раз. Схема оператора представлена на рис. 4.5.
Вид оператора:
do оператор while (выражение)
Рис. 4.5. Схема цикла с постусловием
Схема выполнения оператора do…while:
1.Выполняется тело цикла (которое может быть составным оператором).
2.Вычисляется выражение.
3.Если выражение ложно, то выполнение оператора do…while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполнение оператора продолжается с пункта 1.
Чтобы прервать выполнение цикла до того, как условие станет ложным, можно использовать оператор break.
Пример: Вывести на экран числа от 0 до 10.
…
int x=0; do
{ printf("%d\n",x); x++;
} while (x<10); printf("Вывод закончен!");
…
Пример: Вводить данные с клавиатуры пока их значения лежат в диапазоне от 10 до 150.
…
int input=0, minvalue=10, maxvalue=150;
do
{ printf("Введите значение input \n"); scanf("%d",&input);
}
while ( input < minvalue || input > maxvalue ); ….
4.6.3. Пошаговый цикл. Оператор for
Цикл for используется в том случае, когда известно точное количество итераций, которое нужно выполнить – это наиболее общий способ организации цикла.
Пошаговый цикл имеет следующий вид:
for ( выражение 1 ; выражение 2 ; выражение 3 ) тело цикла
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com
Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом – это область инициализации данных.
Выражение 2 – определяет условие, при котором тело цикла будет выполняться.
Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла – это область модификации данных.
Схема выполнения оператора for представлена на рис. 4.6., последовательность действий такова:
1.Вычисляется выражение 1 (один раз перед входом в цикл).
2.Вычисляется выражение 2 (перед каждым проходом цикла).
3.Если значения выражения 2 – TRUE (отлично от нуля), то выполняется тело цикла, иначе (если выражение FASLE) – цикл прекращается и управление передается оператору, следующему за оператором for.
4.Вычисляется выражение 3 (модификация данных после каждой итерации цикла), осуществляется переход к пункту 2.
Существенно то, что проверка условия выполняется в начале цикла, это значит, что тело цикла может ни разу не выполниться (если выражение ложно).
Рис. 4.6. Схема пошагового цикла |
Любое из трех выражений может быть опущено, хотя точка с запятой обязательно должна оставаться. Если отсутствует проверка (выражение2), то считается, что оно истинно (отлично от нуля), в этом случае цикл будет бесконечным.
Пример: Из бесконечного цикла можно выйти с помощью оператора break. for ( ; ; )
{ . . .
break;
. . .
}
Пример: вычислить сумму квадратов целых чисел от 1 до 20. main()
{int n=20, s=0;
for ( int i = 1; i <= n; i++ ) s += i*i; printf("\ns=%d",s);
}
В данном примере цикл управляется переменной i, значение которой должно быть обязательно целым числом. Выражение в круглых скобках имеет три составляющие:
i=1 |
– инициализация переменной i путем присваивания ей начального значения; |
i <= n |
– задает условие повтора цикла до тех пор, пока значение переменной i остается меньше |
или равно n; |
|
i++ |
– приращение значения переменной i после каждого повтора цикла. |
Тело цикла состоит из одного простого оператора: s += i*i. Пока i <= n происходит накопление суммы в переменной s. После выхода из цикла переменная s выводится на экран дисплея.
Та же задача, выполненная с помощью оператора while
…
int n=20, s=0; while(i <= n)
{s += i*i; i++;
}
PDF created with FinePrint pdfFactory Pro trial version http://www.fineprint.com