Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Создание консольного приложения в среде MS Visual Studio 201xСтр 1 из 4Следующая ⇒
Лабораторная работа № 0
Создание консольного приложения в среде MS Visual Studio 201x
Цель работы: практическое знакомство с методикой создания и отладки консольных приложений средствами языка С++ в среде MS Visual Studio 201x
КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ
1.1. Средства создания консольного приложения в среде MS VS 2010 на языке C++ Консольные приложения – это программы, компилируемые в.exe–файл, который можно запускать на выполнение из командной строки как автономное приложение. Эти приложения работают только в текстовом режиме. Для создания консольного приложения в среде программирования Microsoft Visual Studio 201x можно использовать мастер приложений и шаблон консольного приложения. Мастер приложений вызывается с помощью меню Файл, в котором выбирается пункт Создать, а затем пункт Проект...
Рис. 1. Стартовая страница запуска мастера приложений
Мастер приложений предложит выбрать шаблон приложения в диалоговом окне Создать проект – см. рис. 2.
Рис. 2. Окно выбора типа шаблона
Рассмотрим окно выбора типа шаблона. Помимо шаблона Консольное приложение Win32, мастер предлагает большой список других шаблонов. В этом окне также имеются поля для ввода имени проекта и указания папки, в которой будут записываться файлы проекта. С помощью кнопки Обзор… можно вызвать диалог выбора папки. Переключатель Создать каталог для решения (он размещен под кнопкой Обзор… ) дает возможность создать папку для файлов проекта. Если этот переключатель помечен, будет создана папка с именем проекта. В Visual Studio можно также создавать решения (Solution), содержащие несколько проектов. После нажатия на OK мастер приложений предложит подтвердить установленные параметры – нажатием на кнопку Готово – или продолжить настройку параметров (кнопка Далее> )
Рис. 3. Окно параметров приложения
Нажатие на кнопку Готово (рис. 3)завершает работу мастера приложений и открывает окно с кодом
Рис. 4. Окно кода
(в примере папка имеет имя MyFirstProject). Кроме того, в папке проекта будут созданы файлы проекта – назначение этих файлов описано в файле ReadMe.txt (MyFirstProject\ MyFirstProject\ReadMe.txt). В большинстве консольных приложений потребуется ввод данных с клавиатуры и вывод на экран. Добавление строк #include < iostream> using namespace std; позволит использовать в программе объекты cin для ввода данных и cout – для вывода информации на экран. // MyFirstProject.cpp: определяет точку входа для консольного приложения. // #include " stdafx.h" #include < iostream> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { cout< < " \n MyFirstProject \n"; // вывод строки символов на экран return 0; } Компиляция и запуск программы выполняется с помощью меню Отладка – Запуск без отладки или командой Ctrl+F5. Наиболее оптимальным способом русификации приложений является установка кодовой страницы с помощью функции setlocale(), объявленной в файле locale.h.
#include " stdafx.h" #include < iostream> #include < clocale> using namespace std;
int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_CTYPE, " rus" ); cout< < " \n MyFirst Проект \n"; return 0; } Элементы программирования консольных приложений Тип int (Integer) int value; // 4 байта int i, j; Данное объявление определяет, что переменные value, i и j имеют тип данных int. Это значит, что эти переменные всегда будут содержать целые значения, т.е. целые числа, такие как 3, 5, -77, 0, 24567.
Типы float, double
Типы данных float и double предназначены для хранения чисел с плавающей запятой (с дробной частью). float average; // 4 байта double angle; // 8 байтов
1.2.1.3. Тип char и массивы символов Данные символьного типа (1 байт). char symbol; // 1 байт
Массивы символов char text[ 20 ]; // массив из 20 символов char str[] = “Text string”; wchar_t *wS = new wchar_t[30]; // массив символов Unicode
// инициализация symbol = 56; symbol= 'a'; wS=L”Пример инициализации строки в Unicode”; // инициализация //строки Unicode значением константы – строки Unicode strcpy ( text, " New text" ); // инициализация массива путем копирования strcpy ( text, str );
Указатели
Указатель – это переменная, содержащая адрес другой переменной. Применяя операцию * (операция разыменования ), получаем значение, записанное по данному адресу. С помощью операции &, примененной к переменной, можно узнать адрес, по которому эта переменная хранится в памяти. При объявлении указателя также используется *, кроме того, указывается тип данных, на которые ссылается указатель. Тип_данных *имя_указателя; Пример. Объявление указателей и обращение к памяти. Значение переменной px – адрес памяти, а *px – данные, записанные по адресу px. int x=100; // переменная cout< < " \n x=" < < x; int* px; // указатель на int px = & x; // указателю присвоен адрес переменной x *px =200; /* Изменения значения, записанного по адресу px */ При создании указателя память выделяется только для хранения адреса. Для выделения памяти под данные используется оператор new. Выделение памяти оператором new: указатель = new Тип Оператор new выделяет память в количестве, необходимом для хранения данных указанного типа. Указатель в левой части оператора присваивания должен быть указателем на тот же тип данных. Для динамически размещаемого одномерного массива используется следующая форма оператора new: p=new type [size] Для удаления динамически размещаемого одномерного массива исполь-зуется оператор delete [ ] p; Пример int *p; int i; p = new int [5]; // выделение памяти для 5 целых Указатели и массивы Имя массива является указателем и содержит адрес первого элемента массива. Если, например, w имя массива, то *w – значение первого элемента массива, а обращение w[i] к i-му элементу массива есть сокращенная форма операции с указателями *(w+i). Пример. const int N=10; int w[N]= {0, 10, 20, 30, 40, 50, 60, 70, 80, 90}; // массив из 10 элементов int *v; // указатель v=w+5; cout< < *v; // будет выведено значение 50
1. 2.1.7 Использование объектов класса string (строк) Для того чтобы использовать объекты класса string, необходимо включить соответствующий заголовочный файл: #include < string> Пример строки, представленной объектом типа string и инициализированной строкой символов: #include < string> string st( " Строка-объект\n" ); Длину строки возвращает функция-член size() (длина не включает завершающий нулевой символ). cout < < st.size() < < " символов\n";
Вторая форма определения строки задает пустую строку: string st2; // пустая строка Третья форма конструктора инициализирует объект типа string другим объектом того же типа - строка st3 инициализируется строкой st: string st3( st ); Копирование строк выполняется с помощью обычной операции присваивания: st2 = st3; // копируем st3 в st2 Для конкатенации строк используется операция сложения (+) или операция сложения с присваиванием (+=). Пусть даны две строки: string s1( " hello, " ); string s2( " world\n" ); Можно получить третью строку, состоящую из конкатенации первых двух, таким образом: string s3 = s1 + s2; Чтобы добавить s2 в конец s1, следует написать: s1 += s2; Операция сложения может конкатенировать объекты класса string не только между собой, но и со строками встроенного типа. Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом, а значимые слова – объектами класса string: const char *pc = ", "; string s1( " hello" ); string s2( " world" ); string s3 = s1 + pc + s2 + " \n"; Подобные выражения работают потому, что компилятор знает, как автоматически преобразовывать объекты встроенного типа в объекты класса string. Возможно и простое присваивание встроенной строки объекту string: string s1; const char *pc = " a character array"; s1 = pc; // правильно Обратное преобразование, однако, не работает. Попытка выполнить следующую инициализацию строки встроенного типа вызовет ошибку компиляции: char *str = s1; // ошибка компиляции Чтобы осуществить такое преобразование, необходимо явно вызвать функцию-член с названием c_str(): char *str = s1.c_str(); // почти правильно Функция c_str() возвращает указатель на символьный массив, содержащий строку объекта string в том виде, в каком она находилась бы во встроенном строковом типе. Приведенный выше пример инициализации указателя char *str все еще не совсем корректен. c_str() возвращает указатель на константный массив, чтобы предотвратить возможность непосредственной модификации содержимого объекта через этот указатель, имеющий тип const char * Правильный вариант инициализации массива символов: const char *str = s1.c_str(); // правильно Определение структур
Данные различных типов можно объединить под одним именем с помощью структур. Структуры – это составные типы данных, построенные с использованием других типов. Рассмотрим следующее определение структуры:
struct Person { char name[ 20 ]; char surname[ 20 ]; int age; };
Ключевое слово struct начинает определение структуры. Идентификатор Person – это тег (имя) структуры. Тег структуры используется при объявлении переменных в качестве наименования типа. Имена, объявленные в фигурных скобках, – это элементы (или члены) структуры. Элементы одной и той же структуры должны иметь уникальные имена, но две разные структуры могут содержать элементы с одинаковыми именами. Элементы структуры могут быть любого типа. Каждое определение структуры должно заканчиваться точкой с запятой. Переменные структуры объявляются так же, как и переменные других типов. Person newPerson, personArray[ 10 ], *personPtr; Для доступа к элементам структуры (или класса) используются операции доступа к элементам – операция точка (.) и операция стрелка (-> ). Операция точка обращается к элементу структуры (или класса) по имени переменной объекта. Например, чтобы напечатать значение элемента age структуры newPerson, используется оператор: cout < < newPerson.age < < endl; Для доступа к элементам структуры с помощью указателя используется операция стрелка. Присвоение указателю personPtr на структуру Person значения personPtr = new Person[50]; Присваивание элементу структуры age значения 18 personPtr -> age=18;
Функции Для более эффективного управления кодом используется разделение программы на отдельные логические модули – функции. Модульное программирование предполагает: – объявление функции (создание прототипа), включающее имя функции, тип возвращаемого ею значения и типы формальных параметров функции; – определение функции, включающее заголовок функции и последовательность операторов, реализующих функцию; – вызов функции путем указания ее имени и замены формальных параметров значениями (фактическими параметрами). Пример использования функции. #include < iostream> using namespace std; int sum(int, int); /* Объявление функции sum - прототип */ int main() { int a, b, c; cin > > a > > b; c=sum(a, b); // Вызов функции cout < < " \n sum = " < < c; return 0; } int sum(int a, int b) { // Определение функции return a+b; } Объявление функции
До обработки вызова функции компилятору должно быть известно её имя и типы параметров. Прототип функции является оператором и должен заканчиваться точкой с запятой. В прототипе функции можно не приводить имена параметров, – достаточно указать список типов параметров. Возвращаемый_тип Имя_функции(список типов_параметров);
Можно обойтись и без прототипа функции – если блок определения функции поместить до блока, в котором производится вызов функции.
Пример. Блок определения функции предшествует её вызову, поэтому в программе нет объявления функции (прототипа).
#include < iostream> using namespace std; int sum(int a, int b) { // Определение функции return a+b; } int main() { int a, b, c; cin > > a > > b; c=sum(a, b); // Вызов функции cout < < " \n c = " < < c; return 0; } Использование прототипов позволяет компилятору правильно обрабатывать возвращаемые значения функций, следить за соответствием количества аргументов при вызове функции, корректировать применение типов данных для аргументов функции и пытаться, если это возможно, выполнить приведение типов, в случае несоответствия типов при вызове. Часто прототипы функций помещают в отдельные файлы– заголовочные файлы (эти файлы имеют расширение.h).
Определение функции Определение начинается с заголовка функции. В отличие от прототипа функции, заголовок не должен заканчиваться точкой с запятой. Кроме того, в заголовке обязательно указываются имена параметров. Функция должна содержать хотя бы один оператор return – исключением являются функции, у которых тип возвращаемых значений void. Выполнение оператора return завершает работу функции и возвращает управление в вызывающую программу. Синтаксис оператора return выражение; Для функции с типом возвращения void оператор return необязателен, но его можно использовать завершения работы функции и возврата в вызывающую программу. В этом случае оператор не содержит возвращаемого значения: return; Ссылочные переменные В языке C++ введён новый составной тип данных – ссылочная пере-менная. Ссылка представляет собой имя, которое является псевдонимом для ранее объявленной переменной. Для объявления ссылочной переменной используется символ &. Пример. #include < iostream> using namespace std; int main() { int x; int & r = x; // создание независимой ссылки x = 10; // эти две инструкции r = 10; // идентичны return 0; } Основное назначение ссылок – использование в качестве формальных параметров функций. Используя ссылку в качестве аргумента, функция работает с исходными данными, а не с их копиями. Пример передачи аргументов по ссылке - функция, меняющая значения аргументов #include < iostream> using namespace std; void swapargs (int & x, int & y); int main() { int i, j; i = 10; j = 19; cout < < " i: " < < i < < ", "; cout < < " j: " < < j < < " \n"; swapargs(i, j); cout < < " После перестановки: "; cout < < " i: " < < i < < ", "; cout < < " j: " < < j < < " \n"; return 0; } void swapargs (int & x, int & y) { int t; t = x; x = y; y = t; } Массивы как параметры При передаче массива в качестве параметра нужно: – в заголовке функции после имени массива указать пустые квадратные скобки, например, int sum_arr( int arr[], int size_arr) – а в вызове функции указать имя массива уже без квадратных скобок: sum= sum_arr(mass, N);
Потоковый ввод/вывод
В языке С++ производится ввод-вывод потоков байтов. Поток – это просто последовательность байтов. В операциях ввода байты пересылаются от устройства (например, от клавиатуры, дисковода) в оперативную память. При выводе байты пересылаются из оперативной памяти на устройства (например, на экран дисплея ). Заголовочный файл iostream.h объявляет объекты cin, cout, которые соответствуют стандартным потокам ввода и вывода. < < – операция – поместить в поток; > > – операция – взять из потока; \n – переход на новую строку (так же можно применять манипулятор потока endl, в отличие от ‘\n’ этот манипулятор не только переводит строку, но и выгружает в поток содержимое буфера вывода); Примеры cout < < “Test” < < endl; cout < < “Test \n ”;
1.5. Консольный ввод-вывод средствами языка С, включенными в библиотеку С++
Процесс реализованного в функциях из С-библиотеки форматирования существенно проще, чем форматирование методами ввода и вывода языка С++. Две функции printf() и scanf() и выполняют соответственно консольный вывод и ввод. Этим функциям передается переменное число аргументов, но первым аргументом всегда является текстовая строка, называемой строкой формата. Она задает способ преобразования данных. Эти функции объявлены в файле stdio.h. Функция printf() выдаст на экран всю форматную строку, в которой знак %ххх заменяется символами выводимой информации. Символы после % до первого разделителя рассматриваются как спецификация преобразования значения выводимой переменной. Имя переменной - это второй, третий и т.д. аргументы списка аргументов. Функция scanf() принимает с консоли все символы до нажатия клавиши ENTER и помещает их в буфер. Затем по форматной строке определяется способ преобразования введенных символов в соответствии с заданными спецификация ми. Полученное в результате преобразования число помещается по адресу переменной, который является вторым, третьим и т.д. аргументом в списке аргументов функции. Спецификация преобразования задается в виде последовательности % [флаги] [ширина ] [.точность ] < тип> В таблице перечисляются некоторые из флагов, задающих спецификацию преобразования.
Поле ширина воздействует только на вывод и определяет минимальную ширину поля в n символов. Если после преобразования ширины недостаточно, выводится столько символов, сколько есть. Незаполненные позиции дополняются пробелами. Поле тип преобразования принимает значения с, d, i, o, x, s
1.5.1. Примеры ввода-вывода информации с помощью функций printf() и scanf()
Пример 1. Вывод значений двух переменных целого типа col, nm и одной строковой переменной name
int col=234; int nm=77; char name[10] = " namestr\n";
#include < stdio.h>
{ printf( " %4d %4d %25s", col, nm, name); } Пример 2. Вывод значений двух переменных целого типа col, nm в 16-ричной сс и одной строковой переменной name, значения переменных
printf( " %4x %4x %25s", col, nm, name);
Пример 3. Ввод значений символьной переменной и переменной целого типа int PID; char op; printf( " Введите вид операции и PID процесса: " ); scanf( " %1c %4d", & op, & PID );
Операторы проверки условия Инструкция if Инструкция if обеспечивает выполнение или пропуск инструкции в зависимости от условия Пример. /* сравнение символов */ char ch='\n'; if (ch=='\n') cout < < " \n ch= \\n"; // сравнение целых int n=5; if (n==5) cout< < " \n n = 5"; /* определение диапазона: */ int t=25; if ((t> 10) & & (t< 30)) cout< < " \n 10 < " < < t < < " < 30"; // арифметическое выражение как условие int x; cin> > x; if (x*x) cout< < " \n true "; else cout< < " \n false "; if (x) { // составная инструкция x--; cout< < " \n x= " < < x; } Инструкция if-else содержит уже два оператора, один из которых выполняется. Инструкция if-else Операторы цикла 1.7.1.Инструкция цикла for Общая форма оператора цикла for for (инициализация; условие продолжения; Цикл с постусловием
Цикл с постусловием реализует вариант цикла, в котором сначала выполняется тело цикла и только затем вычисляется условие продолжения цикла. Если значение условия равно нулю (что соответствует false), цикл завершается, если же значение условия отлично от нуля, то снова выполняется тело цикла с последующей проверкой условия. В любом случае, тело цикла выполнится хотя бы один раз. В C/C++ оператор цикла с постусловием имеет вид do Оператор while ( условие продолжения ); Условие продолжение и оператор подчинены тем же правилам, что и аналогичные блоки уже рассмотренных операторов цикла. Работа с файлами Ввод и вывод в файлы Файл представляет собой поток байтов. Каждый файл заканчивается маркером конца файла. Когда файл открывается, ему ставится в соответствие поток. Потоки обеспечивают каналы передачи данных между файлами и программами. В начале выполнения программы автоматически открываются три файла и связанные с ними потоки – это стандартный ввод, стандартный вывод и стандартная ошибка. Открытый файл возвращает указатель на структуру FILE, определенную в stdio.h и содержащую информацию о файле. Пример. Запись в файл. #include < stdio.h> FILE *f; void main() { int i, x; f=fopen(" c: \\result.txt", " w" ); for (i=0; i< 100; i++) { x=i*2; fprintf(f, " %d ", x); } fclose(f); } Оператор FILE *f; Объявляет, что переменная f является указателем на структуру FILE. С каждым файлом необходимо связать отдельную структуру FILE. Открытие файла производится оператором f=fopen(" c: \\result.txt", " w" ); Функция fopen() возвращает указатель на структуру FILE открываемого файла, если же файл невозможно открыть, функция возвращает NULL. В первом параметре функции указывается имя файла (обращаем внимание на двойные слеши в полном имени файла), а второй параметр указывает режим открытия файла (в данном случае, выбран режим w – файл для записи). Оператор fprintf ( f, " %d ", x); записывает данные в файл, на который указывает первый параметр этой функции – переменная f, в остальном функция полностью аналогична функции printf(). После выполнения операций с передачей данных в файл или из файла, необходимо выполнить закрытие файла с помощью оператора fclose(f); в качества аргумента этой функции используется указатель файла.
Режимы открытия файлов r – режим чтения данных из файла; w – режим записи в файл; a – добавление в конец файла (или создание, если файл не обнаружен); r+ – открытие файла для обновления (чтение и запись)
Пример записи в текстовый файл.Замечание. Каталог c: \aa должен существовать.
char *fname=" c: \\aa\\result.txt"; f=fopen(fname, " w" ); if(f == 0) { printf(" не могу открыть файл '%s'", fname); return 0; } for (i=0; i< 10; i++) { x=i*2; fprintf(f, " %10d ", x); } fclose(f);
return 0; }
Чтение из файла Для чтения из файла используется функция fscanf(). Эта функция является аналогом функции scanf(), но с дополнительным параметром – указателем на файл, из которого будет производиться чтение данных. FILE *fp; int n; float x; fscanf(fp, " %d ", & n); fscanf(fp, " %f ", & x);
МЕТОДИКА ВЫПОЛНЕНИЯ
2.1. Базовые задания для всех бригад. 1. Создать консольное приложение. 2. В функции main() созданного приложения объявить переменную типа int и инициализировать ее значением, равным номеру бригады. Объявить массивы символов и инициализировать их фамилиями студентов бригады. 3. Воспользовавшись объектом потокового вывода cout, вывести на экран значения указанной переменной типа int и фамилии студентов. Перейти на новую строку. 4. Повторить вывод, воспользовавшись функцией printf(). 5. В эту же функцию main() вставить строки: int mas[ 3 ] = { 1, 2, 3 }; int mmm[ 3 ] = { 4, 5, 6 }; 6. С помощью функции printf() вывести значения элементов этих массивов на экран. 2.2. Реализовать инициализацию и вывод данных структуры на экран и в текстовый файл - индивидуальное задание для бригад - Таблица 1. Количество элементов структуры равно 5.
Варианты индивидуального задания Таблица 1 Структуры данных и условия отбора записей
2.3.Написать программу, которая выводит на экран и в файл записи созданной структуры данных, удовлетворяющие заданному с клавиатуры значению условия. Имя файла вводить с клавиатуры. Условия отбора приведены в таблице 1. 2.4. Подготовить отчет о работе в соответствии с п.3. 2.5. Распечатать отчет на принтере любого типа 2.6. Готовый отчет представить преподавателю для отметки о выполнении работы Работа считается выполненной, если выполнены все перечисленные выше пункты.
ОТЧЕТ О РАБОТЕ Готовится в письменном виде с помощью доступного текстового процессора. Содержание отчета: 1. Титульный лист с названием работы, ее номером, номером группы, бригады, фамилиями студентов и преподавателей. См. след. страницу. 2. Листинги разработанных приложений командной строки. 3. Результаты, полученные при выполнении индивидуального задания.
КОНТРОЛЬНЫЕ ВОПРОСЫ 1. Порядок создания консольного приложения на языке С++. 2. Пример консольного приложения для вывода на экран строки символов. 3. Русификация приложений. 4. Типы переменных. 5. Объявление и инициализация массивов. 6. Указатели и массивы. 7. Использование объектов класса string 8. Определение структур. 9. Ссылочные переменные 10. Потоковый ввод/вывод 11. Консольный ввод-вывод средствами языка С 12. Вывод строк Unicode 13. Операторы проверки условия 14. Операторы цикла 15. Ввод-вывод в файл
Литература 1. Липачев Е.К. Технология программирования. Базовые конструкции С/C++. Казанский университет. 2012.-142 с. Лабораторная работа № 0
Создание консольного приложения в среде MS Visual Studio 201x
Цель работы: практическое знакомство с методикой создания и отладки консольных приложений средствами языка С++ в среде MS Visual Studio 201x
Популярное:
|
Последнее изменение этой страницы: 2016-05-03; Просмотров: 2716; Нарушение авторского права страницы