34. Передача данных по умолчанию.
В С++ поддерживается возможность задания некоторого числа аргументов по умолчанию. Это означает, что в заголовке функции некоторым параметрам при их описании присваиваются значения. При вызове данной функции число фактических параметров может быть меньше числа формальных параметров. В этом случае принимается умалчиваемое значение соответствующего параметра. Например:
#include "iostream.h"
int sm(int i1, int i2, int i3=0, int i4=0)
{ cout<<i1<<’ ’<<i2<<’ ’<<i3<<’ ’<<i4<<’ ’;
return i1+i2+i3+i4; }
void main()
{ cout <<"сумма = "<< sm(1,2) << endl;
cout <<"сумма = "<< sm(1,2,3) << endl;
cout << "сумма = "<< sm(1,2,3,4) << endl;
}
Результатом работы программы будет:
1 2 0 0 сумма = 3
1 2 3 0 сумма = 6
1 2 3 4 сумма = 10
Описание параметров по умолчанию должно находиться в конце списка формальных параметров (в заголовке функции). Задание параметров по умолчанию может быть выполнено только в прототипе функции или при его отсутствии в заголовке функции.
35. Консольный ввод данных в языке C++.36. Консольный вывод данных в языке C++.
В С++ существует несколько способов консольного ввода и вывода, связанно это с тем, что С++ - это улучшенный С и все эллементы языка С, поддерживаються и в С++. Первый способ - это использование функций таких, как printf() и scanf(), такой принцип унаследован от С и многие считают его устаревшим, посколько его использование мешает полностью оценить достоинства С++. Второй способ – это использование операторов, оператор ввывода – это <<, а оператор ввода - >>, такой способ является более практичным. Примеры:
printf(“Hello world”); //выводим на экран текст Cout << “Hello world”; // аналогично Int a; // объявляем переменную Cin >> a; // присваиваем переменной значение
Для того, что бы ваша программа могла работать с функциями и операторами ввода и ввыдо, необходимо подключить необходимые библиотеки:
#include <stdio.h> //Для функций #include <iostream.h> //Для операторов using namespace std; //Эта инструкция позволяет работать с заголовками старого и нового стиля
Что использовать, операторы или функции – решать вам, я же буду приводить примеры с тем и тем. Итак, давайте сначало поговорим об функциях. Функция printf обеспечивает вывод на экран, функция выглядит так:
printf(Управляющая строка, Список переменных)
Управляющая строка – это способ отображения значения переменных. Список переменных – не являеться обязательным и представляет собой последовательность разделенных собой переменных. Функция puts обеспечивает вывод на экран сообщения. Например:
puts (“Hello world! World hello!\nPcNext.ru! PcNext.ru!”)
Обращаю внимание на то, что символы русского языка будут отображаться в нечитаймой кодировке, мы это исправим чуть позже. Функция scanf позводяет производить ввод с клавиатуры. Давайте напишем первую программу, основонную на функциях ввода и вывода
#include <stdio.h> // Подключаем заголовочный файл void main() { char* a; //Объявляем переменную а printf("Vvedite text:\n"); //Приглашение ввести текст scanf (a); //Вводим текст и присваиваем его на переменную puts(a); //Ввыводим текст с переменной а }
Теперь практически тоже самое мы проделаем уже с оперторами: #include <iostream.h> //Подключаем заголовочный файл для работы с операторами #include <conio.h> //Заголовочный файл для функции getch()
using namespace std;
void main() { float a; //Объявляем переменную а; cout << "Vvedite schiclo:\n"; //Приглашение ввести число cin >>a; //Присваиваем введеное значение на переменную
cout << "Vashe shiclo:\n"; cout << a; //Выводим значение переменной cout << "\nPress key to exit"; getch(); //По нажатию клавиши закрываем приложение }
Давайте разберемся с ввыводом русских букв, которые отбражаются в консоли в DOC’вской кодировке, что для нас неприемлемо. Для началана необходимо преобразовать ANSI-строку в ASCII строку:
char *Rus_simv(char* st)
Rus_simv – это функция, котороя будет отвечать за вывод русских символов. В примере мы будем использовать сразу функцию вывода и оператор:
#include <stdio.h> //для функции вывода #include <iostream.h> // для оператора вывода #include <conio.h> // для функции getch(); using namespace std; char* Rus_simv(char st); //Переводим струку ANSI в ASCII char *Rus_simv(char* st) //Сама функция Rus_simv { unsigned char* p = st; /* При объявлении символов как char русские буквы кодируються отрицательными числами */ while ( *p) { if (*p >= 192) if (*p <= 239) *p -=64; else *p -=16; p++; } return st; }
void main() { //Пробуем вывести русские символы: printf(Rus_simv("Выводим русский текст, используя функцию printf \n")); cout << (Rus_simv("Выводим русский текст, используя оператор << \n\n")); cout << (Rus_simv("Для завершения программы нашмите любую клавишу")) ;
getch(); //по нажатии клавиши завершаем программу }
На самом деле все довольно просто. Сейчас мы добавим в нашу программу вывод системного времени, для этого нам необходимо подключить новый заголовочный файл time.h :
#include <stdio.h> #include <iostream.h> #include <conio.h> #include <time.h>
using namespace std;
char* Rus_simv(char st); char *Rus_simv(char* st) { unsigned char* p = st; while ( *p) { if (*p >= 192) if (*p <= 239) *p -=64; else *p -=16; p++; } return st; }
void time() // Наша функция, отчетная за вывод времяни: { textcolor(RED) ; //Определяем цвет текста textbackground(WHITE); //Определяем фон теста time_t system_time; //Объявляем время system_time = time(NULL); cprintf(Rus_simv("Местное время: ")); cprintf(ctime(&system_time)); //выводим время }
void main() { time(); cout << (Rus_simv("\n\nДля завершения программы щелкни на клавишу")) ; getch(); }
Далее мы поговорим о работе с текстовыми файами и выводом их содержимового на экран.
void file() //Наша функция открывающая файл { FILE *file; //Объявляем переменную типа файл и присваиваем имя file char*filename="c:\\1.txt"; //Объявлем переменную имя файла, эта переменная указавает на путь к файлу char filetext[50]="none"; //Объявляем переменную текст файла.
file = fopen(filename, "r"); /*Открывает файл командой fopen, далее идет путь до файла и режим открытия, у нас это чтение */
if (fopen != 0) //Если удалось отрыть файл { fgets(filetext,120,file); //команда fgets присваивает пременной filetext содержимое файла printf(filetext); } Else //Если файл не возможно открыть { printf("Ошибка окрытия файла"); //Ошибка } fclose(file); //После работы файл необходимо закрыть }
Теперь эту функцию мы вмонтируем в наш пример:
#include <stdio.h> #include <iostream.h> #include <conio.h> #include <time.h> using namespace std; char* Rus_simv(char st); char *Rus_simv(char* st) { unsigned char* p = st; while ( *p) { if (*p >= 192) if (*p <= 239) *p -=64; else *p -=16; p++; } return st; } void file() { FILE *file; char*filename="c:\\1.txt"; char filetext[50]="none"; file = fopen(filename, "r");
if (fopen != 0) { textcolor(RED); textbackground(WHITE); fgets(filetext,420,file); cprintf(Rus_simv(filetext)); } else { printf(Rus_simv("Файл не найден")); } fclose(file); }
void main() { file(); cout << (Rus_simv("\n\nДля завершения программы щелкни на клавишу ")) ; getch(); }
37. Файловый ввод данных в языке C++.38. Файловый вывод данных в языке C++.
Ввод-вывод файлов может выполняться как с помощью стандартных функций библиотеки Си, так и с помощью потоковввода-вывода. Функции библиотеки Си являются функциями низкого уровня, без всякого контроля типов.
Прежде чем перейти к рассмотрению собственно классов, остановимся на том, как осуществляются операции ввода-вывода с файлами. Файл рассматривается как последовательность байтов. Чтение или запись выполняются последовательно. Например, при чтении мы начинаем с начала файла. Предположим, первая операция чтения ввела 4 байта, интерпретированные как целое число. Тогда следующая операция чтения начнет ввод с пятого байта, и так далее до концафайла.
Аналогично происходит запись в файл – по умолчанию первая запись производится в конец имеющегося файла, а все последующие операции записи последовательно пишут данные друг за другом. При операциях чтения-записи говорят, что существует текущая позиция, начиная с которой будет производиться следующая операция.
Большинство файлов обладают возможностью прямого доступа. Это означает, что можно производить операции ввода-вывода не последовательно, а в произвольном порядке: после чтения первых 4-х байтов прочесть с 20 по 30, затем два последних и т.п. При написании программ на языке Си++ возможность прямого доступа обеспечивается тем, что текущую позицию чтения или записи можно установить явно.
В библиотеке Си++ для ввода-вывода файлов существуют классы ofstream (вывод) и ifstream (ввод). Оба они выведены из класса fstream. Сами операции ввода-вывода выполняются так же, как и для других потоков – операции >> и << определены для класса fstream как "ввести" и "вывести" соответствующее значение. Различия заключаются в том, как создаются объекты и как они привязываются к нужным файлам.
При выводе информации в файл первым делом нужно определить, в какой файл будет производиться вывод. Для этого можно использовать конструктор класса ofstream в виде:
ofstream(const char* szName,
int nMode = ios::out,
int nProt = filebuf::openprot);
Первый аргумент – имя выходного файла, и это единственный обязательный аргумент. Второй аргумент задает режим, в котором открывается поток. Этот аргумент – битовое ИЛИ следующих величин:
ios::app | при записи данные добавляются в конец файла, даже если текущая позиция была перед этим перемещена; |
ios::ate | при создании потока текущая позиция помещается в конец файла ; однако, в отличие от режима app, запись ведется в текущую позицию; |
ios::in | поток создается для ввода; если файл уже существует, он сохраняется; |
ios::out | поток создается для вывода (режим по умолчанию); |
ios::trunc | если файл уже существует, его прежнее содержимое уничтожается, и длина файла становится равной нулю; режим действует по умолчанию, если не заданы ios::ate, ios::app или ios::in ; |
ios::binary | ввод-вывод будет происходить в двоичном виде, по умолчанию используется текстовое представление данных. |
Третий аргумент используется только в том случае, если создается новый файл ; он определяет параметры создаваемого файла.
Можно создать поток вывода с помощью стандартного конструктора без аргументов, а позднее выполнить метод open с такими же аргументами, как у предыдущего конструктора:
void open(const char* szName,
int nMode = ios::out,
int nProt = filebuf::openprot);
Только после того, как поток создан и соединен с определенным файлом (либо с помощью конструктора с аргументами, либо с помощью метода open ), можно выполнять вывод. Выводятся данные операцией <<. Кроме того, данные можно вывести с помощью методов write или put:
ostream& write(const char* pch,
int nCount);
ostream& put(char ch);
Метод write выводит указанное количество байтов ( nCount ), расположенных в памяти, начиная с адреса pch. Метод put выводит один байт.
Для того чтобы переместить текущую позицию, используется метод seekp:
ostream& seekp(streamoff off,
ios::seek_dir dir);
Первый аргумент – целое число, смещение позиции в байтах. Второй аргумент определяет, откуда отсчитывается смещение; он может принимать одно из трех значений:
ios::beg | смещение от начала файла |
ios::cur | смещение от текущей позиции |
ios::end | смещение от конца файла |
Сместив текущую позицию, операции вывода продолжаются с нового места файла.
После завершения вывода можно выполнить метод close, который выводит внутренние буферы в файл и отсоединяет поток от файла. То же самое происходит и при уничтожении объекта.
Класс ifstream, осуществляющий ввод из файлов, работает аналогично. При создании объекта типа ifstream в качестве аргумента конструктора можно задать имя существующего файла:
ifstream(const char* szName, int nMode = ios::in,
int nProt = filebuf::openprot);
Можно воспользоваться стандартным конструктором, а подсоединиться к файлу с помощью метода open.
Чтение из файла производится операцией >> или методами read или get:
istream& read(char* pch, int nCount);
istream& get(char& rch);
Метод read вводит указанное количество байтов ( nCount ) в память, начиная с адреса pch. Метод get вводит один байт.
Так же, как и для вывода, текущую позицию ввода можно изменить с помощью метода seekp, а по завершении выполнения операций закрыть файл с помощьюclose или просто уничтожить объект.
- 25. Понятие объекта и класса.
- Определение методов класса
- Переопределение операций
- Подписи методов и необязательные аргументы
- Запись классов
- 26. Скрытие данных и общий интерфейс.
- 27. Конструкторы и деструкторы Инициализация объектов класса: конструкторы
- Основное назначение конструкторов - инициализация объектов.
- Использование конструкторов с аргументами по умолчанию
- Если параметры не передаются конструктору, в определении объекта не нужно включать пустые круглые скобки.
- Использование деструкторов
- Когда вызываются конструкторы и деструкторы.
- 28. Перегрузка классов.
- Перегрузка операторов плюс и минус
- Второй пример
- Операторы, которые Вbl he можете перегрузить
- 29. Дружественные классы.
- 30. Наследование.
- Внутреннее и защищенное наследование
- Виртуальное наследование
- 31. Множественное наследование.
- 32. Полиморфизм.
- 33. Виртуальная функция.
- 34. Передача данных по умолчанию.
- 39. Создание и уничтожение динамических объектов.
- 40. Динамические библиотеки (dll).