这个作业属于哪个班级 | C语言–网络2011/2012 |
---|---|
这个作业的地址 | C博客作业00–我的第一篇博客 |
这个作业的目标 | 学习Makdown语法,对本专业及C语言课程有个简单了解,记录自学慕课视频的笔记。教师可以对学生有个初步的认识。 |
网络工程专业主要讲授计算机科学基础理论、计算机软硬件系统及应用知识、网络工程的专业知识及应用知识。网络工程专业旨在培养具有创新意识,具有本专业领域分析问题和解决问题的能力,具备一定的实践技能,并具有良好的外语应用能力的高级研究应用型专门人才。
该专业学生主要学习计算机、通信以及网络方面的基础理论、设计原理,掌握计算机通信和网络技术,接受网络工程实践的基本训练,具备从事计算机网络设备、系统的研究、设计、开发、工程应用和管理维护的基本能力。
我的理解和体会:
C语言是一门面向过程的、抽象化的通用程序设计语言,与C++、Java等面向对象编程语言有所不同,广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、仅产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言描述问题比汇编语言迅速、工作量小、可读性好、易于调试、修改和移植,而代码质量与汇编语言相当。C语言一般只比汇编语言代码生成的目标程序效率低10%~20%。因此,C语言可以编写系统软件。
学习C语言的原因:主要是因为C语言是一种结构化的语言,是面向过程的。有清晰的层次、简洁的语言、具有结构化的控制语句、丰富的数据类型、丰富的运算符、可对物理地址进行直接的操作、代码具有较好的可移植性、可生成高质量、目标代码执行效率高的程序。
除了上述原因外,现在很多高级语言,其实都是类C语言。学会了C语言之后,要学习其他高级语言的话,可以很快入门。
C语言主要有以下几种应用场景:
系统软件
驱动
操作系统内核
嵌入式(单片机)开发
小程序
我本身是一个机友,我喜欢研究手机参数,也喜欢看不同up主关于新手机的主观体验。回想到小米10周年发布会上关于第一次发出MIUI第一版本系统的那段热血历史,再看到现在MIUI12系统的成熟和慢慢走向人性化,拿着自己手里的苹果手机体验时的那种顺畅感,看到华为手机中即将推出的鸿蒙系统对于物联网方向的努力,在这些之中我都能看到计算机系统的研究、设计、开发它们的散发出来的独特的魅力,这格外让人期待,想着把自己使用手机过程中的主观体验自己可以通过计算机技术的力量让它变成现实,这怎么想都是一件震撼人心的事。所以我很期待学习和系统研究,程序开发这一方面有关的知识。
学习网络工程这个专业,学习计算机编程这件事,我想首先是去学习一种尊重和学习的态度,一种向更大的信息源学习我们还未了解的知识的虚心,以及一种对他人成果尊重的诚心。因为开源是计算机程序员十分重要的素养,历史告诉我们,闭门造车不能取得进步,开放沟通交流才行,学习计算机的这一种思维,不仅仅适用于计算机学习本身,它同样适用于修身养性! 其次我觉得计算机学习的另外还是一种理性谨慎的逻辑思维,这点尤其重要,在开源的基础上,无论是驼峰变量命名法还是匈牙利命名法,其实都在强调一点那就是代码的可读性,而由此观之,逻辑思维越清晰,就越容易被人理解,这样的代码对编程界的意义也会更大。当然我想这样训练出来的思维对生活中做其他事情的效率同样也会有不同程度的提高,因为编程本身就是去解决问题,生活中,企业中,处处需要解决问题的能力,甚至推崇解决问题的能力,把逻辑思维贯彻到编程中,我们能得到好的代码,而把逻辑思维贯彻到生活做事中,我们能得到更高效的生活,这也是我对这个专业期待的。而最后,正如我前面提到我们正处于一个网络环境进步加速的时代,所以我更期待的是网络的未来,未来需要畅想,未来需要创新,未来需要大胆地去实践,我期待网工中所有和创新实践有关的内容。
时间范围大体上先定为大一:
printf(" ");
printf("%d",changeableValue); //%d是存放整形数据的地方。
printf("%f",changeableValue); //%f是存放浮点数数据的地方。
scanf(" ");
scanf("%d",&changeableValue); //%d是存放整形数据的地方。
scanf("%lf",&changeableValue); //%lf是存放浮点数数据的地方。
if语句的结构:
if (判断条件)
{ 内容;
} //这是基础的if语句结构
1.
这说明,即使没有大括号,对于两个相连的if,第二个if会被默认为第一个if的相关执行内容。
2.在没加大括号的情况下,Else总是与最近的那个if匹配,且并不会因为缩进格式而受影响,缩进格式只是方便人的阅读!
3.一个好的编程习惯:不管是几条语句,if 和else后面都最好跟上“{}”。
1.如果else的内容内含有if,可以直接写成else if(…){…}。
2.关于第三点的补充,那就是if判定成立与否的条件是“()”内的结果是0还是非0,前者不成立,后者成立。
3.得养成一个好习惯,那就是要学会尊重“warning”!
4.关于代码风格:在if和else后面必须加上大括号来形成语句块,另外大括号内的语句要缩进一个“Tab”的距离。
5.体验一下三种风格:
第三种风格有一种比较舒适的后期编辑氛围,可以比较方便删除其中的某一个级联。所以我要求自己尽可能用这种风格来书写代码!
6.if语句的判定条件只能是一个表达式,想要多个的话那就使用逻辑预算符。
2.其中,控制表达式(可以是一个变量,也可以是一个变量的表达式)的数据类型只能是int否则无效!
3.其次,常量既可以是 常数 也可以是 结果为常数的表达式。
4.还可以是原先已经定义好的const常量不过这里有一点要注意!!!这一点只针对C99 不针对ANCI C
5.Switch语句就像是在开一堆上了锁的排着顺序的箱子,你控制表达式的值就是你第一把拿到的钥匙,你得走到你拿到的钥匙对应顺序的那个箱子的地方(也就是对应的case)去开箱,如果能在箱子里面开到游戏结束也就是break语句,那就完成了这个游戏跳出了整个switch语句,如果没有开出break语句,就会按照顺序继续开下去(这时开锁的钥匙会自动出现)(正如图片中case 1:中没有内容没有break,那就会顺延到case 2:),直到其中有一个开出了break语句或者把所有箱子开完了才算结束了这个switch语句。
6.小细节,case后要空格接常量,以及常量后面要有 冒号:
7.case并非分割线,case只是一个顺序代表,反而真正有划分意义的是break。
8.如果进行数据转换的话,switch-case可以做一些好像级联才能做的事情。(这是又要提到**/和%对于数据的转换功能了!)
9.小细节记得最后要加上default:(?Default后面接break和不接break有什么差别吗?)
10.请记住读一段代码的过程:输入—计算—和输出。对switch句型不要只想到控制表达式和case的对应就完事了,读一段程序一点要读到结束信号的总结采取考虑输出。Switch语句的终结一定要特别注意break**!!!!
11.switch-case如果表达式中采用逻辑预算符,再加上switch-case语句的嵌套的话,是可以达到想if-else if语句的多重嵌套效果的,并且可创造型更高。
12.
原来计程车计价问题中的不足5分钟不计费的意思是只要算整的几个5分钟,不记零头的费用!
以及在另一个网站链接解法中,它将按公里记的价和等待时间所记的价给分开计算,然后再在最后结合起来,这也是一个很清晰的解法。更强大的一点是,这种解法解放了多个变量条件下,需要对if语句进行层层嵌套的麻烦局面,而仅仅只是多加了一个变量去做计算就解决了这种问题,而且使答案更清晰。
也就是说对于多变量条件影响同一变量的值的问题的时候,比起用if语句将多个变量条件逐一分类嵌套,不如将那个同一变量分成多个分变量逐一去对应每一个不相互影响的变量条件,最后再将分变量合成总变量进行输出!
while (条件)
{
循环体;
}
1.while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。
do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
2.循环体内要有改变条件的机会否则循环会变成死循环!!
3.While语句的判断是在执行循环体之前,所以存在一次循环也不执行的可能。
4.只有条件成立,循环才能继续!!!!
5.有时候可以在循环体里面加入输出(printf),这样会方便我们直接看到变量值的变化。
6.一些用来做标记的printf,在提交到pta上的时候一定要记得加上// 或者/**/ 将其无效化!
7.对于循环语句的计数变量,最好习惯上给初始化。
8.Do-while语句
!与while不同的是,do-while语句的结尾的while需要加上;
9.
while语句的写法!
小细节,for循环的()内是用;隔开的而不是, 其次三位位置分别表达的是1.初始动作2.循环继续的条件3.循环执行的动作。
而且即使是在可识别C99的编译器中也必须要特殊引入才能使用。
10.
11.对于循环体内的n++(n–)和printf,先放哪一个后放哪一个,循序不同,循环的次数,和n最后的值并不会改变,但是输出的值会改变!!!!
1.计算机采用区间的形式来判断一个数的位数。
2.对于 大于 的判断,从高处往下走可以不用设置上限,会比较方便,而对于 小于 的判断,从低处往上走反而更有优势。
3.要学会使用 /= *= 这类复合运算符来提高运算效率!
4.求和的情况下,变量的初始值要是0,而求积的情况下,变量的初始值得是1。
5.
同样是while语句,但是循环体内部语句放置的顺序不一样,变量需要初始化的值也不一样,才能得到相同的结果。
(题目是1到100的累加。)
!先看上面的那个程序,sum的初始化为 1 ,于是就需要先执行n++ 使得n=2,这样下去,下一步才会执行sum = 1+2 而且循环判定条件里面不该有等号,因为99的时候是条件成立的,会先进行n++,在进行sum += n;这时候加的最后一个数是100就刚刚好。
!在看下面一个程序就不一样了,他是先执行累加,在执行n++,所以当累加到99时,n还是99,累加结束后执行n++ 才会变成100,而此时累加还差最后一个100,所以循环条件需要加上等号。
下一个程序可以等价于for类型的写法!
即
for (n = 1; n <= 100; n++)
{
Sum += n;
}
for对于有固定次数的程序的例子有,比如说算阶乘,算累加等等。
7.做循环运算的时候对于一些在后面可能会用到的初始值,我们可以先再设置一个变量去保存它,以备后用。
8.如果要模拟一个很大次数的循环,可以先模拟较少次数的循环然后做出推断!
9.尽量让单一出口成为一种思维习惯,当然不要被限制,如果某些情况下,单一出口会使程序繁琐的话,那就不用!
10.do-while结构中while()内写的依旧是循环的条件,不要直接读成循环结束的条件了!
1.rand()这是产生一个随机数的函数,每次召唤rand()就能得到一个随机的整数。
2.
获得随机数的配套程序:
#include
#include
srand (time(0));
Int a = rand();
3.
1.循环嵌套要求里面的循环循环完才算是外面的循环循环一次,第二次外头的循环还是会经过里循环这堵墙,不过如果判定条件不满足的话,那也会直接跳过,所以盲猜循环嵌套里循环要有能改变外部循环条件的因数,外部循环,在里循环之前要有能改变里循环循环条件的语句。
2.有时候可以另设一个变量来作为开关变量来作为指向不同结果的if语句的条件。
3.
用break可以用于跳出循环;而continue可以跳过循环这一轮剩下的语句进入下一轮。
4.break和continue都只针对他们所在的那一层循环,面对多层循环的时候,一个break并不能完全跳出所有的循环。
5.
用于跳出多重循环。
6.
另一种更好的方式,便是使用 ‘goto’语句就像一个空间传送门,可以到达你想去的地方。
7.处理加减交错的问题,除了利用(-1)的奇偶次方的结果不同之外,还可以另设一个变量,对其进行循环的取负运算,这种方法好像更简洁。更简单一点是取原有的变量比如分子等,这些都行。
8.对一个整数进行正序的拆分的一个办法是,先将这个整数逆序然后在将逆序后的整数进行逆序拆分。(只针对于末尾没有零的数字。)
2.加入#include
后就可以用bool来定义一个bool类型的变量,可以将它们定义为true
或false
,不过,值得一提的是,即使是bool类型的变量,他们的结果依然是一些整数而不会输出为’true’或’false’,并且即使给他们赋值为整数也依旧可以通过编译!
3.
示范程序如图所示。
4.
if语句的其他拓展, && 在if语句中是且的意思, ||在if语句中是或的意思。
其实 &&和||是逻辑类型中的 且 和 或的意思。
由此我们引入逻辑运算的三种运算:
! | && | || |
非 | 且 | 或 |
5.逻辑运算是对逻辑量进行运算,结果只有0或1,逻辑量是逻辑运算和关系运算的结果。
6.
小写字母同理。
7.
不要把赋值包括复合赋值组合进表达式!
9.条件运算符:
嵌套的条件表达式很复杂且可读性很差!(除非。。。。)
10.逗号运算:逗号表达式的结果是逗号右边的式子的值,且逗号表达式一般只在for当中使用。
Example:
(虽然说了那么多,但可以简单地认为,逗号的用处还是逗号。毕竟如果不进行赋值的话,那逗号运算的结果不重要,重要的是,它的优先级比赋值还低,可以用来隔开两个赋值的表达式罢了。)
1.函数是一块代码,接受零个或多个参数,做一件事情,并返回零个或一个值。
void代表返回类型为不需要返回。
2.()在函数中表示调用的意思,也就是说即使没有参数,只要我们需要调用一个函数的话,那就一定要有();如果有参数的话,则需要按照正确的数量、顺序和格式来书写。
3.函数的每次调用都会进行初始化,而且函数每一次执行完全后就会返回到调用它的地方。
4.return表示了一个函数的结束,且如果return后面有值的话,那么return会返回到那一个值去。当然存在不需要返回的情况,也存在返回后面没有值的情况。
5.在一个函数中可以有多个return,但是我们强调单一出口,所以最好不要。return的作用其实是将一个值返回给调用它的函数,将这个值作为那个表达式的结果。
1.
不一定要把整个函数的定义写在前头,可以先把函数头写在前面当作声明,然后再在末尾写定义。
2.**从图中会发现,图中的数据会发生 自动类型转换,因为我们对函数变量的定义是浮点数。 **
3.
4.
这样来说,自定义函数中的参数和main函数中的参数实际上是独立分开的,在调用函数的过程中,实际传递给自定义函数的是 值 而不是那个 参数 (或者说变量,变量也不过就是一个用来容纳值的容器,只不过在调用函数的时候像一个传送门一样,它是把值传送过去,而不是自己本身)本身,当然值在我这个传送门的时候会显示这个传送门有值,一但传送走了,那我也就没有值了。
5.同时传送门理论也可以更好得让我们理解,为什么定义或声明函数的时候,变量名不重要甚至可以不写,但数据类型却必须写。
6.
7.
如果有另加括号的话,那会先执行逗号运算,如果没有,那就是普通的逗号。 注:逗号运算符的结果是逗号右边的值。
8.C语言函数不允许在函数里面嵌套定义函数但是允许在函数内写另一个函数的声明,只不过,我们不推荐这样写。
9.
main函数的小了解。其中关于return 0;正因为是0所以对main函数的返回类型是 int ,其中返回值是0给操作系统的答复是执行正常,也可以是其他值但是不正常。
10.当局部变量和全局变量同名时,局部变量的调用权优先!
%n.mf
其中m表示浮点数保留的小数位,n表示浮点数的字符长度。
特别地,%.0f
具有自动的四舍五入的功能。