ФОРМАТИРОВАННЫЙ ПОТОКОВЫЙ ВВОД-ВЫВОД.

 

В примерах программ рассмотренных выше, использовались операции помещения в поток << , например в стандартный поток вывода cout и операцией извлечения из потока >>, применяемой к стандартному потоку ввода cin. Для того, чтобы сделать потоковый ввод-вывод форматированным можно использовать функции width и precision.

Функция width задает ширину поля вывода. Общая форма ее использования с потоком cout :

cout. width (n) где n- ширина поля вывода, то есть количество позиций для вывода числа.

 

После каждого использования вывода значение ширины поля отбрасывается, так что перед каждым выводом нужно устанавливать ее заново. Если выводимое число оказывается меньше отведенного поля, то поле заполняется слева пробелами по умолчанию. Изменить символ-заполнитель позволяет функция fill() Общий вид вызова которой:

cout.fill('символ-заполнитель');

Функция precision() определяет количество значащих цифр для чисел с плавающей точкой. Общая форма ее использования с потоком cout :

cout.precision (m) где m – количество значащих цифр (десятичная точка не учитывается). Результат вычислений округляется. В отличие от функции width назначенное значение функции precision не отбрасывается после каждого вывода и сохраняет свое значение до следующего использования. Поэтому несколько операций вывода могут использовать одну и ту же назначенную точность.

 

Пример:

 

#include <iostream.h>

main()

{

int i;

float j;

double k;

i=45;

k=3;

j=7.56778;

cout<<" i"<<i<<" j"<<j<<" k"<<k;

cout<<"n";

cout.fill('*');

//По умолчанию символом-заполнителем является пробел. Изменить

//данное значение позволяет функция fill:

//сохраняет свое значение для всех cout пока не будет переопределена

cout.width(3);cout<<i; //нужно ставить перед каждым cout

cout.fill(' ');

cout.width(3);cout<<k;

//если число больше заданного поля, то оно выводится целиком

cout<<"n";

cout.precision(4);cout<<j;

k=i/j;

cout<<"n";

cout<<k;

cout<<"n";

}

 


Ответы к заданиям для самоконтроля:

 

Глава 1 задание 1:

Написать программу выполняющую операции с комплексными числами сложение, вычитание, умножение, деление (+,-,*,/)

 

Возможный текст программы выполняющей арифметические действия с комплексными числами:

#include<iostream.h>

#include<math.h>

class komplex

{

// начало определения класса komplex

public:

float a2,b2,a1,b1,otva,otvb;

char sign;

void input(void)

{

cout<<"nBвeдитe вещественную часть a- пepвoгo чиcлa ";

cin>>a1;

cout<<"Bвeдитe мнимую часть b- пepвoгo чиcлa ";

cin>>b1;

cout<<"Bвeдитe вещественную часть a- втopoгo чиcлa ";

cin>>a2;

cout<<"Bвeдитe мнимую часть b- втopoгo чиcлa ";

cin>>b2;

cout<<"Bвeдитe знaк oпepaции ";

cin>>sign;

}

void vivod(void)

{

if(otvb>0)sign='+'; else sign=' ';

cout<<otva<<sign<<otvb<<'i';

}

void plus_m(void)

{

if(sign=='-')

{

a2=a2*(-1);

b2=b2*(-1);

cout<<"Paзнocть двyx кoмплeкcныx чиceл paвнa ";

}else

cout<<"Cyммa двyx кoмплeкcныx чиceл paвнa ";

otva=a1+a2;

otvb=b1+b2;


vivod();

}


ch()

{

otva=a1*a2-b1*b2;

otvb=a1*b2+b1*a2;

if(sign=='*')

cout<<"Пpoизвeдeниe двyx кoмплeкcныx чиceл paвнo ";

else

{

otva=(a1*a2+b1*b2)/(pow(a2,2)+pow(b2,2));

otvb= (a2*b1-a1*b2)/(pow(a2,2)+pow(b2,2));

cout<<"Чacтнoe двyx кoмплeкcныx чиceл paвнo ";

}

vivod();

}

};// конец определения класса komplex

main()

{

komplex kom;

kom.input(); // вызов функции ввода, принадлежащей классу komplex

switch (kom.sign) // Переменная класса komplex

{

case '+':

case '-':kom.plus_m();break;

case '*':

case '/':kom.ch();break;

}

}

 

Глава 2 задание 1:

 

В результате работы приведенной программы будет выведено:

 

min 1=3

min 2=5

min 3=7

min 4=7

так как цикл выполнится 4 раза после выполнения подстановки строка присваивания должна вычисляться как: rslt=((++num1)<(num2)?(++num1): (num2));

Переменная num1 увеличивается на единицу дважды: один раз при выполнении сравнения и второй раз при вычислении результата условной операции.

 


Глава 4 задание 1:

 

В результате работы приведенной программы выведется:

7 и 4= 4

7 или 4= 7

7 исключающее или 4= 3

4 сдвиг влево на 2 = 16

7 сдвиг вправо на 2 = 1

4 сдвиг влево на 5 = -128

4 сдвиг влево на 6 = 0

kk=ii<<5;//бит знака равен 1 поэтому получаем -128

kk=ii<<6;//1 ушла за пределы байта

 

Глава 5 задание 1:

 

Написать программу и создать ее в файле под именем prim.exe

используя аргументы функции main составить программу так, чтобы в результате выполнения следующей команды в командной строке

>prim вы справились

на экран вывелось сообщение :

хорошо! вы справились с заданием.

 

Текст программы может быть следующим:

// файл prim.exe

#include <iostream.h>

#include <stdlib.h>

main(int argc, char *argv[])

{

int i,j,k;

//при запуске без аргументов передается 1 параметр

if (argc<2) cout<<"вы забыли набрать аргумент";

else

{

cout<<"n Хорошо! "; //в нулевом аргументе argv[0] хранится полное имя файла for(i=1;i<=argc;i++)

cout<<argv[i]<<" ";

cout<<” с заданием”;

}

}

 



Глава 6 задание 1:

 

Программа выдаст следующий результат:

di= 1

di= 1.5

di= 2.33333

di= 4.25

di= 5.6

 


Глава 7 задание 1:

 

Приведенная программа выдаст следующий результат:

 

начальные значения переменных: i=10 c=A x=10.2

значения после вызова функций: i=11 c=B x=11.2

 

Глава 7 задание 2:

Составьте программу, в которой функция с одним и тем же названием могла бы выполнять операцию сложения для различных типов данных.

Возможный текст программы:

 

#include <iostream.h>

#include <string.h>

void summ(int &i, int &j)

{

i=i+j;

}

void summ(double &x, double &y)

{

x=x+y;

}

void summ(char *c,char *a)

{

strcat(c,a);/*функция слияния двух строк добавляет к содержимому первой строки содержимое второй строки. Возвращает указатель на первую строку. Функция предполагает, что первая строка достаточного размера чтобы вместить результат слияния/

}


main()

{

char c[15]="WIN",a[]="DOW"; int i=10,j=11; double x=10.2,y=14.45;

cout<<"n начальные значения переменных:";

cout<<" i="<<i; cout<<" c="<<c; cout<<" x="<<x;


summ(i,j); // Вызов функции для сложения величин целого типа

summ(c,a); // Вызов функции для сложения величин вещественного типа

summ(x,y); // Вызов функции для сложения величин символьного типа

cout<<"n значения после вызова функций:";


cout<<" i="<<i; cout<<" c="<<c; cout<<" x="<<x;

}

 


Результат выполнения программы:

начальные значения переменных: i=10 c=WIN x=10.2

значения после вызова функций: i=21 c=WINDOW x=24.65

 


В тексте программы использована функция для работы со строками strcat() – конкатенация, означающая последовательное присоединение строк друг другу. (прототип находится в string.h) Результатом ее применения в следующем примере:

char str[80]="Borland ";

strcat(str," C++");

cout<<"n"<<str;

будет вывод:

Borland C++

Если из присоединяемой строки нужно взять только несколько символов, а не всю строку целиком, можно использовать функцию strncat() той же библиотеки, которая третьим параметром принимает количество символов из присоединяемой строки. Например результатом работы следующей функции:

char c[15]="WIN",b[]="CHESTERTON";

strncat(c,b,7); /* Значение третьего параметра 7, значит из второй строки будут взяты только 7 первых символов */

cout<<c;

Вывод будет таким:

WINCHESTER

 


Глава 8 задание 1.

 

Напишите программу, перемножающую произвольное число переменных, применяя функцию с переменным числом параметров.

 

Возможный текст программы:

 

#include <iostream.h>

long Proiz(int n, ...);

void main (void)

{

long PR;

PR = Proiz(5, 1, 2, 3, 4, 5 );

/* Вызвали функцию с 6 параметрами. Единственный обязательный параметр (первый в списке) определяет количество передаваемых параметров. */

cout << PR << endl;

}

long Proiz(int n ...)//запятую в списке параметров можно опустить

{

int *p = &n;

// область памяти с параметрами...

int P= 1;

for (int i=1 ; i<=n; i++) P*=*(p+i);

return P;

}