После войны, которая у меня была на четвертой неделе, было действительно приятно передохнуть на пятой неделе. Кто-то из группы CS50 в Facebook однажды сказал мне, что после четвертой недели мне станет легче. Я добрался до набора задач пятой недели и прыгнул через него. Конечно, мне все еще потребовалось несколько часов, но я определенно не испытывал сбоев, как на неделе 4. Каким-то образом, когда я писал код, я мог реально представить себе последовательность того, что я должен был сделать и получить вернуться, чтобы отслеживать, обнаружил ли я ошибку. Я почти могу сказать, что действительно мог читать то, что написал. Это был действительно потрясающий опыт!

Дело в том, что я действительно взял что-то вроде длительного перерыва (неделю или около того) от CS50 после того, как закончил пятую неделю. Знаете, я просто хотел отдохнуть. Я просмотрел темы шестой недели, и они уже были на знакомой территории. Однако это не значит, что я ничего не кодировал в течение недели. Я сделал несколько алгоритмов на HackerRank, чтобы не потерять острое чувство, которое у меня есть. Решив несколько, я понял, что улучшил написание основ языка C. Это действительно сделало меня счастливым, потому что я вспомнил, как впервые пошел на HackerRank, и подумал, что эта проблема мне показалась чуждой. Медленно, но верно CS50 действительно научил меня основам и многому другому! 😊

Конспект лекций:

  • Существует функция realloc(), reallocate, которая дает больше места тому, что было запрошено для этой цели, путем копирования текущего содержимого в другую часть памяти и предоставления ему большего места.
  • Segmentation fault происходит, когда вы вызываете освобожденный указатель (или память) и пытаетесь получить к нему доступ или изменить его.
  • В узлах всякий раз, когда вы нажимаете NULL, это означает, что вы находитесь в конце списка.
  • Между емкостью и размером существует семантическая разница. Емкость - это постоянное количество, которое стек может максимально удерживать. Размер - это текущее содержимое стека. Допустим, 100 - это вместимость, а размер только 50.
  • LiFo = Последний вошел, первым ушел
  • Обратной стороной массива является его конечность. Это ограничено тем, насколько вы его инициализировали.
  • Двоичное дерево поиска означает, что для каждого узла в дереве левый дочерний элемент меньше его, а правый дочерний элемент больше его.
  • Рекурсия происходит, когда функция вызывает сама себя.
  • Числа в IP-адресах от 0 до 255. IP-адрес - это 32-битное значение.
  • DNS, серверы доменных имен, преобразует числовые IP-адреса в имена хостов (которые более понятны и запоминаются для людей).
  • Команда nslookup, команда поиска сервера, вернет IP-адрес сайта.
  • Брандмауэр в основном действует как фильтр (или это фильтр), программное обеспечение, которое не пропускает нежелательные пакеты и предотвращает утечку пакетов, которые вы не хотите отправлять.
  • VPN, виртуальная частная сеть, туннелирует соединение в / из частной сети, такой как школа или офис, при наличии подключения к Интернету.
  • telnet - это старая программа, которая позволяет вам подключаться к удаленному серверу через определенный порт.

Набор задач:

На пятой неделе была только одна задача, а на пятой - ни одной.

Спеллер

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

Загрузка - это место, где вы загружаете файл словаря, текстовый файл, который содержит слова и будет действовать как ссылка, где определенные тексты будут проверяться, есть ли он там или нет. Это означает, что «написание» верно, если слово существует в файле словаря. Проверьте, где вы проверяете, действительно ли слово существует в словаре. Выгрузить, ну, выгружает или освобождает память (и, предположительно, словарь, но я сделал это в конце загрузки), выделенную для хранения слов из словаря, чтобы мы могли проверить, существуют ли слова. Размер проверяет количество слов в файле словаря.

Это было немного сложно. При этом я столкнулся с множеством ошибок. Я использовал CS50 Study, CS50 Reference, tutorialspoint и stackexchange.

Примечания:

  • Не пишите свои собственные хэш-функции (на данный момент), ищите в Интернете (подсказка Дуга в Hash Table Shorts).
  • Обнаруженная ошибка: Could not load dictionaries/small
    Причина проблемы: значение «return false» не было изменено в строке 90
    Решение: изменено значение на «return true»

  • strcasecmp() us функция, которая сравнивает две строки независимо от случая char

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

  • Количество слов в словаре и количество слов в тексте аналогичны решению для персонала. Единственная проблема заключалась в словах с орфографическими ошибками. Это также могло быть причиной того, что программа не прошла проверку 50.
  • После выполнения дополнительных тестов кажется, что слов с ошибками на самом деле не найдено.
  • Изолированная проблема, когда значение первого аргумента в strcasecmp фактически пустое (или больше похоже на отсутствие значения). Он был инициализирован в строке 57. Ошибка исходит из заголовка переменной.
  • При использовании только заголовка переменной нет указания, с какой «частью» в хеш-таблице она сравнивается при передаче в строку 63 для сравнения.

  • Просто решается путем повторной инициализации курсора узла * на новое хеш-слово (переданное из аргумента).

  • При запуске check50 программа не могла пройти из-за флагов valgrind

  • Хотя намекнули, что может быть проблема в строке 59, у функции unload могут быть проблемы сами по себе.
  • Исправлено путем добавления дополнительных строк кода, который выполняет итерацию по всей хеш-таблице, и имеет оператор if для выполнения функции только тогда, когда конкретный связанный список в таблице не равен NULL.
for(int i = 0; i < hashtable_size; i++) {
 if (hashtable[i] != NULL) {} }
  • Как я понял, ошибка «Условный переход или перемещение зависит от неинициализированного значения (значений)» возникла из-за выделения части памяти и присвоения указателю адреса начального блока. Обычно это не вызывает никаких ошибок, но при проверке значений NULL без ввода какого-либо значения (которое буквально является NULL) выдает эту ошибку. Это похоже на проверку того, было ли пространство пустым, но на самом деле оно не было инициализировано или обозначено как пустое. Установка 0 инициализирует его как NULL и false. Это решило это:
memset(new_node, 0, sizeof(node));
  • Решил это благодаря этому вопросу по stackexchange.
  • Проблема все еще не решена. Остался еще still reachable.

  • 568 байт в 1 блоке означает, что файл не был закрыт. Только файл словаря был открыт в функции загрузки. Закрытие файла в конце функции решило эту проблему.
  • Решил это благодаря этому вопросу на stackexchange.

Следите за моим опытом с лекцией на следующей неделе и набором задач! Я очень рад заполучить Python! Битва продолжается, но продолжается! 💪

Если вы хотите увидеть начало моего пути к CS50, вы можете прочитать его здесь:



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

Средний: https://medium.com/@anthonycatantan

Twitter: https://twitter.com/alanthony333

LinkedIn: https://www.linkedin.com/in/alan-anthony-catantan-90a64b133/

Github: https://github.com/alanthony333