Форматированный ввод-вывод данных



Язык Си был разработан во время создания операционной системы UNIX (OC UNIX).

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

Несколько лет не было единой политики в стандартизации языка С. В начале 1980-х г. в Американском национальном институте стандартов (ANSI) началась работа по стандартизации языка С. В 1989 г. работа комитета по языку С была ратифицирована, и в 1990 г. был издан первый официальный документ по стандарту языка С. Появился стандарт 1989, т.е. С89

Язык Си, созданный Денисом Ритчи в начале 70-х годов в Bell Laboratory американской корпорации AT&T, является одним из универсальных языков программирования.

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

С 1989 года язык Си регламентируется стандартом Американского института национальных стандартов ANSI С. В настоящее время, кроме стандарта ANSI C разработан международный стандарт ISO C (International Standard Organization C).

В С прописные и строчные буквы трактуются по-разному. Следовательно, count, Count и COUNT — это три различных идентификатора. Идентификатор не может совпадать с ключевым словом С и не должен иметь такое же имя, как функция, уже содержащаяся в библиотеке С.

Первая программа, которая должна быть написана, – одна для всех языков: напечатать слова: HELLO, WORLD.

Программа печати «HELLO, WORLD» на языке «C» имеет вид:

 # include <stdio.h>   

Int main ()

{

printf(«hello, world\n»);

}

Как пропустить эту программу – зависит от используемой вами системы.

#include <stdio.h>

int main () {

printf ("Hello, Word!\n");

_getch();

return 0;

}

Некоторые пояснения к самой программе. Любая «C»–программа, каков бы ни был ее размер, состоит из одной или более «функций», указывающих фактические операции компьютера, которые должны быть выполнены.

В начале кода используется, так называемая, директива препроцессора. Формально, она не является частью языка Си, но расширяет его возможности. Итак, директива #include заставляет компилятор подключить к программе заголовок, имя которого указано между < >.

 stdio.h — библиотека, содержащая прототипы функций, позволяющих вводить-выводить (и многое другое!) информацию на экран.

В нашем примере такой функцией является main.

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

Одним способом обмена данными между функциями является передача посредством аргументов.

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

Операторы, составляющие функцию, заключаются в фигурные скобки { и }, которые аналогичны BEGIN-END в Паскале.

Строка

 

printf(«HELLO, WORLD\N»);

 

является обращением к функции, которое вызывает функцию с именем printf и аргументом «HELLO, WORLD\N».

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

Последовательность \N в приведенной строке является обозначением на языке «C» для 'символа новой строки', который служит указанием для перехода на терминале к левому краю следующей строки. Если вы не включите \N, то обнаружите, что ваша выдача не закончится переходом терминала на новую строку. Использование последовательности \N – единственный способ введения символа новой строки в аргумент функции PRINTF.

int main() — главная в теле программы функция. Выполнение программы начинается, и как правило, заканчивается именно с нее. Формально, каждая программа на С должна содержать в себе функцию main(). int означает тип возвращаемого значения функцией в вызывающий процесс.

Символы фигурных скобок { — открывающая скобка, а так же } — закрывающая скобка, означают начало (и следовательно конец) программного блока. Программный блок в С — основная программная единица (т.е. инструкции, помещенные между началом и концом блока, либо выполняются все, либо — ни одна из них). printf("Hello world!") — функция, выполняющая вывод на консоль, выражения, заданного между двойными кавычками "". Ее прототип содержится в заголовке. Огромные возможности данной функции будут продемонстрированы позднее. return 0 — заставляет функцию (в данном случае main()) прекратить свое выполнение и передать 0 в вызывающий процесс. Идеология Си предполагает при нормальном завершении функции возвращать нулевое значение ( и не нулевое — при аварийном и др.).

Комментарии – это последовательность символов, которые компилятор воспринимает как отдельный пробельный символ и игнорируется. Комментарии на языке Си могут выделяться следующими способами:

1) // это комментарий от указанных наклонных символов до конца

текущей строки;

2) /*… это комментарий на несколько строк программы, все, что заключено между начальным и конечным символами комментария,  игнорируется транслятором… */

Комментарий можно вставить в любое место, где можно вставить пробел.

Пример: int /* это счетчик */ count;

Ключевые слова

 Следующие идентификаторы зарезервированы для использования в качестве ключевых слов и не могут использоваться иным образом:      int       extern     else     char      register   for     float     typedef    do     double    static     while     struct    goto       switch     union     return     case     long      sizeof     default     short     break      entry     unsigned  continue     auto      if

Типы данных

Все переменные должны объявляться перед использованием. Ниже показана стандартная форма объявления:

 тип список переменных;

Здесь тип должен быть корректным типом данных С, а список переменных может содержать одно или более имен идентификаторов, разделенных запятыми. Ниже показаны некоторые виды объявлений:

int i, j, l;

short int si;

unsigned int ui;

double balance, profit, loss;

Типы данных

Классификацию типов данных языка СИ можно представить в виде следующей схемы:

Стандарт С89 определяет пять базовых типов данных.

int – целочисленный тип, целое число;

float – вещественное число одинарной точности с плавающей точкой;

double– вещественное число двойной точности с плавающей точкой;

char – символьный тип для определения одного символа;

void – тип без значения.

Кроме того, существуют модификаторы, которые могут применяться к этим базовым типам.

Ряд компиляторов может поддерживать еще и логический тип _Bool.

Тип void служит для объявления функции, не возвращающей значения, или для создания универсального указателя (pointer).

Объект типа char всегда занимает 1 байт памяти Размеры объектов других типов, как правило, зависят от среды программирования и операционной системы.

Приведем модификаторы базовых типов данных. К ним относятся следующие спецификаторы, предшествующие им в тексте программы signed, unsigned, long, short

Базовый тип int может быть модифицирован каждым из перечисленных спецификаторов. Тип char модифицируется с помощью unsigned и signed, тип double – с помощью long.

 

 

Типы данных языка С

Тип данных Типичный размер в битах Минимально допустимый диапазон значений
char 8 (или 1 байт) от –128 до 127
unsigned char 8 от 0 до 255
signed char 8 от –128 до 127
int 16 или 32 от –32768 до 32767
unsigned int 16 или 32 от 0 до 65535
signed int 16 или 32 от –32767 до 32767
short int 16 от –32767 до 32767
unsigned short int 16 от 0 до 65535
signed short int 16 от –32767 до 32767
long int 32 от –2147483648 до 2147483647
long long int 64 от –(263–1 ) до (263–1) для С99
signed long int 32 от –2147483647 до 2147483647
unsigned long int 32 от 0 до 4294967295

Для базового типа int возможны следующие записи с модификатором:

signed или signed intunsigned или unsigned intlong или long intshort или short int

Для данных вещественного типа максимальные значения абсолютных величин

Вещественные типы данных языка С

Тип данных Типичный размер в битах Диапазон абсолютных величин
float 32 от 3.4Е–38 до 3.4Е+37
double 64 от 1.7Е–308 до 1.7Е+308
long double 80 от 3.4Е–4932 до 1.1Е+4932

В языке С предусматривается преобразование типов в выражениях и приведение типов.

 Если в выражении смешаны различные типы литералов и переменных, то компилятор преобразует их в один тип. Во-первых, все char и short int значения автоматически преобразуются (с расширением "типоразмера") в тип int. Этот процесс называется целочисленным расширением (integral promotion).

Во-вторых, все операнды преобразуются (также с расширением "типоразмера") в тип самого большого операнда. Этот процесс называется расширением типа (type promotion), причем он выполняется пооперационно. Например, если один операнд имеет тип int, а другой– long int, то тип int расширяется в тип long int.

Или если хотя бы один из операндов имеет тип double, то любой другой операнд приводится к типу double. Это означает, что такие преобразования, как тип char в тип double, вполне допустимы.

После преобразования оба операнда будут иметь один и тот же тип, а результат операции – тип, совпадающий с типом операндов. Приведем последовательность преобразования типов в выражениях по старшинству:

В языке С предусматривается явное преобразование (приведение) типов. Общая форма оператора явного приведения типа: (тип) выражение.

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

Общий вид оператора присваивания следующий:

имя_переменной = выражение;

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

тип имя_переменной =константа;

Ниже приведено несколько примеров

char ch = 'а';

int first = 0;

float balance = 123.23;

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

Таблица: Примеры констант

Тип данных Пример константы
char 'а' '\n' '9'
int 1 123  21000 - 234
long int 35000L  -34L
short int 10 -12  90
unsigned int 10000U 987U 40000U
float 123.23F   4.34e -3F
double 123.23 12312.333 -0.9876324

В языке СИ присутствует три вида констант:

1. целочисленные;

2. вещественные;

3. символьные.
 Целочисленные константы:

1. десятичная константа указывается десятичным числом в обычной форме;

2. восьмеричная константа указывается числом, начинающимся с цифры ноль и содержащим цифры 0...7;

3. шестнадцатеричная константа указывается целым числом с префиксом 0x или 0X, содержащим цифры 0...9 и буквы латинского алфавита a...f, A...F.

    Вещественные константы записываются в десятичной или шестнадцатеричной системе исчисления. Позиция запятой указывается точкой, экспонента указывается после латинской буквы e (или E). Символьным константам предшествует символ \, это так называемое "экранирование".

В языке СИ присутствуют специальные символы:

‘\’’ – одинарная кавычка,
‘\”’ – двойная кавычка,
‘\\’ – обратный слеш,
‘\?’ – знак вопроса,
‘\a’ – звуковой сигнал,
‘\b’ – удаление символа,
‘\f’ – прокрутка страницы,
‘\n’ – перевод строки,
‘\r’ – возврат каретки в начало строки,
‘\t’ – горизонтальная табуляция,
‘\v’ – вертикальная табуляция.

Основные операции в языке Си

Над объектами в языке Си могут выполняться различные операции:

· операции присваивания;

· арифметические;

· логические;

· операции отношения;

· операции сдвига.

 

Результатом выполнения операции является число. Операции могут быть бинарными или унарными. Бинарные операции выполняются над двумя объектами, унарные — над одним.

Операция присваивания

Операция присваивания обозначается символом = и выполняется в 2 этапа:

1) вычисляется выражение в правой части;

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

 

объект = <выражение>;

 

Пример:

int a = 4; // переменной a присваивается значение 4

int b;

b = a+2; // переменной b присваивается значение 6, вычисленное в правой части

 

Арифметические операции

Основные бинарные операции, расположенные в порядке уменьшения приоритета:

· умножение — *;

· деление — /;

· сложение — +;

· вычитание — -;

· остаток от целочисленного деления — %.

 

Основные унарные операции:

· инкрементирование (увеличение на 1) — ++;

· декрементирование (уменьшение на 1) — --;

· изменение знака — -.

 

Результат вычисления выражения, содержащего операции инкрементирования или декрементирования, зависит от того, где расположен знак операции (до объекта или после него). Если операция расположена до объекта, то сначала происходит изменение значения переменной на 1, а потом это значение используется для выполнения следующих операций. Если операция ++ или -- расположена после переменной, то сначала выполняется операция, а потом значение переменной изменяется на 1.

 

Пример:

int a=2; int b=3; int c, d;

c = a*++b; // c=8, поскольку в операции умножения уже b=4

d = a*b++; // d=6, поскольку в операции умножения b=3

Логические операции

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

Основные побитовые логические операции в языке Си:

· конъюнкция (логическое И) — & - бинарная операция, результат которой равен 1 только когда оба операнда единичны (в общем случае - когда все операнды единичны);

· дизъюнкция (логическое ИЛИ) — | - бинарная операция, результат которой равен 1 когда хотя бы один из операндов равен 1;

· инверсия (логическое НЕ) — ~ - унарная операция, результат которой равен 0 если операнд единичный, и равен 1, если операнд нулевой;

· исключающее ИЛИ — ^ - бинарная операция, результат которой равен 1, если только один из двух операндов равен 1 (в общем случае если во входном наборе операндов нечетное число единиц).

 

a b a & b a | b ~a a ^ b
0 0 0 0 1 0
0 1 0 1 1 1
1 0 0 1 0 1
1 1 1 1 0 0

 

Пример:

unsigned char a = 14; // a = 0000 1110

unsigned char b = 9;  // b = 0000 1001

unsigned char c, d, e, f;

c = a & b;                   // c = 8 = 0000 1000

d = a | b;                    // d = 15 = 0000 1111

e = ~a;                      // e = 241 = 1111 0001

f = a ^ b;                 // f = 7 = 0000 0111

 

Операции отношения

Основные операции отношения:

· эквивалентно — == (проверка на равенство);

· не равно — != (проверка на неравенство);

· меньше — <;

· больше — >;

· меньше или равно — <=;

· больше или равно — >=.

 

Операции отношения используются при организации условий и ветвлений. Результатом этих операций является 1 бит, значение которого равно 1, если результат выполнения операции - истина, и равно 0, если результат выполнения операции - ложь.

 

 

Ввод-вывод информации

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

Самый простой механизм ввода - чтение по одному символу из стандартного входного потока (с клавиатуры) с помощью функции getchar( ).

Другая функция - putchar(х) выдает значение переменной x в стандартный выходной поток (на экран дисплея).

Объявления getchar( ) и putchar( ) сделаны в заголовочном файле stdio.h, содержащем описания заголовков библиотечных функций стандартного ввода/вывода. Чтобы библиотечные функции стали доступны программе, к ней необходимо подключить данный файл. Подключение осуществляется с помощью директивы препроцессора, помещаемой в начало программы:

#include <stdio.h>

Форматированный ввод-вывод данных

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

 int printf(const char *форматная_строка,...);

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

 

Код Формат
%c Символ
%d Знаковое десятичное целое число
%i Знаковое десятичное целое число
Научная нотация (е - строчная)
Научная нотация (Е - прописная)
%f Десятичное число с плавающей точкой
%g Использует или %е, или %f, соответствующее более короткому представлению
%G Использует или %Е, или %F, соответствующее более короткому представлению
%o Беззнаковое восьмеричное число
%s Строка символов
%u Беззнаковое десятичное число
Беззнаковое шестнадцатиричное число (строчные буквы)
Беззнаковое шестнадцатиричное число (прописные буквы)
Вывод указателя
%n Ассоциированный аргумент - это указатель на целое, в которое записывается число уже выведенных символов
%% Выводит знак %

 

Должно быть полное соответствие между числом аргументов и числом спецификаторов формата, а также спецификаторы формата и аргументы должны соответствовать друг другу слева направо.

Стандартный ввод с консоли, как правило, осуществляется с помощью scanf(). Она читает все стандартные типы данных и автоматически преобразует числа к правильному внутреннему формату. Чем-то она похожа на свою противоположность printf().

 

Пример простой программы на языке Си:

#include <stdio.h> //- директива препроцессора


Дата добавления: 2018-08-06; просмотров: 369; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!