零基础C语⾔⼊门必备知识
今天跟⼤家⼀起从零学C语⾔:
1. C语⾔简介
1.1 C语⾔发展史
C语⾔是⼀种⼴泛使⽤的⾯向过程的计算机程序设计语⾔,既适合于系统程序设计,⼜适合于应⽤程序设计。C语⾔的发展历程⼤致如图1-1所⽰:
图1-1 C语⾔的发展历程
1.2 C语⾔的特点
C语⾔是⼀种通⽤的程序设计语⾔,语⾔本⾝简洁、灵活、表达能⼒强,被⼴泛⽤于系统软件和应⽤软件的开发,并且具有良好的可移植性。
C语⾔的特点可概括如下:
(1)简洁、紧凑、灵活。C语⾔的核⼼内容很少,只有32个关键字,9种控制语句;程序书写格式⾃由,压缩了⼀切不必要的成分。
(2)表达⽅式简练、实⽤。C语⾔有⼀套强有⼒的运算符,达44种,可以构造出多种形式的表达式,⽤⼀个表达式就可以实现其他语⾔可能需要多条语句才能实现的功能。
(3)数据类型丰富。数据类型越多,数据的表达能⼒就越强。C语⾔具有多种数据类型,如字符型、整型、实型、数组、指针、结构体和共⽤体等,可以实现诸如链表、栈、队列、树等各种复杂的数据结构。其中的指针类型使得参数的传递简单并且迅速,同时节省内存空间。
(4)具有低级语⾔的特点。C语⾔具有与汇编语⾔相近的功能和描述⽅法,如地址运算和⼆进制数位运算等,还可以对硬件端⼝等资源进⾏直接操作,充分使⽤计算机的资源。C语⾔既具有⾼级语⾔便于学习和掌握的特点,⼜具有机器语⾔或汇编语⾔对硬件的操作能⼒。因此,C语⾔既可以作为系统描述语⾔,⼜可以作为通⽤的程序设计语⾔。
(5)C语⾔是⼀种结构化语⾔,适合于⼤型程序的模块化设计。C语⾔提供了编写结构化程序的基本控制语句,如if-else语句、switch语句、while语句和do-while语句等。C语⾔是函数的集合,函数是构成
C语⾔程序的基本单位,每个函数具有独⽴的功能,函数之间通过参数传递数据。程序员可以编写⾃⼰的函数。同时,不同操作系统的编译器都为程序员提供了⼤量的标准库函数,如输⼊/输出函数、数学函数和字符串处理函数等。灵活地使⽤标准库函数可以简化程序设计,提⾼编写程序效率。
(6)各种版本的编译器都提供了预处理命令和预处理程序。预处理扩展了C语⾔的功能,提⾼了程序的可移植性,为⼤型程序的调试提供了⽅便。
(7)可移植性好。程序从⼀个环境不经改动或稍加改动就可以移植到另⼀个完全不同的环境中运⾏。这是因为标准库函数和预处理程序将可能出现的与机器有关的因素与源程序分割开来,使得针对不同的计算机硬件环境,可以重新定义有关的内容。
(8)⽣成的⽬标代码质量⾼。由C源程序编译和链接得到的⽬标代码的运⾏效率⽐⽤汇编语⾔编写的也不过只低10%~20%,可充分发挥机器的效率。
(9)C语⾔语法限制不严,程序设计⾃由度⼤。C语⾔程序在运⾏时不做诸如数组下标越界和变量类型兼容性等检查,⽽是由编程者⾃⼰保证程序的正确性。C语⾔⼏乎允许所有的数据类型的转换,字符型和整型可以⾃由混合使⽤,所有类型均可作逻辑型,可⾃⼰定义新的类型,还可以把某类型强制转换为指定的类型。实际上,这使编程者有了更⼤的⾃主性,能编写出灵活、优质的程序,同时也给初学者增加了⼀定的难度。所以,只有在熟练掌握C语⾔程序设计之后,才能体会到其灵活性。
C语⾔也存在以下缺点:
(1)程序的错误更隐蔽。C语⾔的灵活性使得⽤它编写程序时更容易出错,⽽且C的编译器不检查这样的错误。与汇编语⾔类似,需要程序运⾏时才能发现这些逻辑错误。C语⾔还会有⼀些隐患,如将⽐较的
“==” 写成赋值 “=” ,虽然语法上没错,但这样的逻辑错误往往不易发现,想要出错误往往⼗分费时。
程序员最常用的编程语言 (2)C语⾔程序有时会难以理解。C语⾔语法成分相对简单,是⼀种⼩型语⾔。但是,其数据类型多,运算符丰富且结合性多样,使得对其理解有⼀定的难度。
(3)C语⾔程序有时会难以修改。考虑到程序规模的⼤型化或者巨型化,现在编程语⾔通常会提供 “类” 和 “包”
之类的语⾔特性,这样的特性可以将程序分解成更加易于管理的模块。然⽽C语⾔缺少这样的特性,维护⼤型程序显得⽐较困难。
1.3算法及其表⽰
C语⾔解题时,在程序中有两⽅⾯的描述,即数据描述和处理步骤(算法)描述,后者处理前者的数据。
算法具有以下特性:
有穷性:算法在执⾏了有限步骤后结束,并且每⼀步都可以在有穷的时间内完成。
确定性:算法中每种操作必须有确切的含义,即⽆⼆义性。同时,⽆论如何算法只有唯⼀的⼀条执⾏路径,即相同的输⼊只能得出相同的输出。
可⾏性:算法中描述的操作都可以通过已经实现的基本操作执⾏有限次数来实现。
输⼊:有零个或多个输⼊,即算法需要的必要信息。
输出:有⼀个或多个输出,输出的是与输⼊有某些特定关系的信息。没有输出的算法是⽆意义的。
算法的表⽰:
⾃然语⾔描述;
传统流程图;
N-S流程图;
伪代码。
【例如】求两个正整数m和n的最⼤公约数(即同时能够整除m和n的最⼤正整数)。
1. ⾃然语⾔描述
欧⼏⾥得阐述了求两个数的最⼤公约数的过程——欧⼏⾥得算法
第⼀步:以n除m,并令r为所得余数(显然n>r
0)。
第⼆步:若r=0,算法结束,n即为m和n的最⼤公约数。
第三步:置m
n,n
r,返回第⼀步。
2. 传统流程图
图1-2 求最⼤公约数的传统流程图
3. N-S流程图
图1-3 求最⼤公约数的N-S流程图
4. 伪代码
算法开始输⼊m,n;do{ r←以n除m的余数; m←n; n←r;}while(r≠0);输出m;算法结束
1.4常⽤算法介绍
1.枚举法
枚举法⼜称为穷举法。该⽅法通过逐⼀考察问题的所有可能解,出问题真正的解。枚举法要求问题的可能解必须是有限的,⽽且这些可能解是已知的。
【例】给定⼀个正整数,确定它的整数⽴⽅根是否存在,若存在则出这个⽴⽅根。
算法开始输⼊⼀个正整数给n;x←0;while(x≤n 且 x*x*x≠n){ x←x+1;}if(x≤n) 到n的整数⽴⽅根,输出x的值;else
输出n的整数⽴⽅根不存在信息;算法结束
2.递推法
递推法是从已知的初始条件出发,逐次推出中间结果。在理想状态下,每递推⼀次,结果逐渐接近问题的最后解。递推法在数值算法中⼜称为迭代法。迭代法常⽤于求近似解的问题,根据对前⼀步结果的误差的不同处理⽅法,迭代法⼜有逼近迭代和试探迭代等不同⽅法。数值计算要注意解的稳定性问题,即在迭代中每⼀步的解越来越接近真正的解,否则迭代不会成功。
【例】计算⼀个正整数n的阶乘。
算法开始输⼊⼀个正整数给n;t←1;i←1;while(i≤n){ t←t*i; i←i+1;}输出结果t算法结束
3.递归法
⼀个直接或间接调⽤过程(或函数)⾃⾝的算法称为递归算法,⼀个函数如果调⽤⾃⾝进⾏计算则称该函数为递归函数。⼀些问题的算法描述中,递归法往往⽐⾮递归法更加简洁易懂。
【例】计算⼀个正整数N的阶乘。
阶乘函数f的递归定义为:f(1)=1 (1!=1,N=1 时)f(N)=N*f(N-1) (N!=N*(N-1)!,如果N>1)
除了上⾯介绍的枚举法、递推法和递归法外,还有回溯法、贪婪法、分治法、动态规划法等,⼤家可以先⾃⾏了解,后续会继续补充。
C语⾔零基础更多更有⽤的资料可以看看下边的资料,可以进我这个⼩⼀块聊聊【310226693】
C语⾔编程基础
提升C编程能⼒
夯实C语⾔,从⼩⽩到⼤⽜的进阶之路!
指针
指针换装你还认识吗
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论