走进C程序

由上一篇简单的一些例题对C语言程序的书写有了一个初步的了解,接下来具体学习C语言程序的结构、运行和设计任务。

目录

回顾

C语言程序的结构

运行C程序的步骤与方法

程序设计的任务

碎碎念


回顾

所谓程序,就是一组计算机能识别和执行的指令。每一条指令使计算机执行特定的操作。计算机的每一个操作都是根据人们事先指定的指令进行的。

程序=算法+数据结构

一个过程化的程序除了以上两个主要元素(算法与数据结构)之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示。

计算机的本质是程序的机器。


C语言程序的结构

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


关于头文件、源文件、资源文件:

头文件、源文件、资源文件是软件开发中常见的文件类型,用于组织和管理代码和资源。

•头文件(Header File)

是一种包含函数声明、宏定义、类型定义等信息的文件,在源文件中通过#include指令将头文件包含进来,作为源文件的预处理指令,以便能够使用其中的函数和定义。头文件通常具有.h的扩展名,例如,stdio.h是C语言标准库中的一个头文件,包含了标准输入输出函数的声明。#include<stdio.h>编译预处理指令,通常位于源文件的第一行,为编译系统提供输入输出函数的信息。

•源文件(Source File)

是包含实际代码的文件,通常具有.c(C语言)、.cpp(C++)或者.java(Java)等扩展名。源文件中定义了程序的逻辑和操作,包含了函数的具体实现。源文件中可以包含头文件,以便使用其中的函数和定义。

编写C程序,实际是编写C程序源代码,开发者需要把写好的源代码保存到一个文件中,这样源代码就不会丢失,并且可以被重新编辑和修改,并能被编译器读取,这种用于保存源代码的文件被称为源文件。

一个C程序至少要包含一个源文件,复杂一些的C程序可能需要包含多个源文件。在C程序中只能定义一个main()函数,该函数为C程序的执行入口,包含main()函数的源文件为C程序的主源文件。

•资源文件(Resource File)

是一种用于存储程序所需资源的文件,例如图标、图片、音频、文本等。资源文件通常具有特定的格式和扩展名,例如,.bmp(位图)、.jpg(JPEG图像)、.wav(音频)等。在程序中,可以通过资源文件访问和使用其中的资源。

资源文件(具有 .res 文件扩展名)包含着无需重新编辑代码便可以改变的位图、字符串和其它数据。例如,如果计划用一种外语将应用程序本地化,可以将用户界面的全部正文串和位图存放在资源文件里,然后将资源文件本地化,而不是将整个应用程序本地化。一个工程最多包含一个资源文件。

所有可以从中读取出需要的资源的文件,可以称之为“资源文件”。资源的类型可以是图片、音频、视频、文字资源,或者其他可以在计算机中展示的内容等等。由专门的程序接口去读取,并在应用程序中根据需要向用户展示。资源文件的类型很多,不限制文件的后缀名。

【以上内容来自百度百科、和文章:

【编程语言】头文件、源文件、资源文件_源文件 头文件 资源文件-CSDN博客

https://www.zhihu.com/question/320461945/answer/3023666620?utm_id=0


C程序构成

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

①预处理指令。如#include <stdio.h>、#define。
C编译系统在对源程序进行“翻译”以前,先由一个预处理器(也称预处理程序、预编译器)预处理指令进行预处理,对于#include <stdio.h>指令来说,就是将stdio.h头文件的内容读进来,取代#include <stdio.h>。由预处理得到的结果与程序其他部分一起,组成一个完整的、可以用来编译的最后的源程序,然后由编译程序对该源程序正式进行编译,才得
目标程序


关于源程序、目标程序、可执行程序:

源程序

源程序(也称源代码)是指未编译的按照一定的程序设计语言规范书写的文本文件,是一系列人类可读的计算机语言指令。

目标程序

目标程序,又称为“目的程序”,为源程序经编译可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名----由语言处理程序(汇编程序,编译程序,解释程序)将源程序处理(汇编,编译,解释)成与之等价的由机器码构成的,计算机能够直接运行的程序,该程序叫目标程序。目标代码尽管已经是机器指令,但是还不能运行,因为目标程序还没有解决函数调用问题,需要将各个目标程序与库函数连接,才能形成完整的可执行程序。

可执行程序

可执行程序是可在操作系统存储空间中浮动定位的二进制可执行程序。它可以加载到内存中,由操作系统加载并执行。

编写C程序,实际是编写C程序源代码。


②全局声明。即在函数之外(函数前面)进行的数据声明。如在main函数的前面声明,这就是全局声明,在函数外面声明的变量称为全局变量。如果是在程序开头(定义函数之前)声明的变量,则在整个源程序文件范围内有效。在函数中声明的变量是局部变量,只在函数范围内有效。

③函数定义。要指定每个函数的功能,在调用这些函数时,会完成函数定义中指定的功能(在调用时会执行定义函数的函数体)。如

定义main函数

int main()
{
	……;//所完成的任务,函数语句
	return 0;
}

定义max函数

//定义max函数
int max(int x, int y)
{
	int z;
	if (x > y)z = x;//关于if函数的表达式【?】,z前不能加“,”
	else z = y;
	return(z);
}

2.函数是C程序的主要组成部分。

程序的几乎全部工作都是由各个函数分别完成的、函数是C程序的基本单位,在设计良好的程序中,每个函数都用来实现一个或几个特定的功能,编写C程序的工作主要就是编写一个个函数。一个C语言程序是由一个或多个函数组成的,其中必须包含一个main函数(且只能有一个main函数)
一个小程序只包含一个源程序文件,在一个源程序文件中包含若干个函数(其中有一个main函数)。当程序规模较大时,所包含的函数的数量较多,可以使一个程序包含若干个源程序文件,每个源程序文件又包含若干个函数。一个源程序文件就是一个程序模块,即将一个程序分成若干个程序模块。
在进行编译时是以源程序文件为对象进行的。在分别对各源程序文件进行编译并得到相应的目标程序后,再将这些目标程序连接成为一个统一的二进制可执行程序
C语言的这种特点使得容易实现程序的模块化

一个c语言程序中有且只有一个main函数,不是一个源程序一个main函数。
 


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

①函数首部。

以max函数为例

​int max(int x, int y)
{
	int z;
	if (x > y)z = x;
	else z = y;
	return(z);
}

即函数的第一行,包括函数名、函数类型、函数属性、函数参数(形式参数)名、参数类型。如上述max函数中

     int              max                  (int                        x,                    int                          y)
      ↓                  ↓                      ↓                         ↓                         ↓                           ↓

函数类型        函数名       函数参数类型       函数参数名       函数参数类型        函数参数名 

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

int main(void)或int main()


void

英语意思为“空白”,C语言中是“无类型”的意思表示“无类型指针”,常用在程序编写中,对定义函数的参数类型、返回值、函数中指针类型进行声明,其作用是对函数返回和参数的进行限定。具体来说有以下几种情况:一函数返回为空,二函数参数为空,三指针类型为空。

请注意,void a;这样的声明在C语言中是错误的,因为void类型不能用来声明变量。

void main和int main

int main和void main都是C/C++程序的主函数的两种写法。它们的区别在于int main可以返回一个整型值,而void main没有返回值。

在实际应用中,使用int main比void main更为常见,因为int main可以利用返回值来指示程序执行的结果,一般情况下返回0表示程序执行成功,其他值表示程序执行失败。而使用void main则需要另外的途径来判断程序执行结果。不过在某些特定情况下,比如一些嵌入式系统中,可能需要使用void main。
1、void main的返回值为空值(即没有返回值),int main的返回值为整数类型值。

2、void main 可以用 int main代替,但是 int main 不能用 void main代替。

3、有的编译器main必须要有返回值 int , 那就写成int main 。在使用中可以一律写成 int main,然后在函数体中最后写 return 0; 就行了,这样写基本上所有的编译器都可以通过。

【以上内容来自网络】


②函数体。

以main函数为例

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;
}
int max(int x, int y)
{
	int z;
	if (x > y)z = x;
	else z = y;
	return(z);
}

函数体即函数首部下面的花括号{}内的部分。如果在一个函数中包括有多层花括号,则最外层的一对花括号是函数体的范围。
函数体一般包括以下两部分。
•声明部分。声明部分包括:一定义在本函数中所用到的变量,如在main函数中定义变量“int a,b,c;”;二对本函数所调用函数进行声明,如在main函数中对max函数的声明“int max(int x,int y);”。     
•执行部分。由若干个语句组成,指定在函数中所进行的操作。

在某些情况下也可以没有声明部分(例如HELLO程序),甚至可以既无声明部分也无执行部分。如:
void dump ()

{}

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

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

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

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

程序中要求计算机完成的操作是由函数中的C语句完成的。如赋值、输人输出数据的操作都是由相应的C语句实现的。
C程序书写格式是比较自由的。一行内可以写几个语句,一个语句可以分写在多行上,但为清晰起见,习惯上每行只写一个语句。

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

分号是C语句的必要组成部分。如:
c=max(a,b);
中的分号是不可缺少的。

分号只在函数体内有书写,在预处理指令、函数首部等处无分号。

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

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

(8)程序应当包含注释。

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


运行C程序的步骤与方法

用C语言编写的程序是源程序。计算机不能直接识别和执行用高级语言写的指令,必须用编译程序(也称编译器)把C源程序翻译成二进制形式的目标程序,然后再将该目标程序与系统的函数库以及其他目标程序连接起来,形成可执行的目标程序。

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

将此源程序以文件形式存放在自己指定的文件夹内(如果不特别指定,一般存放在用户当前目录下),文件用.c作为后缀,生成源程序文件,如f.c。

2.对源程序进行编译,先用C编译系统提供的"预处理器”(又称“预处理程序”或“预编译器”)对程序中的预处理指令进行编译预处理。

由预处理得到的信息与程序其他部分一起组成一个完整的、可以用来进行正式编译的源程序,然后由编译系统对该源程序进行编译。
编译的作用首先是对源程序进行检查,判定它有无语法方面的错误,如有,则发出“出错信息”,告诉编程人员认真检查改正,修改程序后重新进行编译,直到没有语法错误为止。这时,编译程序自动把源程序转换为二进制形式的目标程序(在Visual C++中后缀为.obj,如f.obj)。如果不特别指定。此目标程序一般也存放在用户当前目录下,此时源文件没有消失。
在用编译系统对源程序进行编译时,自动包括了预编译和正式编译两个阶段,一气呵成。用户不必分别发出二次指令。

3.进行连接处理。

经过编译所得到的二进制目标文件(后为.obj)还不能供计算机直接执行。一个程序可能包含若干个源程序文件,而编译是以源程序文件为对象的,一次编译只能得到与一个源程序文件相对应的目标文件(也称目标模块),它只是整个程序的一部分。必须把所有的编译后得到的目标模块连接装配起来,再与函数库相连接成一个整体,生成一个可供计算机执行的目标程序,称为可执行程序,在Visual C++中后缀为.exe,如f.exe。
即使一个程序只包含一个源程序文件,编译后得到的目标程序也不能直接运行,也要经过连接阶段,因为要与函数库进行连接,才能生成可执行程序。
以上连接的工作是由一个称为“连接编辑程序”(linkage editor)的软件来实现的。

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

编写好的程序并不一定能保证正确无误,除了用人工方式检查外,还须借助编译系统来检查有无语法错误。有时编译过程未发现错误,能生成可执行程序,但是运行的结果不正确。一般情况下,这不是语法方面的错误,而可能是程序逻辑方面的错误,例如计算公式不正确、赋值不正确等,应当返回检查源程序,并改正错误。

程序设计的任务

1.问题分析。忽略次要因素,使问题抽象化,建立模型。

2.设计算法。一般用流程图来表示解题的步骤。

3.编写程序(源程序)。

4.对源程序进行编辑、编译和连接,得到可执行程序。

5.运行程序,分析结果。能得到运行结果并不意味着程序正确,要对结果进行分析,看它是否合理。这不是语法方面的错误,而可能是程序逻辑方面的错误,例如计算公式不正确、赋值不正确等,因此要对程序进行调试(debug)。调试的过程就是通过上机发现和排除程序中故障的过程。经过调试,得到了正确的结果,但是工作不应到此结束。不要只看到某一次结果是正确的,就认为程序没有问题。例如,求 c=b/a,当a=4,b=2时,求出c的值为 0.5,是正确的,但是当a=0,b=2时,就无法求出 c的值。说明程序对某些数据能得到正确结果,对另外一些数据却得不到正确结果,程序还有漏洞,因此,还要对程序进行测试(test)。所谓测试,就是设计多组测试数据,检查程序对不同数据的运行情况,从中尽量发现程序中存在的漏洞,并修改程序,使之能适用于各种情况。作为商品提供使用的程序,是必须经过严格测试的。

6.编写程序文档。正式提供给用户使用的程序,必须向用户提供程序说明书(也称为用户文档)。内容应包括程序名称、程序功能、运行环境、程序的装入和启动、需要输入的数据,以及使用注意事项等。
程序文档是软件的一个重要组成部分,软件是计算机程序和程序文档的总称。现在的商品软件光盘中,既包括程序,也包括程序使用说明,有的则在程序中以帮助(help)或 readme 形式提供。


碎碎念

学过一个程序后一定要动手实操,自己能独立地写出来。虽说死记硬背是不可取的,但对于刚接触的人来说很多东西是不能理解的。没有必要钻牛角尖、先记住,有一定的基础,随着知识的积累,也许在后来的某一天会突然顿悟。但对于书写程序的逻辑是要理解的。

学C语言有一定的英语基础是更好的,能帮助更好地理解一些术语、名词,主要是能帮助记忆和适应语境。


声明:以上内容主要源于书本和网络,本人只是整理搜集。

时间酿酒,余味成花。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值