Найти тему
Пикабу

CS50 Harvard - учебные программы на С из лекций 3-4

Проблема тех, кто не является студентом Гарварда и хочет пройти вводный курс CS50, заключается в том, что у них нет доступа к директории с учебными программкам в облачной IDE, зато есть доступ к самой IDE со всеми прикрученными костылями-библиотеками. Приходится вручную переписывать код из видеолекции и молиться, чтобы эти программы завелись.

Также если вы смотрите старый курс (а большинство смотрит перевод курса 2015 года), то появляется ещё одна проблема - изменилось написание функций во встраиваемых библиотеках, поэтому простое списывание для большинства программ уже не проканает.

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

Вооружившись мануалом к университетским библиотекам (https://manual.cs50.io/), а также гуглом, я упоролся и восстановил все программы из этих лекций.

Helloworld.c.

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

#include int main (void) { printf ("Hello, world\n"); }.

.
.

Далее вариации этой программы, которые Дэвид Малан сочинял на ходу, но не сохранял. Строковая переменная.

Hellohannah.c #include #include int main (void) { string s = "Hannah"; printf ("Hello, world\n"); }.

-3

А эта программа заняла у меня больше всего времени. Заставляем переменную запрашивать имя самостоятельно через библиотечную функцию. 4 дня ушло на то, чтобы узнать, что в новой версии функции GetString () - get_string () - требуется вставить что-то в скобки, чтобы она заработала. Я ставлю кавычки, ибо они интуитивно понятны.

getname.c.

#include #include int main (void) { string s = get_string (""); printf ("Hello, %s\n", s); }.

-4

После решения этого гиппопотамуса от мира ребусов работа пошла быстрее.

Далее лектор вернулся к сохранённым в каталоге курса программам и запустил простой калькулятор сложения целых чисел.

adder.c.

#include #include int main (void) { // ask user for input printf ("give me an integer:); int x = get_int (""); printf ("give me another integer:); int y = get_int (""); // do the math printf ("the sum of %i and %i is %i! \n", x, y, x + y); }.

-5

Далее рассматривалась программа про условия. Я разделил её на две версии - багнутую версию (conditions-0b.c), которая не предусматривает ситуацию, когда переменная равна 0, и пофикшенную версию (conditions-0.c).

conditions-0b.c

#include #include int main (void) { // ask user for input printf ("I'd like an integer, please:); int n = get_int (""); //analyze user's input if (n>0) { printf ("You picked a positive number! \n"); } else { printf ("You picked a negative number! \n"); } }.

-6

conditions-0.c.

#include #include int main (void) { // ask user for input printf ("I'd like an integer, please:); int n = get_int (""); //analyze user's input if (n>0) { printf ("You picked a positive number! \n"); } else if (n == 0) { printf ("You picked zero! \n"); } else { printf ("You picked a negative number! \n"); } }.

-7

Условия и операторы.

nonswitch.c.

#include #include int main (void) { //ask user for an integer printf ("Give me an integer between 1 and 10: \n"); int n = get_int (""); //judje user's input if (n >=1 && n <=3) { printf ("You picked a small number.\n"); } else if (n >= 4 && n <= 6) { printf ("You picked a medium number.\n"); } else if (n >= 7 && n <= 10) { printf ("You picked a big number.\n"); } else { printf ("You picked an invalid number.\n"); } }.

-8

Погрешность десятичных дробей, связанная с разрядностью программы.

imprecision.c.

include int main (void) { printf ("%f\n", 1.0/10.0); }.

-9

imprecision10.c (Сохранил баловство Дэвида с количеством нулей после запятой в отдельные программы)

#include int main (void) { printf ("%.10f\n", 1.0/10.0); }.

-10

imprecision20.c.

#include int main (void) { printf ("%.20f\n", 1.0/10.0); }.

-11

imprecision29.c.

#include int main (void) { printf ("%.29f\n", 1.0/10.0); }.

-12

Первая демонстрация цикла - for.

loopdemo.c.

#include int main (void) { for (int i = 0; i < 50; i++) {printf ("%i\n", i); } }.

-13

Создание функций.

function-0.c.

#include #include void PrintName (string name); int main (void) { printf ("Your Name:); string s = get_string (""); PrintName (s); } void PrintName (string name) { printf ("Hello, %s\n", name); }.

-14

function-1.c.

Помимо самопальной функции, имеем ещё и do-цикл и return.

#include #include int GetPositiveInt (); int main (void) { int n = GetPositiveInt (); printf ("Thanks for the %i! \n", n); } int GetPositiveInt (void) { int n; do { printf ("Please geve me a positive int:); n = get_int (""); } while (n < 1); return n; }.

-15

И завершающая прога четвёртой лекции, демонстрируюшая return на примере возведения целого числа в куб.

return.c.

#include #include int cube (int a); int main (void) { int x = 2; printf ("x is now %i\n", x); printf ("Cubing...\n"); x = cube (x); printf ("Cubed! \n"); printf ("x is now %i\n", x); } int cube (int n) { return n*n*n; }.

-16