二十天走进C语言的奇妙世界【1】


太原理工机器人团队二十天学习打卡


前言

经过上一年对C语言的学习,感触非常深,因此写下如下这些内容,希望能对后来者有所启迪。在接下来的二十天里,我将带领大家走进c语言的奇妙世界,一起去领略计算机编程的异域风采。本系列文章综合bilibili,AlphaCoding,等各大网站教授们的课程精华,以及我自己的个人理解,希望能够得到大家的认同。

第一章 程序设计和C语言

本章的内容致力于从最基础,最根本的角度带领大家走进程序设计的奠基石——C语言。

1.1 什么是计算机语言

机器语言 计算机工作基于二进制,从根本上来说,计算机只能识别和接受由0和1组成的指令。在计算机发展的初期,一般计算机的指令长度为16,即以16个二进制数(0或1)组成一条指令,16个0和1可以组成各种排列组合。

这种计算机能直接识别和接受的二进制代码称为 机器指令(machine instruction)。机器指令的集合就是该计算机的 机器语言(machine language)。在语言的规则中规定各种指令的表示形式以及他们的作用。

符号语言 为了克服机器语言与人们习惯用的语言差别过大的缺点,人们创造出 符号语言 (symbolic language),它用一些英文字母和数字表示一个指令,例如 ADD 代表“加”,SUB 代表“减”,LD 代表“传送”等。

ADD A,B  (执行A+B→A,将寄存器A与B中的数相加,放到寄存器A中)

显然,计算机无法直接识别和执行符号语言的指令,因此需要用一种称为 **汇编程序 **的软件把符号语言的指令转换成机器指令。一般,一条符号语言的指令对应转换为一条机器指令。转换的过程称为“代真”或“汇编”,因此,符号语言又称为 符号汇编语言(symbolic assembler language)或 汇编语言(assembler language)。

然而,不同型号的计算机的机器语言和汇编语言是互不通用的,此类语言称为计算机 低级语言 (low level language)。

与之不同的是,语言功能很强,且不依赖于具体机器,用它写出的程序对任何型号的计算机都适用(或只需做很少的修改),它与具体机器距离较“远”,此类语言称为计算机 高级语言(high level language)。

当然计算机也并不能直接识别高级语言程序,需要进行“翻译“。用一种称为 编译程序 的软件把高级语言写的程序(称为 源程序(source program))转换为机器指令的程序(称为 目标程序(object program)),然后让计算机执行机器指令程序,最后得到结果。

高级语言经历了如下的发展阶段:

(1)非结构化的语言

(2)结构化语言

(3)面向对象的语言

进行程序设计,必须用到计算机语言,人们根据任务的需要选择合适的语言,编写出程序,然后运行程序得到结果。

1.2 C语言的发展及其特点

1.2.1 C语言的起源

提起C语言,就不得不谈到两位骨灰级游戏玩家:Ken ThompsonDennis M. Ritchie

他们究竟做了什么呢?

1969年,ken和dmr梦想能遨游宇宙

ken设计了一款电子游戏——“Space Travel

游戏在PDP-7小型机上开发,因为这台机器免费

免费的机器没有操作系统

玩游戏之前,先给PDP-7做个操作系统,命名为“UNIX

汇编编写UNIX太慢,又没有称手的高级语言,怎么办?

dmr设计了一种新的高级语言,命名为“C语言

1983年,因为UNIXC语言的巨大成功,ken和dmr共同获得当年度的计算机界最高奖——图灵奖

1.2.2 C语言的主要特点

1)语言简洁、紧凑,使用方便、灵活

C语言一共只有37个关键字、9种控制语句,程序书写形式自由,主要用小写字母表示,缩了一切不必要的成分C语言程序比其他许多高级语言简练,源程序短,因此输入程序时工作量少。实际上,C是一个很小的内核语言,只包括极少的与硬件有关的成分,C的编译系统相当简洁。

2)运算符丰富

C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号赋值和强制类型转换等都作为运算符处理,从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其他高级语言中难以实现的运算。

3)数据类型丰富

C语言提供的数据类型包括整型、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型等,C99又扩充了复数浮点类型、超长整型(long long)和布尔类型(bool)等。尤其是指针类型数据,使用十分灵活和多样化,能用来实现各种复杂的数据结构

4)具有结构化的控制语句

如if else语句、while语句、do… while语句、 switch语句和for语句。用函数作为程序的模块单位便于实现程序的模块化。C语言是完全模块化和结构化的语言。

5)语法限制不太严格,程序设计自由度大

对变量的类型使用比较灵活,例如,整型量与字符型数以及逻辑型数据可以通用。一般的高级语言语法检查比较严,能检查出几乎所有的语法错误,而C语言为了使编写者有较大的自由度放宽了语法检查。

6)C语言允许直接访问物理地址

C语言可以进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此C语言既具有高级语言的功能,又具有低级语言的许多功能,可用来编写系统软件。C语言的这种双重性,使它既是成功的系统描述语言,又是通用的程序设计语言。

7)用C语言编的程序可移植性好

由于C的编译系统相当简洁,因此很容易移植到新的系统。而且C编译系统在新的系统上运行时,可以直接编译“标准链接库”中的大部分功能,不需要修改源代码,因为标准链接库是用可移植的C语言写的。因此,几乎在所有的计算机系统中都可以使用C语言。

8)生成目标代码质量高,程序执行效率高

1.3 最简单的C语言程序

例题1 求两个整数之和

编写程序如下:

#include                        //这是编译预处理指令
int main()                              //定义主函数
{                                       //本行开始
  int a,b,sum;                          //本行是程序的声明部分,定义a,b,sum为整型变量
  a=123;                                //对变量a赋值
  b=456;                                //对变量b赋值
  sum=a+b;                             //进行a+b的运算,并把结果放在变量sum中
  printf("两整数之和为%d\n",sum);        //输出结果
  return 0;                            //使函数返回值为0
}                                      //函数结束

运行结果:

两整数之和为579

例题2 求两整数中的较大者。

编写程序如下:

#include
//主函数
int main()
{
    int max(int x,int y);
    int a,b,c;
    scanf("%d,%d",&a,&b);
    c=max(a,b);
    printf("max=%D\n",c);
    return 0;
}
//求两个整数中较大者的max函数
int max(int x,int y)
{
    int z;
    if(x>y)z=x;
    else z=y;
    rerurn(z);
}

运行结果为:

8,5
max=8

1.4 C语言程序的结构

1) 一个程序由一个或多个源程序文件组成。

在一个源程序文件中可以包括三个部分:

预处理指令。如#include。c编译系统对源程序进行“翻译”以前,先有一个预处理器对预处理指令进行预处理,由预处理得到的结果与程序其他部分一起,组成一个完整的,可以用来编译呃最后的源程序,然后由编译程序对该源程序正式进行编译,才得到目标程序。

全局申明。即在函数之外进行的数据声明。例如可以把前文例题程序中的“int a,b,sum;"放到main函数的前面,这就是全局声明,在函数外面声明的变量称为全局变量。如果是在程序开头(定义函数之前)声明的变量,在整个源程序文件范围内有效。

函数定义。如前文例题中的main函数和max函数,要指三每个函数的功能。在调用这些函数时,会完成函数定义中指定的功能。

2) 函数是c程序的主要组成部分。

3) 一个函数包括两个部分。

函数首部。 即函数的第一行,包括函数名,函数类型,函数属性,函数参数名,参数类型。

一个函数名后面必须跟一对圆括号,括号内写函数的参数名及其类型。如果函数没有参数,可以在括号中写 void,也可以是空括号如:

​ int main() 或 int main(void)

函数体。即函数首部下面的花括号内的部分。如果在一个函数中包括有多层花括号,则最外层的一对花括号是函数体的范围。函数体一般包括以下两部分:

·声明部分。声明部分包括:定义在本函数中所用到的变量,如前文例题中在main函数中定义变量“int a,b,c;”;对本函数所调用函数进行声明,如对max函数明“int max(int x,int y);”。

·执行部分。由若干个语句组成,指定在函数中所进行的操作在某些情况下也可以没有声明部分,甚至可以既无声明部分也无执行部分。如:

 void dump()
{}

是一个空函数,什么也不做,但这是合法的。

4)程序总是从main函数开始执行的。

程序总是从main函数开始执行的,而不论main函数在整个程序中的位置如何(main函数可以放在程序最前头,也可以放在程序最后,或在一些函数之前、另一些函数之后)。

5)程序中要求计算机完成的操作是由函数中的语句完成的。

例如赋值、输入输出数据的操作都是由相应的C语句实现的。

C程序书写格式是比较自由的。一行内可以写几个语句,一个语句可以分写在多行上,但为清晰起见,习惯上每行只写一个语句。

6)在每个数据声明和语句的最后必须有一个分号。

分号是C语句的必要组成部分。如:

c=a+b;

中的分号是不可缺少的。

7)C语言本身不提供输入输出语句。

输入和输出的操作是由库函数scanf和 printf等函数来完成的。C语言对输入输出实行“函数化”。由于输入输出操作涉及具体的计算机设备,把输入输出操作用库函数实现,就可以使C语言本身的规模较小,编译程序简单,很容易在各种机器上实现,程序具有可移植性。

8)程序应当包含注释。

一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。

1.5 运行c程序的步骤与方法

呃呃呃,这个好像没有什么可说的,就是按部就班了。。

在编写好一个c源程序后,怎样上机编译与运行呢?

1. 上机输入和编辑源程序。

2.对原程序进行编译。

3.进行连接处理。

4.运行可执行程序,得到运行结果。

然而,如果只是编写和运行一个很简单的程序,上面介绍的步骤就够了,但是实际上要处理的问题要比上面见到的复杂的多,需要考虑和处理的问题也复杂的多。程序设计只从确定任务到得到结果,写出文档的全过程。

从确定问题到得到结果,一般经历以下几个工作阶段:

1.问题分析。

2.设计算法。

3.编写程序。

4.对原程序进行编辑,编译和连接。

5.运行程序,分析结果。

6.编写程序文档。

课后思考

1.编写一个程序,运行时输出:

Hello World!

2.编写一个程序,运行时输入 a,b,c 三个值,输出其中值最大者。

结语

正如这样,C语言可以解决我们生活中许多常见的问题,然而,我们该如何熟练掌握并学会这种语言,让我们的生活更加便捷的同时向智能化社会迈进新的一步呢?在接下来的二十天里,我会带你一步一步走进C语言的奇妙世界,如果你有兴趣,请点击一下关注我,这将成为我持续更新最佳的动力源泉!

你可能感兴趣的:(C语言,c语言,编程语言,机器学习,指针,算法)