Лекция основы си++ 7




НазваниеЛекция основы си++ 7
страница9/18
Дата публикации08.06.2014
Размер1.94 Mb.
ТипЛекция
literature-edu.ru > Курсовая работа > Лекция
1   ...   5   6   7   8   9   10   11   12   ...   18

Программа 6.1.

7. Операторы ввода/вывода ">>" и "<<"

До сих пор рассматривались способы записи и чтения из файлов отдельных символов. На нижнем уровне, скрытом внутри классов of stream and if stream, объ­екты этих классов всегда работают с файлами как с последовательностями символов. Поэтому данные других типов ("int", "double" и др.) для записи в файл должны быть преобразованы в последовательность символов. При чтении из файла эти последова­тельности должны быть преобразованы обратно.

Некоторые преобразования типов данных автоматически выполняются опера­торами ">>" и "<<" (в предыдущих лекциях они часто использовались для ввода с кла­виатуры и вывода на экран). Например, из состояния, показанного на рис. 13:





[программа)

Рис. 13. Состояние программы после открытия файла вывода (после подклю­чения потока вывода к файлу).

с помощью оператора

out_stream « 437 « ' ';

программа перейдет в новое состояние, изображенное на рис. 14.

out stream


НЕЛ

(программа)

1 41

Рис. 14. Состояние программы после записи в поток вывода целого значения "437" и пробела.

При использовании операторов ">>" и "<<" обязательно надо после каждого за­писанного значения записывать еще как минимум один символ ' ' (пробел) или слу­жебный символ ' \n' (маркер конца строки). Это гарантирует, что элементы данных будут корректно отделены в файле друг от друга, и их можно будет извлекать оттуда с помощью оператора ">>". Например, в состоянии, показанном на рис. 15:

48



Рис. 15. Состояние программы в некоторый момент времени, когда текущая позиция потока ввода установлена на пробел.

если "n" является переменной типа "int" и имеет значение 10, то выполнение опера­тора

in_stream » n;

приведет к состоянию, показанному на рис. 16.


1 О1


^[программа) п[437]

Рис. 16. Состояние программы после чтения из потока ввода целого значения

"437".
Обратите внимание, что оператор ">>" перед числом 437 пропустил пробел ' '. Этот оператор всегда пропускает пробелы, независимо от типа считываемых данных (даже при чтении символов).

Работа с операторами ">>" и "<<" продемонстрирована в программе 7.1. Снача­ла она создает файл "Integers . txt", записывает в него целые числа 51, 52, 53, 54 и 55, а затем считывает эти числа из файла.
#include #include

int main ()

{

char character;

int number = 51;

int count = 0;

ofstream out_stream;

ifstream in_stream1; // Поток для подсчета целых чисел.

ifstream in_stream2; // Поток для подсчета символов.

// Создание файла

out_stream.open( "Integers.txt" );

for ( count = 1; count <= 5; count++ )

out_stream « number++ « ' ' ; out_stream.close();

// Подсчет количества целых чисел в файле

in_stream1.open( "Integers.txt" );

count = 0;

in _stream1 >> number;

while ( !in_stream1.eof() )

49

count++;

in_streaml » number;

}

in_stream1.close() ; cout « "В файле хранится " « count « " целых чисел,\n";

// Подсчет количества символов, не являющихся разделителями

in_stream2.open( "Integers.txt" );

count = 0;

in_stream2 » character;

while ( !in_stream2.eof() )

{

count++;

in_stream2 » character;

}

in_stream2.close(); cout << "представленных с помощью " « count << " символов.\n";

return 0; }

Программа 7.1.

Программа 7.1 выведет на экран следующие сообщения:

В файле хранится 5 целых чисел, представленных с помощью 10 символов.

При подсчете символов в последней части программы 7.1 снова обратите вни­мание на то, что, в отличие от функции "get (...)", оператор ">>" игнорирует в файле пробелы (которые разделяют пять целых чисел).

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

В лекции рассмотрены способы работы с текстовыми файлами с помощью по­токов ввода/вывода. "Низкоуровневый" ввод/вывод выполняется с помощью функций "get (...)" и "put (...)", а "высокоуровневый" ввод/вывод значений разных типов - с помощью потоковых операторов ">>" и "<<".

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

Упражнение 1

Напишите программу, печатающую на экране содержимое собственного ис­ходного файла на Си++.

Упражнение 2

Разработайте программу, которая (1) начинается с оператора вывода тестового сообщения:

cout « "Проверка: " « 16/2 « " = " « 4*2 « ".\n\n";

и затем (2) копирует собственный исходный файл на Си++ в файл "WithoutComments . cpp" и на экран, при этом пропуская все комментарии между маркерами "/* ... */" (и маркеры комментариев тоже).

50

Получившийся файл "WithoutComments . cpp" должен компилироваться и ра­ботать точно так же, как и исходная программа.

Подсказки: (1) вам может пригодиться функция "putback () "; (2) для отслежива­ния состояния, находитесь ли вы внутри комментария или нет, можете применить логический "флаг".

Упражнение 3

Напишите программу, которая подсчитывает и выводит на экран количество символов (включая пробелы) в собственном исходном файле.

Упражнение 4

Без использования массива (массивы будут рассмотрены в 6-й лекции) напи­шите программу, которая печатает на экране собственный исходный файл в обратном порядке.

Подсказки: (1) Для начальной части этой программы может пригодиться програм­ма из упражнения 3. (2) Будьте внимательны и не используйте поток ввода после ошибки — вместо этого работайте с новым потоком.

Примечание: не беспокойтесь, если перед началом печати происходит небольшая задержка - открытие и закрытие файлов требует некоторого времени.

Упражнение 5

Что выведет на экран следующая программа?

#include #include

int main () {

char character;

int integer;

ofstream out_stream;

ifstream in_stream;

// Создание текстового файла и запись в него двух целых чисел out_stream.open( "Integers.txt" ); out_stream « 12 3 « ' ' « 45 6; out_stream.close() ;

// Попытка чтения из только что созданного файла

// "Integers.txt" символа, затем целого числа,

// затем снова символа, затем опять целого числа.

in_stream.open( "Integers.txt" );

in_stream » character » integer;

cout « "символ: '" « character < <"'\n";

cout « "целое число: " « integer « "\n";

in_stream » character » integer;

cout « "символ: '" « character < <"'\n";

cout « "целое число: " « integer « "\n";

in_stream.close();

return 0;

51

ЛЕКЦИЯ 5. Операторы ветвления и циклы

1. Логические значения, выражения и функции

В этой лекции подробно рассматриваются операторы ветвления ("if" и "switch") и операторы циклов "for" и "while". Для применения всех этих операто­ров необходимо хорошо знать, что такое логические выражения и как они вычисля­ются.

Язык Си++ унаследовал от языка Си соглашение, согласно которому целое значение 0 считается логическим "false" (ложное значение), а ненулевое целое - ло­гическим "true" (истинным значением). Но выражения вроде

условие1 == 1

ИЛИ

условие2 == 0

не слишком удобны при чтении теста программ человеком. Было бы лучше записы­вать логические выражения в интуитивно понятном виде:

условие1 == true и

условие2 == false

Поэтому в Си++ был добавлен специальный логический тип "bool". Перемен­ные типа "bool" могут принимать значения "true" и "false", которые при необхо­димости автоматически преобразуются в выражениях в значения 1 и 0.

Тип данных "bool" можно использовать в программах точно так же, как и ти­пы "int", "char" и др. (например, для описания переменных или для создания функ­ций, возвращающих значения типа "bool").

Программа 1.1 приведена в качестве примера использования типа данных "bool". Она запрашивает с клавиатуры возраст кандидата, сдававшего некий тест, и полученную кандидатом оценку в баллах. Затем программа оценивает результат вы­полнения теста по шкале, зависящей от возраста кандидата и делает вывод о том, сдан тест или нет. Для кандидатов до 14 лет порог сдачи теста составляет 50 баллов, для 15 или 16 лет - 55 баллов, старше 16-ти лет - 60 баллов.

#include

bool acceptable( int age, int score );

int main () {

int candidate_age, candidate_score;

cout « "Введите возраст кандидата: "; cin » candidate_age;

cout << "Введите результат тестирования: "; cin » candidate_score;

if ( acceptable( candidate_age, candidate_score ) ) cout « "Этот кандидат сдал тест успешно.\n";

else

cout « "Этот кандидат тест не прошел.\n";

52

return 0;

// Функция оценки результата тестирования: тест сдан/не сдан

bool acceptable( int age, int score )

{

if ( age <= 14 && score >= 50 )

return true; else if ( age <= 16 && score >= 55 )

return true; else if ( score >= 60 )

return true; else

return false; }

Программа 1.1.

2. Циклы "for", "while" и "do...while"

Циклы "for" впервые встречались во 2-й лекции, цикл "while" упоминался в 4-й лекции. Любой цикл "for" можно переписать в виде цикла "while" и наоборот. Рассмотрим программу 2.1 (она похожа на программу 2.2 из 2-й лекции).

#include

int main ()

{

int number; char character;

for ( number = 32; number <= 12 6; number = number + 1 ) {

character = number; cout « "Символ '" « character; cout « "' имеет код " « number « "\n"; }

return 0; }

Программа 2.1.

Программу 2.1 можно переписать с помощью цикла "while" (программа 2.2):

#include

int main ()

{

int number; char character;

number = 32;

while ( number <= 12 6 )

{

character = number;

cout « "Символ '" « character;

cout « "' имеет код " « number « "\n";

number++;

53

return 0; }

Программа 2.2.

Замена цикла "while" на цикл "for" выполняется совсем просто. Например, в программе 2.2 строку

while (number <= 12 6)

можно заменить эквивалентным циклом "for" без операторов инициализации и из­менения значений:

for ( ; number <= 12 6; )

В Си++ есть еще один, третий, вариант цикла - оператор цикла с постфиксным условием (постусловием) "do {...} while". Он отличается от циклов "for" и "while" тем, что тело цикла внутри скобок " {}" обязательно выполняется как минимум один раз, т.к. условие повторения цикла проверяется только после выполнения тела цикла. Циклы "Do . . . while" используются довольно редко. Например этот цикл можно применить для проверки корректности введенных с клавиатуры данных (програм­ма 2.2а).

do {

cout « "Введите результат тестирования: ";

cin » candidate_score;

if ( candidate_score > 100 || candidate_score < 0 )

cout « "Допускается оценка от 0 до 100.\n"; } while ( candidate score > 100 || candidate score < 0 );

Фрагмент программы 2.2a.

В программе 2.2a цикл с постусловием позволяет избавиться от дублирования операторов печати приглашения и ввода данных, которое возникает при использова­нии эквивалентного цикла "while" (программа 2.2b).

cout << "Введите результат тестирования: ";

cin » candidate_score;

while ( candidate_score > 100 || candidate_score < 0 )

{

cout « "Допускается оценка от 0 до 100.\n";

cout << "Введите результат тестирования: ";

cin » candida te_score;

Фрагмент программы 2.2b.

54

3. Множественное ветвление и оператор "switch"

Вложенные операторы "if", предназначенные для выполнения "множествен­ного ветвления", уже встречались в 1-й лекции. Упрощенная версия этого примера приведена ниже:

if ( total_test_score < 50 )

cout « "Вы не прошли тест. Выучите материал как следует.\n"; else if ( total_test_score < 60 )

cout « "Вы прошли тест со средним результатом.\n"; else if ( total_test_score < 80 )

cout « "Вы хорошо выполнили тест.\n"; else if ( total_test_score < 100 )

cout « "Вы показали отличный результат.\n"; else

{

cout << "Вы выполнили тест нечестно";

сout « "(оценка должна быть меньше 100 баллов)!\n";

Вложенные операторы "if" выглядят слишком громоздко, поэтому в Си++ реализован еще один способ множественного ветвления - оператор "switch". Он по­зволяет выбрать для выполнения один из нескольких операторов, в зависимости от текущего значения определенной переменной или выражения.

В приведенном выше примере сообщение для печати выбирается в зависимо­сти от значения переменной "total_test_score". Это может быть произвольное целое число в диапазоне от 0 до 100. Диапазон проверяемых значений можно сузить, если учесть, что оценка теста проверяется с точностью до 10-ти баллов. Введем дополни­тельную целочисленную переменную "score_out_of_ten" и присвоим ей значение: score_out_of_ten = total_test_score/10;

Теперь проверку в программе можно сформулировать так: (1) если переменная "score_out_of_ten" равна 0, 1, 2, 3 или 4, то печатать сообщение "Вы не прошли тест. Выучите материал как следует.", (2) если "score_out_of_ten" равна 5, то печатать сообщение "Вы прошли тест со средним результатом." и т.д. В целом оператор "switch" будет выглядеть так:

score_out_of_ten = total_test_score / 10; switch ( score_out_of_ten ) {

case 0 case 1 case 2 case 3 case 4

cout « "Вы не прошли тест. Выучите материал как следует.\n";

break; case 5

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

break; case 6

case 7

55

cout « "Вы хорошо выполнили тест.\n";

break; case 8 : case 9 : case 10 :

cout « "Вы показали отличный результат.\n";

break; default :

cout << "Вы выполнили тест нечестно\n";

сout « "(оценка не должна быть больше 100 баллов)!\n";

Фрагмент программы 3.1.

Оператор "switch" имеет следующий синтаксис:

switch (селектор)

case метка1 : <опера торы1 > break;

case меткаN :

<опера торыN>

break; default :

<опера торы> }

Сделаем несколько важных замечаний относительно оператора "switch":

  • Внутри "switch" выполняются операторы, содержащиеся между меткой,
    совпадающей с текущим значением селектора, и первым встретившимся по­
    сле этой метки оператором "break".

  • Операторы "break" необязательны, но они улучшают читабельность про­
    грамм. С ними сразу видно, где заканчивается каждый вариант множествен­
    ного ветвления. Как только при выполнении операторов внутри "switch"
    встречается "break", то сразу выполняется переход на первый оператор про­
    граммы, расположенный после оператора "switch". Иначе продолжается
    последовательное выполнение операторов внутри "switch".

  • Селектор (переменная или выражение) может быть целочисленного (напри­
    мер, "int" или "char") или любого перечислимого типа, но не веществен­
    ного типа.

  • Вариант "default" ("по умолчанию") необязателен, но для безопасности
    лучше его предусмотреть.

4. Блоки и область видимости переменных

В Си++ фигурные скобки " {}" позволяют оформить составной оператор, кото­рый содержит несколько операторов, но во всех конструкциях языка может подстав-

56

ляться как один оператор. На описания переменных фигурные скобки также оказы­вают важное влияние.

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

Если одно и то же имя используется для переменной внутри и снаружи блока, то это две разных, независимых переменных. При выполнении внутри блока про­грамма по умолчанию полагает, что имя относится к внутренней переменной. Обра­щение к внешней переменной происходит только в том случае, если переменная с та­ким именем не описана внутри блока. Действие этого правила продемонстрировано в программе 4.1.

#include

int integer1 = 1; int integer2 = 2; int integer3 = 3;

int main ()

{

int integer1 = -1; int integer2 = -2;

{

int integer1 = 10;

cout « "integer1 == " « integerl « "\n";

cout « "integer2 == " « integer2 « "\n";

cout « "integer3 == " « integer3 « "\n";

}

cout << "integer1 == " << integer1 << "\n"; cout « "integer2 == " « integer2 « "\n"; cout « "integer3 == " « integer3 « "\n";

return 0; }

Программа 4.1.

Программа 4.1 выводит на экран сообщения:

integer1 == 10

integer2 == -2

integer3 == 3

integer1 == -1

integer2 == -2

integer3 == 3

Применение локальных переменных иногда объясняется экономией памяти, а иногда необходимостью использования в различных частях программы разных пере­менных с одинаковыми именами. См. в качестве примера программу 4.2, которая пе­чатает таблицу умножения для чисел от 1 до 10.

#include

int main ()

{

int number;

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

57

int multiplier;

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

{

cout « number « " x " « multiplier « " = ";

cout << number * multiplier « "\n";

}

cout « "\n"; }

return 0; }

Программа 4.2.

Программу 4.2 можно переписать в более понятном виде с помощью функ­ции (см. программу 4.3).

#include

void print_times_table( int value, int lower, int upper );

int main () {

int number;

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

{

print_times_table( number, 1, 10 ); cout « "\n"; }

return 0; }

void print_times_table ( int value, int lower, int upper ) {

int multiplier;

for ( multiplier = lower; multiplier <= upper; multiplier++ ) {

cout « value « " x " « multiplier « " = "; cout « value * multiplier « "\n"; } }

Программа 4.3.

Далее, программу 4.3 можно усовершенствовать, исключив описания всех пе­ременных из "main ()" и добавив две функции (см. программу 4.4).

#include

void print_tables( int smallest, int largest );

void print_times_table( int value, int lower, int upper );

int main () {

print_tables( 1, 10 );

return 0; }

void print_tables( int smallest, int largest )

58

int number;

for ( number = smallest; number <= largest; number++ )

print_times_table( number, 1, 10 ); cout « "\n";

void print_times_table( int value, int lower, int upper )

int multiplier;

for ( multiplier = lower; multiplier <= upper; multiplier++ )

cout « value « " x " « multiplier « " = "; cout « value * multiplier « "\n"; } }

Программа 4.4.
1   ...   5   6   7   8   9   10   11   12   ...   18

Похожие:

Лекция основы си++ 7 iconЛекция основы Си++ 9
Б73 Основы программирования на языке Си++: Для студентов физико-математических факультетов педагогических институтов. – Коломна:...

Лекция основы си++ 7 iconЛекция I и проблема языка и сознания лекция II 31 слово и его семантическое...
Монография представляет собой изложение курса лекций, про* читанных автором на факультете психологии Московского государственного...

Лекция основы си++ 7 iconЛекция психосексуальное развитие. Возрастная динамика взаимоотношения полов 15
Основы семейной психопедагогики (курс лекций) / В. И. Короткий. — Архангельск: М'арт, 2003. — 178 с

Лекция основы си++ 7 iconЛекция Архитектура 32-разрядных ос windows 7
Б73 Основы программирования на языке Си++: Для студентов физико-математических факультетов педагогических институтов. – Коломна:...

Лекция основы си++ 7 iconЛекция Основные понятия ооп 7
Б73 Основы программирования на языке Си++: Для студентов физико-математических факультетов педагогических институтов. – Коломна:...

Лекция основы си++ 7 iconЛекция №1. Введение. Элементы дифференциальной геометрии. 2
Лекция №5. Множества Жюлиа, множество Мандельброта и их компьютерное представление. 18

Лекция основы си++ 7 iconЛекция на тему: «Современные подходы к содержанию дополнительного образования детей»
...

Лекция основы си++ 7 iconЛекция в Дорнахе 22 мая 1920 года
Канта и протестантизма. Эта лекция вызвала негодование среди членов Лиги, культивировавших и признававших под названием монизма вообще...

Лекция основы си++ 7 iconКурс лекций Лекция Введение в философскую суицидологию. Лекция Общая...
Открыть, в чём состоит суть суицида, наука не в состоянии (по собственной ограниченной природе) и потому должна обращаться за объяснениями...

Лекция основы си++ 7 iconЛекция для слушателей курса «Основы религий»
Я не могу всего этого понять, потому что некоторые пытливые учителя, помню, меня просто одолевали вопросами, где найти, например,...

Литература


При копировании материала укажите ссылку © 2015
контакты
literature-edu.ru
Поиск на сайте

Главная страница  Литература  Доклады  Рефераты  Курсовая работа  Лекции