И математическое моделирование

Вид материалаМетодические указания

Содержание


Константы и переменные
Лабораторная работа № 2
Год рождения
3. Организация вычислений. операции языка си. математические функции
Операция преобразования типа.
Подобный материал:
1   2   3   4   5

Константы и переменные


Под константой будем понимать значение, имеющее некоторый тип, и которое не может быть изменено. Например: 2, 321, 15 – константы целого типа; 3.1416, 2.71 – константы вещественного типа; «абабагаламага» – строковая константа.

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

Целые константы соответствуют типам: char, int, short, long, и могут быть записаны в десятичной, восьмеричной или шестнадцатеричной системах счисления. Так, последовательность цифр, начинающихся не с нуля, обозначает десятичную запись числа (например: 12, 64, 321); начинающаяся с 0 (ноль) – восьмеричную (например: 045, 0123, 0231) и с 0x или 0X (ноль-икс) – шестнадцатеричную запись числа (например: 0x12, 0x3F, 0x4d). Для обозначения длинных целых констант (типа long) в конце записи дописывается малая или большая английская буква L или l. Например: 1234L, 0x1223l. Для того, чтобы подчеркнуть, что константа является беззнаковой, дописывается U или u: 123u, 13244U, 145UL.

Вещественные константы обозначают в виде целой части, десятичной точки, дробной части, символа e или E и экспоненты со знаком или без. При этом, запись может не содержать целой или дробной части, а также экспоненты. Например: 3.12E-2 (представление числа 0.0312), 15E-2, 123., .321, 12.2. По умолчанию вещественные константы имеют тип double. Если необходимо указать, что константа имеет тип float, в конце записи добавляют F или f. Для обозначения констант типа long double – дописывают L или l.

Символьные константы – это один или два символа, заключенные в апострофы (‘ ‘). Последовательности, начинающиеся со знака \ , называются управляющими. Некоторые наиболее часто используемые управляющие символы приведены в таб. 2.3.


Таблица 2.3

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

Символ

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

Символ

\b

возврат на один шаг

\r

Возврат каретки

\n

новая строка

\t

Табуляция

\\

\

\0ddd

Символ с кодом ddd в восьмеричной системе

\%

%

\‘



\0xdd

Символ с кодом dd в шестнадцатеричной системе

\?

?

\"

"


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


"\nНовая строка",

"\n\"Алгоритмические языки программирования\"".


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


enum {ten=10, three=3, four, five, six};

enum {Sun, Mon, Tue, Wed, Thu, Fri, Sat};


Переменная – именованная область памяти, в которой хранятся данные определенного типа. У переменной есть имя и значение. Имя служит для обращения к области памяти, в которой хранится значение. Перед использованием любая переменная должна быть описана. Описание переменной может быть выполнено в любом месте программы. Общий вид оператора описания: <тип переменной> <имя переменной>. При описании переменной также может быть присвоено начальное значение (инициализация переменной). Если вводится несколько переменных одного типа, можно перечислить их имена через запятую. Перед типом переменной возможно использование ключевого слова const (переменные, объявленные таким образом не могут менять своего значения после инициализации). Например:


int a = 10;

float b = 20.5f;

double c, d, e;

char d[50] = “первая строка\nвторая строка”;

const double ___my_pi = 3.1416;


4. Организация ввода \ вывода


Для ввода/вывода данных в Cи используются функции, которые описываются в библиотечном файле stdio.h.

Для ввода с клавиатуры и вывода на экран в Си используются функции scanf и printf, имеющие следующий формат:


scanf (<форматная строка>, <список аргументов>);

printf (<форматная строка>, <список аргументов>);


Форматная строка – это строка символов (включая управляющие символы, приведенные в таб. 2.3), а также спецификации преобразования. Каждому аргументу из списка аргументов соответствует своя спецификация преобразования. Для функции printf аргументы из списка аргументов представляют собой некоторые значения, представленные константой, выражением либо переменной. Для функции scanf аргументы представляют собой адреса переменных, в которые осуществляется ввод соответствующих значений. К примеру, если задана переменная a типа int, то для вывода её значения на экран при помощи функции printf в списке аргументов необходимо указать a, а для ввода при помощи функции scanf – адрес этой переменной &a (& – операция взятия адреса).

Основная задача спецификации преобразования – указать тип и формат выводимого значения. Общий вид спецификации преобразования:


%<модификатор><спецификация формата>


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

Таблица 2.4

Спецификация

Тип аргумента

Описание

%d, %i

Знаковое целое

Десятичное целое

%u

Беззнаковое целое

Десятичное целое

%x, %X

16-ричное целое

%o

8-ричное целое

%f

Действительное

В форме [-]dddd.ddd

%e, %E

Действительное

В экспоненциальной форме

%g, %G

Действительное

В форме %e или %f (зависит от числа)

%c

char

Одиночный символ

%s

char [], char *

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


Модификатор (необязательная часть) – может содержать:
  • минимальную ширину поля. Обозначается одним целым числом N, указывающим минимальную ширину поля вывода. Если выводимое значение не достигает минимальной ширины поля, то выводимое значение дополняется пробелами: слева – для положительного N, и справа – для отрицательного.
  • ширина поля дробной части (для действительных чисел). Обозначается в виде .M, где M – целое число, обозначающее выводимое количество разрядов дробной части. Если задана минимальная ширина поля, то она обозначает общее минимальное количество символов в поле вывода (включая точку).
  • модификатор типа (существенно при вводе значений типа short, long, double, long double). Задаётся в виде одной буквы: h – для short, l – для long и double, L – для long double. Например, для ввода параметра типа double, то вместо “%f” необходимо писать “%lf”.


// пример программы ввода и вывода


#include


void main()

{

int a; long b; // целые типы

float c; double d; // действительные

char e; // символ

char f[200]; // строка


printf("a="); scanf("%i", &a); // запрос и ввод a

printf("b="); scanf("%li", &b); // запрос и ввод b

printf("c="); scanf("%f", &c); // запрос и ввод c

printf("d="); scanf("%lf", &d); // запрос и ввод d

printf("e="); scanf("%c", &e); // запрос и ввод e

printf("f="); scanf("%s", &f); // запрос и ввод f


// вывод всех введенных переменных на экран

printf("a=%5i\nb=%5i\nc=%5.2f=%7e\nd=%5.2f=%7e\ne=%3c\nf=%10s\n",

a, b, c, c, d, d, e, f);

}


ЛАБОРАТОРНАЯ РАБОТА № 2

ОРГАНИЗАЦИЯ ВВОДА / ВЫВОДА

Цель:
  1. Изучение основных типов данных языка Си.
  2. Приобретение навыков работы с функциями ввода / вывода.

Контрольные вопросы:
  1. Что такое тип данных?
  2. Равны ли строки: «01» и «\0x30\0x31»?
  3. Сформируйте текстовую константу, которая при выводе формирует на экране следующую запись:


ФАМИЛИЯ: <Ваша фамилия>

ИМЯ: <Ваше имя>

ОТЧЕСТВО: <Ваше отчество>

ГОД РОЖДЕНИЯ: <Ваш год рождения>


Выравнивания значений добейтесь за счёт использования табуляции.

  1. Значение какой из переменных (a или b) больше?


unsigned int a = 23;

unsigned int b = -1;

  1. Чему будет равно значение переменной a после выполнения следующего фрагмента кода?


int b = 1;

int &a = b;

a = 2;

b = 5;

  1. В чём разница между ссылкой и указателем?
  2. Найдите ошибку в следующем фрагменте кода:


#include


void main()

{

int a, b, c;

scanf(“%i %i”, a, b);

c = a+b;

printf(“\n a+b=%i+%i=%i”, a, b, c);

}
  1. В чём заключается различие в работе следующих команд:


scanf(“%i %i %i”, &a, &b, &c);

scanf(“%i,%i,%i”, &a, &b, &c);


Задание:

1) Организовать ввод переменных:
      • целых int a, long b;
      • действительных float c, double d;
      • символьной char e;
      • строковой char f[].

2) Организовать вывод:
      • целых переменных с шириной поля L;
      • действительных переменных в форме ddd.ddd с шириной поля вывода M и количеством разрядов дробной части N, а также в экспоненциальной форме шириной поля вывода P;
      • символьной переменной с шириной поля Q;
      • строковой переменной с шириной поля R.

Значения L, M, N, P, Q, R для каждого варианта приведены в таб. 2.5.


Таблица 2.5

Вариант

L

M

N

P

Q

R

1

7

12

5

10

2

10

2

8

12

4

11

3

11

3

9

12

3

12

4

12

4

10

13

2

10

5

13

5

11

13

2

11

2

14

6

7

13

3

12

3

15

7

8

14

4

10

4

15

8

9

14

5

11

5

14

9

10

14

5

12

2

13

10

11

11

4

10

3

12

11

7

11

3

11

4

11

12

8

11

2

12

5

10

13

9

10

2

10

2

10

14

10

10

3

11

3

11

15

11

10

4

12

4

12



3. ОРГАНИЗАЦИЯ ВЫЧИСЛЕНИЙ. ОПЕРАЦИИ ЯЗЫКА СИ. МАТЕМАТИЧЕСКИЕ ФУНКЦИИ

  1. Операции языка Си


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


Таблица 3.1

Операция

Назначение

Пример использования

::

Обращениеие к глоб. перем.

::a

[]

()

sizeof

sizeof

Индексация массива

Вызов функции

Размер объекта

Размер типа

a[12]

func(a, s)

sizeof(a)

sizeof(int)

++

++

--

--

~

!

-

&

()

Приращение после

Приращение до

Уменьшение после

Уменьшение до

Дополнение (побитовое «не»)

Логическое «не»

Унарный минус

Взятие адреса объекта

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

a++

++a

a--

--a

~a

!a

-a

&a

(int)a

*

/

%

Умножение

Деление

Остаток от деления

a*b

a/b

a%b

+

-

Сложение

Вычитание

a+b

a-b

<<

>>

Сдвиг битов влево

Сдвиг битов вправо

a<
a>>b

<

<=

>

>=

Меньше

Меньше или равно

Больше

Больше или равно

a
a<=b

a>b

a>=b

==

!=

Равно

Не равно

a==b

a!=b

&

Побитовое «И»

a&b



Побитовое «исключающее или»

ab

|

Побитовое «ИЛИ»

a|b

&&

Логическое «И»

a&&b

||

Логическое «ИЛИ»

a||b

?:

Условная операция

a?b:c

=

*=

/=

%=

+=

-=

<<=

>>=

&=

|=

=

Присваивание

Умножить и присвоить

Разделить и присвоить

Присвоить остаток от деления

Сложить и присвоить

Отнять и присвоить

Сдвиг влево – присвоить

Сдвиг вправо – присвоить

Побитовое «И» – присвоить

Побитовое «ИЛИ» – присвоить

«исключающее или» – присвоить

a=b

a*=b

a/=b

a%=b

a+=b

a-=b

a<<=b

a>>=b

a&=b

a|=b

a=b

,

Операция «запятая»

a+b, c*d


Рассмотрим подробнее некоторые из перечисленных операций.


Операция преобразования типа. Язык Си не относится к так называемым языкам с жесткой типизацией. Это проявляется в так называемом неявном преобразовании типов. Для демонстрации данного принципа рассмотрим следующий пример:


void main()

{

int c;

float a = 5.1f, b = 3.1f;

c = a+b;

}


Прокомментируем данный пример. Очевидно, результатом операции a+b будет число 8.2 типа float. Однако результат операции сложения необходимо присвоить переменной с, имеющей тип int. В языках с жесткой типизацией подобное действие просто невозможно. В Си же выше приведенный фрагмент кода не является ошибочным – значение 8.2 типа float будет неявно преобразовано в значение 8 типа int. Очевидно, при подобном преобразовании типов возможна потеря данных (в нашем случае – потеряна дробная часть 0.2). Для того, чтобы объяснить компилятору, что мы не ошибочно, а намеренно делаем подобное преобразование типов, используется операция преобразования типов. В данном случае вместо строки: c = a+b – можно было записать: c = (int) (a+b).