Последние новости

YoungCoder теперь и на Stepikе. Записывайтесь: https://vk.cc/75rISy

Чтобы записаться на курс, необходимо зарегистрироваться на Степике: https://vk.cc/75rIC4

Это моя личная ссылка-приглашение на Stepik для вас. Регистрируясь по этой ссылке, записываясь на курсы и решая задачи, Вы помогаете автору данного сайта принять участие в конкурсе платформы Stepik! Подробности конкурса здесь: https://vk.cc/75rKuS

воскресенье, 27 ноября 2011 г.

Занятие 8.Оформление кода программы на Си.Уроки программирования для чайников.Язык Си.

Добрый день уважаемые читатели.
Сегодняшний пост начну не так как обычно. Сегодня 27 ноября, воскресенье, последнее воскресенье в этом месяце. А значит что? Значит, что сегодня отмечается международный День матери. От всей души хочу поздравить матерей, бабушек, у кого живы прабабушек, всех моих читателей, да и вообще всех матерей. Частенько мы бываем нетерпимы к родителям, особенно когда они читают нам мораль и учат жить. Вот сегодня замечательный повод извиниться перед своими мамами, за свою нетерпимость.Поздравить их, при наличии возможности подарить им цветы, им будет очень приятно.
Теперь же перейдем к самому занятию.Сегодня мы не будем разбирать какие-то новые конструкции языка, а поговорим об оформлении кода наших программ. Тема это очень важная. Дабы самому не путаться в своем коде написанном несколько месяцев назад. У каждого программиста есть свой стиль, свои привычки при написании программ. Они появляются с течением времени и закрепляются у каждого. В компаниях и командах где несколько разработчиков, обычно разработчики договариваются об каком-то одном стиле написания исходного кода. Оформляя определенным образом код программы, человек приучается к дисциплине. Вот об основных таких советах оформления кода мы сегодня и поговорим.

Имена и способы описания переменных.
Основной совет таков, давайте переменным осмысленные имена.
Это очень важный совет на самом деле. В маленьких программках которые мы пишем в практических занятиях это не столь серьезно, но в большой программе это вам очень поможет. Даже в небольших программах это иногда очень помогает. У меня есть небольшой опыт олимпиадного программирования, так вот когда переменным даешь короткие имена, ничего не обозначающие, можно очень легко запутаться. Когда имя переменной несет в себе информацию которая хранится в переменной, это позволяет легче искать ошибки в ходе отладки программы. А в условиях нехватки времени, отлаживать и оптимизировать программу  постоянно вспоминая что именно хранится в переменной q, что в get, очень непросто. Так что давайте своим переменным осмысленные имена. 
Немного о разделении слов в именах переменных. Пусть есть переменная целого типа в который содержится номер ящика. Её логично назвать number_box. Так вот, разделение слов с помощью нижнего подчеркивания, можно считать традицией программистов на Си. В паскалеподобных языках обычно подчеркивания для это цели не используют программисты. Для этого используется заглавные буквы. Возвращаясь к нашему примеру: NumberBox. Но так как Си регистрозависимый, а паскаль нет, то при если случайно ошибиться и написать потом numberBox, то в паскале программа будет работать, а в Си нет, ибо NumberBox и numberBox являются по правилам языка Си разными переменными. Отсюда, есть еще традиция в языке Си, имена переменных всегда пишутся маленьким буквами, а имена констант  только заглавными.И всегда понятно, где используется константа, а где переменная.  
Еще одна из условностей, это указание типа переменной в её имени. Опять же обратимся к нашему примеру, количество ящиков величина целая, поэтому достаточно удобно в имени это указать каким-то образом. Например так. n_number_box. Т.е. в начале имени переменной писать  определенный префикс для каждого типа свой (int - n, char - ch, double,float - d, file - f, и другие). Я лично таким способом не пользуюсь постоянно, хотя это иногда очень удобно.

Оформление логических блоков и запись лесенкой.
Запись лесенкой очень-очень полезная и практичная вещь. Оформлять код лесенкой это первое, что каждый может сделать на пути избежания ошибок в коде своих программ и повышения удобчитаемости.
Смысл в том, чтобы каждый вложенный блок сдвигать несколько в сторону. Вот пример такого оформления.
Листинг 8.1
#include <stdio.h>

int main(void)
{
      int n,b;
      printf("Vvedite chislo ot 1 do 100: ");
      scanf("%d", &n);
            if(n>=11&&n<=14){
                  printf("Na lugu pasetsya %d korov \n", n);
            }
            else{
                  b=n%10;
                  if(b==1)          printf("Na lugu pasetsya %d korova \n", n);
                  if(b>=2&&b<=4)    printf("Na lugu pasetsya %d korovy \n", n);
                  if(b>=5&&b<=9)    printf("Na lugu pasetsya %d korov \n", n);
                  if(b==0)          printf("Na lugu pasetsya %d korov \n", n);
            }
return(0); 
}

Оформляя таким образом свой код, его очень удобно читать другим, да и самому спустя какое-то время, да и непосредственно во время написания. Отступы можно делать как пробелами, так и табуляциями, я предпочитаю табуляции, и вам советую тоже пользоваться ими. Это удобно.Касательно табуляций и пробелов есть хороший пост на ресурсе Хабрахабр. Рекомендую ознакомится.

Теперь оформление логических блоков, а точнее разберемся с написание составного оператора. Есть несколько типов написания составного оператора. Рассмотрим основные, на примере с оператором if.Обратите внимание в каких местах расставлены фигурные скобки.
Личтинг 8.2.
1)
if(n>=11&&n<=14){
                 printf("Na lugu pasetsya %d korov \n", n);
}
2)

if(n>=11&&n<=14)
{
                printf("Na lugu pasetsya %d korov \n", n);
}
3)

if(n>=11&&n<=14)
               {
               printf("Na lugu pasetsya %d korov \n", n);
               }

Вам надо раз и навсегда определиться где вы будете ставить скобки и непременно следовать этому своему стилю. Каюсь, я и сам грешен, частенько используя второй стиль, перепрыгиваю на первый. Хотя смешивание это плохо. В ближайшее время, я постараюсь пройтись по всем листингам в блоге и привести оформление к единому образцу.
В качестве совета который я уже давал в комментариях. Всегда пишите фигурные скобки, даже если у вас один оператор в теле цикла, и в конструкции if. И при том сразу напишите заготовку if () {}, а потом уже записывайте условие и что делать при этом условии. Так же и с циклами.
Еще один совет, если у вас много вложенных друг в друга циклов и там еще вложены конструкции if, то очень удобно после закрывающей фигурной скобки писать к чему она относится например:
Листинг 8.3.


for (int i=0; i<100; i++){
      for(int j=i+1; j<200-i; j++){
            b=i*j+4;
            if(b%2!=0){
                  g=13*b;
            }//IF
      }//FOR(j)
}//FOR(i)


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


Оформление арифметических выражений и сложных условий.

И тут есть свои нюансы, в основном они касаются использования пробелов. 
Посмотрите на пример:
Листинг 8.4.
if ((x-1 < 0) && (b-x != 0))  print_task1(x, a*x*x+b, P);
   else
       if ((x-1 > 0) && (b+x == 0)) print_task1(x, (x-a)/x, P);

Использование умеренного количества пробелов облегчает чтение исходного кода программы. Но некоторые в и тут борщат. Не стоит ставить пробелы после каждого печатного знака, это не украшает программу. 

Использование комментариев.

Комментарии использовать нужно. Комментировать можно отдельные куски кода, функции, всякие оригинальные трюки используемые вами, но стоит избегать комментирования всего подряд.  

На сегодня все. Завтра ждите домашнее задание к предыдущему уроку. 
UPD (от 29 ноября):Сегодня был занят важными делами, поэтому не сумел подобрать задачи.Извиняюсь. 

Резюме урока:
  • Надеюсь каждый осознал важность использования одного стиля написания и оформления кода программы. И теперь определится для себя как ему удобно.


До свидания. Удачной недели.

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

6 комментариев :

  1. Что ж, огромное спасибо, уроки помогли разобраться с основами C++, были в текстах уроков ошибки, но за такой труд это СТОИТ простить, буду надеяться что продолжение следует.
    P.S. Кадет, если сможешь, добавься в скайп - offerist777; или напиши мне в маил - wwcc777@mail.ru.

    ОтветитьУдалить
    Ответы
    1. Если заметили ошибки, сообщите мне. Можно в группе во Вконтакте или здесь в комментариях. Ошибки надо исправлять.

      Удалить
  2. Листинг 8.3
    Вы можете написать условие задачи, часть кода которой изображено на этом листинге?

    ОтветитьУдалить
    Ответы
    1. Нет, не могу. Никакой задачи нет, я кажется писал просто код, наобум. =)

      Удалить
  3. привет рад был прочитать столь хорошие советы но я вообще барабан в программировании но мне её изучать нужно подскажешь может мне что делать или литературу спс

    ОтветитьУдалить
    Ответы
    1. Внизу и справа есть ссылка на другие уроки. Начинайте с 1-го и потихоньку вы перестанете быть барабаном. )

      Удалить

Примечание. Отправлять комментарии могут только участники этого блога.