Давайте знакомиться с программированием : введение

Давайте знакомиться с программированием

Программирование — процесс создания компьютерных программ с помощью языков программирования, реализация одного или нескольких взаимосвязанных алгоритмов на некотором языке программирования.

Язык программирования — формальная знаковая система, предназначенная для описания алгоритмов в форме программы, которая удобна для исполнителя (например, компьютера).
Языки программирования делятся на

Машинно-независимые языки позволяют быстро писать довольно сложные программы.

Машинно-зависимые языки применяются в тех случаях, когда необходимо построить наиболее компактный машинный код и создать самые быстродействующие программы. Они оперируют непосредственно ячейками памяти и программно-доступными элементами микропроцессора.

Алгоритмизация — процесс систематического составления алгоритмов для решения поставленных прикладных задач.

Алгоритм — точный набор инструкций, описывающих порядок действий некоторого исполнителя для достижения результата, решения некоторой задачи за конечное число шагов. Основные свойства алгоритмов:

  • Понятность для исполнителя — исполнитель алгоритма должен понимать, как его выполнять. Иными словами, имея алгоритм и произвольный вариант исходных данных, исполнитель должен знать, как надо действовать для выполнения этого алгоритма.
  • Дискретность (прерывность, раздельность) — алгоритм должен представлять процесс решения задачи как последовательное выполнение простых (или ранее определенных) шагов (этапов).
  • Определенность — каждое правило алгоритма должно быть четким, однозначным и не оставлять места для произвола. Благодаря этому свойству выполнение алгоритма носит механический характер и не требует никаких дополнительных указаний или сведений о решаемой задаче.
  • Результативность (или конечность) состоит в том, что за конечное число шагов алгоритм либо должен приводить к решению задачи, либо после конечного числа шагов останавливаться из-за невозможности получить решение с выдачей соответствующего сообщения, либо неограниченно продолжаться в течение времени, отведенного для исполнения алгоритма, с выдачей промежуточных результатов.
  • Массовость означает, что алгоритм решения задачи разрабатывается в общем виде, т.е. он должен быть применим для некоторого класса задач, различающихся лишь исходными данными. При этом исходные данные могут выбираться из некоторой области, которая называется областью применимости алгоритма.

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

Существующие парадигмы программирования:

  • императивное программирование – описывает процесс вычисления в виде инструкций, изменяющих состояние программы;
  • декларативное программирование – программа генерируется по ее описанию (HTML-страница);
  • структурное программирование – представление программы в виде иерархической структуры блоков;
  • функциональное программирование – заключается в выполнении ряда функций;
  • объектно-ориентированное программирование – основными концепциями являются понятия объектов и классов.

22 комментария к “Давайте знакомиться с программированием”

  1. Максим

    Может кто подсказать, почему следующий код в последнем printf выводит "-115"?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdio.h>

    int cube(input);

    int main(void)
    {
         int x = 2;
         char y = '5';
         printf("x is %i\n", x);
         printf("y is %i\n", y);
         x = cube(x);
         y = cube(y);
         printf("x cube is %i\n", x);
         printf("y cube is %i\n", y);
    }

    int cube(input)
    {
         int output = input * input * input;
         return output;
    }

    Не понимаю откуда берется это число, ещё и отрицательное.

    1. Елена

      y занимает 1 байт со знаком, то есть значение от -128 до +127.
      Изначально y='5'=53 (ASCII код символа 5). Мы возводим 53 в куб, но помним про переполнение разрядной сетки.
      53*53=2809. В разрядной сетке останется -7, т.к. 2809 — 2560 = 249, для размещения в разрядной сетке это 256-249=-7.
      Ещё раз умножаем на 53
      -7*53=-371.
      В разрядную сетку войдёт -371+256=-115.
      Вот оно и выводится!

      1. Максим

        Большое Вам спасибо!
        Много нового узнал подробнее разобравшись в этом

  2. Денис

    Здравствуйте. Огромное спасибо за Ваш труд! Сайт очень помогает в освоении языка, все очень наглядно и доступно написано.

  3. Дмитрий

    "Язык программирования — формальная знаковая система, предназначенная…"
    Справедливо, например, для Бейсик-системы, Форт-системы. Для Си, Паскаля, … системы выстраивает методология программирования, то есть она решает проблемы.

    Я бы написал "формальная грамматика".

  4. Тимур

    Добрый день и спасибо за учение!

    Подскажите, эти две команды они делают одно и тоже?
    (Как я понял, создается массив символов с именем s.)

    1
    2
    char *s="Папа Тима"//вариант 1
    char s[] = "Папа Тима"//вариант 2

    Я не могу понять 1 вариант все таки. Если создается указатель s — этот указатель должен содержать адрес участка памяти другой переменной (или имя массива), в котором уже будут данные.. Так ведь?
    А тут получается, что имя указателя s и имя массива это одно и то же.

    И почему тогда компилятор выдает ошибку, когда я пытаюсь по такой же аналогии сделать заполнение типа int

    1
    2
    3
    int *n=500; // компилятор выдает ошибку!
    char *s="Папа Тима"// а здесь почему то нет ошибки, хотя аналогия
    // точно такая же, просто другой тип не char, а int.
    1. Елена

      При задании строки сначала создаётся массив символов, а потом начальный адрес этого массива присваивается указателю. Вариант 1 и вариант 2 различаются лишь тем, что во втором случае используется константный указатель, который нельзя переставить на начало другой строки.

      1
      int *n=500; // компилятор выдает ошибку!

      В этом случае не выделена область памяти, в которой лежит число 500, поэтому и ошибка.

      1. Тимур

        Спасибо за быстрый ответ! Я поражен Вашими знаниями!
        Объясните, пожалуйста, почему в варианте со строковым массивом, этот массив _сначала_ создается где то в памяти и уже потом его адрес присваивается указателю, а в варианте с int, значение 500 _сначала_ не создается где то в памяти, а _сразу_ пытается присвоить указателю несуществующее значение адреса?

        Получается что конструкция char *s="Какая то строка"; работает ТОЛЬКО для массивов типа char? Так? Получается тип char какой то особенный в СИ? Или в чем загвоздка все таки?

        1. Елена

          Особенный не тип char, а особенное создание строки, заключённой в двойные кавычки. С числом такой фокус не получится, потому что если число заключить в двойные кавычки, то получится строка.

          1. Тимур

            Ах, вот оказывается в чем дело! А я то ломал голову! Теперь это ясно!
            Спасибо!

  5. Огромное спасибо за ваш сайт. Решил освежить знания по алгоритмам сортировки.
    Хотя много лет не писал на C++, сейчас я программирую на Golang но все очень понятно и структурировано.
    Однозначно в закладки!

  6. Сергей

    Здравствуйте Елена, в поисках последовательного и внятного изложения материалов о программировании на Си, набрел на ваш сайт. Вся каша в голове из кусков и отрывков найденных на просторах интернета начала приобретать смысл после ознакомления с материалами сайта. Так же радует, что вы отвечаете на все вопросы пользователей вашего сайта. Может и мне поможете. Разбирая в учебных целях программу на Си столкнулся с непонятным мне началом программы. Гугл не смог мне объяснить, что это за функция.

    void recoding(void) {
    }

    1. Елена

      Это какая-то пользовательская функция, которая не принимает никаких данных, не возвращает никакого значения и ничего пока не делает.

      1. Сергей

        Спасибо, значит в стандартных библиотеках такой функции нет. А где на вашем сайте можно прочитать про перекодировки переменных и для чего это нужно. Ну то есть я тупо перевел слово "recoding", или меня понесло не в ту степь.

      2. Сергей

        Кажется понял,прочитал раздел "Функция". Это значит какой то товарищ написал кусок кода на Си, поместил этот код в тело функции, которую обозвал "recoding"

        1
        2
        3
        4
        5
        6
        7
        void recoding(void) {

         digit_out[0]=indication/100%10;
         digit_out[1]=indication/10%10;
         digit_out[2]=indication%10;

         }

        а комментарий для таких как я оставить забыл.
        Еще раз спасибо,ваше ключевое слово было "Пользовательская функция"

      3. николай

        Добрый день!
        Помогите пожалуйста с контрольной работой по языкам программирования.

        1. Елена

          На заказ задачи не решаю. Сама преподаватель, и не люблю, когда студенты приносят заказанные решения.
          На вопросы могу ответить.

  7. Алексей

    Здраствуйте, уважаемая Елена! Меня зовут Алексей, и я с большим удовольствием читаю некоторые ваши пояснения к работе с С++, начал самообучение путем поисков статей и всякого рода работ с микроконтроллерами. Понимаю, что на это всё нужны годы а может и целая жизнь, но интерес к творчеству присутствует огромный, в связи с этим назрел вопрос. Может, и бестолковый, но всё же.
    Вопрос касается компилированных прошивок,конкретно в HEX. Возможно ли из машинного кода декомпилировать обратно в текстовую команду, и если да, то как это можно сделать. Читал много разных сайтов. Люди прямо в компилированной прошивке могут её отредактировать, переписать и т.д. Каким образом они понимают, что в той или иной строчке записанно? то есть функционал той или иной строки….. И для примера… встретил две разные прошивки, которые заканчиваются одинаковыми символами…не могли бы вы подсказать что зашифрованно в этой строке :00000001FF?
    Заранее огромная благодарность вам за ваши труды!

    1. Елена

      Здравствуйте, Алексей!
      Да, по коду прошивки возможно дизассемблировать код. Но для этого необходимо изучить документацию на микроконтроллер, для которого этот hex получен. Каждая команда имеет свой шестнадцатеричный код, который и генерируется при формировании hex файла. Обратная операция — зная код, можно определить команду.
      Но для того, чтобы расшифровать, что в строке, нужно знать как минимум тип микроконтроллера. А лучше ещё и перечень ассемблерных команд с кодами для него.

      1. Алексей

        я вас понял,большое спасибо…..буду вписывать команды,компилировать…..думаю таким способом можно увидеть значение шестнадцатеричного кода той или иной команды…..к примеру команда void,и посмотреть во что она скомпилируется.

  8. Андрей

    Очень приятный сайт с полезной информацией и достойными картинками. Пожалуйста, не забрасывайте!

Комментарии закрыты.

Прокрутить вверх