Автор работы: Пользователь скрыл имя, 29 Октября 2013 в 12:08, лекция
В спецификаторах формата функции printf после символа % можно указывать число, задающее минимальную ширину поля вывода, например, %5d – для целых, %4.2f – для вещественных (означает поле общей шириной 4 символа, две цифры после запятой). Недостающие позиции будут слева заполнены пробелами (если нужно заполнить их нулями, перед шириной поля надо поставить символ '0' , например: %05d ). Если, наоборот, указанных позиций не хватает для вывода целой части числа, то происходит автоматическое расширение поля до нужной ширины.
Типы операндов преобразуются к общему типу в порядке увеличения их "допустимого диапазона значений". Поэтому неявные преобразования всегда идут от "меньших" объектов к "большим". Схема выполнения преобразований операндов арифметических операций:
short, char ® int ® unsigned ® long ® double
float ® double
При этом действуют следующие правила:
long double
double
long long
unsigned long
long
unsigned int
int
Внимание: результатом 1/3 будет «0», чтобы избежать такого рода ошибок необходимо явно изменять тип хотя бы одного операнда, т.е. записывать, например: 1. / 3.
Типы char и int могут свободно смешиваться в арифметических выражениях, при этом каждая переменная типа char автоматически преобразуется в int. Это обеспечивает значительную гибкость при проведении определенных преобразований символов.
4.4. Преобразование типов при присваивании.
При присваивании значение правой части преобразуется к типу левой. И здесь необходимо быть внимательным, так как при некорректном использовании операций присваивания могут возникнуть неконтролируемые ошибки. Так, при преобразовании int в char старший байт просто отбрасывается.
Если объявлены: float x; int i; то как x=i; так и i=x; приводят к преобразованиям. При этом float преобразуется в int отбрасыванием дробной части.
Тип double преобразуется во float округлением.
Длинное целое преобразуется в более короткое целое и переменные типа char посредством отбрасывания лишних битов более высокого порядка.
При передаче данных функциям также происходит преобразование типов.
В любом выражении преобразование типов может быть осуществлено явно. Для этого достаточно перед любым выражением поставить в скобках идентификатор соответствующего типа.
Вид записи операции: (тип) выражение;
Ее результат - значение выражения, преобразованное к заданному типу представления.
Операция приведения типа вынуждает компилятор выполнить указанное преобразование, но ответственность за последствия возлагаются на программиста. Рекомендуется использовать эту операцию в исключительных случаях.
Например:
double x;
int n=6, k=4;
1) x=n/k; - дробная часть будет отброшена
2) x=(double)n/k; - использование операции приведения типа здесь позволяет избежать округления результата деления целочисленных операндов.
Другой пример:
int i=100000, j=100000;
long long k;
k=(long long)i*j; - использование операции приведения типа здесь позволяет избежать переполнения типа int.
4.6. Операция «,» (запятая)
Данная операция используется для организации заданной последовательности вычисления выражений (обычно используется там, где по синтаксису допустима только одна операция, а необходимо разместить две и более, например, в операторе for). Форма записи:
выражение_1, …, выражение_N;
выражения 1, 2,…, N вычисляются последовательно друг за другом и результатом операции становится значение последнего выражения N, например:
m = ( i = 1, j = i ++, k = 6, n = i + j + k );
получим последовательность вычислений: i =1, j =i =1, i =2, k=6, n=2+1+6, и в результате m=n=9.
4.7. Приоритеты операций (по убыванию, чертой разделены разные приоритеты)
Операция |
Краткое описание |
Использование |
Порядок выполнения |
Унарные операции | |||
. |
Доступ к полю или методу |
объект . поле |
Слева направо |
-> |
Доступ к полю или методу по указателю |
указатель -> поле | |
[] |
Индексирование |
переменная[выражение] | |
() |
Вызов функции |
ID(список_выр.) | |
++ |
Префиксный инкремент |
++lvalue |
Справа налево |
-- |
Префиксный декремент |
--lvalue | |
++ |
Постфиксный инкремент |
lvalue++ | |
-- |
Постфиксный декремент |
lvalue-- | |
~ |
Побитовое НЕ |
~выражение | |
! |
Логическое НЕ |
!выражение | |
- |
Унарный минус |
-выражение | |
+ |
Унарный плюс |
+выражение | |
* |
Раскрытие указателя |
*выражение | |
& |
Адрес |
&выражение | |
sizeof |
Размер объекта или типа |
sizeof(выражение или тип) | |
() |
Приведение типа |
(тип)выражение | |
Бинарные и тернарная операции | |||
* |
Умножение |
выражение * выражение |
Слева направо |
/ |
Деление |
выражение / выражение | |
% |
Получение остатка |
выражение % выражение | |
+ |
Сложение |
выражение + выражение | |
- |
Вычитание |
выражение – выражение | |
<< |
Сдвиг влево |
выражение << выражение | |
>> |
Сдвиг вправо |
выражение >> выражение | |
< |
Меньше |
выражение < выражение | |
<= |
Меньше или равно |
выражение <= выражение | |
> |
Больше |
выражение > выражение | |
>= |
Больше или равно |
выражение >= выражение | |
== |
Равно |
выражение == выражение | |
!= |
Не равно |
выражение != выражение | |
& |
Побитовое И |
выражение & выражение | |
^ |
Побитовое исключающее ИЛИ |
выражение ^ выражение | |
| |
Побитовое ИЛИ |
выражение | выражение | |
&& |
Логическое И |
выражение && выражение | |
|| |
Логическое ИЛИ |
выражение || выражение | |
?: |
Условная операция (тернарная) |
выражение ? выражение : выражение | |
= |
Присваивание |
lvalue = выражение |
Справа налево |
+= -= *= /= %= <<= >>= &= |= ^= |
Сложение, умножение и др. с присваиванием |
lvalue += выражение lvalue *= выражение lvalue <<= выражение и т.д. | |
, |
Последовательное вычисление |
выражение, выражение |
Слева направо |
5. Стандартная библиотека языка Си
В любой программе кроме операторов и операций используются средства библиотек, входящих в среду программирования. Часть библиотек стандартизована и поставляется с компилятором. Функции, входящие в библиотеку языка Си, намного облегчают создание программ.
В стандартную библиотеку входят также прототипы функций, макросы, глобальные константы. Это, как вы уже знаете, заголовочные файлы с расширением *.h, которые хранятся в папке include и подключаются на этапе предпроцессорной обработки исходного текста программ.
5.1. Стандартные математические функции
Математические функции языка Си декларированы в файлах math.h и stdlib.h.
В приведенных здесь функциях аргументы и возвращаемый результат имеют тип double. Аргументы тригонометрических функций должны быть заданы в радианах (2π радиан = 360°).
5.2. Потоковый ввод-вывод
Поток – это абстрактное понятие, которое относится к любому переносу данных от источника к приемнику. Потоки С++ обеспечивают надежную работу как со стандартными (stdin, stdout), так и с определенными пользователем типами данных. Поток определяется как последовательность байтов не зависящая от конкретного устройства.
Для ввода-вывода в консольных приложениях в языке С++ используются два объекта класса iostream: cin (класс istream), cout (класс ostream) и две операции: >> и <<. Для их работы необходимо подключить заголовочный файл iostream.h.
Формат записи операций извлечения из потока >> (ввод с клавиатуры) и помещения в поток << (вывод на экран) следующий:
cout << выражение ;
cin >> ID(имя) переменной ;
Стандартный поток вывода cout по умолчанию связан со стандартным устройством вывода stdout (дисплей монитора), а ввода cin – со стандартным устройством ввода stdin, т.е. клавиатурой. Приведем пример:
#include<iostream.h>
void main (void)
{
int i, j, k;
cout << “ Hello! ” << endl; // «end line» – переход на новую строку
cout << “ Input i, j ”;
cin >> i >> j ;
k = i + j ;
cout << “ Sum i , j = “ << k << endl;
}
5.3. Консольные функции вывода данных на экран
Наряду с потоковым вводом-выводом, в консольных приложениях применяются и функции ввода-вывода языка Си. Их декларации приведены в заголовочных файлах stdio.h и conio.h .
Для вывода информации на экран монитора (дисплей) в языке Си служат функции printf() и puts().
Формат функции форматного вывода на экран:
printf( управляющая строка , список объектов вывода);
В управляющей строке, заключенной в кавычки, записывают: текст, выводимый на экран ; спецификаторы форматов, указывающие компилятору способ вывода объектов (каждый спецификатор формата начинается с символа '%' ).
В списке объектов вывода указываются выводимые на экран переменные, константы или выражения, разделенные запятыми. Список объектов вывода может отсутствовать.
Каждый из спецификаторов формата соответствует своему объекту из списка вывода, в порядке следования. Поэтому количество и порядок следования спецификаторов форматов должны совпадать с количеством и порядком следования выводимых объектов. Функция printf выполняет вывод данных в соответствии с указанными форматами. Весь остальной (кроме спецификаторов форматов) текст управляющей строки выводится на экран без изменений.
Имеется большое количество различных спецификаторов формата. Основные из них:
%d (%i) – десятичное целое число;
%f – вещественное число, запись с фиксированной точкой;
%е – вещественное число, экспоненциальная запись;
%g – вещественное число, запись с фиксированной точкой либо экспоненциальная запись, в зависимости от значения величины;
%o – восьмеричное число без знака;
%x – шестнадцатеричное целое число без знака (малые буквы a-f);
%X – шестнадцатеричное целое число без знака (большие буквы A-F);
%c – один символ;
%s – строка символов (массив char).
Для "длинных" типов чисел добавляется символ l : %ld – long (длинное целое), %lf – double (вещественное число с удвоенной точностью). Для еще более длинных типов чисел вместо l добавляется L : %Ld - long long, %Lg - long double в соответствии с форматом %g.
Если нужно напечатать сам символ %, то его нужно указать 2 раза:
printf ("Только %d%% предприятий не работало. \n",5);
Получим: Только 5% предприятий не работало.
Пример:
int number = 5; float but = 255; int cost = 11000;
printf(" %d студентов съели %f бутербродов. \n", number, but);
printf(" Значение числа pi равно %f. \n", M_PI);
printf(" Стоимость этой вещи %d %s. \n", cost, "Руб.");
. . .
В спецификаторах формата функции printf после символа % можно указывать число, задающее минимальную ширину поля вывода, например, %5d – для целых, %4.2f – для вещественных (означает поле общей шириной 4 символа, две цифры после запятой). Недостающие позиции будут слева заполнены пробелами (если нужно заполнить их нулями, перед шириной поля надо поставить символ '0' , например: %05d ). Если, наоборот, указанных позиций не хватает для вывода целой части числа, то происходит автоматическое расширение поля до нужной ширины.
Если после «%» указан знак «минус», то выводимое значение будет выравниваться по левой (а не по правой) позиции поля вывода заданной ширины, например: % – 10d.
Использование функции printf для преобразования данных:
1) printf("%o", 336); получим: 520, т.е. 5*8**2+2*8+0*1 = 336;
2) printf("%x", 335); получим: 14f (шестнадцатеричное).
Можно использовать функцию printf для нахождения кода ASCII некоторого символа:
printf (" %c – %d\n", 'a', 'a');
получим десятичный код ASCII символа а: a – 65 .
Функция puts(строка); выводит на экран дисплея строку символов, автоматически добавляя к ней символ перехода на начало новой строки (\n).
Аналогом такой функции будет: printf(“строка\n”);
5.4. Консольные функции ввода информации
Функция scanf предназначена для форматированного ввода исходной информации с клавиатуры:
scanf (управляющая строка , список адресов объектов ввода);
Список адресов объектов ввода представляет собой имена переменных, разделенные запятыми, перед каждой из которых указывается символ &, обозначающий здесь операцию «взять адрес».
В управляющей строке (заключенной в кавычки) указывается список спецификаторов форматов. Каждый спецификатор формата начинается с символа '%', за которым следует тип спецификатора, указывающий компилятору способ ввода объекта. Функция scanf() использует практически тот же набор модификаторов форматов, что и printf(), отличия от функции вывода следующие: форматы %f, %e, %g – эквивалентны. Для ввода коротких целых чисел (short) введен модификатор формата %h.
Вводить данные с клавиатуры можно как в одной строке через пробелы, так и в форме разных строк, нажимая после ввода текущего объекта клавишу Enter.
Поэтому функцией scanf() по формату %s строка вводится только до первого пробела. Для ввода произвольной строки текста, содержащей пробелы, используется функция:
gets (ID символьного массива);
В управляющей строке функции scanf(), как и в printf(), между спецификаторами формата можно помещать текст. Но предназначение его иное: если введенные данные окажутся разделены теми же символами, что и в управляющей строке, эти введенные символы будут пропущены. Это можно использовать для ввода значений, разделенных не пробелами, например:
scanf("%d:%d:%d", &hour, &min, &sec);
позволяет вводить с клавиатуры время в обычном формате.
Функцию scanf() также можно записывать в виде:
целая переменная = scanf (управляющая строка , список адресов объектов ввода);
Информация о работе Основные принципы составления блок-схем и алгоритомов