19:49 

Учимся программировать на С++. Лекция 3. Переменные и получение значений с клавиатуры

ToxicSpider
Бритуля - Богиня
Я сегодня в ударе)))


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

Мы объединим 2 новые фишки. Я расскажу о переменных и для чего они, а так же научу получать данные с клавиатуры пользователя.


Переменные


Представим себе ситуацию, в которой нам нужно в программе запомнить какое-то число для последующей обработки. Для того, чтобы запомнить число, в языке применяются "переменные".

Переменные - это такие "ящички", в которые мы можем положить значения. Для того, чтобы создать переменную в программе (далее я буду употреблять глагол "объявить". Кому объявить? Естественно - компилятору! Мол, знай: я создаю переменную, познакомься с ней). Так вот, для того, чтобы объявить переменную нужно компилятору рассказать КАК МИНИМУМ 2 вещи: тип переменной и имя переменной.

В С++ обязательно, при объявлении переменной указать, что именно она будет хранить. Переменная, с которой мы столкнемся сегодня, имеет тип "целое число". Она объявляется так:
int num;

разберем:
int - это тип переменной "целое число", от английского "integer"
num - это имя переменной.
не забываем точку с запятой в конце!

тип переменной пишется ТОЛЬКО один раз, в момент, когда мы объявляем ее. Далее к этой переменной мы будем обращаться только по имени.

Если понятно, то я "бросаю вас в воду" и сразу же опишу программу, которая будет делать следующие вещи:
она считает количество квартир в доме, при этом она знает, что на одном этаже есть 4-ре квартиры, а всего - пять этажей.

Это задачка для первого класса и решается она так: количество квартир в доме равно: количеству квартир на этаже, умножить на количество этажей. То есть в нашем случае: 4 * 5 = 20 квартир. В конце подсчета программа выдаст результат на экран:





Отлично, разберем, что я написал:

первые три строчки - объявление переменных.

следующие 2 - присвоение переменным значения.

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

далее - уже знакомый нам способ вывести результат на экран.


Немного замечаний:

1. Ставить пробелы между строками - необязательно. Я поставил их только для удобства чтения.

2. Обратите внимание, я даю переменным имена, из которых понятно, что они содержат. В программировании есть понятие "хороший тон программирования".

Хороший тон программирования - это набор требований, которые необязательны к исполнению, с точки зрения компилятора (программа бы скомпилировалась и работала правильно даже, если бы я назвал их "петя, вася и коля") НО!!! такое поведение ОЧЕНЬ советуется, чтобы облегчить себе отладку и сопровождение кода. Более подробно о хорошем тоне, отладке и сопровождении поговорим позже.

3. Присвоение значения переменной осуществляется так: пишем имя, после этого знак равно (=), после него значение, которое присваиваем.

Внимание! порядок ВАЖЕН!

num_of_floors = 5; // правильно
5 = num_of_floors; // НЕправильно!

4. имя переменной НЕ может содержать пробелы. Поэтому используется один из возможных трюков:

а. имя_переменной (нижнее подчеркивание)
б. ИмяПеременной (каждое новое слово с большой буквы)
в. имяПеременной (первая буква маленькая, каждое следующее слово с большой буквы)

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

Примечание: одно из требований хорошего тона - использовать английский язык. НЕ писать что-то типа "int koli4estvo_kvartir" - это выглядит некрасиво.

Примечание: некоторые программисты любят первой буквой от имени переменной обозначать тип переменной. К примеру: int i_num_of_floors. Буква "i", вначале имени говорит о том, что это int. Я не пользуюсь таким приемом, так как стараюсь давать такие имена, которые однозначно говорят сами за себя.

Примечание: в коде, который я написал выше, есть одна проблема: я объявил переменную, но не присвоил ей начальное значение. Это не страшно, если быть уверенным, что значение она получит прежде, чем я буду ею пользоваться в вычислениях. Однако! Если будет наоборот - программа поведет себя непредсказуемо! Поэтому, принято присваивать переменной начальное значение сразу. Обычно - это ноль.

Правильно бы было написать:
int num_of_floors = 0;

Итак, перепишите себе код, написанный выше и скомпилируйте. Результат должен быть следующий: на экран будет выведена строка:
"total number of flats in current building: 20".
Если вы не видите эту строку - ищите где вы допустили ошибку и невнимательно переписали.

Примечание: далее я не буду пользоваться словом "Экран". Я заменяю его на слово "Консоль". Консолью я называю нижнюю часть Эклипса, в которой мы видим то, что выводим на экран, через оператор "cout".



Получение значений с клавиатуры


Когда Тюринг изобретал компьютер, он создавал "машину, которая решит все математические задачи". Это конечно очень амбициозная цель, так как математика - это философия и язык Бога, но в арифметике компьютер помочь способен. Для того, чтобы начать решать задачи, компьютеру нужно ввести данные условия. Самый простой путь - клавиатура.

Сразу код:



Обратим внимание на новшество в коде:

cin - говорит программе: получи с клавиатуры символ

>> - разделитель (обратите внимание! он в обратную сторону от разделителя cout. Если задуматься - очень логично)))

input_from_user - имя переменной, в которую положить полученный символ

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

Примечание: а если пользователь введет букву? В данном коде эта ошибка не обрабатывается. О правильной обработке ошибок мы будем разговаривать ОЧЕНЬ много, так как это наиважнейшая часть программирования. НО! это будет позже. Пока мы надеемся на то, что пользователь не выкинет сюрприз)))

Примечание: первая строка cout не заканчивается привычным "endl". Я сделал это специально. Почему?


Скомпилируйте этот код и запустите. ВОЗМОЖНО в момент, когда вы захотите ввести число в консоль - оно не введется (вы не увидите его в консоле). Просто клацните по консоли мышью и попробуйте снова. После удачного ввода числа нажмите клавишу Enter.

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



Домашнее задание


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

Итак:

Напишите программу, которая высчитывает количество учеников в классе.
Условия:
1. Программа получает с клавиатуры количество парт в классе.
2. Программа получает с клавиатуры количество учеников за одной партой.
3. Дано: за всеми партами сидит одинаковое количество учеников (то есть НЕ может быть ситуации, в которой за одной партой сидит 2 ученика, а за другой - только один)
4. Программа выводит ответ на экран (консоль).

Удачи!

@темы: C++

URL
Комментарии
2011-12-27 в 00:25 

Denver_Frost
forever plagued with this fire inside me
Сашечка))))))))) Спасибо огромное же))))) спасибо)))!
Ты просто чудеснее чудесного)))
Мы с Катериной в восторге, правда))) будем учиться))))))

2011-12-27 в 00:52 

ToxicSpider
Бритуля - Богиня
Denver_Frost, Ради вас и старался)))
Хотя на Зоне есть такие, кому идея тоже понравилась)))

Так что вроде учеников прибавилось))))

З.Ы. У вас экзамены буду принимать ЛИЧНО! :alles:

URL
2012-03-25 в 13:54 

ToxicSpider
Бритуля - Богиня
den/m/dems, Прежде всего: отлично. Но есть пару "но" (просто потому что я вредный)))) шучу. Так вот....

Заранее извиняюсь, если буду говорить очевидные вещи, но я всегда люблю "перебдеть" более, чем "недобдеть". Когда учат меня, то я обычно прошу думать обо мне, как о последнем дибиле, потому что так я защищен от момента, когда человек не объясняет, думая, что это очевидно и он боится меня обидеть, в итоге - я остаюсь в проигрыше. Я не знаю, что для тебя очевидно, а что нет, поэтому, я скажу все.

Первый код, проблема, которая бросается в глаза - переменные, во время объявления лучше обнулять, так, как ты сделала во втором варианте. Этот факт вовсе не зависим от того, как именно ты объявляешь переменные: каждую на новой строке, или через запятую.

Теперь я бы хотел остановиться на объявлении переменных. Да, действительно, язык позволяет объявлять переменные через запятую или каждую - с новой строки. Какой способ выбрать? Я поступаю так: как правило, я объявляю каждую с новой строки, за исключением тех случаев, когда у меня есть переменные, которые, по-сути, выполняют одну и туже функцию. То есть... допустим, у тебя в коде есть 2 цикла. Я бы конечно не стал сейчас цеплять циклы, так как в лекциях мы еще не дошли до них, но я знаю, что у тебя есть знания php и поэтому, понятие цикла для тебя не в новинку.

Итак: есть 2 цикла, по первому "бежит" переменная int i, а по второму - переменная int j. Это тот случай, когда я в коде объявлю их через запятую. Как отделить один случай от другого? Очень просто: представь, что тебе нужно возле каждой переменной написать комментарий, что она делает. Переменные, в которых комментарий совпадал бы - объявляй через запятую. Переменные, где это не так - каждую с новой строки. В дальнейшем, ты поймешь, что эта мелочь делает код намного более "интуитивно-понятным".

Теперь по коду: я не совсем понял, зачем ты объявила такие пары: input_from_user_pupils_on_one_desk и num_of_pupils_on_one_desk (и т.д.) если ты пользуешься первой только для того, чтобы получить с клавиатуры значение и сразу положить во вторую. Это - лишнее. можно объявить только num_of_pupils_on_one_desk и в нее получить с клавиатуры символ, без лишнего присвоения.

Возможен вариант, в котором ты хочешь проверить, а не ввел ли пользователь нелегальное значение (например - отрицательное) и только после этого присвоить его другой переменной (хоть мы еще не учили проверки, но на будущее). Тогда я бы объявил только одну переменную input и использовал бы ее во всех случаях. То есть:

cin >> input;
проверка
num_of_desk = input;
cin >> input;
проверка
num_of_pupils = input;

в таком ключе это более оправдано.

Это все мелочи, конечно, но именно из этих мелочей складывается умение программировать. В коде не должно быть лишних вещей, с одной стороны, но и салат делать не правильно - с другой. Например, у нас была переменная num_of_desk и на каком-то этапе она стала тебе не нужна. Ты подумаешь: зачем я буду обьявлять, допустим, переменную speed (содержащую скорость чего-то), если у меня есть ненужная num_of_desk? Я положу скорость в нее, чтобы не объявлять лишнюю переменную.

Это будет ошибкой, так как код становится нечитабелен. То есть, всегда нужно искать разумный компромисс. Это приходит с опытом. И именно поэтому я и обращаю внимание на эти вещи, чтобы этот опыт пришел. Сори, если я буду дотошным))))

А в целом - ты отлично справилась! Без шуток. Я радуюсь не меньше тебя, потому что твоя победа - это и моя победа. Мы вместе преследуем одни и те же цели))) Продолжай в том же духе и прости мою дотошность)))

URL
2012-03-25 в 14:25 

ToxicSpider, спасибо, Саш!
Хорошо, я все запомню-запишу. Блокнотик уже есть, где все лекции планом-конспектом).
Про присвоение имени понятно, про комментарии тоже (я в школе на бейсике делала штуки))), я помню много всякой всячины))), но тут как-то иначе.
Сокращено так тогда:
i5.pixs.ru/storage/0/9/8/3png_9602035_4370098.p...
Лучше?
Хорошо, с проверками пока не ясно, но ладно. Там выходит больше-равно нулю и прочая ерунда?
А с объяснениями - наоборот! Я люблю слушать и читать что-то, о чем человек "напротив" имеет представление в теории и на практике. Очень люблю рассказы про работу поэтому профессиональные. Поэтому только рада))
Спасибо).

2012-03-25 в 14:26 

А еще! Зачем { .... } фигурные в конце и в начале? Это обозначение body?

2012-03-25 в 16:10 

ToxicSpider
Бритуля - Богиня
den/m/dems, О, молодец, теперь - на все 100!

Да, скобки - это границы блока. Между скобками - тело блока. Блоки бывают разные. Об этом мы поговорим далее, а пока относись к этому как к "обязательному шаблону", не стоит пытаться бежать вперед паровоза.
То же самое касается проверок. Пока, представь, что ты не слышала от меня это слово. Но далее есть Лекция 7. Блоки и условия. if-else. Вот там мы поговорим и о блоках и об условиях, подробно, разжеванно и дотошно, то есть - в моем стиле))))

URL
   

Godney

главная