- •Ответы по дисциплине «Основы алгоритмизации и программирования»
- •Запись алгоритма Евклида на языке с
- •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() {
If (условие) оператор
Например: if (x%2) y += x/2;
Т.е. если x – нечетно, то y увеличивается, в противном случае ничего не делается.
Если при выполнении условия нужно выполнить последовательность операторов, необходимо использовать блок
В другом случае требуется выбрать для выполнения один из двух операторов, в зависимости от некоторого условия:
If (условие) оператор1 else оператор2
Например: if (a>b) c=a; else c=b;
Вопрос №29. Вложенные операторы выбора.
Если в качестве исполняемого оператора в операторе выбора используется другой оператор выбора, возникает ситуация вложенности операторов выбора.
Пример: найти: d = max(a, b, c)
Вопрос №30. Реализация множественного выбора с помощью else if.
Фрагмент алгоритма программы «Калькулятор»:
…
if (c==‘+’) r = a + b;
else if (c==‘+’) r = a + b;
else if (c==‘-’) r = a - b;
else if (c==‘*’) r = a * b;
else if (c==‘/’) r = a / b;
else printf(“error!\n");
…
Вопрос №31. Оператор множественного выбора switch. Необходимость использования break.
Для алгоритмов с множественным выбором существует специальный оператор:
…
switch(c){
case '+': r = a + b; break;
case '-': r = a - b; break;
case '*': r = a * b; break;
case '/': r = a / b; break;
default: printf(“error!\n");
}
…
При отсутствии операторов break реализуется совсем другой алгоритм:
…
switch(c){
case '+': r = a + b;
case '-': r = a - b;
case '*': r = a * b;
case '/': r = a / b;
default: printf(“error!\n");
}
…
Общий вид оператора switch:
switch (выражение) {
case констант-выраж1: операторы
case констант-выраж2: операторы
…
default: операторы
}
Действие оператора: вычисляется значение выражения и это значение последовательно сравнивается со значениями константных выражений в блоках case. Если произошло совпадение значений, выполняются операторы соответствующего блока case. Как правило, последним оператором в каждом блоке case является оператор break («прервать») и поэтому по завершению выбранного case-блока вычислительный процесс выходит за пределы оператора switch. Если совпадения значений не произошло ни для одного из case-блоков, то выполняются операторы блока default (если он есть) или вычислительный процесс сразу выходит за пределы оператора switch.
Вопрос №32. Оператор цикла с предусловием while.
Во многих алгоритмах встречается элементарная конструкция, приведенная на блок-схеме. Она соответствует многократному (циклическому) повторению оператора (или нескольких операторов в блоке), пока некоторое выражение не станет равным нулю (получит значение «ложь»).
Это записывается так:
while(выражение)
оператор
Такая конструкция называется циклом с предусловием.
Вопрос №33. Оператор цикла с предусловием for.
В
языке С существует еще одна форма цикла
с предусловием, более сложная по
сравнению с простейшей формой while.
В этой форме дополнительно участвуют
еще два выражения, одно из которых
вычисляется однократно, до проверки
условия, а второе – многократно, после
всех операторов, выполняемых в цикле. Это
записывается так: for(выраж1;
выраж2; выраж3)
оператор В
круглых скобках любое из выражений
можно опустить, но точки с запятой
обязательно должны присутствовать.
Если опущено выраж2,
то оно считается =1. Поэтому конструкция: for(;;);
является
бесконечным циклом (как, впрочем, и
конструкция while(1);
Вопрос №34. Оператор цикла с постусловием do … while.
В некоторых случаях тело цикла должно быть выполнено хотя бы один раз, вне зависимости от истинности выражения. Это может быть реализовано, если проверка значения выражения будет располагаться после тела цикла.
Это записывается так:
do
оператор
while(выражение);
Такая конструкция называется циклом с постусловием.
Цикл с постусловием применяется на практике значительно реже, чем цикл с предусловием.
Лекции 6-7. Управляющие конструкции языка С» (продолжение).
Вопрос №35. Оператор break.
Иногда возникает необходимость прервать выполнение тела цикла и «досрочно» выйти за пределы цикла. Это можно сделать, разместив в теле цикла оператор break. Это оператор вызывает «безусловный переход» в точку программы, расположенную непосредственно за циклом. Оператор break может использоваться в любом операторе цикла, а также в операторе множественного выбора switch.
Пример: программа удаляет «незначащие» символы в конце строки s.
# include <stdio.h>
#include <stdlib.h>