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

3. Типы данных

Программы оперируют с различными данными, которые могут быть простыми (скалярными) и структурированными. Простые данные - это целые и вещественные числа, перечисляемые и указатели (адреса объектов в памяти). Целые числа не имеют, а вещественные имеют дробную часть. Структурированные данные - это массивы и структуры.

Типы данных

Скалярные

Структурированные

Числовые

Перечисляемые

Массивы

Структуры

Объединения

Целые

Вещественные

signed (со знаком)

unsigned (без знака)

В языке Си различают понятия "тип данных" и "модификатор типа". Тип данных - это, например, целый, а модификатор - со знаком или без знака. Целое со знаком будет иметь как положительные, так и отрицательные значения, а целое без знака - только положительные значения. В языке Си выделяются пять базовых типов, которые задаются следующими ключевыми словами:

char - символьный;

int - целый;

float - вещественный;

double - вещественный двойной точности;

void - не имеющий значения.

Краткая характеристика типов:

  1. Переменная типа char имеет размер 1 байт, ее значениями являются целые числа, различные символы из кодовой таблицы, например: 'ф', ':', 'j' (при записи в программе они заключаются в одинарные кавычки).

  2. Размер переменной типа int в стандарте языка Си не определен. В большинстве систем программирования размер переменной типа int соответствует размеру целого машинного слова. Например, в компиляторах для 16-разрядных процессоров переменная типа int имеет размер 2 байта. В Visual Studio 2010 для 32-разрядных и 64-разрядных процессоров переменная типа int имеет размер 4 байта.

  3. Ключевое слово float позволяет определить переменные вещественного типа. Их значения имеют дробную часть, отделяемую точкой от целой части. Переменная типа float занимает в памяти 4 байта.

  4. Ключевое слово double позволяет определить вещественную переменную двойной точности. Она занимает в памяти в два раза больше места, чем переменная типа float (т.е. ее размер 8 байта).

  5. Ключевое слово void (не имеющий значения) используется для нейтрализации значения объекта, например, для объявления функции, не возвращающей никаких значений.

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

  • unsigned – число без знака;

  • signed – число со знаком;

  • short – короткое число;

  • long – длинное число.

Использование модификаторов для базовых типов

Модификаторы записываются перед спецификаторами типа, например: unsigned char, long int. Если после модификатора опущен спецификатор, то компилятор предполагает, что этим спецификатором является int. Таким образом, следующие строки:

short а;

signed short а;

short int а;

signed short int а;

являются идентичными и определяют объект а, как короткий целый (2 байта). Строки:

unsigned b;

unsigned int b;

определяют объект b, как целый без знака(4 байта).

Модификатор signed является необязательным и определяется по умолчанию. В Си принято соглашение по соотношению размерности объектов с модификаторами: short ≤ int ≤ long. В таблицах показаны возможные сочетания модификаторов (unsigned, signed, short, long) со спецификаторами (char, int и double), а также приведены размеры полей и диапазоны значений объекта (для 32-разрядных компиляторов).

Целые типы

Тип

Размер в байтах (битах)

Интервал изменения

char, signed char

1 (8)

от -128 до 127

unsigned char

1 (8)

от 0 до 255

short int,

signed short int

2 (16)

от -32768 до 32767

unsigned short int

2 (16)

от 0 до 65535

int, signed int

4 (32)

от -2147483648 до 2147483647

unsigned int

4 (32)

от 0 до 4294967295

long int,

signed long int

4 (32)

от -2147483648 до 2147483647

unsigned long int

4 (32)

от 0 до 4294967295

long long int,

signed long long int

8 (64)

от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807

unsigned long long int

8 (64)

от 0 до 18 446 744 073 709 551 615

Вещественные типы

Точность

float

double

long double

Размер (байты)

4

8

10

Число десятичных знаков

~7.2

~15.9

~19.2

Наименьшее значение (>0), denorm

1,401298·10−45

4,940656·10−324

1,9·10−4951

Наименьшее значение (>0), normal

1,175494·10−38

2,225074·10−308

3,4·10−4932

Наибольшее значение

3,402823×10+38

1,797693×10+308

1,1×10+4932

Поля

S-E-F

S-E-F

S-E-I-F

Размеры полей

1-8-23

1-11-52

1-15-1-63

  • S — знак, E — показатель степени, I — целая часть, F — дробная часть

  • Так же, как и для целых, знаковый бит — старший.

  • В Visual studio 2010 типы double и long double – это различные типы, но по диапазону представления чисел long double эквивалентен double.

Модификатор const позволяет определить имя, тип и задать значение константе. Строки

const float x = 32.78;

const int short_MIN = -32768;

- определяет вещественную константу x со значением 32.78 и целочисленную константу short_MIN со значением -32768. Использовать эти значения в программе можно по имени константы, изменять значения констант в программе не разрешается. В памяти для констант выделяется количество байт в соответствии с размерностью заданного для нее типа.

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

Директива #define также используется для определения константных значений. В отличие от использования спецификатора const память для определяемых имен не выделяется. Например:

#define NMAX 100

. . .

int a[NMAX];

double x[NMAX];

В том случае в тексте программы везде, где встречается имя NMAX, перед компиляцией производится замена имени NMAX на его значение 100. После замены в программе будут строки:

int a[100];

double x[100];

Только после этого начинается компиляция программы. Эта подмена действует только на время компиляции и не изменяет исходную программу.

Правила выполнения операций над целыми и вещественными типами данных

Если в выражении появляются операнды различных типов, то они преобразуются к некоторому общему типу, при этом к каждому арифметическому операнду применяется такая последовательность правил:

  1. Если один из операндов в выражении имеет тип long double, то остальные тоже преобразуются к типу long double.

  2. В противном случае, если один из операндов в выражении имеет тип double, то остальные тоже преобразуются к типу double.

  3. В противном случае, если один из операндов в выражении имеет тип float, то остальные тоже преобразуются к типу float.

  4. В противном случае, если один из операндов в выражении имеет тип unsigned long, то остальные тоже преобразуются к типу unsigned long.

  5. В противном случае, если один из операндов в выражении имеет тип long, то остальные тоже преобразуются к типу long.

  6. В противном случае, если один из операндов в выражении имеет тип unsigned, то остальные тоже преобразуются. к типу unsigned.

  7. В противном случае все операнды преобразуются к типу int. При этом тип char преобразуется в int со знаком; тип unsigned char в int, у которого старший байт всегда нулевой; тип signed char в int, у которого в знаковый разряд передается знак из сhar; тип short в int (знаковый или беззнаковый).

Кроме того, действует правило: если один из операндов имеет тип long, второй – unsigned int, а значение unsigned int не может быть представлено типом long, то оба операнда преобразуются в значение типа unsigned long.

Предположим, что вычислено значение некоторого выражения в правой части оператора присваивания. В левой части оператора присваивания записана некоторая переменная, причем ее тип отличается от типа результата в правой части. Здесь правила преобразования очень простые: значение справа от оператора присваивания преобразуется к типу переменной слева от оператора присваивания. Если размер результата в правой части больше размера операнда в левой части, то старшая часть этого результата будет потеряна.

Явное преобразование типов

При выполнении операций на результат может значительно влиять тип данных. Например, определены две целочисленные переменные a и b, две вещественные переменные c и d. При определении переменные a и d были проинициализированы значением 5. Рассмотрим результаты выполнения операции деления:

int a=5,b;

float c,d=5;

. . .

b=a/2; //b=2 целочисленное деление (остаток)

c=a/2; //c=2.0 целочисленное деление (остаток)

c=d/2; //c=2.5 d вещественного типа

c=a/2.; //c=2.5 2.0 вещественного типа

В языке Си можно явно указать тип любого выражения. Для этого используется унарная операция явного преобразования ("приведения") типа. Она применяется следующим образом:

(тип) выражение,

здесь можно указать любой допустимый в языке Си тип.

Рассмотрим пример:

c=(float)a/2; //c=2.5

переменная a целого типа явно преобразована к типу float. Преобразование типа также может использоваться для преобразования типов аргументов при вызове функций.

Функции форматного ввода, вывода данных

Экран монитора и клавиатура образуют консоль – устройство оперативного вывода и ввода информации в ЭВМ. Изначально консоль представляла собой электронную печатающую машинку типа «CONSUL-260» («Консул-260»). На ее клавиатуре набирались команды или текст, которые распечатывались на бумаге и параллельно передавались в ЭВМ (ввод данных). Данные, полученные в результате выполнения программы, передавались от ЭВМ обратно на «Консул-260» и распечатывались на бумаге (вывод данных). Для удобства регистрации данных использовалась рулонная бумага. По распечатке осуществлялся контроль входных и анализ выходных данных. Впоследствии клавиатура стала самостоятельным устройством, а для регистрации данных стал применяться монитор.

Операции ввода/вывода в языке Си организованы посредством библиотечных функций (причем их довольно много). Функции printf() и scanf(), включенные в библиотеку stdio обеспечивают вывод в стандартный поток данных и ввод из стандартного потока данных различных типов.

Функция printf() (прототип содержится в файле stdio.h) записывает в стандартный поток stdout (стандартный выходной поток данных) значения аргументов из заданного списка вывода (2-й параметр) в соответствии со строкой форматирования, адресуемой параметром format (1-й параметр). Функция возвращает для контроля (если это требуется) количество выведенных символов, а в случае ошибки значение -1 (системная константа EOF=-1).

int printf( const char *format, <список вывода>);

Строка форматирования состоит из элементов двух типов. К элементам первого типа относятся символы, которые выводятся на экран.

Элементы второго типа содержат ESC-последовательности и спецификации формата, определяющие способ отображения аргументов. Количество спецификаций формата должно совпадать с количеством элементов в списке вывода. Спецификация формата начинается символом процента %, за которым следует код формата.

На спецификации могут воздействовать модификаторы, задающие ширину поля, точность и признак выравнивания по левому краю. Целое значение, расположенное между % и командой форматирования, играет роль спецификации минимальной ширины поля. Наличие этого спецификатора приводит к тому, что результат будет заполнен пробелами или нулями, чтобы выводимое значение занимало поле, ширина которого не меньше заданной минимальной ширины. По умолчанию в качестве заполнителя используются пробелы. Для заполнения нулями перед спецификацией ширины поля нужно поместить нуль. Например, спецификация формата %05d дополнит нулями выводимое целое число, в котором менее пяти цифр, чтобы общая длина равнялась пяти символам. Если количество цифр больше заданного значения, поле автоматически расширяется.

Действие модификатора точности зависит от кода формата, к которому он применяется. Чтобы добавить этот модификатор, следует поставить за спецификатором ширины поля десятичную точку, а после – требуемое значение точности. Применительно к целым числам модификатор точности задает минимальное количество выводимых цифр. При необходимости перед целым числом будут добавлены нули. Например:

int k=15;

printf("\nk=%d \nk=%7d \nk=%7.3d\nk=%07d \nk=%07.3d",k,k,k,k,k);

\n - управляющая ESC-последовательность для печати последующей информации с новой строки. На экране монитора будет распечатано:

k=15

k= 15

k= 015

k=0000015

k= 015

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

Для вещественного типа числа модификатор точности задает р, количество знаков после десятичной точки. Десятичная точка тоже учитывается при расчете длины поля (она занимает 1 знакоместо, также как и цифра, и знак + или -). По умолчанию все выводимые значения выравниваются по правому краю: если ширина поля больше выводимого значения, то оно будет выровнено по правому краю поля. Чтобы установить выравнивание по левому краю, нужно поставить знак «минус» () сразу после знака процента. Например, спецификация формата %–10.4f обеспечит выравнивание вещественного числа с четырьмя десятичными знаками по левому краю в 10-символьном поле. Пример:

float k=156.324;

printf("\nk=%f |\nk=%6.4f |\nk=%10.4f |\nk=%-10.4f |",k,k,k,k);

На экране монитора будет распечатано:

k=156.324005 |

k=156.3240 |

k= 156.3240 |

k=156.3240 |

Существуют два модификатора формата, позволяющие функции printf() отображать короткие и длинные целые числа. Модификатор l (латинская буква «эль») уведомляет функцию printf() о длинном типе значения. Модификатор h сообщает функции printf(), что нужно вывести число короткого целого типа. Кроме того, модификатор l можно поставить перед командами форматирования вещественных чисел, в этом случае он уведомит о выводе значения типа long double. Для выводы чисел типа long long int применяется сдвоенный модификатор ll, например, %16lld.

Спецификаторы формата для функции printf() перечислены в таблице.

Код

Формат

%c

%d

%i

%e

%E

%f

%F

%g

%G

%o

%s

%u

%x

%X

%p

%%

Символ

Десятичное целое число со знаком

Десятичное целое число со знаком

Экспоненциальное представление числа (в виде мантиссы и порядка, е

— на нижнем регистре)

Экспоненциальное представление числа (в виде мантиссы и порядка, Е

— на верхнем регистре)

Десятичное число с плавающей точкой

Десятичное число с плавающей точкой (только стандарт С99; если приме-няется к бесконечности или нечисловому значению, то выдает надписи INF, INFINITY(бесконечность) или NAN (not a number) на верхнем регистре. Спецификатор %f выводит их эквиваленты на нижнем регистре)

Использует более короткий из форматов %e или %f

Использует более короткий из форматов %E или %F

Восьмеричное число без знака

Символьная строка

Десятичное целое число без знака

Шестнадцатеричное без знака (строчные буквы)

Шестнадцатеричное без знака (прописные буквы)

Выводит указатель

Выводит знак процента

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

// crt_set_printf_count_output.c

#include <stdio.h>

int main()

{

int e;

int i;

e = _set_printf_count_output( 1 );//разрешить поддержку, возвращает предыдущий режим

//e = _set_printf_count_output( 0 ); //запретить поддержку

printf( "12345%n6789\n", &i ); // %n format should set i to 5

printf( "i = %d\n", i ); //i=5

}

Форматирование вывода применяется для удобства восприятия информации на экране монитора.

Пример 1. Вывод данных в таблице. Пусть будут заданы 4 переменные:

short int a=5,b=1526,c=-3,d=10251;

При выводе на экран переменных без спецификации минимальной ширины поля:

printf("\n | %d | %d |",a,b);

printf("\n | %d | %d |",c,d);

получим:

| 5 | 1526 |

| -3 | 10251 |

Диапазон значений типа short int -32769 … 32767. Если специфицировать минимальную ширину поля шестью знаками (с учетом 5-и цифр и знака -):

printf("\n | %6d | %6d |",a,b);

printf("\n | %6d | %6d |",c,d);

получим:

| 5 | 1526 |

| -3 | 10251 |

Пример 2. Вывод данных в таблице. Пусть будут заданы 4 переменные:

float a=5.,b=1526.1212,c=-3.345,d=10.251;

При выводе на экран переменных без спецификации минимальной ширины поля:

printf("\n | %f | %f |",a,b);

printf("\n | %f | %f |",c,d);

получим:

| 5.000000 | 1526.121216 |

| -3.345000 | 10.251000 |

Для заданных значений требуется специфицировать минимальную ширину поля десятью знаками (с учетом 8-и цифр, десятичной точки и знака -):

printf("\n | %10.4f | %10.4f |",a,b);

printf("\n | %10.4f | %10.4f |",c,d);

В результате получим:

| 5.0000 | 1526.1212 |

| -3.3450 | 10.2510 |

Пример 3. Вывод даты. Пусть будут заданы переменные day, month и year, определяющие день, месяц и год:

short int day=1,month=2,year=2014;

При выводе на экран переменных без спецификации минимальной ширины поля:

printf("Текущая дата = %d.%d.%d\n",day,month,year);

printf("Текущая дата = %hd.%hd.%hd\n",day,month,year);

получим:

Текущая дата = 1.2.2014

Текущая дата = 1.2.2014

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

printf("Текущая дата= %02d.%2.2d.%02d\n",day,month,year%100);

В результате получим:

Текущая дата= 01.02.14

Функция scanf() (прототип содержится в файле stdio.h) обеспечивает форматированный ввод из стандартного входного потока stdin (например, клавиатура) и сохраняет информацию в переменных, перечисленных в списке аргументов ввода.

int scanf( const char *format, <список ввода>);

Управляющая строка форматирования содержит спецификации преобразования и используется для установления количества и типов аргументов. Если в строке форматирования встретится разделитель, то функция scanf() пропустит один или несколько разделителей во входном потоке. Под разделителем, или пробельным символом, подразумевают пробел, символ табуляции \t или разделитель строк \n. Все переменные (аргументы списка ввода scanf( )) должны передаваться посредством своих адресов, например с помощью символа &, и соответствовать типам, заданным в строке форматирования. Управляющая строка, задаваемая параметром format, состоит из символов трех категорий: спецификаторов формата; пробельных символов; символов, отличных от пробельных. Спецификация формата начинается знаком % и сообщает функции scanf() тип данного, которое будет прочитано.

Код

Формат

%c

%d

%i

%u

%hd

%e

%E

%f

%lf

%F

%g

%G

%o

%x

%X

%s

%p

%n

%[ ]

%%

Читает один символ

Читает десятичное целое число

Читает целое число в любом формате (десятичное, восьмеричное или шест-надцатеричное)

Читает беззнаковое целое десятичное число

Читает десятичное целое число типа short int

Читает число с плавающей точкой (и в экспоненциальной форме)

Аналогично коду %e

Читает число с плавающей точкой

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

Аналогично коду %f (для стандарта С99)

Читает число с плавающей точкой.

Аналогично коду %g

Читает восьмеричное число

Читает шестнадцатеричное число

Аналогично коду %x

Читает строку

Читает указатель

Принимает целое значение, равное количеству прочитанных до сих пор символов

Просматривает набор символов

Читает знак процента

Строка форматирования читается слева направо, и спецификации формата сопоставляются с аргументом в порядке их перечисления в списке аргументов. Символ *, стоящий после знака % и перед кодом формата, прочитает переменные заданного типа, но запретит их присваивание. Команды форматирования могут содержать модификатор максимальной длины поля. Он представляет собой целое число, располагаемое между знаком % и кодом формата, которое ограничивает количество читаемых для всех полей символов. Если входной поток содержит больше заданного количества символов, то при последующем обращении к операции ввода чтение начнется с того места, в котором «остановился» предыдущий вызов функции scanf(). Если разделитель (например, пробел) встретится раньше, чем достигнута максимальная ширина поля, то ввод данных завершится. В этом случае функция scanf() переходит к чтению следующего поля. При чтении одиночных символов символы табуляции и разделители строк читаются подобно любому другому символу.

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

F - изменяет указатель, заданный по умолчанию, на указатель типа far; N - изменяет указатель, заданный по умолчанию, на указатель типа near; h - преобразует аргумент к типу short int (может записываться перед символами d, i, о, u, х); l - преобразует аргумент к типу long int (может записываться перед символами d, i, o, u, x); L - преобразует аргумент к типу long double (может записываться перед символами е, f, g).

Для вводы чисел типа long long int применяется сдвоенный модификатор ll, например, %lld.

Пример. Ввести данные в переменные разного типа. Определены 3 переменные:

double a; int b; long long int c;

Перед вводом данных печатается строка, которая информирует пользователя о том, какие данные надо вводить и их количество. После этого осуществляется ввод данных.

printf("\n Введите double a, int b, long long int c \n");

scanf("%lf%d%lld",&a,&b,&c);

При работе функции scanf() выполнение программы приостанавливается. Открывается консольное окно и ожидается ввод данных с клавиатуры. Пользователь на клавиатуре может набрать 3 требуемых числа, отделив их одно от друга пробелами.

134.2670982 -10000 2341926252342

После набора нажимается <Enter>. Функция scanf() считывает данные, преобразует их к заданному формату и сохраняет в указанных переменных. Данные можно вводить по одному числу, завершая ввод нажатием клавиши <Enter>. После ввода, преобразования и сохранения очередного числа выполнение программы не продолжится, будет ожидаться ввод следующего числа. Выполнение программы продолжится только после ввода всех данных, указанных в списке.

Если ввод данных задать в двух функциях:

scanf("%lf%d",&a,&b);

scanf("%lld",&c);,

а с клавиатуры ввести такую же строку из трех чисел, то первая функция ввода прочтет 2 числа из входного потока и запишет их значения в переменные a и b. После этого выполнение программы продолжится. Начнется работа второй функции scanf(). Чтение данных из входного потока продолжается с того места, где закончила ввод предыдущая функция. Таким образом, будет введено третье число.

С Т Р У К Т У А С И - П Р О Г Р А М М Ы

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

Обычная СИ-программа представляет собой определение функции main, которая для выполнения необходимых действий вызывает другие функции. Обычно можно давать любые имена для своих функций, но “main" - особое имя: любая программа начинает свои вычисления с первой инструкции функции main. Кроме функций, которые разрабатываются самим программистом, может использоваться большое количество функций, включенных в библиотеки Си.

Пример Си-программы, в которой с клавиатуры вводится значение вещественной переменной x, вычисляется y=x2 и распечатывается на экране.

// Возведение числа в квадрат

//Заголовочные файлы включаемых библиотек

#include <stdio.h>

#include<conio.h>

#include<windows.h>

//Функция возведения вещественного числа в квадрат

double Sqr(double x)

{

return x*x; //возведения х в квадрат

}

//Главная функция программы

int main()

{

//Определение переменных

double x,y;

/*Функции для подключения кириллицы в консольном окне

при вводе/выводе данных*/

SetConsoleOutputCP(1251);

SetConsoleCP(1251);

//Ввод значения аргумента

printf("\n Введите значение x= ");

scanf("%lf",&x);

//Возведение x в квадрат, запись его в y

y=Sqr(x);

//Печать результата

printf("\n Квадрат х=%-9.3lf составляет y=%-9.3lf",x,y);

//Ожидание нажатия клавиши

getch();

return 0;

}

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

В примере используются 2 функции Sqr() и main(), определенные в программе. Скобки (), стоящие после идентификатора, указывают на то, что это функция. Также используются функции, определенные в библиотеках Си. Для того, чтобы сообщить компилятору, что он должен включить информацию о подключаемых библиотеках, в первых 3-х строках программы используются директивы препроцессора, начинающиеся с инструкции #include. В директивах указаны имена заголовочных файлов библиотек. Для функций pintf() и scanf() подключается заголовочный файл стандартной библиотеки ввода-вывода stdio.h, в котором они определены. Функции SetConsoleOutputCP(1251) и SetConsoleCP(1251) используются для подключения кодовой страницы 1251 (кириллические символы) при вводе/выводе данных в консольном окне. Они определены в файле windows.h. Функция getch(), определенная в файле стандартной библиотеки работы с консолью conio.h, ожидает ввода символа с клавиатуры и возвращает его код.

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

Строка double Sqr(double x) является определением функции с именем Sqr. Один из способов передачи данных между функциями состоит в том, что функция при обращении к другой функции передает ей список значений, называемых аргументами. Этот список берется в скобки и помещается после имени функции. Функции Sqr в качестве параметра передается значение вещественного аргумента (double x). Слово double перед именем функции указывает на то, она возвращает значение вещественного типа.

Функция - имеет { "блок" } в фигурных скобках. Блок - это инструкции, написанные на языке Си. Он определяет, что делает функция. Знак «;» после блока в определении функции не ставится. Блок содержит последовательность объявлений, определений и операторов. Возведение аргумента в квадрат выполняется в операции x*x. Оператор return возвращает из функции вычисленное значение. Поэтому блок функции Sqr() содержит только 1 оператор.

Главная функция программы main() не ждет никаких аргументов, что отмечено пустым списком (). Она начинается с определения переменных. При определении переменных указывается тип, после которого задается список переменных данного типа, заканчивающийся знаком ";" :

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

В функции main() определены две переменные double x,y;. При определении переменных их можно проинициализировать (задать начальное значение). Определение double x,y=0.0; указывает, что переменной y будет присвоено значение 0.

Функция вызывается по имени, после которого, в скобках, указывается список аргументов. Таким образом, приведенные ниже строки - это вызов функций с аргументом "1251":

SetConsoleOutputCP(1251);

SetConsoleCP(1251);.

Эти функциииспользуются для подключения кириллицы в консольном окне при вводе/выводе данных. При вызове функции SetConsoleOutputCP(1251) выполнение main() приостанавливается, и управление передается на первый оператор вызванной функции. После завершения работы вызванной функции управление возвращается в main() на следующий оператор.

При вводе значения х функцией printf() в консольном окне будет напечатано переданное ей в параметрах приглашение «Введите значение x=». Функция scanf() приостановит выполнение программы, открывает консольное окно и ожидает окончания ввода данных. Если ввести, например, 123.54 и нажать <Enter>, выполнение программы продолжится.

После ввода значения аргумента х выполняется оператор присваивания:

y=Sqr(x);

В нем вызывается функция Sqr(), которой в параметре передается значение х. Функция возвращает значение х2, которое будет сохранено в переменной y.

Далее функцией printf() результат распечатывается на экране монитора. На экран выводятся значения х и у= х2, отформатированные на ширину поля из 9-и знаков с 3-мя знаками после десятичной точки, и выровненные по левому краю:

Квадрат х=123.540 составляет y=15262.132.

При вызове функции getch(), вновь откроется консольное окно, и будет ожидаться ввод символа с клавиатуры. Пока ожидается ввод символа, консольное окно остается открытым. В это время можно просмотреть полученные результаты. После чего нажимается любая клавиша. Функция getch(), вернет код нажатой клавиши. Но, так как он в программе использоваться не будет, он не сохраняется в переменной.

Работа функции main() заканчивается оператором

return 0;

Функция возвращает операционной системе значение 0 – признак успешного завершения программы.

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

директивы_препроцессора

определения_объектов;

определение_функции_1

определение_функции_2

. . .

определение_функции_N

Определение функции и имеет структуру:

тип имя_функции(<список параметров>)

{

определения_объектов;

исполняемые_операторы;

}

 

А Л Г О Р И Т М И С П О С О Б Ы

Е Г О П Р Е Д С Т А В Л Е Н И Я

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

Свойства алгоритма:

    1. Массовость (универсальность) - применимость алгоритма к различным наборам исходных данных.

    2. Дискретность - процесс решения задачи по алгоритму разбит на отдельные действия.

    3. Определенность (однозначность) - правила и порядок выполнения действий алгоритма имеют единственное толкование.

    4. Конечность  - каждое из действий и весь алгоритм в целом обязательно завершаются.

    5. Результативность - по завершении выполнения алгоритма обязательно получается конечный результат.

    6. Выполнимость - результата алгоритма достигается за конечное число шагов.

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

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

Соседние файлы в папке Прогр_обменка