Пересмотр
На прошлой неделе мы прошли первую неделю знаменитого курса Гарвардского университета CS50, где нас познакомили с фундаментальными строительными блоками языков программирования.
- Типы данных
- Инструкции
В разделе «Типы данных» мы рассмотрели, как важно определить для программы, с каким типом данных мы будем работать, будет ли это целое число (int), действительное число (float), если наши данные являются булевыми (bool), и другие типы данных. В рамках типов данных нам также рассказали о переменных и о том, как мы используем их для хранения данных (информации).
Также мы увидели, что программы — это последовательности инструкций, в которых мы можем работать повторно и использовать выражения для управления ходом операции.
Чтобы напомнить вам о некоторых вещах, вот пост, который я сделал о первой неделе, где я подробно остановился на некоторых вопросах по первому уроку.
Введение
Пока что мы используем облачную вселенную, которую курс подготовил для студентов, чтобы все использовали одинаковые условия для разработки своих программ. И с этим, как вы понимаете, а также в специальной библиотеке cs50
, которую мы используем, у нас есть доступ к командам, которых нет в других средах разработки, например, в той, которую мы используем для компиляции нашей программы, разработанной на C.
Компиляция программ
Итак, для запуска всех программ, которые мы разработали до сих пор, нам необходимо:
1) Откройте терминал в облаке cs50.
2) Напишите: make program.c
.
3) Запись: ./program
4) Вот как будет работать наша программа
Оказывается, что этот make nameProgram.c
не является родным для среды программирования C.
Таким образом, мы знакомимся с командой clang
для работы в качестве компилятора языка вручную.
Отладка
Профессор Дэвид Дж. Малан вводит понятие debugging
— это когда в нашем коде есть ошибка/ошибка/проблема, и мы используем какой-либо инструмент для поиска ошибок.
Эти инструменты могут быть различными: от использования printf
для отображения на экране процесса выполнения команд до использования инструмента debug50
, разработанного CS50, для использования в среде программирования nuvel курса.
Где преподаватель учит вас интерпретировать, знать и использовать инструмент для отладки
вашего кода.
Память
Важной частью занятия является то, что профессор Дэвид Дж. Малан наглядно показывает, каким будет это пространство в памяти каждый раз, когда нам нужно использовать или хранить тип данных. Он показывает пример использования сетки для представления памяти в том виде, в котором мы ее знаем.
И используя примеры в классе переменных, которые он использует в данный момент, как, в теории, они будут храниться.
Эти изображения были взяты с собственной страницы cs50
Массивы
Здесь представлены массивы. Другой тип данных, который работает как список и может хранить несколько значений одного типа.
Таким образом, массив чисел — это список, состоящий из определенного количества элементов, где эти элементы — числа.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
int scores[3];
for (int i = 0; i < 3; i++)
{
scores[i] = get_int("Score: ");
}
printf("Average: %fn", (scores[0] + scores[1] + scores[2]) / 3.0);
}
Где int scores[3]
определяется, что это будет список с типом данных int.
Поэтому в цикле int scores[i]
не нужно задавать как int scores[i]
, так как уже сказано, что это будет список элементов int.
Символы и строки
Знания накапливаются!
После той части занятия, где рассматривается концепция и практика работы с массивами, мы переходим к обсуждению других типов данных, таких как char и strings. И здесь все сходится.
Профессор Дэвид Дж. Малан представляет два способа, которые дают одинаковый результат, для печати сообщения на экране: Hi!
.
#include <stdio.h>
int main(void)
{
char c1 = 'H';
char c2 = 'I';
char c3 = '!';
printf("%c%c%cn", c1, c2, c3);
}
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string s = "HI!";
printf("%sn", s);
}
В обоих случаях на экране появится одно и то же сообщение,
- В первом случае мы видим, что каждый символ хранится в переменных char.
- Во втором, с включением заголовка
cs50.h
, мы видим использование строковой переменной.
Заметили ли вы сходство между string
и array
, например, список символов? Интересно, нет?
Таким образом, мы можем получить доступ к элементам списка s (строка), используя пометки в скобках
, как мы видим в примере, приведенном в классе ниже.
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string s = "HI!";
printf("%i %i %in", s[0], s[1], s[2]);
}
Интерфейс командной строки (CLI)
На первой неделе я сказал, что в этот первый момент нам не нужно будет беспокоиться о int main(void)
. Потому что до этого момента наша главная функция при вызове не получала никаких аргументов. В этой части урока она представлена,
#include <stdio.h>
int main(int argc, string argv[]) {
//todo
}
Таким образом, теперь мы можем создавать программы, принимающие аргументы, как, например, в приведенной ниже функции,
#include <cs50.h>
#include <stdio.h>
int main(int argc, string argv[])
{
printf("hello, %sn", argv[1]);
}
./hello leitor
$ hello, leitor
Здесь очень важно помнить, что этот аргумент должен быть char или строкой. Поскольку argv
соответствует символьному списку
, указывающему на все аргументы.
Заключение
Этот пост не заменяет занятия (не в последнюю очередь потому, что я не говорю абсолютно обо всем, что дается на занятиях), и мы настоятельно рекомендуем вам посмотреть этот урок. Класс очень полный и очень хорошо объясняет все его концепции и применение.
На этом уроке мы говорили о том, как мы можем исправить наш код (и что наличие ошибки — это нормально, не мучайтесь!). И углубился в воспоминания о том, как типы данных занимают эти пространства, и как мы, разработчики, должны знать, что под крышкой что-то происходит.
Закончив просмотр этого урока, я оставил ниже несколько вопросов, на которые вы сможете ответить!
В течение этой недели я буду публиковать наборы задач, относящиеся ко второй неделе.
Спасибо, что дочитали до конца, до скорой встречи!
Проверка знаний
- Как компьютеры понимают код, который мы пишем?
- Как мы можем компилировать наши программы на C вручную?
- Что означает препроцессор C?
- На каком этапе код преобразуется в ассемблер?
- После преобразования кода в ассемблер, как он преобразуется в двоичный код? (И почему преобразование кода в двоичный код вообще важно?)
- Отладка — это инструмент для чего? И почему это важно?
- Как называются эти []? И для чего они нужны?
- Когда у нас есть значения char и мы печатаем с помощью %i, что мы увидим на экране?
- Что такое кастинг типов?
- Какова функция NUL в строке?
- Где можно найти информацию о заголовке string.h?
- Принимает ли функция strlen() какую-либо роль внутри цикла? Если да, то что это будет?
- Можно ли установить отношения между символами в строке с помощью ASCII?
- Если вместо слова поставить число, то в функции main будет использоваться (int argc, string argv[]). Как это число будет обрабатываться в C?
- Что мы можем сделать с помощью CLI?
- Что означает возврат 0 в конце функции?