走进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函数)
一个小程序只包含一个源程序文件,在一个源程序文件中包含若干个函数(其中有一个m    
main函数)。当程序规模较大时,所包含的函数的数量较多,可以使一个程序包含若干个源程序文件,每个源程序文件又包含若干个函数。一个源程序文件就是一个程序模块,即将一个程序分成若干个程序模块。
在进行编译时是以源程序文件为对象进行的。在分别对各源程序文件进行编译并得到相应的目标程序后,再将这些目标程序连接成为一个统一的二进制可执行程序
C语言的这种特点使得容易实现程序的模块化
 


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语言有一定的英语基础是更好的,能帮助更好地理解一些术语、名词,主要是能帮助记忆和适应语境。


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

时间酿酒,余味成花。

​​​​​​​

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
<br> ◎ 文件说明<br> <br> 本文件包括以下内容:<br> <br> ※ 1、文件说明<br> ※ 2、源码操作说明<br> ※ 3、光盘目录清单<br> <br><br> ◎ 源码操作说明<br><br> 源代码使用方法是(以实例1为例):<br> 将该实例的源码,比如实例1的1.c文件(可以在001目录下找到),<br> 拷贝到tc编译器目录下,运行tc.exe,打开编译器,<br> 按【F3】键或者“File->Open”菜单命令,打开1.c文件,<br> 按【Ctrl+F9】键,或者“Run->Run”菜单命令,编译运行该程序。<br> <br><br> ◎ 光盘目录清单如下:<br><br>第一部分 基础篇<br> <br>001 第一个C程序 <br>002 运行多个源文件 <br>003 求整数之积 <br>004 比较实数大小 <br>005 字符的输出 <br>006 显示变量所占字节数 <br>007 自增/自减运算 <br>008 数列求和 <br>009 乘法口诀表 <br>010 猜数字游戏 <br>011 模拟ATM(自动柜员机)界面 <br>012 用一维数组统计学生成绩 <br>013 用二维数组实现矩阵转置 <br>014 求解二维数组的最大/最小元素 <br>015 利用数组求前n个质数 <br>016 编制万年历 <br>017 对数组元素排序 <br>018 任意进制数的转换 <br>019 判断回文数 <br>020 求数组前n元素之和 <br>021 求解钢材切割的最佳订单 <br>022 通过指针比较整数大小 <br>023 指向数组的指针 <br>024 寻找指定元素的指针 <br>025 寻找相同元素的指针 <br>026 阿拉伯数字转换为罗马数字 <br>027 字符替换 <br>028 从键盘读入实数 <br>029 字符行排版 <br>030 字符排列 <br>031 判断字符串是否回文 <br>032 通讯录的输入输出 <br>033 扑克牌的结构表示<br>034 用“结构”统计学生成绩 <br>035 报数游戏 <br>036 模拟社会关系 <br>037 统计文件的字符数 <br>038 同时显示两个文件的内容 <br>039 简单的文本编辑器 <br>040 文件的字数统计程序 <br>041 学生成绩管理程序 <br> <br>第二部分 数据结构篇<br> <br>042 插入排序 <br>043 希尔排序 <br>044 冒泡排序 <br>045 快速排序 <br>046 选择排序 <br>047 堆排序 <br>048 归并排序 <br>049 基数排序 <br>050 二叉搜索树操作 <br>051 二项式系数递归 <br>052 背包问题 <br>053 顺序表插入和删除 <br>054 链表操作(1) <br>055 链表操作(2) <br>056 单链表就地逆置 <br>057 运动会分数统计 <br>058 双链表 <br>059 约瑟夫环 <br>060 记录个人资料 <br>061 二叉树遍利 <br>062 浮点数转换为字符串 <br>063 汉诺塔问题 <br>064 哈夫曼编码 <br>065 图的深度优先遍利 <br>066 图的广度优先遍利<br>067 求解最优交通路径 <br>068 八皇后问题<br>069 骑士巡游 <br>070 用栈设置密码 <br>071 魔王语言翻译 <br>072 火车车厢重排 <br>073 队列实例 <br>074 K阶斐波那契序列 <br> <br>第三部分 数值计算与趣味数学篇<br> <br>075 绘制余弦曲线和直线的迭加<br>076 计算高次方数的尾数 <br>077 打鱼还是晒网 <br>078 怎样存钱以获取最大利息 <br>079 阿姆斯特朗数 <br>080 亲密数 <br>081 自守数 <br>082 具有abcd=(ab+cd)2性质的数 <br>083 验证歌德巴赫猜想<br>084 素数幻方 <br>085 百钱百鸡问题 <br>086 爱因斯坦的数学题 <br>087 三色球问题<br>088 马克思手稿中的数学题 <br>089 配对新郎和新娘 <br>090 约瑟夫问题<br>091 邮票组合 <br>092 分糖果 <br>093 波瓦松的分酒趣题 <br>094 求π的近似值 <br>095 奇数平方的有趣性质<br>096 角谷猜想 <br>097 四方定理 <br>098 卡布列克常数 <br>099 尼科彻斯定理 <br>100 扑克牌自动发牌 <br>101 常胜将军 <br>102 搬山游戏<br>103 兔子产子(菲波那契数列) <br>104 数字移动 <br>105 多项式乘法 <br>106 产生随机数 <br>107 堆栈四则运算 <br>108 递归整数四则运算 <br>109 复平面作图 <br>110 绘制彩色抛物线 <br>111 绘制正态分布曲线 <br>112 求解非线性方程 <br>113 实矩阵乘法运算<br>114 求解线性方程 <br>115 n阶方阵求逆 <br>116 复矩阵乘法 <br>117 求定积分 <br>118 求满足特异条件的数列 <br>119 超长正整数的加法 <br> <br>第四部分 图形篇<br> <br>120 绘制直线 <br>121 绘制圆 <br>122 绘制圆弧 <br>123 绘制椭圆<br>124 设置背景色和前景色<br>125 设置线条类型 <br>126 设置填充类型和填充颜色 <br>127 图形文本的输出 <br>128 金刚石图案<br>129 飘带图案 <br>130 圆环图案 <br>131 肾形图案 <br>132 心脏形图案 <br>133 渔网图案 <br>134 沙丘图案<br>135 设置图形方式下的文本类型 <br>136 绘制正多边形 <br>137 正六边形螺旋图案 <br>138 正方形螺旋拼块图案<br>139 图形法绘制圆 <br>140 递归法绘制三角形图案 <br>141 图形法绘制椭圆 <br>142 抛物样条曲线 <br>143 Mandelbrot分形图案<br>144 绘制布朗运动曲线 <br>145 艺术清屏 <br>146 矩形区域的颜色填充 <br>147 VGA256色模式编程 <br>148 绘制蓝天图案 <br>149 屏幕检测程序 <br>150 运动的小车动画 <br>151 动态显示位图 <br>152 利用图形页实现动画<br>153 图形时钟 <br>154 音乐动画 <br> <br>第五部分 系统篇<br> <br>155 读取DOS系统中的国家信息 <br>156 修改环境变量 <br>157 显示系统文件表 <br>158 显示目录内容 <br>159 读取磁盘文件 <br>160 删除目录树 <br>161 定义文本模式 <br>162 设计立体窗口 <br>163 彩色弹出菜单 <br>164 读取CMOS信息 <br>165 获取BIOS设备列表 <br>166 锁住硬盘 <br>167 备份/恢复硬盘分区表 <br>168 设计口令程序 <br>169 程序自我保护<br> <br>第六部分 常见试题解答篇<br> <br>170 水果拼盘 <br>171 小孩吃梨 <br>172 删除字符串中的特定字符 <br>173 求解符号方程 <br>174 计算标准差 <br>175 求取符合特定要求的素数 <br>176 统计符合特定条件的数 <br>177 字符串倒置 <br>178 部分排序 <br>179 产品销售记录处理 <br>180 特定要求的字符编码 <br>181 求解三角方程 <br>182 新完全平方数 <br>183 三重回文数 <br>184 奇数方差 <br>185 统计选票 <br>186 同时整除 <br>187 字符左右排序 <br>188 符号算式求解 <br>189 数字移位 <br>190 统计最高成绩 <br>191 比较字符串长度 <br>192 合并整数 <br>193 矩阵逆置<br>194 删除指定的字符<br>195 括号匹配 <br>196 字符串逆置 <br>197 SIX/NINE问题 <br>198 单词个数统计 <br>199 方差运算 <br>200 级数运算 <br>201 输出素数 <br>202 素数题 <br>203 序列排序 <br>204 整数各位数字排序 <br>205 字符串字母移位 <br>206 Fibonacc数列 <br> <br>第七部分 游戏篇<br> <br>207 商人过河游戏 <br>208 吃数游戏 <br>209 解救人质游戏 <br>210 打字训练游戏 <br>211 双人竞走游戏 <br>212 迷宫探险游戏 <br>213 迷你撞球游戏<br>214 模拟扫雷游戏 <br>215 推箱子游戏 <br>216 五子棋游戏 <br> <br>第八部分 综合实例篇<br> <br>217 综合CAD系统 <br>218 功能强大的文本编辑器<br>219 图书管理系统<br>220 进销存管理系统
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值