План первого занятия
Мы будем работать в среде VisualStudio.
Для себя вы можете скачать на сайте MicrosoftсредуVisualStudioExpress2010 (а не 2013!). Вам будет предлагаться русская версия. Не соглашайтесь, и выбирайте английскую.
1. В этой среде основное понятие – проект. Он объединяет код, формы для ввода, пиктограммы и многое другое. В этом году мы будем создавать только консольные приложения. Они включают в себя (в качестве исходных) текстовые файлы с расширениями .c(код) и .h(заголовочные файлы). Сначала мы будем создавать только код и только в одном файле. А заголовочные файлы будем использовать только стандартные (поставляемые с системой).
Не отступим от традиции и напишем программу, которая выдаёт на экран приветствие “Hello,world!”.
Первый проект – приветствие
2. Шаги по созданию проекта
1) File → New→Project.
Выбираем тип проекта VisualC++ →Win32. Выбираем шаблон Win32 Console Applicaton.
Задаём имя hello
Задаём расположение. Изначально предлагается место где-то в глубинах VisualStudio. Это неудобно. ЗадаёмC:\projects(или в ДК на МПR:\projects?). Если такой папки не существует, то она будет создана.
Итак, мы задали тип проекта, его имя и расположение. Щёлкаем OK.
2) Открывается окно Мастера консольных приложений Win32ApplicationWizard. ЩёлкаемNext. Предлагается предкомпилированный заголовок (Precompiledheader). Но мы хотим делать программы, которые годятся и дляUnix. Поэтому выбираем пустой проект (Empty project). Finish.
Проект существует. Нужно его наполнить.
3) Программы на языке Си у нас нет.
Project→AddNewItem
Выбираем категорию Code, шаблонC++File(.cpp).
Задаём имя файла greeting.c. Расширение задавать обязательно. Иначе вы получите по умолчанию .cpp!
Мы получаем окно для ввода текста в файл greeting.c
4) Настройка редактора
Tools → Options → Text Editor (раскрыть) → C/C++ → Tabs. Выбрать Smart Tabs, Tab Size 2 (по умолчанию 4),Indent Size 2 (по умолчанию 4), Insert spaces.
Эти настройки делаются один раз, при последующих сессиях будут использованы именно эти настройки.
5) Набираем текст программы
#include <stdio.h>
Int main() {
puts("Hello, world!");
return 0;
}
Сначала препроцессору (на это указывает # в первой позиции) даётся команда: включить в текст нашей программы содержимого заголовочного файлаstdio.h. Этот файл содержит прототипы стандартных функций ввода/вывода (standard input/otput). Зачем? Увидим дальше, при выполнении упраженений. Нельзя говорить, что этой инструкцией подключется стандартная библиотека. Она подключается всегда!
Далее описывается главная (main) функция. Она возвращает целое число (int) в операционную систему. В нашем примере возвращается 0 (return 0;). Это число могут анализировать командные файлы и в зависимости от его значения принимать решение о вызове других программ. Обычно 0 означет нормальное завершение, а ненулевое число свидетельствет об аномалих в работе программы (например, программа должна открыть файл для чтения, а файла на диске нет). Функция main должна присутствовать всегда. С неё начинается выполнение программы.
Единственная содержательная строка в нашей простейшей программы, вызов функции puts (put string – вывести строку). Эта функция стнадартной библиотеки. Она выводит на экран строку и осуществляет переход на новую строку.
6) Этапы обработки программы: препроцессорная обработка (выполняются директивы, которые начинаются с #), компиляция – compiling (получение объектного файла greeting.obj), компоновка – linking (в частности, присоединение кода библиотечных функций, в нашем случае puts). В результате получаем hello.exe.
Build →Buildhello(Можно иBuild →BuildSolution, т.к. наше «решение» состоит из одного проекта).
Появляется сообщение
------ Build started: Project: hello, Configuration: Debug Win32 ------
Compiling...
greeting.c
Compiling manifest to resources...
Linking...
Embedding manifest...
Build log was saved at "file://d:\projects\hello\hello\Debug\BuildLog.htm"
hello - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
В нашем случае нет ни ошибок, ни предупреждений.
7) Запуск программы на выполнение
Debug → Start Without Debugging
Появляется консольноеокно. В нём
Hello, world!
Для продолжения нажмите любую клавишу . . .
3. Как делать копииэкранов для отчёта
Установить мышь на заголовке консольного окна.
Нажать правую кнопку мыши.
Появляется контекстное меню.
Выбираем Изменить → Пометить
Красим мышью и нажимаем Enter (вывод помешается в буфер)
Вставляем в документ Word(Ctrl+V).
4. Понимание роли заголовочногофайла.
Выполним серию заданий
1) Закомментируем первуюстроку программы
//#include <stdio.h>
Build → Build hello. Можно коротко F7.
----- Build started: Project: hello, Configuration: Debug Win32 ------
Compiling...
greeting.c
d:\projects\hello\hello\greeting.c(5) : warning C4013: 'puts' undefined; assuming extern returning int
Linking...
Embedding manifest...
Build log was saved at "file://d:\projects\hello\hello\Debug\BuildLog.htm"
hello - 0 error(s), 1 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
Мы получили предупреждение: функцияputsне определена. Всё равно запускаем программу
Debug →StartWithoutDebugging. Можно короткоCtrl+F5.
Программа работает правильно. Вывод: и при отсутствии заголовочного файла стандартная библиотека подключается.
2) Сделаем ошибку: вызовем putsс двумя аргументами
puts("Hello", "world!");
Сообщения при компиляции те же. Но выводится только первое слово. Это ошибка!
3) Вернём строку#include <stdio.h>(снимем символ комментария – два слэша)
warning C4020: 'puts' : too many actual parameters
слишком много аргументов.
Как компилятор узнал об этом? Для этого надо в папке Includeнайти файлstdio.hи посмотреть его содержимое. Но мы поступим проще: поставим курсор на вызов функцииputsи нажмём правую кнопку мыши. Выберем пункт контекстного менюGotodefinition. В отдельной вкладке открывается файлstdio.h. Мы видим прототип функцииputs.
_CRTIMP __checkReturn_opt int __cdecl puts(__in_z const char * _Str);
Даже не будем пытаться понять, что означают элементы этой строки. Главное, мы видим, что у функции putsдолжен быть всего один аргумент. Поэтому компилятор выдал предупреждение.
4. Как выводить русскиесообщения
1) Попробуем вывести на экран русский текст
puts("Привет!");
на экране:
╧ЁштхЄ!
Только восклицательныйзнак выводится правильно.
Научное объяснение такое. При вводе текста программы используется кодировкаcp1251 (Windows), а при выводе на экран кодировкаcp866 (MSDOS). Английские буквы там кодируются одинаково, а русские – нет.
2) Первое решение: перенаправлениевывода в файл
Project → hello Properties, раскрыть Configuration Properties → Debugging → Command Arguments. Вводим >out.txt. Символ > означает перенаправление вывода на экран в файл. Имя файла, разумеется, любое. Расширение .txt.
F7, Ctrl+F5
File→Open→File. Выбираем в окнеout.txt. В файле всё отображается
Но это решение не подходит для программ, которые проводят диалог с пользователем.
Уберём перенаправление вывода в файл.
3) Использование локализации
#include <stdio.h>
#include <locale.h>