JavaRush /Java 博客 /Random-ZH /讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)
Masha
第 41 级

讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)

已在 Random-ZH 群组中发布
cs50 俄语附加材料 第 1 周任务

第一周目标

  • 熟悉基本的 Linux 命令
  • 学习基本的 C 语法并解决一些问题
  • 开始更清晰地思考=)
IDE CS50
为了完成任务,CS50 在云端提供了 IDE(集成开发环境)。要使用它,请在 edX 平台上创建一个帐户并注册原始课程。之后:
1. 转到 cs50.io,从列表中选择 edX,输入您的登录名和密码,单击“提交” 2. 输入您的 edX 帐户信息,单击“返回 ID.CS50.NET”CS50.io 3. 我们正在等待:您的虚拟空间正在创建。 虚拟空间CS50 4. 完成! CS50IDE
命令行和启动 CS50 IDE
在 CS50 IDE 窗口底部的“终端”选项卡中,有一个终端窗口或命令行面板。您可以在这里输入字符串命令:您可以执行与窗口界面相同的操作,例如启动应用程序、删除和创建文件、安装软件。如果您从未使用过命令行,那么此方法可能看起来很麻烦:您必须记住命令并键入它们,而不是单击图标和按钮。从某种程度上来说这是真的,然后窗口界面就被发明了。然而,命令行在所有操作系统中都可用,并且管理员喜欢它。这一切都是因为有时没有它你就无法生存。在终端的 IDE 窗口中,您将看到一行神秘的行:username:~/workspace $ 代替“username”,将有一个自动生成的名称(基于您的注册数据)。单击终端窗口,输入: update50 按 Enter。该命令要求系统更新。您将看到终端中出现描述安装过程的行。在看到更新完成之前不要关闭 CS50 IDE 。此后,默认行将再次出现,即带有您名字的行。
在 IDE 中工作
让我们创建一个用于存储文件的文件夹。右键单击CS50 IDE左上角的~/workspace (您的根目录) ,选择新建文件夹。重命名文件夹pset1(如果名称拼写错误,请右键单击文件夹并选择“重命名”)。 然后右键单击pset1文件夹并选择“新建文件”。Untilted 文件出现,让我们将其重命名为hello.txt。 双击 hello.txt。在 CS50 IDE 中,您将看到一个新选项卡和右侧可以键入的字段。如果您已执行此操作,请注意选项卡上文件名前面出现的星号 (*) - 该指示符表明已对文件进行了更改,但尚未保存。 通过转至*文件 > 保存或使用command + S(在 Apple 计算机上)或Ctrl + S(在 PC 上)来保存文件。星号应该消失。让我们检查一下文件是否位于应有的位置。让我们使用命令行来完成此操作,是时候习惯它了:)。和以前一样,终端中的活动行如下所示: Workspace - 当前工作目录(在工作环境中打开的目录)。波形符 (~) 表示根目录(工作空间位于其中)。请注意,终端中的工作区与 CS50 IDE 左上角的 ~/workspace 图标相同。让我们来练习。单击终端中的任意位置并输入命令行 并按 Enter。这两个小写字母(“列表”的缩写)将显示位于当前工作区目录内的文件和文件夹的列表。除此之外,您将看到您创建的pset1!现在让我们使用命令打开文件夹。我们输入 或更详细的内容: cd(更改目录)命令更改活动目录,在我们的例子中为 活动行已更改为 这确认您现在位于该目录中 (该行代表“我在工作区内的 pset1 中”文件夹,位于根文件夹中,用 ~" 表示)。现在输入 您将看到文件hello.txt!如果您在终端中单击该名称,则不会发生任何事情:它是文本,并且不会给出活动的链接,但它确认 hello.txt 是它应该在的位置。类型 如果您只编写 cd 命令本身,但不提供参数(即它应该转到的文件夹的名称),它将返回您到默认根目录,因此您将在活动线路上看到以下图片: 要返回到文件夹 pset1,请拨打 cs50 ide重命名文件夹CS50IDE讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)- 1username:~/workspace $lscd pset1cd ~/workspace/pset1~/pset1username:~/workspace/pset1 $~/workspace/pset1lscdusername:~ $cd workspace 并按 Enter 键。然后 cd pset1 再次输入。您还可以将这两个命令替换为一个更真实的命令: cd workspace/pset1
你好ç!
终于,这一刻来了!让我们开始编程吧。在 IDE 的 pset1 文件夹中,创建一个名为hello.c的文件(扩展名是必需的),在新选项卡中打开它(我们认为您还记得上一段中如何执行此操作)。 重要的!字母必须小写,Linux 区分大小写。Hello.c 和 hello.c 是不同的文件。在 CS50 IDE 窗口的右侧,键入与下面所示完全相同的文本。是的,您可以复制它,但打字更有用。 由于 CS50 IDE 具有语法高亮功能,因此字母的颜色不同。它用颜色突出显示文本块,以提高可读性。颜色不会保存在文件本身中;它们仅在 IDE 中可见。如果它们在那里,那么 IDE 可以识别 C,并且您在文件扩展名 (*.c) 中指出它是 C。如果您调用同一文件 hello.txt,则文本将为一种颜色。确保您输入的所有内容与示例中完全相同,否则您将遇到第一个错误 =)。我们再次提请您注意小写字母和大写字母之间的区别。\n 字符将光标移动到下一行,接下来输入的文本不会与程序的输出粘在一起。哦,是的,不要忘记分号 (;)。这是程序语句的重要分隔符;如果没有它们,C 将无法工作。单击文件 > 保存(或 command- 或 Ctrl-s)。注意到文件名前面的星号消失了吗?如果是,则更改已保存。单击代码下方终端窗口中的任意位置,并确保您位于~/workspace/pset1中(如果不在 ~/workspace/pset1 中,请按住 cd 键单击并按 Enter 键,然后再次按 cdworkspace/pset1 并按 Enter 键)。您的活动行应如下所示: 让我们确保hello.c文件恰好位于其应在的位置。键入 并按 Enter 键。你也看到 hello.c 了吗?如果没有,请返回几个步骤并再次在所需目录中创建文件。...现在是庄严的时刻:我们交叉手指,然后...我们打字: 然后交叉手指,按下 Enter 键。确切地说是 hello,而不是 hello.c。如果执行此操作后您看到的只是第二个活动行,它看起来与前一个活动行完全一样,那么一切正常!您的源代码已被翻译为机器代码或目标代码(即按 0 和 1 的序列)。现在这段代码可以被执行了(也就是说,程序可以运行了!)。为此,请 在命令行中键入:,然后按 Enter 键。如果您没有更改“”之间包含的文本,您将看到以下内容: 如果您现在键入命令 并按 Enter 键,您将看到一个新的 hello 文件,以及 hello.c 和 hello.txt。第一个 hello 名称后面应该有一个星号,这表明这是一个可执行文件,即您用来启动程序的文件。 #include int main(void) { printf("hello, world\n"); } username:~/workspace/pset1 $lsmake hello./hellohello, worldls
虫子?
如果在 make 命令之后您看到错误,那么就需要进行第一次调试了!像“预期声明”这样的铭文意味着你在某个地方犯了错字。再次检查上面的代码,只要非常小心所有细节即可。 注意力!错误描述以英文提供。如果不清楚,请使用搜索引擎、谷歌翻译,或在评论中提出问题。更正错误后,不要忘记使用“文件”>“保存”(或 command- 或 Ctrl-s)保存代码,再次单击终端窗口内部并键入 make hello (只需确保您处于〜首先是 /workspace/pset1 )。如果没有更多错误,则通过键入命令来运行程序。 ./hello 理论上,您所珍视的短语应该出现在您的前面,并用 printf 运算符的引号引起来,该运算符命令“print”。如果终端窗口看起来太小,请单击 hello.c 旁边带圆圈的加号 (+) 图标。
检查正确性
check50 应用程序内置于 CS50 IDE 中。它从命令行运行并检查某些程序是否有错误。如果还没有,请通过在终端中运行命令转到 ~/workspace/pset1 目录: cd ~/workspace/pset1 现在运行 ls 您将至少看到一个 hello.c 文件。确保文件名如下所示,而不是 Hello.c 或 hello.C。mv source destination 您可以通过运行命令源 - 当前文件名,目标 - 新文件名来重命名文件 。mv(来自英语 move)是一个重命名实用程序。如果您不小心将文件命名为 Hello.c,请键入以下行: mv Hello.c hello.c 在确保该文件准确命名为 hello.c 后,让我们调用 check50 检查程序。请注意,2015.fall.pset1.hello 是“hello world”问题的唯一标识符。check50 2015.fall.pset1.hello hello.c 如果程序执行正确,你会看到: 讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)- 2 绿色笑脸表示测试通过。您还可以在 check50 输出的底部看到 URL,但它仅适用于员工(但是,如果您有兴趣,请检查一下!)。check50 运行 3 个测试:hello.c 文件是否存在、hello.c 是否编译以及应用程序是否生成一行“hello, world\n”。如果您看到悲伤的红色表情符号,则表示您遇到了错误。 :( hello.c exists \ expected hello.c to exist :| hello.c compiles \ can't check until a frown turns upside down :| prints "hello, world\n" \ can't check until a frown turns upside down 这里check50没有找到hello.c,红色笑脸表明你要么是名字写错了,要么是文件上传到了错误的地方。黄色“中性”表情符号意味着测试未运行。如果程序没有找到需要检查的文件,他们可以从哪里开始呢?如果您更改 printf() 函数应输出的文本,则会弹出以下另一个选项: :) hello.c exists :) hello.c compiles :( prints "hello, world\n" \ expected output, but not "hello, world" check50 报告预期有 hello, world\n 行,但出现了其他内容。check50 不计算完成课程的分数,而是检查作业的结果是否与预期不同。它允许您在确认课程中任务的正确性之前验证这一点(我们稍后将告诉您如何执行此操作)。
C 基础知识:与 Scratch 的比较
Scratch 和 C 语言中的 Hello world:
讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)- 3 #include int main(void) { printf("hello, world\n"); }
  • 讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)- 4表示在 Scratch 中将精灵的“单词”打印到漫画气泡中的函数,C 中有一个 printf 函数可以执行相同的操作,只是没有漫画。
  • main - 英语 - “main”。程序的入口点。与...一样讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)- 5
无限循环
讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)- 6 翻译成C语言: while (true) { printf("hello, world\n"); } while(true)做同样的事情:当(while)值为真(布尔表达式“true”或“one”)时,循环继续工作。这个循环将无限地运行。
在屏幕上循环显示一个短语 10 次
Scratch 讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)- 7 C for (int i = 0; i < 10; i++) { printf("hello, world!\n"); } i 是一个计数器变量;它的值由增量运算符 i++ 更改,在循环的每次迭代中将其加 1。最初,使用赋值运算符 = 为 i 赋值 0。 注意力! 与 Java 中一样,在 C 中,相等由 ==(赋值运算符 =)表示。即a = 5表示变量a已被赋值5,(a= =5)表示布洛涅表达式(如果a等于5,则表达式为真,如果不等于,则为假) 。 当i“增长”到9时循环就会停止。很容易计算,循环会执行10次。因此,如果您需要重复某件事一定次数,可以在 C 中定义一个 for 循环 (int i = 0; i < 10; i++)。 另一个例子: 讲座 CS50 的附加材料:第 1 周(讲座 3 和 4)- 8 同样的事情翻译成 C: int counter = 0; while (true) { printf("%i\n", counter); counter++; }
  • 计数器将值存储在 C 和 Scratch 中。在 C 中,我们设置 int counter = 0 而不是Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 9.
  • 为了澄清起见,我们将变量的类型标记为 int:i 是一个整数(来自英语的 integer,whole)。
  • 我们在第四行 printf 中使用的 %i 符号是一个占位符,告诉我们打印十进制整数,就像我们告诉 printf 将占位符替换为计数器变量所采用的值一样。
布尔表达式
Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 10 它是一样的 (x < y) ((x < y) && (y < z))
状况
Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 11 以及“狗屎”的等价物: Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 12 第一个难以理解的短语怎么样? 稍后在“库”部分对此进行更多介绍。 #include
条件语句
这些人检查某些条件(逻辑表达式,只能用“是”或“否”回答的问题)是否为真,如果是,则他们执行与该条件相关的一些操作。生活中的一个例子:如果下雨(假设下雨)而我在外面(下雨时我在外面),我会打开雨伞。 if (condition) { //исполнить, если meaning истинно } 一个更复杂的选项:如果满足条件,则执行一个操作;如果不满足,则执行另一个操作。 if (condition) { //выполнить действие } else { //выполнить другое действие, если condition ложно } 示例:如果您年满 18 岁,请批准访问。如果少于,则不予批准。 Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 12
选择运算符
switch (n) { case const1: // если n equals const1, выполнить break; // condition совершилось — выйти из выбора case const2: // если n equals const2, выполнить break; ... default: // если n не equals ни одной из констант, выполнить break; } 示例:如果n = 50,则打印“CS50是计算机科学概论I”,如果n = 51,则打印“CS51是计算机科学概论II”,否则打印“对不起,我对那门课不熟悉!” switch (n) { case 50: printf("CS50 is Introduction to Computer Science I\n"); break; case 51: printf("CS51 is Introduction to Computer Science II\n"); break; default: printf("Sorry, I'm not familiar with that class!\n"); break; }
周期
while:检查条件,然后在条件为真时执行操作 while (condition) { // выполнять, пока истина } do/while 的不同之处在于,第一次执行操作时不检查条件,然后只检查条件。如果条件为真,则重复该操作,直到条件变为假。 do { ) // выполнять, пока истина } while (condition); for 循环重复一个操作指定的次数。 Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 13 循环可以相互嵌套。在这种情况下,在外循环的每一步,内循环都会被完整执行。 Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 14
C 中的基本数据类型
основные типы данных в C
库C
您可能已经想知道 C 程序的第一行意味着什么: 它的作用是什么?没有它是否可以完成?#include 行做了一件非常重要的事情:它将已编写的代码库包含到您的程序中。连接的库的名称包含在尖括号 (<>) 中,并具有扩展名 (.h)。如果没有库,那么任何操作,即使是最基本的操作,每次都必须一遍又一遍地描述。我们连接的图书馆#include 包含输入/输出功能。正是这个允许我们使用 printf() 函数打印到屏幕上。也就是说,如果我们没有写#include 行 ,但将 printf() 函数留在程序主体中;当我们尝试运行它时,我们会收到错误!因为如果没有这个库,编译器就不知道 printf() 是什么。有标准库,它们构成了语言的词汇。printf()函数并不是内置在计算机中的,但是它包含在标准C库中,也就是说,一些程序员以前编写了它并包含在库中。现在其他人可以使用它而无需重新发明轮子。为了让编译器“理解”它,我们连接 。CS50 流程中还使用了其他标准库。例如,字符串库,它描述了字符串的操作(确定长度、加法等)。与其他流行的编程语言相比,标准 C 库的数量非常少。但也有一些自行编写的、通常更为高度专业化的库。是的,图书馆 专为 CS50 学生创建。 是时候做一个重要的说明了:除了使用自己的代码编写程序和解决问题之外,优秀的开发人员还拥有另一项重要技能:了解已经编写的工具以及使用它们(其他人的库)的能力,以便不要浪费时间重新发明“轮子”。因此,如果您正在解决一个似乎很常见的乏味或复杂的问题,请学会问自己这个问题:“解决方案是其他人写的吗?” 很可能是这种情况,并且您可以在现有库中找到此函数。用技术术语来说,库是通过使用链接器组合目标文件集合而生成的二进制文件。目标文件是编译应用程序时获得的带有扩展名 (*.o) 的文件。
C 库的结构
Когда программист пишет библиотеку, code распределяется по двум типам файлов — заголовочный файл (header, расширение *.h) и файл реализации (implementation, расширение *.c). Заголовочный файл содержит code, описывающий ресурсы библиотеки, которые вы можете использовать. То есть описания переменных, функций, структур, типов и прочее. Если вам интересно, что содержит та or иная библиотека, нужно заглянуть именно в заголовочный файл. В терминале CS50 IDE (и других средах Linux) вы можете вызвать приложение less для просмотра файлов и открыть с его помощью интересующую вас библиотеку: less /usr/include/stdio.h Файл откроется прямо в терминале. Правда, для новичков он будет очень трудночитаемым. Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 15 Whatбы выйти из less, нажмите q на клавиатуре. Заголовочный файл не содержит code функций, что служит примером очень важного понятия — сокрытия данных or инкапсуляции. Пользователю системы незачем знать «внутренности» библиотек, ему достаточно, чтобы она работала. Если вы прошерстите stdio.h, то не найдете там реализации printf(), хотя How её использовать, вы уже знаете. Это сделано для того, чтобы защитить данные от вмешательства, которое порой может плохо отразиться на системе. Так, если кто-то изменит реализацию функции printf() в библиотеке, это отразится на всех тех программах, которые её используют. Любознательным будет интересно, где спрятана реализация. Согласно конвенции (соглашения, принятые в мире программирования) такой code хранят в файле с расширением (*.c). После компиляции библиотеки на основе двух файлов с одинаковым именем, но разным расширением создается an objectный файл, который собран так, чтобы создать файл с двоичным codeом библиотеки. Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 16 Author библиотеки передает программисту, который хочет её использовать, два file — с двоичным codeом, а также заголовочный файл. Таким образом, файл с исходным codeом программисту не нужен. Точнее, он может быть нужен, если программист хочет что-то поменять в самой библиотеке и перекомпorровать её под собственные нужды. Whatбы воспользоваться функциями библиотеки в своей программе нужно проделать следующее: 1. Включить заголовочный файл в программу с помощью строки #include В случае стандартных библиотек достаточно указать Name библиотеки в угловых скобках: #include <Name_библиотеки.h> Если библиотека, которую вы хотите подключить, лежит в той же папке, что и ваша программа, подключайте её следующим образом: #include “Name_библиотеки.h” 2.Присоединить бинарный файл для компиляции. Это очень важный шаг, поскольку, How мы говорor выше, заголовочный файл не содержит реализации элементов библиотеки. Whatбы это сделать, нужно вызвать компилятор clang с флагом –l и идущим непосредственно за ним названием библиотеки. Например, компонуем библиотеку cs50: clang hello –lcs50 Clang — один из компиляторов. Для компиляции можно также использовать уже знакомую вам программу make. По сути, она вызывает clang с определенными аргументами командной строки.
И снова Hello C: разбор синтаксиса простейших программ
Директива #include подключает библиотеку ввода/вывода . Программы в C состоят из функций, а те — из операторов и переменных. Функция — это кусок codeа, в котором уже есть or подаются Howие-то данные, а Howие-то данные получают в результате её исполнения. Фигурные скобки { } ограничивают тело функции — описание того, что она должна делать. printf() из стандартной библиотеки stdio выводит любую строку на экран. Строки заключаются в двойные кавычки, а символ “\n” означает перевод курсора на новую строку. Пример: функция «посчитать квадрат целого числа». Передаем функции данные, в нашем случае — число, которое нужно возвести в квадрат. Затем в ней прописывается алгоритм умножения числа на самое себя, и результат этого умножения она выдает на выходе. int sqr(int a) { return a*a; } int sqr(int a) — название функции. В скобках — её аргумент a, это то, что подается на вход функции. Это How переменная в уравнении. То есть, если мы хотим узнать квадрат числа 5, то мы вызовем нашу функцию в виде sqr(5) и получим результат 25. int — тип данных (от англ. integer — целые числа). Наша функция написана так, что мы не можем вызвать её с аргументом a = 5.5. Такая попытка выдаст ошибку, поскольку 5.5 — число дробное, а наше число должно быть целым. int перед именем функции означает тип, который должна эта функция возвращать. Он не обязательно совпадает с типом аргумента. Пример: функция, которая отнимает от целого числа 0.5: double bit_less(int a) { double b; b = a – 0.5; return b; } int main (void) — название главной функции. В одной программе может быть много функций, но, чтобы начать её выполнять, нужна функция под названием main. Слово void в скобках означает, что у этой функции нет аргументов. Внимание! main всегда возвращает int, но return для неё не обязателен. Пример функции не возвращающей значения: void sayhello(void) { printf(“hello everyone!\n”); } При вызове функции в главной программе, она выведет приветствие. Давайте напишем одну программу, в которой будет несколько функций. Тех, что мы уже создали выше. Две созданные нами функции вызовем через главную функцию main(). В C, How и любом языке, есть такой элемент, How комментарий or примечание в коле программы, предназначенное не для компьютера, а для понимания людей. Например, описание, что именно делает code. Компилятор комментариев не видит. Комментирование программ — очень важный момент, поскольку порой разобраться в чужом (и даже своем) codeе очень сложно. //пример однострочного комментария /** а это – многострочного **/ #include //функция возведения в квадрат числа a int sqr(int a) { return a*a; } //выводит приветствие void test(void) { printf ("hello everyone!\n"); } //главная функция int main(void) { test(); printf("%d\n", sqr(5)); } Почти всё, что есть в этой программе вы уже видели. Две функции — возведения в квадрат и приветствия и главная функция main, где мы последовательно вызываем эти две функции. В результате выполнения программы у нас сначала выведется приветствие, на следующей строке — квадрат 5. Обратите внимание, функция test() вызывается с пустыми скобками, потому что её аргументы определены How void.
Еще немного о вводе/выводе в C
Вы, наверное, уже успели заметить странные символы %d и %f в скобках оператора printf. Дело в том, что функция printf выводит данные в следующем обобщенном виде: рrintf ("управляющая строка", аргумент1, аргумент2,...); Управляющая строка содержит компоненты трех типов:
  • символы, которые выводятся на экран дисплея;
  • спецификаторы преобразования, которые вызывают вывод на экран очередного аргумента из последующего списка;
  • управляющие символьные константы.
Спецификатор преобразования начинается со знака % и заканчивается символом, задающим преобразование. Некоторые из таких символов:
  • с: meaningм аргумента является символ;
  • d or i: десятичное целое число;
  • f: десятичное число с плавающей точкой;
  • s: строка символов.
То есть, %d означает, что на экране появится целое десятичное, а %f — десятичное с плавающей запятой. What если нам нужно, чтобы пользователь ввёл данные с клавиатуры? Для этого можно использовать функцию scanf( ), прототип которой также лежит в библиотеке stdio. Whatбы считать с экрана вещественное число, в программе нужно написать строку scanf("%d", &a); Давайте перепишем нашу программу так, чтобы пользователь сам вводил число, которое нужно возвести в квадрат. Дополнительные материалы к лекциям CS50: Week 1 (лекции 3 и 4) - 17
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION