Смекни!
smekni.com

Основы программирования на языке Си (стр. 7 из 27)

гических операций "&&" ("И"), "||" ("ИЛИ") и "!" ("НЕ") (см. таблицу).

Выражение:

(6 <= 6) && (5 < 3)

(6 <= 6) || (5 < 3)

(5 != 6)

(5 < 3) && (6 <= 6) || (5 != 6)

(5 < 3) && ((6 <= 6) || (5 != 6))

!((5 < 3) && ((6 <= 6) || (5 != 6)))

Истинно или ложно:

false

true

true

true

false

true

В таблицевчетвертомпримеревыражениеистинно, посколькуприоритетопе-

рации "&&" выше, чему "||". Приоритет (порядоквыполнения) различныхопераций

Си++ можноузнатьвучебникеилируководствепоязыкуСи++, атакжевсправочной

системе Visual C++ (темаOperator Precedence). Еслиувасвозникаютсомненияотно-

сительно приоритетаопераций, применяйтекруглыескобки(). Применениеэтих

скобок облегчаетчтениепрограмм.

Составные логическиевыраженияобычноприменяютсявкачествеусловийв

операторах if и вциклахfor. Например:

...

...

if ( total_test_score >= 50 && total_test_score < 65 )

cout << "Вы прошли тест со средним результатом.&bsol;n";

...

...

У логических выраженийвСи++ естьещеодноважноесвойство. ВСи++ ис-

тинное значение ("true") представляетсяввидецелогочисла 1 (большинство ком-

пиляторов любоеположительноечислосчитаютистиннымзначением), аложное

значение ("false") ввидезначения 0. Этоможетпривестикошибкам. Например,

легко напечатать "=" вместо "==". Поэтомуфрагмент

...

...

if ( number_of_people = 1 )

cout << "Есть только один человек.&bsol;n";

...

...

всегда будетпечататьсообщение "Естьтолькоодинчеловек", дажееслидооператора

if переменная "number_of_people" былабольше 1.

28

6. Сводка результатов

В даннойлекциидовольноподробнорассматривалисьпеременныеязыкаСи++.

У переменныхвсегдаестьопределенныйтипданных. Переменныеприменяютсядля

временного илипостоянногохранениязначенийразныхтипов. Значенияпеременным

можно присваиватьразличнымиспособами. Ввыраженияхдлявычисленияновых

значений переменныхможно использоватьразличныеарифметическиеилогические

операции.

7. Упражнения

Упражнение 1

Для преобразованиятемпературыизшкалыЦельсиявабсолютнуюшкалутем-

ператур (шкалуКельвина) надо добавить ктемпературепоЦельсиюзначение 273.15.

В шкалуФаренгейтатемпературапоЦельсиюпреобразуетсяt = 1.8t o + 32 f .

Напишите программупреобразованиязначенийтемпературы, котораябудет

печатать наэкранеследующуютаблицу:

Цельсий Фаренгейт Абсолютная температура

0 32.00 273.15

20 68.00 293.15

40 104.00 313.15

... ... ...

... ... ...

300 572.00 573.15

Упражнение 2

Измените программуизупражнения 1 так, чтобыоназапрашивалаупользова-

теля минимальную имаксимальнуютемпературупоЦельсию, которыедолжныбыть

в первойипоследнейстрокахтаблицы. Программатакжедолжназапроситьшагиз-

менения температуры (наэтозначениедолжныотличатьсятемпературывсоседних

строках таблицы, вупражнении 1 шагбылравен 20-тиградусам).

Перед таблицейпрограммадолжнавывестинесколькострокспояснениемсво-

их действий, атакжеповторитьвыводнаэкранвведенныхпользователемданных.

Упражнение 3

Напишите программу, котораясчитываетсклавиатурысимвол (ch) изатемвы-

водит одноизследующихсообщений (вместо ch долженвыводитьсявведенныйсим-

вол, авместо ... –соответствующаяпрописнаяилистрочнаябуква):

а) еслисимвол ch является 2ьстрочнойбуквой–сообщение "Букве ch соответст-

вует прописнаябуква ...",

б) если ch являетсяпрописнойбуквой–сообщение "Букве ch соответствует

строчная буква ...",

в) если ch неявляетсябуквой–сообщение "Символ ch неявляетсябуквой".

Для составлениянеобходимыхусловийобратитеськрасширеннойтаблице

символов ASCII (см. п.8.3).

Упражнение 4

Напишите программудлявозведенияпроизвольногочислаx в положительную

степень n с помощьюциклаfor. (Естьлиспособыповышенияэффективностивашей

программы?)

29

8. Приложения

8.1 Служебные слова Си++

По назначениюслужебныесловаязыкаСи++ можноразделитьнанесколько

групп. Нижеперечисленыэтигруппыиотносящиесякнимслова. Полужирным

шрифтом выделеныслова, назначениекоторыхвыузнаетевданномвводномкурсе.

•Типы данных (определяюттипыданных, которыеможнохранитьвпамяти

компьютера).

char short int long (целые числа)

enum (тип "перечисление")

double float (вещественные числа)

void

struct union typedef (типы, определяемые

пользователем)

•Модификаторы типовданных (позволяютзадатьнекоторыесвойствахране-

ния данныхвпамяти).

signed unsigned

volatile register

const static extern auto

•Управление порядкомвыполненияоператоров.

if else (ветвление с двумя вариантами)

switch case default (множественное ветвление)

for while do (циклы)

break continue

return (возврат из функции)

goto (безусловный переход)

•Динамическое распределениепамяти.

new delete

•Объектно-ориентированноепрограммирование (этисловабудутподробно

рассматриваться вотдельномкурсеобъектно-ориентированногопрограм-

мирования ипроектирования).

class private protected public

virtual this friend template

operator

•Обработка исключений (особыймеханизмобработкиошибоквобъектно-

ориентированных программах).

try throw catch

•Разное.

sizeof inline asm

30

8.2 Таблица символов ASCII

8.3 Расширенная таблица символов ASCII для кодовой страницы DOS-866

31

ЛЕКЦИЯ 3. Функции и процедурная абстракция

1. Назначение подпрограмм

Естественный иинтуитивнопонятныйподходкрешениюбольшихсложных

задач состоитвтом, чтобыразбитьбольшуюзадачунанаборменьших, которыемож-

но решитьболееилименеенезависимоизатемскомбинироватьполученныерешения

для полученияполногорешения. Натакомподходеоснованаметодологияструктур-

ного программирования, котороегосподствоваловразработкепрограммногообеспе-

чения допоявления объектно-ориентированногоподхода.

При структурномпрограммированиибольшаяпрограммаразделяетсянанабор

более илименеенезависимыхподпрограмм. ВСи++ подпрограммыназываются

функциями (вПаскалеинекоторыхдругих языкахпрограммированияестьдватипа

подпрограмм – "процедуры" и "функции").

Подпрограммы уженеоднократновстречалисьвпредыдущихлекциях. Напри-

мер, впрограмме 2.3.2 дляпостроениятаблицыквадратныхкорнейбылприменен

следующий циклfor:

...

#include<math.h>

...

...

for ( number=1 ; number<=10 ; number=number+1 )

{

cout.width(20);

cout << number << sqrt(number) << "&bsol;n";

}

...

Функция "sqrt(...)" –этоподпрограмма, описаниекоторойхранитсявзаголо-

вочном файле "math.h", ареализация–вбиблиотечномфайле "math.lib". Привызове

функции "sqrt(...)" ейпередаетсячисловойпараметр "number", функцияприменяет

алгоритм вычисленияквадратногокорняизэтогочисла, изатемвозвращаетвычис-

ленное значениеобратновместовызова. Дляпримененияэтойфункциипрограмми-

сту совсемнеобязательнознать, какойименноалгоритмреализованвнутринее. Глав-

ное, чтобыфункциягарантированновозвращалаверныйрезультат. Былобыдовольно

нелепо включатьвявномвидеалгоритмизвлеченияквадратногокорня (и, возможно,

делать этонеоднократно) вглавнуюфункциюпрограммы "main".

В даннойлекцииописывается, какпрограммистможетопределятьсвоисобст-

венные функции. Сначалапредполагается, чтоэтифункцииразмещаютсяводном

файле сфункцией "main". Вконцелекциипоказывается, какраспределятьфункции

программы понесколькимфайлам.

2. Определение новых функций

Простым примеромопределенияииспользованияновойфункцииявляется

программа 2.1 (внейпользовательскаяфункцияназывается "area(...)"). Этапро-

грамма вычисляетплощадьпрямоугольниказаданнойдлиныиширины.

#include<iostream.h>

int area(int length, int width); /* Описание функции */

32

// ГЛАВНАЯ ФУНКЦИЯ:

int main()

{

int this_length, this_width;

cout << "Введите длину: "; /* <--- строка 10 */

cin >> this_length;

cout << "Введите ширину: ";

cin >> this_width;

cout << "&bsol;n"; /* <--- строка 14 */

cout << "Площадь прямоугольника с размерами ";

cout << this_length << "x" << this_width;

cout << " равна " << area(this_length, this_width) << "&bsol;n";

return 0;

}

// КОНЕЦ ГЛАВНОЙ ФУНКЦИИ

// ФУНКЦИЯ ВЫЧИСЛЕНИЯ ПЛОЩАДИ:

int area(int length, int width) /* Начало определения функции */

{

int number;

number = length * width;

return number;

} /* Конец определения функции */

// КОНЕЦ ФУНКЦИИ

Программа 2.1.

Программа 2.1, конечно, допускаетзаписьвболеесжатойформе, новданном

виде онаслужитхорошейиллюстрациейнекоторыхсвойствфункцийСи++:

•Структура определения (реализации) функцииподобнаструктурефункции

"main()" –втелефункцииестьописаниялокальныхпеременныхииспол-

няемые операторы.

•У функциимогутбытьпараметры, которыеуказываютсявспискевнутри

круглых скобокпослеименифункции. Укаждогопараметразадаетсятип.

•Если вызовфункциивстречаетсяранееееопределения, товначалепро-

граммы должносодержатьсяописаниефункции (прототип). Прототип

функции описываетеепараметрыитипвозвращаемогозначения. Обычно

прототипы функцийразмещаютсяпослеописанияглобальныхконстант.

Внутри функцииможетбытьнесколькооператороввозврата "return". Функ-

ция завершаетсяпослевыполнениялюбогооператора "return". Например:

double absolute_value(double number)

{

if (number >= 0)

return number;

else

return -number;

}

33

3. Способы передачи параметров внутрь функций

Во всехрассмотренныхдосихпорпримерахпараметры функцийпередавались

по значению. Привызовеизфункции "main()" вызываемойфункциипередаютсяко-

пии указанных переменных. Например, впрограмме 2.1 функции "area(...)" переда-

ются текущиезначенияпеременных "this_length" и "this_width". Затемфункция

"area(...)" сохраняетпереданныезначениявсобственныхлокальныхпеременных, и