- •Ответы по дисциплине «Основы алгоритмизации и программирования»
- •Запись алгоритма Евклида на языке с
- •Int main() {
- •Эвристический алгоритм «ближайшего соседа»
- •Эвристический алгоритм «ближайших пар»
- •«Правильный» алгоритм поиска маршрута
- •Эволюция языка с bcpl → b → c → k&r c → ansi c → c99 → c1x
- •#Define имя текст_для_подстановки
- •123, 67543, 037, 07777, 0Xabf7, 0xffff, …
- •123456789L, 0xful (это просто число 15).
- •Определение символических констант в limits.H
- •Int lower, upper, step;
- •Int main() {
- •Int main() {
- •Int main() {
- •Всего операций: 47
- •If (условие) оператор
- •If (условие) оператор1 else оператор2
- •Int main() {
- •Int main() {
- •Int main() {
- •Int main() {
- •If (found)
- •Адресация памяти
- •Адреса объектов программы
- •Int fact(int n) {
- •О размерах участков памяти, выделяемых объектам
- •Правила адресной арифметики
- •Никакие другие операции к адресам неприменимы, т.Е. Адреса нельзя умножать, делить, складывать между собой и пр.
- •Имя массива – это константный указатель на его начало.
- •T X[] эквивалентно t *X
- •Int main() {
- •Void *calloc(size_t n, size_t r)
- •Void free(void *p)
- •Int main() {
- •Void *p;
- •Void swaps(char** a, char** b) {
- •Int main(void) {
- •Int main() {
- •Правило «право-лево»
- •Int pt_in_rect(struct point p, struct rect r) {
- •Int main() {
- •Int main() {
- •Int ival;
- •Void init(Vector*);
- •Void resize(Vector*, int);
- •Void push_back(Vector*, double);
- •Void push_s(Stack *st, double d) {
- •Void init_q(Queue *q) {
- •Void enqueue(Queue *q, double d) {
- •Int dequeue(Queue *q, double *d) {
- •Typedef struct Heap {Vector V;} Heap;
- •Void init_h(Heap *hp) {
- •Int Heap_Maximum(Heap *hp, double *z) {
- •Void Max_Heap_Insert(Heap *hp, double X){
- •Void Max_Heapify(Heap *hp, int I) {
- •Int l, r, largest;
- •Int Heap_Extract_Max(Heap *hp, double *z) {
- •Void Build_Max_Heap(Heap *hp) {
- •Void Insert_head_l1(List1 *l, double z) {
- •Void Insert_back_l1(List1 *l, double z) {
- •Int Extract_head_l1(List1 *l, double *z) {
- •Int Extract_back_l1(List1 *l, double *z) {
- •Void reverse_l1(List1 *l) {
- •Исходный код функции sort_l1
- •Void sort_l1(List1 *l) {
- •Void visit(List1* l) {
- •Void traverse(List1* l) {
- •Void Print_l1(List1 *l) {
- •Void Insert_l2(List2 *l, double z, int direction) {
- •Прямой обход (сверху вниз), при котором мы посещаем узел, а затем левое и правое поддеревья
- •Поперечный обход (слева направо), при котором мы посещаем левое поддерево, затем узел, а затем правое поддерево
- •Обратный обход (снизу вверх), при котором мы посещаем левое и правое поддеревья, а затем узел.
- •Простой метод сортировки массива
- •Задача о взвешивании монет
- •1) Очевидно, что на последнем шаге процедуры взвешивания мы должны иметь дело максимум с 3 монетами, чтобы в при любом исходе взвешивания получить результат.
- •2) Задача предпоследнего шага – отобрать группу из 3-х монет. Это можно сделать, если в нашем распоряжении будет не более 9 монет (3 группы по 3 монеты).
- •3) Наконец, если у нас будет от 10 до 27 монет, мы сможем отобрать из них не более 9
- •Void mov(int n, char a, char c, char b) {
- •Int main() {
Int lower, upper, step;
char c, line[1000];
char esc = ‘\\’;
int limit = MAXLINE + 1;
float eps = 1.0e-05;
К объявлению любой переменной можно добавить модификатор const, который придаст этой переменной свойство “read only” (только для чтения). Попытка присвоить такой переменной (или элементу массива) нового значения вызовет ошибку компиляции:
const double e = 2.71828182845905;
const char msg[] = “Warning: “;
Вопрос №16. Определение понятий «операция» и «операнд». Классификация операций по числу операндов. Определение понятия «выражение».
Операции определяют преобразования, которые можно производить с объектами программы.
В зависимости от количества операндов, участвующих в одной операции, операции делятся на:
унарные (одноместные, применяются к одному операнду);
бинарные (двуместные, два операнда) и
тернарные (трехместные, три операнда).
В результате выполнения операции получается некоторое значение (которое можно использовать для последующих вычислений) и, возможно, изменяется значение одного из операндов.
Из операций конструируются более сложные объекты программы – выражения.
Вопрос №17. Арифметические операции.
операция |
смысл |
пример |
+ |
сложение |
x=3+2; y+z; x+y+2; |
- |
вычитание |
3−2; int x=y−z; y−2−z; |
* |
умножение |
int x=3∗2; int x=y∗z; x∗y∗2; |
/ |
деление |
float x=3/2; /∗ x=1 ∗/ float x=3.0/2 /∗x=1.5 ∗/ int x=3.0/2; /∗ x=1 ∗/ |
% |
остаток от деления |
int x=3%2; /∗ x=1 ∗/ int y=7;int x=y%4; /∗ x=3 ∗/ int y=7;int x=y%10; /∗ x=7 ∗/ |
Вопрос №18. Операции отношения.
Операции отношения сравнивают два операнда и выдают «булевский» результат («ложь» – 0, «истина» – отлично от 0)
операция |
смысл |
пример |
> |
больше |
3>2; /∗ 1 ∗/ 2.99>3 /∗ 0 ∗/ |
>= |
больше или равно |
3>=3; /∗ 1 ∗/ 2.99>=3 /∗ 0 ∗/ |
< |
меньше |
3<3; /∗ 0 ∗/ ’A’<’B’/∗ 1∗/ |
<= |
меньше или равно |
3<=3; /∗ 1 ∗/ 3.99<3 /∗ 0 ∗/ |
== |
равно |
3==3; /∗ 1 ∗/ ’A’==’a’/∗ 0 ∗/ |
!= |
не равно |
3!=3; /∗ 0 ∗/ 2.99!=3 /∗ 1 ∗/ |
Вопрос №19. Логические операции. Особенности вычисления выражений, содержащих логические операции.
операция |
смысл |
пример |
&& |
AND |
((9/3)==3) && (2∗3==6); /∗ 1 ∗/ (’A’==’a’) && (3==3) /∗ 0 ∗/ |
|| |
OR |
2==3 || ’A’==’A’; /∗ 1 ∗/ 2.99>=3 || 0 /∗ 0 ∗/ |
! |
NOT |
!(3==3); /∗ 0 ∗/ !(2.99>=3) /∗ 1 ∗/ |
Выражения, содержащие логические операции, вычисляются слева направо, и вычисление прекращается, как только установлена гарантированная истинность или ложность результата, например:
(3==3) || ((c=getchar())==’y’) – второе выражение не вычисляется.
(0) && ((x=x+1)>0) - второе выражение не вычисляется.
Вопрос №20. Операции инкремента и декремента.
Это – унарные операции, позволяющие увеличить или уменьшить на 1 текущее значение операнда. Каждая из них существует в двух формах – постфиксной и префиксной.
Постфиксная форма
x++ означает то же самое, что и x=x+1;
x−− означает то же самое, что и x=x−1;
y=x++; означает то же самое, что и y=x; x=x+1; x используется до его автоувеличения.
y=x−−; означает то же самое, что и y=x; x=x−1; x используется до его автоуменьшения.
Префиксная форма
++x означает то же самое, что и x=x+1;
−−x означает то же самое, что и x=x−1;
y=++x; означает то же самое, что и x=x+1;y=x; x используется после его автоувеличения.
y=−−x; означает то же самое, что и x=x−1;y=x; x используется после его автоуменьшения.
Вопрос №21. Поразрядные (битовые) операции.
Эти операции применимы только к целочисленным аргументам типов: char, short, int и long (как к имеющим знак, так и к беззнаковым).
операция |
смысл |
пример |
& |
AND |
0x77 & 0x3; /∗ 0x3 ∗/ 0x77 & 0x0; /∗ 0 ∗/ |
| |
OR |
0x700 | 0x33; /∗ 0x733 ∗/ 0x070 | 0 /∗ 0x070 ∗/ |
^ |
XOR |
0x770 ^ 0x773; /∗ 0x3 ∗/ 0x33 ^ 0x33; /∗ 0 ∗/ |
<< |
сдвиг влево |
0x01<<4; /∗ 0x10 ∗/ 1<<2; /∗ 4 ∗/ |
>> |
сдвиг вправо |
0x010>>4; /∗ 0x01 ∗/ 4>>1 /∗ 2 ∗/ |
~ |
инверсия битов |
x = x & ~077 /*сбросить в 0 младшие 6 бит*/ |
Лекции 4-5. Типы данных, операции и выражения (продолжение).
Вопрос №22. Операция присваивания и ее особенности в языке С.
В языке С операция присваивания немного отличается от аналогичной операции в других языках:
Присваивание a = b действительно является операцией (а не оператором), т.е. после завершения этой операции получается некоторое значение (в данном примере – значение переменной b), которое может быть использовано для последующих вычислений. Следовательно, присваивание может применяться внутри выражений, наряду с другими операциями.
#include <stdio.h>
#include <stdlib.h>