CS50 научил меня чему-то на этой неделе, так это тому, что программирование никогда не бывает легким, особенно когда вы еще только начинаете.
Урок этой недели был для меня действительно тяжелым. Собственно, на лекции я чуть не заснул. Могу вас уверить, хотя это не потому, что я просто смотрел с экрана. Вероятно, по двум причинам: Во-первых, во время лекции было не так много кода, что меня как бы дремало. Во время прошлых лекций я следил за примерами кодирования из лекции и пробовал их. в IDE cs50. Во-вторых, это только я или обсуждение показалось довольно общим, но в то же время вроде математики? Я не понял 60% лекции, пока не начал искать их в сети (и нет, я не говорю, что я такой тупой с математикой).
Даже не заставляйте меня начинать с постановки задачи! Вы мне поверите, я спал ПОЛНОСТЬЮ ночи, думая о проблемах, особенно об Игре пятнадцати !? Ага, вы правильно прочитали, sleepFULL. Дело не в том, что я просто продолжал спать или что-то в этом роде. Я назвал это сном ПОЛНЫЙ, потому что я засыпал бесчисленное количество раз, размышляя о решении проблем, до такой степени, что я действительно чувствовал разочарование, потому что я почти не мог понять инструкции (так грустно ☹).
Лекция
Как бы то ни было, у меня остались вещи, которые я узнал из лекции, например:
1. Термин «рекурсивный» фактически означает повторение.
2. В методах сортировки мы называем наихудший сценарий «O», как в случае с большим o. Мы называем лучший сценарий Ω (большая Омега). Кроме того, я только узнал, что есть еще и небольшая омега (извините, пожалуйста, за мое незнание).
3. На самом деле у рекурсии есть формула:
T(n) = T(n/2) + T(n/2) + O(n) If n > 2
4. Существует функция под названием sigma (или вы должны это сделать?), Которая складывает все числа от 1 до ввода пользователя, а затем возвращает их:
int sigma(int m) { int sum = 0; for (int i = 1; i <= m; i++) { sum += i; } return sum; }
Это также может быть выражено:
int sigma(int m) { if(m <= 0) { return 0; } else { return(m + sigma(m — 1)); } }
5. Сортировка выбора будет иметь минимум (самый маленький в массиве) для сортировки в первую очередь. Пузырьковая сортировка - это противоположность, при которой сначала выполняется сортировка самого большого значения в массиве.
Меня очень сбивали с толку разные сорта, особенно их коды. Хорошо, что я нашел справочник по исследованию cs50 для разных видов! 😊 Вы можете найти его здесь: https://study.cs50.net/.
Конечно, я многому научился, выполняя наборы задач. Перечисленное выше было тем, чему я научился, когда впервые прочитал лекцию.
Наборы задач
В наборе нужно сделать две вещи: Найти (есть более и менее удобные варианты) и Игра пятнадцати.
Вдобавок, это был первый раз, когда проблемы CS50 предоставляли основу и недостающие функции, которые нужно было заполнить в соответствии с инструкциями. Наверное, это добавило мне затруднений при ответе на задачи.
Находить
Эта проблема была немного сложной. Вам нужно найти число среди чисел в массиве, найти иголку на стоге сена.
После выполнения предоставленных инструкций у вас будет доступ к 6 файлам. Основной файл, над которым вы будете работать, - это файл helpers.c.
Прежде чем начать, я хотел бы отметить, что эта проблема научила меня двум вещам.
Во-первых, команда make требует, чтобы перед командами стояла вкладка. Переход к файлу с именем Makefile проясняет это. (Как видите, есть вкладка, где начинается слово «лязгать».) 😊
Во-вторых, я узнал как важное напоминание, что если кто-то хочет использовать тип данных «bool» в C, всегда включайте заголовок ‹cs50.h›.
Для начала у задачи есть две функции, которые нужно выполнить: поиск и сортировка.
Для поиска:
Согласно спецификации, время поиска должно быть O (log n). Это указывает на бинарный поиск, который быстрее линейного.
Чтобы иметь более легкое понимание данных переменных, нам необходимо понять следующее:
- Значение: дата, по которой будет выполняться поиск; игла
- Значения: массив, в котором будут искать данные (значение); стог сена
- n: это будет размер массива значений
Для сортировки:
Согласно спецификации, время работы должно быть O (n2). Для этого требуется либо пузырьковая, либо выделенная сортировка.
Как и в предыдущем пункте, давайте определим следующее:
- Значения: массив; стог сена
- n = размер
Если вы хотите просмотреть различные виды сортировки (и выполнить поиск), вы можете сделать это здесь: https://study.cs50.net/bubble_sort.
Пятнадцать
Пока что для меня это было самым тяжелым. В пятнадцать лет я почти захотел бросить курить. Вы когда-нибудь видели серию инструкций и код и почти ничего не понимаете? Ага! Вот как я себя чувствовал. Я проводил ночи ради этого, некоторые из которых я чувствовал подавленным и неадекватным. Во-первых, я не понимаю большую часть инструкции, во-вторых, я не знаю, с чего начать.
В любом случае, эта задача требует от вас реализации Игры пятнадцати. Эта игра представляет собой головоломку, в которую играют на квадратной двухмерной доске с пронумерованными плитками, которые скользят. Эта задача состоит в том, чтобы расположить плитки на доске от наименьших к наибольшим, слева направо, сверху вниз, с пустым пространством в правом нижнем углу доски. (Если вы хотите узнать об этом больше, вы можете сделать это здесь, на его вики-странице.)
После выполнения инструкции по загрузке у вас будет доступ к 4 файлам. Необходимо выполнить 4 функции: init()
, draw()
, move()
и won()
.
Для init()
part:
Здесь происходит инициализация, запуск платы.
Примечания:
- Для начала необходимо произвести отсчет по убыванию, чтобы пометить и расположить плитки, чтобы начать игру. Максимальное значение отсчета будет зависеть от размера, указанного пользователем.
- Узнайте больше о приоритете операторов здесь: https://en.cppreference.com/w/c/language/operator_precedence.
- В соответствии с правилами игры и спецификацией набора плитки 1 и 2 необходимо менять местами, когда плитки четные. Таким образом, нечетное измерение даст четное количество плиток, потому что последняя пуста (в реальной игре на последней клетке нет плитки). Оператор по модулю был бы полезен, чтобы узнать, четная или нечетная область.
Для части draw()
:
В этом разделе мы должны распечатать и отобразить инициализацию.
Примечания:
- После итерации с использованием того же метода, что и при инициализации, проверьте, равно ли содержимое плитки 0, и если да, мы должны сделать так, чтобы она выглядела как пустая плитка.
- При печати остальных используйте целое число в% i, чтобы между числами были пробелы. В подсказке от cs50 намекнули 2, но 3 лучше визуализировать те, которые представляют собой 2-значные числа. Если используется 2, места недостаточно.
Для части move()
:
В этой части плитки, выбранные пользователем для перемещения, будут заменены пустой плиткой.
Примечания:
- Узнайте, выбрал ли пользователь плитку, которая находится в текущем игровом измерении и не равна нулю.
- Укажите флаг, когда плитка найдена.
- Было бы полезно указать переменные для координаты плитки. Инициализируйте переменные до того, как цикл for будет установлен на 0.
- В переменные поместите переменную координат, в которой мы нашли плитку, указанную пользователем.
- Сначала проверьте, не является ли выбранная плитка плиткой на краю в направлении ее замены. Итак, если плитка находится на левом краю, ее нельзя переставить слева, так как она находится на краю. Также проверьте, действительно ли пустая плитка находится, например, слева от нее.
Для won()
части:
Это та часть, где мы видим, выиграл ли пользователь. Пользователь выиграл, когда числа расположены в порядке возрастания слева направо и сверху вниз.
Примечания:
- Установите счетчик, который будет использоваться в итерации. Это будет подсчет количества выполненных итераций.
- Проверьте, не совпадают ли координаты счетчика и доски друг с другом, например, счетчик 1 соответствует 1 на доске и т. Д., И верните false, если оно действительно не совпадает. (Примечание: проверить несходство проще, чем противоположное. Для этого нужно быть более конкретным. Перед тем, как я переключился на несходство, я обнаружил ошибку, из-за которой игра просто зависала после завершения решения.)
Это может быть самая тяжелая неделя для меня, но я ни за что не сдамся. Я узнал все больше и больше, отвечая на эти задачи. Я просто подумал, почему на этой неделе было всего две задачи, их сложность (на этом уровне) действительно непомерна. 😊
Следите за моим опытом с лекцией на следующей неделе и набором задач! Битва все еще продолжается! 💪
Если вы хотите увидеть начало моего пути к CS50, вы можете прочитать его здесь:
Если вам понравился этот пост и он вам чем-то помог, нажмите 👏 и поделитесь. Если вы хотите следовать за мной на моем пути к тому, чтобы стать разработчиком программного обеспечения, не стесняйтесь следовать за мной. 🙂
Средний: https://medium.com/@anthonycatantan
Twitter: https://twitter.com/alanthony333
LinkedIn: https://www.linkedin.com/in/alan-anthony-catantan-90a64b133/
Github: https://github.com/alanthony3 33