logo
inf_otvety_24-40

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 или просто уничтожить объект.