C + + Л Е К Ц І Я 1.1
Программа печати сообщения “Hello
World!” имеет вид:
#include <stdio.h>
void main(void)
{
printf("Hello
World!\n");
}
Для использования функций ввода-вывода
следует подключить библиотеку стандартного ввода-вывода (STanDart
Input-Output). Библиотека подключается ключевым словом include, перед которым
ставится символ #.
Строки в языке Си выделяются двойными
кавычками (в Паскале – одинарными). Символ перевода курсора на новую строку
имеет вид ‘\n’. При помощи функции printf в программе выводится строка "Hello
World!", после чего производится перевод курсора на новую строку.
После компиляции программы на языке Си
операционная система вызывает функцию main. Слово main являет ключевым –
оно является именем функции, которая вызывается операционной системой при
старте программы. Функция main обязана присутствовать в любой
программе Си, так как она является точкой входа в программу.
Открывающаяся и закрывающаяся скобки { …
} в Си являются аналогом begin .. end в Паскале.
ПЕРЕМЕННЫЕ И ИХ ОБЪЯВЛЕНИЯ
Переменные представляют собой
область памяти для хранения данных. Имя переменных называют идентификатором.
Имя переменной может содержать от одного до 32
символов. Разрешается использовать строчные и прописные буквы, цифры и символ
подчёркивания, который в Си считается буквой. Первым символом обязательно
должна быть буква. Имя переменной не может совпадать с зарезервированными
словами.
Объявление переменных происходит в операторе описания, состоящем из
спецификации типа и списка имён переменных, разделённых запятой. В конце
оператора должна стоять точка с запятой.
Например, объявить две целочисленные
переменные x, y и одну символьную c можно следующим образом:
int x,y;
char c;
ФОРМАТ ВВОДА-ВЫВОДА. ВЫЧИСЛЕНИЕ СУММЫ ДВУХ ЧИСЕЛ
Для форматированного ввода-вывода данных
пользуются функциями scanf и printf. Первый аргумент
функций содержит формат ввода-вывода. Далее следуют вводимые (выводимые)
переменные. Следующая таблица представляет формат ввода-вывода элементарных
типов данных в Си:
описание типа
|
тип
|
формат
|
целочисленный, 4 байта
|
int
|
%d
|
целочисленный, 8 байт
|
__int64
|
%I64d
|
целочисленный, 8 байт
|
long long
|
%lld
|
действительный, 4 байта
|
float
|
%f
|
действительный, 8 байт
|
double
|
%lf
|
символьный, 1 байт
|
char
|
%c
|
строка, массив символов
|
char[], строка
|
%s
|
Оператор присваивания в языке Си имеет
вид знака равенства ‘=’.
Операторы в языке Си разделяются знаком
‘;’.
Комментарии в языке Си выделяются
символами /* … */.
Комментарии до конца строки следуют
после символов //.
Пример 1. Инициализируем
переменные i (целое), j (вещественное), c (символьное) соответственно значениями 4, 5,4, ‘A’ и выведем их
на экран. В дальнейшем операции ввода-вывода будем комментировать, указывая
вводимые и выводимые значения.
#include <stdio.h>
int i = 4;
double j = 5.4;
char c = 'A';
void main(void)
{
printf("%d
%lf %c\n", i, j, c); // 4 5.400000 A
}
Символьным переменным можно присваивать
не только символы, но и значения от 0 до 255. В таком случае переменная будет
принимать значение того символа, ASCII код которого ей присвоен. Значения
символьных переменных можно выводить как символы (используя формат вывода %c)
или как числа – ASCII коды символов (используя формат вывода %d).
Напоминание! Сокращение ASCII расшифровывается как American Standart Code for Information Interchange.
Пример 2. Присвоим символьной
переменной с значение 65 и выведем
ее, используя форматы %c и %d. Напомним, что ASCII код символа ‘A’ равен 65.
#include <stdio.h>
char c = 65;
void main(void)
{
printf("%c
%d\n", c, c); // A 65
}
Упражнение 1. Напишите программу, которая выведет на
экран строку из четырех символов, ASCII коды которых соответственно равны 3, 4,
5 и 6.
#include <stdio.h>
char c1 = 3;c2=4;c3=5;c4=6;
void main(void)
{
printf("%c %c
%c %c\n", c1, c2, c3,c4);
}
Пример 3. Рассмотрим программу, которая вводит два целочисленных
числа a и b, вычисляет их сумму в переменной res и выводит на печать пример в формате
«слагаемое + слагаемое
= сумма»
В качестве второго аргумента функции scanf
следует передавать адреса переменных. Адрес переменной x обозначается &x.
#include <stdio.h>
int a, b, res;
void main(void)
{
scanf("%d
%d",&a,&b); // a = 3,
b = 5
res = a + b;
printf("%d +
%d = %d\n", a, b, res); // 3 + 5 = 8
}
Операции ввода-вывода можно также
выполнять при помощи потоковых бесформатных функций cin и cout
библиотеки <iostream.h> (тільки в C++). Но они работают значительно медленнее, чем prinf и scanf
(прийшло з мови С). Поэтому для выполнения операций ввода-вывода
рекомендуется пользоваться библиотекой <stdio.h>.
Пример. Перепишем программу из примера 2.3.3.
вычисления суммы двух чисел с использованием функций cin и cout:
#include <iostream.h>
int a, b, res;
void main(void)
{
cin >> a >>
b; // a = 3, b = 5
res = a + b;
cout << res <<
endl; // 8
}
Упражнение 2. Напишите программу, которая по заданным двум действительным числам a и b
находит и выводит значение выражения a2
+ b2.
#include <stdio.h>
#include
<math.h>
int a, b, res;
void main(void)
{
scanf("%d
%d",&a,&b);
res = a*a + pow (b,2);
printf("%lf
^2 + %lf ^2 = %d\n", a, b, res);
}
2.6. БИТЫ. БАЙТЫ. СЛОВА
Битом называется единица информации. В одну ячейку памяти
размером 1 бит можно занести два значения: 0
или 1.
Байтом называется ячейка памяти, состоящая из 8 битов.
Словом называется ячейка памяти, состоящая из двух байт или 16
битов.
Двойным словом называется ячейка памяти, состоящая из четырех байт или
32 битов.
В языках программирования различают, как правило, знаковые
и беззнаковые
типы данных. Беззнаковые типы данных хранят только неотрицательные значения,
знаковые могут содержать как положительные, так и отрицательные числа.
Беззнаковые типы данных. В трех битах можно хранить значения от 0 до 7:
содержимое 3 битов
|
значение
|
000
|
0
|
001
|
1
|
010
|
2
|
011
|
3
|
100
|
4
|
101
|
5
|
110
|
6
|
111
|
7
|
В n битах можно хранить числа от
0 до 2n – 1. Например, в
беззнаковом байте можно записать любое число от 0 до 255, а в беззнаковом
двойном слове – число от 0 до 232 – 1 = 4294967295.
При выводе десятичных значений переменных беззнаковых типов вместо %d (decimal) пользуются %u (unsigned).
Знаковые типы данных. Старший бит знакового типа данных отвечает за знак числа. Число является
положительным, если бит равен 0 и отрицательным, если бит равен 1. Например, в
трех битах можно хранить знаковые значения от -4 до 3:
содержимое 3 битов
|
значение
|
011
|
3
|
010
|
2
|
001
|
1
|
000
|
0
|
111
|
-1
|
110
|
-2
|
101
|
-3
|
100
|
-4
|
В n битах можно хранить
знаковые числа от -2n-1
до 2n-1 – 1.
Например, в байте можно записать любое число от -128 до 127, в двойном слове –
число от -231 = -2147483648 до 231 – 1 = 2147483647.
Целочисленный тип int в языке Си четырехбайтовый,
поэтому переменные типа int могут хранить значения в
промежутке [-231; 231 – 1] = [-2147483648; 2147483647].
Целочисленный тип long long в языке Си восьмибайтовый, поэтому переменные типа long long могут хранить
значения в промежутке [-263; 263 – 1] =
[-9223372036854775808; 9223372036854775807].
Пример 4. Если к максимальному
целочисленному значению прибавить 1, то получится наименьшее целочисленное
значение. Аналогично если из наименьшего значения типа int вычесть 1, то
получится наибольшее значение типа int.
#include <stdio.h>
int i = 2147483647;
void main(void)
{
printf("%d
%d\n", i, i + 1); // 2147483647 -2147483648
i++;
printf("%d
%d\n", i, i - 1); // -2147483648 2147483647
}
Константы INT_MIN и INT_MAX, объявленные в библиотеке
<limits.h>, соостветственно равны наименьшему и наибольшему значению,
которое может принимать переменная типа int.
Упражнение 3. Вывести
значения переменных INT_MIN, INT_MAX и их сумму.
#include <stdio.h>
#include <limits.h>
int i = INT_MIN, j = INT_MAX, sum;
void main(void)
{
printf("Min
Value:%d \nMax Value: %d\n", i, j);
// Min Value:
-2147483648
// Max Value:
2147483647
sum = i + j;
printf("Summa: %d \n",
sum);
}
Пример. Выведем
наибольшее и наименьшее значение восьмибайтового целочисленного знакового
типа long long. Для того чтобы
число имело тип long long, а не int, после него следует писать
суффикс LL. Например, значение (1LL << 63) – 1 будет иметь тип long long и равняться
9223372036854775807 =2^63-1 , а (1 << 63) – 1 будет типа int и равняться -1
(значение 1 << 63 при вычислении на 32 битах равно нулю, потому что
слищком большое и не поместится в 32 бита).
#include <stdio.h>
long long
i;
int j;
void main(void)
{
i = (1LL << 63) - 1;
j = (1
<< 63) - 1;
printf("max
long long i =: %lld\n min long long: i + 1 = %lld\n",i,i+1);
//
max long long: i = 9223372036854775807 = 2 ^ 63 - 1
// i + 1
= -9223372036854775808 = -2 ^ 63
printf("int
j =: %d\n",
j);
// int j = -1
}
Пример. Выведем наибольшее значение беззнаковых 32 и 64
– битовых целочисленных типов (потому что 0 - наименшее беззнаковое число, а менше его -1
- и берется наибольшее беззнаковое число соот ветственного типа).
#include <stdio.h>
unsigned int
i = -1;
unsigned long
long j = -1;
void main(void)
{
printf("%u
%llu\n",i,j);
// 4294967295 =
2 ^ 32 - 1, 18446744073709551615 = 2 ^ 64 - 1
}
Пример. Выведем восьмеричное,
десятичное и шестнадцатиричное представление числа 255. Шестнадцатиричное
представление чисел можно выводить как прописными (%x), так и заглавными (%X) буквами.
#include <stdio.h>
int i = 255;
void main(void)
{
printf("%o
%d %x %X\n",i,i,i,i);
//
377 255 ff FF
}
Немає коментарів:
Дописати коментар