Смекни!
smekni.com

Язык программирования С 2 (стр. 4 из 7)

восьмеричные: 01 077 012340

шестнадцатеричные: 0х51 0х6А0 0xF59В

2.5.3. Вещественные константы

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

– в виде числа с десятичной точкой, например, 0.1, 15.189;

– в научном виде (экспоненциальной форме), в котором вместо показателя основания записывается символ Е (или е), например: 1.1Е–10, –5е2 (что эквивалентно математической форме записи чисел 1.1×10–10 и –5×102).

Различие между числами float и double состоит не только в большем диапазоне последних, но и в более точном значении чисел типа double – верными являются 15...16 значащих цифр.

2.6. Макроопределения

Наряду с использованием в тексте программ констант в языке Си существует возможность применения макроопределений (макросов). Макроопределение устанавливает соответствие между именем и определённым значением. Для использования макросов существует несколько предпосылок. Если в программе используется одна и та же константа несколько раз в различных местах программ, то становится желательным использовать соответствующее макроопределение. Другой вариант применения макросов - использование хорошо понимаемых имен.

В общем случае форма записи макроопределения следующая:

#define <ИмяМакроса> <3аменяемоеВыражение>

где <ИмяМакроса> – любое разрешенное имя переменной, при этом желательно использовать заглавные буквы (что облегчает чтение программы). Примеры макросов:

#define NUNBER 1OO

#define LEFT 75

#define RIGHT 77

#define ENTER 13

#defineSPACE 0x20

#definePI 3.14159

После определения этих макросов в заголовке, в тексте программы можно использовать имена NUMBER, LEFT, RIGHT и т.д. На этапе создания исполняемого файла (точнее в фазе препроцессора, выполняемой до компиляции) происходит замена имен макросов на соответствующие им значения. Например, если в тексте программы встречаются имена NUMBER, то происходит замена этого имени на значение 100.

2.7. Преобразование типов данных

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

int а=11.54;

Так как переменная а определяется как переменная целого типа, то дробная часть вещественной константы 11.54 будет отброшена без округления и в ячейке переменной а будет записано целое число 11.

То же самое произойдет, т.е. не будет учитываться дробная часть числа, если исполнить следующие операторы:

floati;

i=1/10;

Это происходит, потому что в начале вычисляется правая часть выражения, а она содержит только целые константы 1 и 10, следовательно, результат тоже будет целое число: 1/10=0, а не 0.1 как ожидалось. Окончательно переменной i будет присвоено значение 0 и это несмотря на то, что она определяется вещественной.

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

1) все переменные типа char преобразуются в тип int, переменные типа float - в тип double.

2) для любой пары операндов (т.е. в результате вычисления, например, суммы или произведения двух чисел) происходит следующее преобразование:

– если хотя бы один из операндов double, то и второй преобразуется в этот тип;

– если хотя бы один из операндов long, то и другой преобразуется в long;

– если хотя бы один из операндов unsigned, то и другой преобразуется в unsigned.

3) конечный результат после операции присваивания приводится к типу переменной в левой части выражения.

Рассмотрим пример вычисления арифметического выражения:

char а=25, b=20;

int i,j,

long k;

double d=l.55;

i=a*b;

k=10000*b;

j = b*d;

printf(“i=%d k=%ld j=%d”,i,k,j);

При вычислении значения переменной i хотя обе переменные имеют тип char и как будто бы результат перемножения должен выйти за максимальные размеры, но по первому правилу обе переменные приводятся к целому типу. В этом случае результат за допустимые пределы не выйдет i=25*20=500. Для второй переменной k целого типа результат выходит за пределы целого, хотя переменная k объявлена типа длинного целого, поэтому результат перемножения будет неверный. Чтобы исправить эту ошибку необходимо строчку переписать следующим образом:

k=(long)10000*b;

Для третьей переменной j результатом перемножения будет вещественное число двойной точности, при присвоении этого результата происходит приведение типа (double)®(int) и при этом происходит потеря дробной части полученного произведения. пределы.

2.8. Задания для решения

2.8.1. Составьте программу, в которой объявляются две целые переменные a1 и a2, вещественная переменная b и переменные типа символ c и d. Переменная a2 инициализирована значением 10.

2.8.2. Найдите ошибки в приведенной программе

#include <conio.h>

#include <studio.h>

void main() {

intprintf=5; /* объявление целой переменной */

longnumber-one; объявление переменной типа длинное целое

double f=1e,

scanf=3.14;/* объявление вещественных переменных */

char if_else='a',

red%bull=100;/* объявление переменных типа символ */

unsigned float a=5,

void=1.e-10;;/* объявление вещественных переменных */

getch(); /* ожидание нажатия любой клавиши */

}

2.8.2. Напишите программу, в которой вводится переменная типа символ, она инициализируется значением 125. Прибавьте единицу к переменной и выведите новое значение переменной на экран. Повторите эти операции (увеличения на единицу и вывода на экран) еще 3 раза. Какие значения переменной будут выведены? Объясните результат.

2.8.4. Составьте программу, в которой сообщение "Привет мир" на экран бы выводилось в кавычках.

2.8.5. Запишите в тетради с указанием всех пробелов и созданных новых строк, что будет выведено на экран следующими функциями (символ V означает символ пробела):

printf(“Это&bsol;nVПростоVV&bsol;nСтрока&bsol;n&bsol;n”);

printf(“H&bsol;nVE&bsol;nVVL&bsol;nVVVL&bsol;nVVVVO&bsol;n”);

printf(“&bsol;t&bsol;tИванов&bsol;n&bsol;tПетров&bsol;n&bsol;Сидоров&bsol;n”);


3. ФУНКЦИИ ВВОДА-ВЫВОДА

3.1. Простейшие функции ввода-вывода

Язык Си содержит множество стандартных функции ввода–вывода информации (с клавиатуры, на экран, из файла и в него и т.д.). В данной главе рассматриваются только самые простые функции – ввода информации с клавиатуры и вывода на экран: printf, scanf, cprintf, cscanf,getch. Эти функции определены в стандартной и консольной библиотеках: <stdio.h> и <conio.h>.

3.2. Функция форматированного вывода printf()

3.2.1. Назначение и описание функции

Функция позволяет вывести информация на экран: простые сообщения, значения переменных и специальные символы (перевод строки, горизонтальная табуляция и т.д.). Функция определяется в библиотеке <stdio.h>.Синтаксис функции:

printf(<управляющая строка>, <список переменных>);

где <управляющая строка> - строка, которая может содержать:

а) простые сообщения, выводимые на экран без изменения, эти сообщения могут содержать произвольные символы, в том числе и на русском языке;

б) спецификации формата вывода переменных;

в) специальные символы;

<список переменных> - перечень идентификаторов переменных, значения которых необходимо вывести на экран.

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

Таблица 3.1.

Формат спецификации Назначение
ЦЕЛЫЕ ЧИСЛА
%d целое десятичное число
%x целое шестнадцатеричное число
%o целое восьмеричное число
%u целое беззнаковое десятичное число
%ld число типа длинное целое
ВЕЩЕСТВЕННЫЕ ЧИСЛА
%f вещественное число в формате xx.xxxxxx
%e вещественное число в научном формате xx.xxxxxe+xx
%g вещественное число в форматах %f или %e (в какой форме запись будет короче)
%lf вещественное число двойной точности
ПРОЧЕЕ
%c символ
%s строка
%p указатель

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

Замечание: При использовании функции printf() необходимо быть очень внимательным к соответствию спецификаций форматов в управляющей строке и типов переменных в списке. В противном случае выводимые значения будут существенно отличаться от реальных. Кроме этого, требуется проверять количество вводимых спецификаций и количество переменных в списке – они должны быть равны друг другу.

Примеры:

1) Необходимо вывести на экран сообщение «Значения переменных равны:» и далее текущие значения двух целых переменных aиb, вещественной переменной c. После вывода значения переменных aиb необходимо перевести курсор на новую строку. Эта задача выполняется следующим вызовом функции:

printf(“Значения переменных равны: %d %d&bsol;n%f”,a,b,c);

2) Значения двух вещественных переменных xиy, а также символьной переменной symb необходимо вывести на экран в следующем виде (символы … означают, что здесь будет выведено текущее значение переменной):

x=…

y=…

symb=…

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

printf(“ x=%f&bsol;n y=%f&bsol;n symb=%c&bsol;n&bsol;a”,x,y,symb);

3.2.2. Точность и ширина поля вывода

В функции printf() существует возможность задания вывода переменных определенного формата, а именно, можно задавать ширину поля переменных, определять точность вывода вещественных переменных, определять тип выравнивания данных и т.д. В этом случае спецификации формата записывается в такой форме: