Прекомпиляция и комментарии
Перед компиляцией программы ее исходный текст подвергается предварительной обработке - прекомпиляции. Прекомпилятор (он же препроцессор) просматривает текст файла, находит строки, которые начинаются с символа #. Такие строки называются директивами препроцессора. Например, описания используемых в программе функций, классов, и т.д. могут содержаться в так называемых заголовочных файлах. Они представляют собой текстовые файлы с расширением . h (h от англ. header–заголовок). Директива прекомпилятора #include заменяет строку текстом из указанного в ней заголовочного файла. Если препроцессор должен искать этот файл в подкаталоге include среды разработки (например, iostream.h с описанием потоковых операций ввода/вывода), то его имя берётся в угловые скобки, а если в текущем каталоге - там же, где исходный текст программы (например, собственный заголовочный файл myheader.h), то его название пишется в кавычках. #include <iostream> #include "myheader.h" Кроме вставки в текст содержимого включаемых файлов, препроцессор совершает и другие действия. Пусть в тексте программы несколько раз встречается число 143.9. Вместо многократной записи значения этого числа, можно дать ему название с помощью директивы # define, а затем это название использовать: #define NUMBER143.9 В дальнейшем препроцессор заменит при компиляции все встреченные в программе обозначения NUMBER на 143.9 Кроме директив препроцессора в программе могут быть ещё фрагменты, не обрабатываемые компилятором, но используемые для улучшения читабельности кода. Комментарий – это последовательность символов, которая игнорируется компилятором. Комментарий в C++ имеет следующий вид: /*<символы>*/. Комментарии могут занимать несколько строк, но не могут быть вложенными. Кроме того, часть строки, следующая за символами //, также рассматривается как комментарий. Кое-что о функции main При создании проекта, в его исходных файлах можно найти главный файл main.cpp, в котором обязательно присутствует стандартная оболочка головной функции main. int main(int argc, char** argv) {
return 0; } Программы при выполнении могут получать данные через параметры командной строки. Так, например, при запуске команды для проверки соединений в сетях ping, мы передаём в неё два параметра – адрес ресурса ya.ru и параметр –t, определяющий, что пакеты будут отправляться на указанный узел до команды прерывания. Рис. 5 Передача параметров через командную строку Любая программа при завершении своей работы возвращает операционной системе код своего завершения. Принято при успешном завершении возвращать ноль, иначе - код ошибки. Иногда программа "сознательно" возвращает ненулевое значение для того, чтобы можно было "узнать" некоторые подробности ее работы. В этой оболочке предусмотрена возможность использования параметров командной строки – количества параметров argc и массива со списком имен параметров argv[]. Так как тип функции объявлен как int, то в заготовке предусмотрен оператор возврата с признаком нормального завершения приложения return 0. Так в вышеприведенном примере параметр argc принял бы значение 2, argv[0] значение “ya.ru”, argv[1]значение “-t”. ВАЖНО: Стандарт C++ требует, чтобы функция main() возвращала тип int. Программа, которая имеет другой тип возвращаемого значения функции main(), не соответствует стандарту C++. При этом, если в main() явно не указать return 0, то при завершении программы в систему будет возвращено значение 0. Для всех других функций, кроме main(), с типом значения int отсутствие значения вызовет ошибку. Пространство имён Идентификатор – это уникальное имя объекта. Пространство имён (англ. namespace) — абстрактное хранилище, созданное для уникальных идентификаторов (имён). std–стандартное пространство имен в C++. Для его использования нужно прописать перед первым вызовом любого из его идентификаторов: using namespace std; Если его не подключить, то придётся для его идентификаторов, например, таких как cin и cout, описанных в следующей главе, каждый раз применять синтаксис std::cin и std::cout. Это несколько затрудняет читабельность кода, особенно при частом использовании cin и cout. Если при этом подключить std нельзя, а нужно использовать другое пространство имён, то можно вместо всего пространства имен подключать отдельные функции. using std::cout; using std::cin; После этого допускается использование обычной формы синтаксиса cin и cout. ВАЖНО: Ряд слов в языке C++ имеет особое значение и не может использоваться в качестве идентификаторов. Такие зарезервированные слова называются ключевыми. Например, вместо использования логического оператора && (логическое И) допускается ключевое слово and. Ввод и вывод данных Меня два раза спрашивали [члены Парламента]: «Скажите на милость, мистер Бэббидж, что случится, если вы введете в машину неверные цифры? Cможем ли мы получить правильный ответ?» Я не могу себе даже представить, какая путаница в голове может привести к подобному вопросу. Чарльз Бэббидж В данной главе рассматривается несколько разных способов, при помощи которых программа может считать данные по условию задачи и вывести ответ. Обратите внимание, при подготовке к олимпиадам обязательно нужно следовать оговоренным в условии задачи форматам входных и выходных данных. Решения участников проверяются с помощью автоматизированной системы и нарушение указанных форматов, вывод лишних символов и т.д. может привести к неудачному прохождению теста при правильном алгоритме. Консольный ввод/вывод В языке С++ нет встроенных средств ввода/вывода — он осуществляется с помощью функций, типов и объектов, содержащихся в стандартных библиотеках. Используется два способа: объекты С++ и функции, унаследованные из языка С. Система ввода/вывода языка Си поддерживает интерфейс, не зависящий от того, какое в действительности используется физическое устройство ввода/вывода, то есть абстрактный уровень между программистом и физическим устройством. Эта абстракция называется потоком. Пример программы с использованием библиотеки классов С++: #include <iostream> using namespace std; int main() { int i; cout << "Введите целое число" << endl; cin >> i; cout << "Вы ввели число " << i << ", спасибо!"; return 0; } Заголовочный файл iostream.h содержит описание набора классов для управления вводом/выводом. В нем определены стандартные объекты – потоки cin для ввода с клавиатуры и cout для вывода на экран, а также операции помещения в поток << и чтения из потока >>. Основные функции ввода/вывода в стиле С: int scanf (const char* format, ... ) // ввод int printf(const char* format, ... ) // вывод Они выполняют форматированный ввод и вывод произвольного количества величин в соответствии со строкой формата format. Строка формата содержит символы, которые при выводе копируются в поток (на экран) или запрашиваются из потока (с клавиатуры) при вводе, и спецификации преобразования, начинающиеся со знака %, которые при вводе и выводе заменяются конкретными величинами. Так выглядит та же программа, использующая функции ввода/вывода в стиле С: #include <cstdio> int main() { int i; printf("Введите целое число\n"); scanf("%d", &i); printf("Вы ввели число %d, спасибо!", i); return 0; } Первая строка этой программы — директива препроцессора, по которой в текст программы вставляется заголовочный файл, содержащий описание использованных в программе функций ввода/вывода. Функция printf в четвертой строке выводит приглашение «Введите целое число» и переходит на новую строку в соответствии с управляющей последовательностью \n. Функция scanf заносит введенное с клавиатуры целое число в переменную i (знак & означает операцию получения адреса), а следующий оператор выводит на экран указанную в нем строку, заменив спецификацию преобразования значением этого числа. Можно использовать оба способа организации ввода/вывода, но в одной программе смешивать их не рекомендуется. В тех случаях, когда требуется вывести кавычку, нужно её отобразить как управляющую последовательность, поставив перед ней символ \. Для вывода самого символа \ достаточно его продублировать. Например, фрагмент программы cout << "\"ABC\" \\abcd\n" << '\'' << '\\'; выведет "ABC" \abcd '\ ВАЖНО: Постарайтесь для себя выбрать наиболее удобный способ ввода и вывода, который при решении задач нужно отработать до автоматизма. При этом помните, что потоковые операции работают медленнее, чем printf и scanf, однако более понятны интуитивно при использовании, а также их можно перегружать для собственных типов данных. Эта тема затрагивается в главе «Классы». Если вы участвуете в командном турнире, крайне желательно, чтобы участники команды использовали одинаковые способы ввода/вывода. ВАЖНО: Любая программа на языке C должна компилироваться компилятором с языка C++. Это позволяет заимствовать технологии и библиотеки из языка C в язык C++, хотя, чаще всего, такое заимствование не является рекомендуемым. Чтобы смягчить некоторые проблемы такого заимствования, в стандартную библиотеку языка C++ включены переработанные варианты заголовочных файлов из стандартной библиотеки языка C. Чтобы различать эти версии, используется некоторое формальное правило об изменении имени заголовочного файла. Во-первых, согласно правилам языка C++, заголовочные файлы стандартной библиотеки не имеют в своем имени суффикс .h. Во-вторых, к имени адаптированных файлов добавляется префикс из литеры c. В результате, например, stdio.h превращается в cstdio, а stdlib.h превращается в cstdlib и т.д. Работа с файлами Работа с файлами в C/C++ предусматривает использование двух различных типов файлов: текстовых и двоичных. В данной книге рассматриваются только текстовые файлы, которые применяются при даче олимпиадных задач по программированию. 3.2.1 Работа с файлами C++ Работе с файлами с использованием синтаксиса C++ аналогична применению стандартных потоков cin и cout. Однако вместо iostream необходимо подключить файловые описания и операции fstream. Затем нужно связать потоки с файлами на диске. #include <fstream> using namespace std; int main(int argc, char* argv[]){ ifstream fin("input.txt"); // создаём потоки fin и fout ofstream fout("output.txt"); // и связываем их с файлами int a, b; fin >> a >> b; fout << "sum result " << a + b << endl; // запись ответа в файл fout.close(); // закрываем файл return 0; } Данная программа будет искать в каталоге своего проекта файл с именем input.txt. Если файл не найден, то будет выведено сообщение об ошибке. Создадим такой файл и запишем в него два произвольных целых числа. 2 3 Программа создаст в текущем каталоге файл output.txt. Если такой файл уже существует, он будет перезаписан. В данный файл программа выведет результат вида: sum result 5 Задача №1. Сумма чисел в файле В текстовый файл записано некоторое заранее не известное количество целых чисел, разделённых между собой пробелами или переводом строки. Вывести в другой текстовый файл сумму всех этих чисел. Входные данные Текстовый файл input.txt содержит некоторое заранее не количество целых чисел. Выходные данные Текстовый файл output.txt содержит одно целое число – сумму чисел из предыдущего файла Пример
Решение При решении нам придётся воспользоваться циклом while (пока), с которым мы познакомимся в дальнейшем в главе «Циклы». Однако в данной задаче его синтаксис и алгоритмический смысл совершенно очевиден: «Пока возможно читать целое xиз потока fin, добавляя его к сумме sum» #include <fstream> using namespace std; int main(){ ifstream fin("input.txt"); ofstream fout("output.txt"); int sum = 0, x; while(fin >> x) sum += x; fout << sum; } ВАЖНО: При проверке ваших решений на олимпиаде ни в коем случае не прописывайте пути к файлам в ifstream и ofstream. Проверяющая система на сервере поместит файлы тестов в ту папку, где будет компилироваться ваш проект. В тех размещениях, где вы хранили тестовые файлы у себя на компьютере, естественно, ничего не окажется, и программа получит 0 баллов за прохождение тестов. Кроме того, вы можете переопределить потоки ввода и вывода. Например, если программа тестировалась на вашем компьютере со стандартными потоками, а для сдачи жюри олимпиады нужно её переделать под файловый ввод/вывод, то достаточно подключить fstream и связать cin и cout с файлами. Работа с файлами в C Работа с файлами средствами C может быть реализована при помощи стандартной библиотеки ввода/вывода stdio.h или её более позднего аналога cstdio, переработанного под C++. Рассмотрим это на примере. #include <cstdio> int main() { freopen("input.txt", "r", stdin); // открыть для чтения freopen("output.txt", "w", stdout); // открыть для записи int a, b; scanf("%d%d", &a, &b); // прочитать данные printf("sum result %d", a + b); // вывести результат return 0; } Эта программа считывает два числа из файла input.txt (должен существовать) и записывает их сумму в файл output.txt (будет создан).
Популярное: Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (338)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |