& – поразрядное И
| – поразрядное включающее ИЛИ
^ – поразрядное исключающее ИЛИ
<< – сдвиг влево
>> – сдвиг вправо
~ – одноместное поразрядное дополнение до единицы
В побитовых операциях работа идет над каждым битом.
Поразрядное включающее ИЛИ
Пример:
8 | 10 = 10
8 – это 1000 в двоичной системе счисления, 10 – это 1010 в двоичной системе счисления. С каждым битом числа выполняется операции логическое ИЛИ, и вместо этого бита ставится результат этой операции, смотри Рисунок 4.
Рисунок 4
Поразрядное И
Пример:
8 & 10 = 8
8 – это 1000 в двоичной системе счисления, 10 – это 1010 в двоичной системе счисления. С каждым битом числа выполняется операции логическое И, и вместо этого бита ставится результат этой операции.
Пример программы в Листинге 12.
Листинг 12
#include
using namespace std;
void dv(int a)
{
int b[100];
int i=0;
while(a>1)
{
b[i]=a%2;
a=(a-a%2)/2;
i++;
}
b[i]=a;
for(int j=i;j>=0;j–)
cout<
}
int main()
{
int a,b;
int c;
cin>>a>>b;
c=a|b;
cout<
dv(a);
cout<<" | ";
dv(b);
cout<<" = ";
dv(c);
c=a&b;
cout<
dv(a);
cout<<" & ";
dv(b);
cout<<" = ";
dv(c);
return 0;
}
Ниже даны тесты для проверки задач программы.
Тест 1
a=10 b=8
Результат
1010 | 1000 =1010
1010 & 1000 =1000
Тест 2
a=11 b=3
Результат
1011 | 11 = 1011
1011 & 11 = 11
Сдвиг влево
Пример:
10 << 2 = 1000
Двоичная запись числа передвинется на 2 знака влево, на их место проставятся 0. Необходимо быть внимательными, так как в типе int и т.д. хранится ограниченное количество бит.
Сдвиг вправо
Пример:
100 >> 2 = 1
Двоичная запись числа передвинется на 2 знака вправо. 2 бита исчезнут.
Одноместное поразрядное дополнение до единицы
С каждым битом выполняется инверсия.
Пример:
x = ~8;
8 – это 1000 в двоичной системе счисления, после инверсии с каждым битом: 1 меняется на 0, 0 на 1. При хранении числа, один бит отвечает за знак, поэтому знак числа тоже меняется. ~x=|~x|-1. Результат: ~8=-9.
Комментарии
Для красивого стиля и правил оформления кода, необходимо, чтобы в коде все функции, блоки и т.д. были расшифрованы. Комментарии бывают /*….*/ (все, что между косыми чертами и звездочкой есть комментарий), // (все, что после // и на одной строке есть комментарий), смотри Листинг 13.
Листинг 13
/*демонстративная программа*/
#include
using namespace std;
int main()
{
cout<<"Hello!"; //Вывод «Hello!» в консоль
}
Строки
Во второй программе мы уже использовали строки. Специальные функции для работы со строками определены в библиотечном файле
Некоторые функции для работы со строками, представлены ниже.
char* strcpy(str1,str2) – копирует строку str2 в строку str1 c ‘\0’, возвращает str1.
char* strcat(str1,str2) – присоединяет str2 в конец строки str1, возвращает str1.
Листинг 14
Работа со строками
#include
#include
int main()
{
char str1[100];
char str2[100];
printf("Vvedite stroky: \n");
scanf("%s",str1);
printf("Vvedenai stroka:\n%s \n",str1);
printf("Vvedite stroky: \n");
scanf("%s",str2);
printf("Vvedenai stroka:\n%s\n",str2);
strcat(str1,str2);
printf("Vvedenai stroka:\n%s\n",str1);
}
Задания:
Написать программу, в которой пользователь дописывает фразу, которую вывел компьютер, результат вывести на экран.
Закрепление материала
Операции
Присваивать значение переменной
a=10;
Вычислить значение выражения a^3+a^2-10.
Листинг 15
#include “stdio.h”
int main()
{
int a,s;
printf(“Vvedite zna4enie a\n”);
scanf(“%d”,&a);
s=a*a*a+a*a-10;
printf(“Rezultat: %d”,s);
}
Операция инкрементирования и декрементирования
++ – операция увеличения на 1,
– – – операция уменьшения на 1.
Операции ++ и – – бывают постфиксные и префиксные.
Пример:
N++;
++N;
–-N;
N–;
Разница в постфиксной и префиксной форме в том, что ++N – прибавление 1 до того, как переменная используется, N++ после того. Аналогично, с операцией –. Смотри Листинг 16, результат на Рисунке 5.
Листинг 16
#include
using namespace std;
int main()
{
int y=3;
cout<
y=3;
cout<
}
Рисунок 5
Приоритет операций и порядок выполнения
В любой операции важен приоритет, как в вычислительном примере порядок действий. Также порядок действий зависит от аппаратно-системной архитектуры, поэтому нужно быть аккуратными.
В Таблице 3 представлен приоритет с ассоциированием слева направо для ANSI C.
Таблица 3
Работа с файлами
С писался для написания Unix, операционной системы. Все устройство Unix – это потоки. Также есть понятие файла. Файл – именованный памяти компьютера. «Поток» – это абстракция, все программирование – это абстракции.
Рассмотрим Листинг 17. 4 строка – это файловый указатель. Об указателях в части 3.
Строка 5.
1 – функция для открытия файла
2 – название файла
3 – режим доступа
Строка 6.
fwrite(“ura”,1,sizeof(char)*u,F);
1 – функция для записи в файл
2 – что записываем, строку
3 – сколько таких строк
4 – размер, функция sizeof() – вычисляет размер типа
5 – файловый указатель
После запуска программы, на компьютере в папке с программой будет текстовый файл «text».
Режимы доступа для функции fopen() приведены в Таблице 4.
Таблица 4
Листинг 17
Ввод в файл. Способ первый
1 #include
2 main()
3 {
4 File *F;
5 F=fopen(“text”, “w+”);
6 fwrite(“ura”,1,sizeof(char)*u,F);
7 fclose(F);
8 }
Рассмотрим второй способ записи в файл, Листинг 18.
Листинг 18
Ввод в файл. Способ второй
1 #include
2 #include
3 main()
4 {
5 File *F;
6 char text[100];
7 printf(«Vvedite text:/n»);
8 scanf(“%s”,&text);
9 F=fopen(“text”, “w+”);
10 fwrite(text,1,sizeof(char)*strlen(text), F);
11 fclose(F);
12 }
fwrite(text,1,sizeof(char)*strlen(text),F)
1 – функция для записи в файл
2 – что записываем, массив символов
3 – сколько таких строк
4 – размер, функция sizeof() – вычисляет размер типа, функция strlen() – вычисляет длину заполненного массива text.
5– файловый указатель
fclose(F);
1 – функция для закрытия файла
2 – файловый указатель
Задания:
Записать в файл строку.
Прочитать из файла текст.
Структуры
«Структура – это совокупность нескольких переменных, часто различных типов, сгруппированных под единым именем для удобства обращения» [4].
Методов в структурах нет в стандарте ANSI C. Я бы не рекомендовала смешивать методы С, С++ и следить за версиями компилятора для красоты стиля программирования.
Несколько структур с одним набором данных.
struct {…} x,y,z;
Описание структуры.
struct point
{
int x;
int y;
};
Объявление структур: через точку, в начале название структуры, в конце имя переменной
point.x;
Листинг 19
Создание структуры
1 #include
2 struct point
3 {
4 int x;
5 int y;
6 };
7 int main ()
8 {
9 printf(“Введите координаты точки /n Введите абциссу точки”);
10 scanf(“%d”,&point.x);
11 printf(«Введите ординату точки»);
12 scanf(“%d”,&point.y);
13 printf(“/n (%d,%d)”,point.x,point.y);
14 }
Массивы структур
struct key
{
char* word;
int count;
}keytab[NKEYS];
Листинг 20
Работа со структурой
1 #include
2 struct zapisi
3 {
4 char text[100];
5 char data[11];
6 };
7 main()
8{
9 struct zapisi x;
10 int d;
11 printf(«Vvedite datu, v formate dd.mm.yyyy: \n»);
12 scanf(“%s”,x.data);
13 printf(“Vvedite poslanie: \n”);