С++ для начинающих





Скачать 17.65 Mb.
НазваниеС++ для начинающих
страница14/198
Дата публикации21.08.2013
Размер17.65 Mb.
ТипКнига
100-bal.ru > Информатика > Книга
1   ...   10   11   12   13   14   15   16   17   ...   198


(a) "Who goes with F\144rgus?\014"

(b) 3.14e1L

(c) "two" L"some"

(d) 1024f

(e) 3.14UL

(f) "multiple line


comment"

3.2. Переменные


Представим себе, что мы решаем задачу возведения 2 в степень 10. Пишем:

#include



int main() {

// a first solution

cout << "2 raised to the power of 10: ";

cout << 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2;

cout << endl;

return 0;


}

Задача решена, хотя нам и пришлось неоднократно проверять, действительно ли 10 раз повторяется литерал 2. Мы не ошиблись в написании этой длинной последовательности двоек, и программа выдала правильный результат – 1024.

Но теперь нас попросили возвести 2 в 17 степень, а потом в 23. Чрезвычайно неудобно каждый раз модифицировать текст программы! И, что еще хуже, очень просто ошибиться, написав лишнюю двойку или пропустив ее... А что делать, если нужно напечатать таблицу степеней двойки от 0 до 15? 16 раз повторить две строки, имеющие общий вид:

cout << "2 в степени X\t";


cout << 2 * ... * 2;

где Х последовательно увеличивается на 1, а вместо отточия подставляется нужное число литералов?

Да, мы справились с задачей. Заказчик вряд ли будет вникать в детали, удовлетворившись полученным результатом. В реальной жизни такой подход достаточно часто срабатывает, более того, бывает оправдан: задача решена далеко не самым изящным способом, зато в желаемый срок. Искать более красивый и грамотный вариант может оказаться непрактичной тратой времени.

В данном случае “метод грубой силы” дает правильный ответ, но как же неприятно и скучно решать задачу подобным образом! Мы точно знаем, какие шаги нужно сделать, но сами эти шаги просты и однообразны.

Привлечение более сложных механизмов для той же задачи, как правило, значительно увеличивает время подготовительного этапа. Кроме того, чем более сложные механизмы применяются, тем больше вероятность ошибок. Но даже несмотря на неизбежные ошибки и неверные ходы, применение “высоких технологий” может принести выигрыш в скорости разработки, не говоря уже о том, что эти технологии значительно расширяют наши возможности. И – что интересно! – сам процесс решения может стать привлекательным.

Вернемся к нашему примеру и попробуем “технологически усовершенствовать” его реализацию. Мы можем воспользоваться именованным объектом для хранения значения степени, в которую нужно возвести наше число. Кроме того, вместо повторяющейся последовательности литералов применим оператор цикла. Вот как это будет выглядеть:

#include
int main()

{

// objects of type int

int value = 2;

int pow = 10;
cout << value << " в степени "

<< pow << ": \t";
int res = 1;
// оператор цикла:

// повторить вычисление res

// до тех пор пока cnt не станет больше pow

for ( int cnt=1; cnt <= pow; ++cnt )

res = res * value;
cout << res << endl;

}

value, pow, res и cnt – это переменные, которые позволяют хранить, модифицировать и извлекать значения. Оператор цикла for повторяет строку вычисления результата pow раз.

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

int pow( int val, int exp )


{

for ( int res = 1; exp > 0; --exp )

res = res * val;

return res;


}

Теперь получить любую степень нужного числа не составит никакого труда. Вот как реализуется последняя наша задача – напечатать таблицу степеней двойки от 0 до 15:

#include

extern int pow(int,int);

int main()

{

int val = 2;

int exp = 15;
cout << "Степени 2\n";

for ( int cnt=0; cnt <= exp; ++cnt )

cout << cnt << ": "

<< pow( val, cnt ) << endl;
return 0;


}

Конечно, наша функция pow() все еще недостаточно обобщена и недостаточно надежна. Она не может оперировать вещественными числами, неправильно возводит числа в отрицательную степень – всегда возвращает 1. Результат возведения большого числа в большую степень может не поместиться в переменную типа int, и тогда будет возвращено некоторое случайное неправильное значение. Видите, как непросто, оказывается, писать функции, рассчитанные на широкое применение? Гораздо сложнее, чем реализовать конкретный алгоритм, направленный на решение конкретной задачи.

3.2.1. Что такое переменная


Переменная, или объект – это именованная область памяти, к которой мы имеем доступ из программы; туда можно помещать значения и затем извлекать их. Каждая переменная С++ имеет определенный тип, который характеризует размер и расположение этой области памяти, диапазон значений, которые она может хранить, и набор операций, применимых к этой переменной. Вот пример определения пяти объектов разных типов:

int student_count;

double salary;

bool on_loan;

strins street_address;

char delimiter;

Переменная, как и литерал, имеет определенный тип и хранит свое значение в некоторой области памяти. Адресуемость – вот чего не хватает литералу. С переменной ассоциируются две величины:

  • собственно значение, или r-значение (от read value – значение для чтения), которое хранится в этой области памяти и присуще как переменной, так и литералу;

  • значение адреса области памяти, ассоциированной с переменной, или l-значение (от location value – значение местоположения) – место, где хранится r-значение; присуще только объекту.

В выражении

ch = ch - '0';

переменная ch находится и слева и справа от символа операции присваивания. Справа расположено значение для чтения (ch и символьный литерал '0'): ассоциированные с переменной данные считываются из соответствующей области памяти. Слева – значение местоположения: в область памяти, соотнесенную с переменной ch, помещается результат вычитания. В общем случае левый операнд операции присваивания должен быть l-значением. Мы не можем написать следующие выражения:

// ошибки компиляции: значения слева не являются l-значениями
// ошибка: литерал - не l-значение

0 = 1;
// ошибка: арифметическое выражение - не l-значение

salary + salary * 0.10 = new_salary;

Оператор определения переменной выделяет для нее память. Поскольку объект имеет только одну ассоциированную с ним область памяти, такой оператор может встретиться в программе только один раз. Если же переменная, определенная в одном исходном файле, должна быть использована в другом, появляются проблемы. Например:

// файл module0.C


// определяет объект fileName

string fileName;

// ... присвоить fileName значение
// файл module1.C

// использует объект fileName
// увы, не компилируется:

// fileName не определен в module1.C


ifstream input_file( fileName );

С++ требует, чтобы объект был известен до первого обращения к нему. Это вызвано необходимостью гарантировать правильность использования объекта в соответствии с его типом. В нашем примере модуль module1.C вызовет ошибку компиляции, поскольку переменная fileName не определена в нем. Чтобы избежать этой ошибки, мы должны сообщить компилятору об уже определенной переменной fileName. Это делается с помощью инструкции объявления переменной:

// файл module1.C


// использует объект fileName
// fileName объявляется, то есть программа получает

// информацию об этом объекте без вторичного его определения

extern string fileName;



ifstream input_file( fileName )

Объявление переменной сообщает компилятору, что объект с данным именем, имеющий данный тип, определен где-то в программе. Память под переменную при ее объявлении не отводится. (Ключевое слово extern рассматривается в разделе 8.2.)

Программа может содержать сколько угодно объявлений одной и той же переменной, но определить ее можно только один раз. Такие объявления удобно помещать в заголовочные файлы, включая их в те модули, которые этого требуют. Так мы можем хранить информацию об объектах в одном месте и обеспечить удобство ее модификации в случае надобности. (Более подробно о заголовочных файлах мы поговорим в разделе 8.2.)

3.2.2. Имя переменной


Имя переменной, или идентификатор, может состоять из латинских букв, цифр и символа подчеркивания. Прописные и строчные буквы в именах различаются. Язык С++ не ограничивает длину идентификатора, однако пользоваться слишком длинными именами типа gosh_this_is_an_impossibly_name_to_type неудобно.

Некоторые слова являются ключевыми в С++ и не могут быть использованы в качестве идентификаторов; в таблице 3.1 приведен их полный список.

Таблица 3.1. Ключевые слова C++

asm

auto

bool

break

case

catch

char

class

const

const_cast

continue

default

delete

do

double

dynamic_cast

else

enum

explicit

export

extern

false

float

for

friend

goto

if

inline

int

long

mutable

namespace

new

operator

private

protected

public

register

reinterpret_cast

return

short

signed

sizeof

static

static_cast

struct

switch

template

this

throw

true

try

typedef

typeid

typename

union

unsigned

using

virtual

void

volatile

wchar_t

while







Чтобы текст вашей программы был более понятным, мы рекомендуем придерживаться общепринятых соглашений об именах объектов:

  • имя переменной обычно пишется строчными буквами, например index (для сравнения: Index – это имя типа, а INDEX – константа, определенная с помощью директивы препроцессора #define);

  • идентификатор должен нести какой-либо смысл, поясняя назначение объекта в программе, например: birth_date или salary;

если такое имя состоит из нескольких слов, как, например, birth_date, то принято либо разделять слова символом подчеркивания (birth_date), либо писать каждое следующее слово с большой буквы (birthDate). Замечено, что программисты, привыкшие к ОбъектноОриентированномуПодходу предпочитают выделять слова заглавными буквами, в то время как те_кто_много_писал_на_С используют символ подчеркивания. Какой из двух способов лучше – вопрос вкуса.

3.2.3. Определение объекта


В самом простом случае оператор определения объекта состоит из спецификатора типа и имени объекта и заканчивается точкой с запятой. Например:

double salary;

double wage;

int month;

int day;

int year;

unsigned long distance;

В одном операторе можно определить несколько объектов одного типа. В этом случае их имена перечисляются через запятую:

double salary, wage;

int month,

day, year;

unsigned long distance;

Простое определение переменной не задает ее начального значения. Если объект определен как глобальный, спецификация С++ гарантирует, что он будет инициализирован нулевым значением. Если же переменная локальная либо динамически размещаемая (с помощью оператора new), ее начальное значение не определено, то есть она может содержать некоторое случайное значение.

Использование подобных переменных – очень распространенная ошибка, которую к тому же трудно обнаружить. Рекомендуется явно указывать начальное значение объекта, по крайней мере в тех случаях, когда неизвестно, может ли объект инициализировать сам себя. Механизм классов вводит понятие конструктора по умолчанию, который служит для присвоения значений по умолчанию. (Мы уже сказали об этом в разделе 2.3. Разговор о конструкторах по умолчанию будет продолжен немного позже, в разделах 3.11 и 3.15, где мы будем разбирать классы string и complex из стандартной библиотеки.)

int main() {


// неинициализированный локальный объект

int ival;
// объект типа string инициализирован

// конструктором по умолчанию

string project;
// ...


}

Начальное значение может быть задано прямо в операторе определения переменной. В С++ допустимы две формы инициализации переменной – явная, с использованием оператора присваивания:

int ival = 1024;


string project = "Fantasia 2000";

и неявная, с заданием начального значения в скобках:

int ival( 1024 );


string project( "Fantasia 2000" );

Оба варианта эквивалентны и задают начальные значения для целой переменной ival как 1024 и для строки project как "Fantasia 2000".

Явную инициализацию можно применять и при определении переменных списком:

double salary = 9999.99, wage = salary + 0.01;

int month = 08;

day = 07, year = 1955;

Переменная становится видимой (и допустимой в программе) сразу после ее определения, поэтому мы могли проинициализировать переменную wage суммой только что определенной переменной salary с некоторой константой. Таким образом, определение:

// корректно, но бессмысленно


int bizarre = bizarre;

является синтаксически допустимым, хотя и бессмысленным.

Встроенные типы данных имеют специальный синтаксис для задания нулевого значения:

// ival получает значение 0, а dval - 0.0


int ival = int();


double dval = double();

В следующем определении:

// int() применяется к каждому из 10 элементов


vector< int > ivec( 10 );

к каждому из десяти элементов вектора применяется инициализация с помощью int(). (Мы уже говорили о классе vector в разделе 2.8. Более подробно об этом см. в разделе 3.10 и главе 6.)

Переменная может быть инициализирована выражением любой сложности, включая вызовы функций. Например:

#include


#include
double price = 109.99, discount = 0.16;

double sale_price( price * discount );

string pet( "wrinkles" );
extern int get_value();

int val = get_value();



unsigned abs_val = abs( val );

abs() – стандартная функция, возвращающая абсолютное значение параметра. get_value() – некоторая пользовательская функция, возвращающая целое значение.

Упражнение 3.3

Какие из приведенных ниже определений переменных содержат синтаксические ошибки?


(a) int car = 1024, auto = 2048;

(b) int ival = ival;

(c) int ival( int() );

(d) double salary = wage = 9999.99;


(e) cin >> int input_value;

Упражнение 3.4

Объясните разницу между l-значением и r-значением. Приведите примеры.

Упражнение 3.5

Найдите отличия в использовании переменных name и student в первой и второй строчках каждого примера:

(a) extern string name;

string name( "exercise 3.5a" );
(b) extern vector students;

vector students;

Упражнение 3.6

Какие имена объектов недопустимы в С++? Измените их так, чтобы они стали синтаксически правильными:

(a) int double = 3.14159; (b) vector< int > _;

(c) string namespase; (d) string catch-22;

(e) char 1_or_2 = '1'; (f) float Float = 3.14f;

Упражнение 3.7

В чем разница между следующими глобальными и локальными определениями переменных?

string global_class;

int global_int;


int main() {

int local_int;

string local_class;
// ...


}
1   ...   10   11   12   13   14   15   16   17   ...   198

Похожие:

С++ для начинающих iconКалендарно-Тематическое планирование элективного курса «Компьютер для начинающих» для 5 класс
Программа элективного курса «Компьютер для начинающих» для 5 класса (Рекомендована Экспертным Советом му «Управление образования...
С++ для начинающих iconПособие на каждый день для начинающих студентов Губкинского университета...
У нас так принято. Пособие на каждый день для начинающих студентов Губкинского университета и не только для них. Авторы: доцент Л....
С++ для начинающих iconСписок используемой литературы на тему «Компьютерная графика и Анимация»...
Издательство: Педагогика–пресс «Информатика: Энциклопедический словарь для начинающих.» – 1994 – С. 121-154
С++ для начинающих iconПояснительная записка Программа рассчитана на 30 час ( 2 часа в неделю)....
Учебник английского языка «Страна чудес Wonderland Pre-Junior для начинающих» Кристина Бруни Эдинбург, «Пирсон», 2012
С++ для начинающих iconМетодические рекомендации для учителей, начинающих работать по курсу...

С++ для начинающих iconНик Бостром. Рассуждение о Конце Света для начинающих. Алексей Турчин
Оценочные средства для текущего контроля успеваемости, промежуточной итоговой аттестации студентов д/о и з/о
С++ для начинающих iconПрограмма по формированию навыков безопасного поведения на дорогах...
Уровень подготовленности: для начинающих; для среднего и любого уровня подготовленности; для подготовленных
С++ для начинающих iconRu Персональный компьютер, или "Азбука pc" для начинающих http
Олимпиады и контрольно-измерительные материалы по информатике и ит олимпиадная информатика
С++ для начинающих iconНемецкий язык для начинающих
С 34 Лингвострановедение и страноведение: учебно-методический комплекс / А. А. Сибгатуллина – Елабуга: Изд-во егпу, 2010. – 24с
С++ для начинающих iconПрограмма по формированию навыков безопасного поведения на дорогах...
Курс для начинающих 1 (А1): для абсолютных новичков. Разговор для первой ориентации,ситуации повседневной жизни,грамматических структур...
С++ для начинающих iconПрограмма по формированию навыков безопасного поведения на дорогах...
...
С++ для начинающих iconПрограмма по формированию навыков безопасного поведения на дорогах...
...
С++ для начинающих iconПрограмма по формированию навыков безопасного поведения на дорогах...
...
С++ для начинающих iconПособие на каждый день для начинающих студентов Нефтегаза и не только для них Тюмень
Использовано пособие «У нас так принято!» Российского государственного университета нефти и газа им. Губкина
С++ для начинающих iconПоложение о XV городской конференции учащихся «Первая ступень в науку»
Создание условий для формирования познавательного интереса у начинающих исследователей в различных отраслях науки
С++ для начинающих iconПрограмма по формированию навыков безопасного поведения на дорогах...
Аэробика с использованием степ платформы. Рекомендуется для начинающих. Продолжительность 45 минут


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск