Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ИС / Лабораторные работы / Лабораторная работа#1

.pdf
Скачиваний:
71
Добавлен:
22.03.2015
Размер:
336.2 Кб
Скачать

Лабораторная работа № 1

Организация ввода-вывода значений стандартных типов данных в языках C и C++

Цель занятия

1.Освоение простейшей структуры программы.

2.Получение навыков в организации ввода-вывода значений стандартных типов данных

3.Приобретение навыков в записи выражений на языках C/C++ и использовании стандартных функций.

Постановка задачи

1. Написать на языке C/C++ программу ввода/вывода стандартных данных.

Содержание отчета

1.Постановка задачи для конкретного варианта.

2.Алгоритм решения задачи.

3.Текст программы и результаты ее выполнения.

Методические указания

В языке C++ производится ввод-вывод потоков байтов. Поток - это просто последовательность байтов. В операциях ввода байты пересылаются от устройства (например, от клавиатуры, дисковода или соединения сети) в оперативную память. При выводе байты пересылаются из оперативной памяти на устройства (например, на экран дисплея, принтер, дисковод или в соединение сети).

Язык C++ предоставляет возможности для ввода-вывода, как на «низком», так и на «высоком» уровнях. Ввод-вывод на низком уровне (т.е. неформатированный ввод-вывод) обычно сводится к тому, что некоторое число байтов данных просто следует переслать от устройства в память или из памяти в устройство. При такой пересылке каждый байт является самостоятельным элементом данных. Передача на низком уровне позволяет осуществлять пересылку больших по объему потоков ввода-вывода с высокой скоростью, но такая передача обычно неудобна для программиста.

Программисты предпочитают иметь дело с представлением операций ввода-вывода на высоком уровне, т.е. с форматированным вводом-выводом, при котором байты группируются в такие значащие элементы данных, как, например, целые числа, числа с плавающей запятой, символы, строки, а также данные типов, определенных пользователем. Такие ориентированные на типы возможности более удобны для большинства операций ввода-вывода, кроме обработки файлов очень большого объема.

Классы и объекты потоков ввода-вывода

Библиотека iostream содержит много классов для обработки широкого спектра операций вводавывода. Класс istream поддерживает операции по вводу потоков. Класс ostream поддерживает операции по выводу потоков. Класс iostream поддерживает оба типа операций: и ввод и вывод потоков.

Перегрузка операций обеспечивает удобную запись операций ввода-вывода. Операция сдвига влево (<<) перегружена для обозначения вывода в поток и называется операцией поместить в поток. Операция сдвига вправо (>>) перегружена для обозначения ввода потока и называется операцией взять из потока. Эти операции применяются к объектам стандартных потоков cin, cout, cerr и clog и обычно используются также с объектами потоков, тип которых определен пользователем.

Объект стандартного потока ввода cin класса istream, как принято говорить, «привязан» (или «присоединен») к стандартному устройству ввода, обычно к клавиатуре.

Объект стандартного потока вывода cout класса ostream, как принято говорить, «привязан» к стандартному устройству вывода, обычно к экрану дисплея.

Объект cerr класса ostream «привязан» к стандартному устройству вывода сообщений об ошибках. Выводимые потоки данных для объекта cerr являются небуферизованными. Это означает, что каждая операция поместить в cerr приводит к мгновенному появлению выводимых сообщений об ошибках; в этих случаях пользователь своевременно и должным образом информируется о неполадках в системе.

Объект clog класса ostream «привязан» тоже к стандартному устройству вывода сообщений об ошибках. Выводимые потоки данных для объекта clog являются буферизованными. Это означает, что каждая операция поместить в clog может приводить к тому, что вывод хранится в буфере до тех пор, пока буфер полностью не заполнится или пока содержимое буфера не будет выведено принудительно.

Вывод данных.

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

//Вывод строки операцией поместить в поток

# include <iostream.h> main ( )

{

cout << "Добро пожаловать в мир C++!\n"; return 0;

}

//Вывод строки двумя операциями поместить в поток

#include <iostream.h> main( )

{

cout << "Добро пожаловать в "; cout << "мир C++ !\n"; return 0;

}

Переход на новую строку, осуществленный в этих программах с помощью управляющей последовательности \n, можно осуществить и с помощью манипулятора потока endl (end line – конец строки). Манипулятор потока endl вызывает переход на новую строку и кроме того приводит к сбросу буфера вывода (т.е. заставляет буфер немедленно вывести данные, даже если он полностью не заполнен). Сброс буфера вывода может быть также выполнен оператором: cout << flush;

// Использование манипулятора потока endl

# include <iostream.h> main ( )

{

cout << "Добро пожаловать в "; cout << "мир C++!";

cout << endl; // манипулятор потока конец строки return 0;

}

// Вывод значения выражения

#include <iostream.h> main ( )

{

cout << "47 плюс 53 равняется "; cout <<(47 + 53); // выражение cout << endl;

return 0;

}

Вывод данных языке ANSI C выполняется при помощи команды printf, описанной в заголовочном файле stdio.h.

// Вывод на экран строки текста.

#include<stdio.h> main ( )

{

printf("Hello world!\n"); return 0;

}

Печать целых и дробных чисел

Операция поместить в поток (<<) языка C++ является достаточно «интеллектуальной», чтобы определить тип переменной (полагая, что она должным образом объявлена); поэтому для использования операции поместить в поток никакой дополнительной информации не требуется.

#include<iostream.h> main ( )

{

cout<<"Целое число - "<< 3<<endl; cout<<"Дробное число - "<< 3.1415<<endl; return 0;

}

Функция printf языка ANSI C не обладает способность распознавать целые и дробные числа, поэтому в ней используются спецификаторы, которые «подсказывают» тип выводимого значения.

#include<stdio.h> main ( )

{

printf("%d\n", 3); printf("%f\n", 3.1415); printf("%e\n", 3.1415); return 0;

}

Сцепление операций поместить в поток и взять из потока

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

они записаны:

(((cout <<"47 плюс 53 равняется ")<<(47 + 53))<< endl);

т.е. операция поместить в поток << имеет ассоциативность слева направо. Такой способ сцепления операций поместить в поток возможен, поскольку перегруженная операция << возвращает ссылку на объект своего левого операнда, т.е. на объект cout. Таким образом, самое левое выражение в скобках

(cout << "47 плюс 53 равно")

выводит заданную строку символов и возвращает ссылку на cout. Это приводит к тому, что среднее выражение в скобках должно выполняться как

(cout<<(47 + 53))

выводить целое значение 100 и возвращать ссылку на cout. Затем выполняется самое правое выражение в скобках как

cout << endl;

которое переводит строку, сбрасывает cout и возвращает ссылку на cout. Эта ссылка в данном случае не используется.

// Сцепление перегруженных операций поместить в поток <<. #include <iostream.h>

main( )

{

cout << "47 плюс 53 равняется " << (47 + 53) << endl; return 0;

}

Функция printf языка ANSI C также позволяет вывод нескольких значение различных типов.

#include<stdio.h> main ( )

{

printf("47 plus 53 is %d", (43+57)); return 0;

}

Печать строк и символов

При написании программы в стиле языка C при вводе-выводе программист должен давать информацию о типе данных. В C++ типы данных определяются автоматически и это является замечательным достижением по сравнению с языком C.

#include <iostream.h> main ( )

{

char c=’A’;

char string1[ ] = "проверка первой строки"; char *string2 = "проверка второй строки";

cout << "Значение символа равно " << с<<endl;

cout << "Значение первой строки равно " << string1<<endl; cout << "Значение второй строки равно " << string2<<endl; return 0;

}

Для вывода отдельных символов и строк в языке ANSI C используются спецификаторы c и s соответственно.

#include<stdio.h> main ( )

{

char c='A';

char string1[ ]="First string"; char *string2="Second string"; printf("%c\n", c); printf("%s\n", string1); printf("%s\n", string2); return 0;

}

Ввод потоков

Операция ввода потока может быть выполнена с помощью операции взять из потока, т.е. перегруженной операции>>. Эта операция обычно игнорирует во входном потоке так называемые символы разделители или пробельные символы (пробелы, знаки табуляции, знак новой строки). Операция взять из потока возвращает нулевое значение (false), когда встречает в потоке признак конца файла; в противном случае операция взять из потока возвращает ссылку на объект, с помощью которого она вызывалась. Каждый поток содержит набор битов состояния, используемых для управления состоянием потока (форматированием, установкой ошибок потока и т.д.). Операция взять из потока приводит к установке бита failbit при вводе данных неправильного типа и приводит к установке бита badbit при неуспешном завершении операции.

Операция взять из потока

Для того чтобы прочитать два целых числа, используем объект cin и перегруженную операцию взять из потока >>. Операции взять из потока можно сцеплять.

Операция взять из потока также является достаточно «интеллектуальной», чтобы определить тип используемых данных. Если переменная была должным образом объявлена, то не требуется никакой дополнительной информации для использования операции взять из потока (в случае использования языка C такая информация требуется).

/* Вычисление суммы двух целых чисел, которые вводятся с клавиатуры с помощью cin и операции взять из потока */

#include <iostream.h> main( )

{

int x, у;

cout << "Введите два целых числа:"; cin >> x >>y;

cout << "Сумма чисел " <<x<<" и "<<y<< " равна " <<(x+y)<<endl; return 0;

}

В языке ANSI C для ввода значений предусмотрена функция scanf. В отличие от C++ функция не способна распознать тип вводимого значения. Так же как и в функции printf для обозначения типов вводимых данных используются те же спецификаторы ввода.

#include<stdio.h> main ( )

{

int x,y;

printf("Введите два целых числа\n"); scanf("%d%d\n", &x, &y); printf("Сумма x и y равна %d\n", (x+y)); return 0;

}

Манипуляторы потоков

В языке C++ имеется возможность использовать манипуляторы потоков, которые решают задачи форматирования. Манипуляторы потоков позволяют выполнять следующие операции:

задание ширины полей;

задание точности;

установку и сброс флагов формата;

задание заполняющего символа полей;

сброс потоков;

вставку в выходной поток символа новой строки и сброс потока;

вставку нулевого символа в выходной поток и пропуск символов разделителей во входном потоке.

Манипуляторы потоков dec, oct, hex и setbase, задающие основание чисел

Целые числа обычно интерпретируются как десятичные (с основанием 10). Для изменения основания интерпретации целых чисел в потоке используются манипуляторы hex, чтобы установить шестнадцатеричный формат представления элементов данных (с основанием 16), oct, чтобы установить восьмеричный формат представления данных (с основанием 8). Манипулятор dec используется для возврата к основанию потока 10.

Основание потока может быть также изменено с помощью манипулятора потока setbase, который принимает один целый параметр со значениями 10, 8 или 16, задающими соответствующие основания системы счисления. Поскольку манипулятор setbase принимает параметр, он называется параметризованным манипулятором потока. Использование манипулятора setbase или любого другого параметризованного манипулятора требует включение заголовочного файла <iomanip.h>. Основание потока остается установленным до тех пор, пока оно не будет изменено явным образом.

// Использование манипуляторов потока hex, oct, dec и setbase. #include<iostream.h>

#include<iomanip.h> main ( )

{

int n;

cout << " Введите десятичное число:" << endl; cin>>n;

cout << n <<" в шестнадцатеричном формате равно " << hex << n <<endl; cout << n <<" в восьмеричном формате равно " << oct << n <<endl; cout << setbase(10) <<" в десятичном формате равно " << n <<endl;

return 0;

}

Язык программирования ANSI C не имеет манипуляторов потоков, и ввод-вывод чисел в различных системах счисления производится при помощи спецификаторов преобразования.

#include<stdio.h> main ( )

{

int n;

printf("Введите десятичное число; \n"); scanf("%i", &n);

printf("\n в шестнадцатеричном формате равно %X", n); printf("\n в восьмеричном формате равно %o", n); printf("\n в десятичном формате равно %i", n); system("Pause");

return 0;

}

Точность чисел с плавающей запятой (precision, setprecision)

Мы можем управлять точностью печатаемых чисел с плавающей запятой, т.е. числом разрядов справа от десятичной точки, используя манипулятор потока setprecision или функцию-элемент precision. Вызов любой из этих установок точности действует для всех последующих операций вывода до тех пор, пока не будет произведена следующая установка точности. Функция-элемент precision не имеет никаких аргументов и возвращает текущее значение точности.

// Управление точностью печати значений с плавающей запятой

#include<iostream.h>

#include<iomanip.h> const float pi=3.14159265; main ( )

{

cout << "PI with precision 1, 2, 3"<<endl; cout.precision(1);

cout<<pi<<endl;

cout.precision(2);

cout<<pi<<endl;

cout.precision(3);

cout<<pi<<endl;

cout << "PI with precision 3 = "<<setprecision(3)<< pi<<endl; cout << "PI with precision 4 = "<<setprecision(4)<< pi<<endl; cout << "PI with precision 5 = "<<setprecision(5)<< pi<<endl; return 0;

}

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

#include<stdio.h>

const float pi=3.14159265; main ( )

{

printf("PI with precision 3 =%.3f", pi); printf("\nPI with precision 4 =%.4f", pi); printf("\nPI with precision 5 =%.5f", pi); return 0;

}

Ширина поля (setw, width)

Функция-элемент width класса ios устанавливает ширину поля (т.е. число символьных позиций, в которые значение будет выведено, или число символов, которые будут введены) и возвращает предыдущую ширину поля. Если обрабатываемые значения имеют меньше символов, чем заданная ширина поля, то для заполнения лишних позиций используются заполняющие символы: Если число символов в обрабатываемом значении больше, чем заданная ширина поля, то лишние символы не отсекаются и число будет напечатано полностью. Установка ширины поля влияет только на следующую операцию поместить или взять; затем ширина поля устанавливается неявным образом на 0, т.е. поле для представления выходных значений будут просто такой ширины, которая необходима. Функция width, не имеющая аргументов, возвращает текущую установку.

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

Для установки ширины поля может быть также использован манипулятор потока setw. #include<iostream.h>

#include<iomanip.h> main ( )

{

char str[6]; cin>>setw(3)>>str; cout<<endl<<str; return 0;

}

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

#include<stdio.h> main ( )

{

char str[7]=”string”

printf("Ширина строки равная 3 =%3s", str); printf("\nШирина строки равная 4 =%4s", str); printf("\nШирина строки равная 5 =%5s", str); return 0;

}

Варианты заданий

1.Даны два целых числа. Написать программу на языке C++ организующую ввод чисел и вывод на экран остаток от деления этих чисел.

2.Даны два дробных числа. Написать программу на языке ANSI C, организующую ввод чисел и вывод на экран результата деления этих чисел.

3.Даны два дробных числа. Написать программу на языке C++, организующую ввод чисел и вывод на экран результат произведения этих чисел.

4.Дана строка. Написать программу вывод на экран строки при помощи конструкций языка

ANSI C и C++.

5.Дано целое число. Вывести его на экран в десятичной, восьмеричной и шестнадцатеричной системах счисления используя конструкции языка ANSI C.

6.Дано целое число. Вывести его на экран в десятичной, восьмеричной и шестнадцатеричной системах счисления используя конструкции языка C++.

7.Дано дробное число π с точностью до 10 знака после запятой. Вывести его на экран с точностью 3 знака и 5 знаков после запятой, используя конструкции языка ANSI C.

8.Дано дробное число π с точностью до 10 знака после запятой. Вывести его на экран с точностью 4 знака и 6 знаков после запятой, используя конструкции языка C++.

9.Дана текстовая строка размером 15 символов. Вывести на экран данную строку с шириной поля 7 символов, используя конструкции языка ANSI C.

10.Дана текстовая строка размером 15 символов. Вывести на экран данную строку с шириной поля 7 символов, используя конструкции языка C++.

11.Даны одно целое и одно дробное числа. Написать программу на языке ANSI C, организующую ввод чисел и вывод на экран суммы чисел.

12.Даны два целых числа. Написать программу на языке C++ организующую ввод чисел и вывод на экран суммы этих чисел в восьмеричной системе счисления.

13.Даны два целых числа. Написать программу на языке ANSI C организующую ввод чисел и вывод на экран разности этих чисел в восьмеричной системе счисления.

14.Даны два целых числа. Написать программу на языке C++ организующую ввод чисел и вывод на экран произведения этих чисел в шестнадцатеричной системе счисления.

15.Даны два целых числа. Написать программу на языке ANSI C организующую ввод чисел и вывод на экран частного этих чисел в шестнадцатеричной системе счисления.

16.Дана текстовая строка размером 7 символов. Осуществить ввод строки и вывод ее на экран, используя конструкции языка ANSI C.

17.Дана текстовая строка размером 7 символов. Осуществить ввод строки и вывод ее на экран, используя конструкции языка C++.

18.Даны два целых числа. Написать программу на языке C++, организующую ввод чисел и вывод на экран результата целочисленного деления этих чисел.

19.Даны два целых числа. Написать программу на языке C++ организующую ввод чисел и вывод на экран остатка от деления этих чисел в шестнадцатеричной системе счисления.

20.Даны два целых числа. Написать программу на языке ANSI C организующую ввод чисел и вывод на экран остатка от деления этих чисел в шестнадцатеричной системе счисления.