Мегаобучалка Главная | О нас | Обратная связь


Прекомпиляция и комментарии



2019-11-13 338 Обсуждений (0)
Прекомпиляция и комментарии 0.00 из 5.00 0 оценок




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

Например, описания используемых в программе функций, классов, и т.д. могут содержаться в так называемых заголовочных файлах. Они представляют собой текстовые файлы с расширением . 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 содержит одно целое число – сумму чисел из предыдущего файла

Пример

Ввод Вывод
3  19 7  8  9 1 4  5 56

Решение

При решении нам придётся воспользоваться циклом 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 (будет создан).



2019-11-13 338 Обсуждений (0)
Прекомпиляция и комментарии 0.00 из 5.00 0 оценок









Обсуждение в статье: Прекомпиляция и комментарии

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (338)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)