- 1 -
2021年03月21日。
周日。
这是奶爸进击之旅——CS自修室的第五期更新。
- 2 -
上期我们一起创建了第一个C语言程序:<hello,world>。
而且前几期有提到过C语言中的一些基本功能,functions(函数)、loops(循环)、conditions(条件)、Boolean expression(布尔表达式)等。
接下来我们将进一步去学习这些功能,将它们写入到真正的代码当中。
首先,functions在各种语言书籍里的中文均称之为‘函数’,但其实应当把functions理解成‘功能’更为恰当一点,functions就像一个个小小的程序,可以在程序中执行某些操作。
最理想的状态是,每一个function都独立地完成某项功能,而所有这些functions则组成了一个程序,所以,可以这样理解:“一个程序是由多个小的功能叠加而成。”
functions可以接受输入和调用,在学习如何调用函数参数的输入时,又引入了一个新的术语——参数(arguments或者parameters,它们具有相同的意义,都表示参数),参数就是函数的输入。
如同我们上期使用的“打印”函数:printf();
你可以注意到,在打印函数的后面有一对圆括号,圆括号里的内容,实际上就是函数的参数,也就是该函数的输入。
在C语言中,打印函数中的参数,需要使用双引号标注:
printf("hello, world");
而在C语言中,有些烦人的是,任何函数都需要以分号「;」结尾,函数方可以正确执行,你把它当做平时写完一个句子时,需要在末尾增加一个句号去记忆就好了。
如果忘记了,导致编译不成功,编辑器也会相应的警告你错误的位置,找出来补上就好了。
在刚开始编写程序的的时候,漏写(有时候是结尾的分号,有时候是引号,有时候是括号)是经常发生的,不要为这些愚蠢的事情感到沮丧,随着不断的练习,你的大脑会不断强化记忆这些规则。
即便你因为一个引号的漏写编译报错而检查了半天,不知道到底自己错在哪里,也不要因此感到挫败,即便是最厉害的程序员,他在编写代码的时候,仍然会出现这样或那样的小错误。
- 3 -
另外,functions并不只会打印一段文本,有些functions能够返回值(return values),而要做到返回值,就必须引入变量(variables),将functions的输入存储在变量当中,再以某种形式传递给使用者,从而可以重复地使用它。
C语言本身支持输入的方法并不容易,但如果你使用库(library——库就是别人写的代码,你可以在你自己编写的程序中引入它,简化你的编写工作)的话,就会变得非常容易。
CS50拥有自己编写的库(library),它可以帮助我们在前期的学习中,更好的理解和操作。
如CS50库中的函数:get_string();——就能帮助我们更好地从用户那里获得输入的文本。
string(字符串)——是编程世界中的艺术术语,string就是文本。
如:get_string("What is your name? ");
函数内的参数为某种提示,你可以任意设定这些提示,好让用户知道自己接下来输入的内容是什么?
但是C语言无法直接获取输入,还需要你引入一个变量将用户的输入存储其中,所以你必须提供一个变量的名称,将用户的输入赋值给这个变量,如下:
name =get_string("What is your name? ");
以上name就是一个变量,变量可以是任意名称,但最好是具有描述性的名称,让人一看知道该变量的含义。
变量可由字母(一般是小写字母,大写字母在编程语言中有其他的指示)、下划线、数字组成,可以是字母开头或下划线开头,但不能以数字为开头。
虽然可以用下划线开头,但根据惯例,下划线开头的变量名是系统专用的,所以最好的选择是使用字母开头,如果需要两三个词才能描述一个变量,则用下划线将每个词隔开,方便阅读。
如存储学生的姓名的变量,则可以命名为:name_student,相较于随意命名,这样的命名方式就能很清晰的描述该变量。
还有一点,变量名不能使用C语言内置的关键字(keywords),如printf,这会引发程序的错误。
其实这些变量的命名规则,在任何语言中都基本适用,如python也是按照这些规则给变量命名的。
另外,要注意的是,上文代码中的等号(=),在大多数编程语言中,它其实并不是等号,而是赋值符号,执行将它右边的内容赋值给左边变量的操作。
简单来说,它的作用就是将右边的内容复制下来,并将它分配给左边的内容当中。
如上述代码就是将用户输入的名字赋值给变量【name】。
不过上述代码仍然是不完整的代码,在C语言中,你不能直接写出变量以期盼计算机能识别你的意图,你还需要给变量指定类型,告诉计算机你所创建的变量属于什么类型的变量。
C语言指定字符串变量有点复杂,但由于我们引入了CS50的函数库,我们可以简化字符串的类型指定,见下面代码:
string name = get_string("What is your name? ");
现在,这就是C语言中一行完整又正确的代码了。
不过,通常来说,我们并不会只存储用户输入的值就这样结束一个程序,那程序也就没有什么存在的意义了。
接着,我们得学会如何调用functions中的返回值或输入,并处理使用这个数据。
如程序的作用是用户输入了自己姓名后,将对其打招呼。
这里就又需要用到printf();函数了。
在C语言中,我们可以用以下代码执行上述打招呼的操作:
printf("hello, %s", name);
这里出现的新的语法,%s,表示的是格式代码(printf函数不仅可以打印(print)文本,而且printf中的f(format)使其也可以打印格式代码),但格式代码并不会真正地打印出来,它只是为需要打印的string(字符串)提供一个占位符。
代码中的第二个< , >的作用是将functions中的多个参数或输入分开来,但值得注意的是,第一个< , >,由于它存在于printf函数的引号之中,它实际上就只不过是一个文本中的逗号而已,并非程序语言的符号,所以没有任何功能。
现在,将这些代码组合起来,并输入CS50 IDE中编译执行:
以上就是<hello,world>程序的改进版,从用户那里获得输入,再调用处理这个输入。
虽然和前文介绍的代码略有不同,如图中的变量名为answer,实际上我是故意为之的,目的是要让你知道变量命名不影响程序的执行,在这个程序中,变量answer和name没有任何区别,只是命名的选择而已。
不过,要谨记的是,这里使用到了string来指定变量名,而且使用了get_string();函数来获取用户的输入,则必须要在最开始引入CS50的函数库才可以。
因为C语言本身并没有这些函数和功能,它是CS50编写的代码,意欲让你在前期的学习中更好的学习,更好的理解。
好了,以上,就是本期CS自修室总结,希望对你有所帮助,我们下期再会。
01010100 01101000 01100001 01101110 01101011 01111001 01101111 01110101 00100001
——我就是可可奶爸,一个平平无奇的全职奶爸。
我只是一个平平无奇的全职奶爸,不敢指导你什么,只想和你一起共同成长。
关注公号:Irene_Daddy 【进击的可可奶爸】
本号的更新内容:
周一,马拉松幻视:以马拉松为目标,每周跑步总结。
周三,英语屋:总结学习时收获的英语口语表达,以及一些英文的学习方法。
周五:向往的N2:以考取日语N2为目标,每周学习总结。
周日:CS自修室:自学CS的每周总结。
还有不定时的更新奶爸的日常:读书、观影的一些碎碎念,偶尔的秀恩爱撒狗粮,不时的亲子活动等……