Проблема тех, кто не является студентом Гарварда и хочет пройти вводный курс CS50, заключается в том, что у них нет доступа к директории с учебными программкам в облачной IDE, зато есть доступ к самой IDE со всеми прикрученными костылями-библиотеками. Приходится вручную переписывать код из видеолекции и молиться, чтобы эти программы завелись.
Также если вы смотрите старый курс (а большинство смотрит перевод курса 2015 года), то появляется ещё одна проблема - изменилось написание функций во встраиваемых библиотеках, поэтому простое списывание для большинства программ уже не проканает.
Вот и я дважды за неделю строчил посты с просьбами расшифровать тексты ошибок из терминала, потому что работать с ним не учат. По крайней мере, в первых лекциях. Спасибо тем, кто смог хотя бы донести, что в тексте ошибки зашифрована строка и номер символа по порядку, и можно найти и сравнить неверный кусок кода.
Вооружившись мануалом к университетским библиотекам (https://manual.cs50.io/), а также гуглом, я упоролся и восстановил все программы из этих лекций.
Helloworld.c
Обычно первое, что создаёт будущий прогер практически на любом языке. Первая-то она первая, но с её отладкой я помудохался знатно.
#include <stdio.h>
int main(void)
{
printf("Hello, world\n");
}
Далее вариации этой программы, которые Дэвид Малан сочинял на ходу, но не сохранял. Строковая переменная.
Hellohannah.c
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string s = "Hannah";
printf("Hello, world\n");
}
А эта программа заняла у меня больше всего времени. Заставляем переменную запрашивать имя самостоятельно через библиотечную функцию. 4 дня ушло на то, чтобы узнать, что в новой версии функции GetString() - get_string() - требуется вставить что-то в скобки, чтобы она заработала. Я ставлю кавычки, ибо они интуитивно понятны.
getname.c
#include <cs50.h>
#include <stdio.h>
int main(void)
{
string s = get_string("");
printf("Hello, %s\n", s);
}
После решения этого гиппопотамуса от мира ребусов работа пошла быстрее.
Далее лектор вернулся к сохранённым в каталоге курса программам и запустил простой калькулятор сложения целых чисел.
adder.c
#include <cs50.h>
#include <stdio.h>
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);
}
Далее рассматривалась программа про условия. Я разделил её на две версии - багнутую версию (conditions-0b.c), которая не предусматривает ситуацию, когда переменная равна 0, и пофикшенную версию (conditions-0.c).
conditions-0b.c
#include <cs50.h>
#include <stdio.h>
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");
}
}
conditions-0.c
#include <cs50.h>
#include <stdio.h>
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");
}
}
Условия и операторы
nonswitch.c
#include <cs50.h>
#include <stdio.h>
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");
}
}
Погрешность десятичных дробей, связанная с разрядностью программы.
imprecision.c
include <stdio.h>
int main(void)
{
printf("%f\n", 1.0/10.0);
}
imprecision10.c (сохранил баловство Дэвида с количеством нулей после запятой в отдельные программы)
#include <stdio.h>
int main(void)
{
printf("%.10f\n", 1.0/10.0);
}
imprecision20.c
#include <stdio.h>
int main(void)
{
printf("%.20f\n", 1.0/10.0);
}
imprecision29.c
#include <stdio.h>
int main(void)
{
printf("%.29f\n", 1.0/10.0);
}
Первая демонстрация цикла - for
loopdemo.c
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 50; i++)
{printf("%i\n", i);
}
}
Создание функций
function-0.c
#include <cs50.h>
#include <stdio.h>
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);
}
function-1.c
Помимо самопальной функции, имеем ещё и do-цикл и return
#include <cs50.h>
#include <stdio.h>
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;
}
И завершающая прога четвёртой лекции, демонстрируюшая return на примере возведения целого числа в куб.
return.c
#include <cs50.h>
#include <stdio.h>
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;
}