《C语言程序设计快速入门.doc》由会员分享,可在线阅读,更多相关《C语言程序设计快速入门.doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第1部分 语 言 篇第1章 程序设计入门阅读资料摘录自网络以及专业书籍Main函数相关:每个 C+ 程序都包含一个或多个函数,而且必须有一个命名为 main。函数由执行函数功能的语句序列组成。操作系统通过调用 main 函数来执行程序,main 函数则执行组成自己的语句并返回一个值给操作系统。 下面是一个简单的 main 函数,它不执行任何功能,只是返回一个值: int main() return 0; 操作系统通过 main 函数返回的值来确定程序是否成功执行完毕。返回 0 值表明程序程序成功执行完毕。 main 函数在很多方面都比较特别,其中最重要的是每个 C+ 程序必须含有 main 函
2、数,且 main 函数是(唯一)被操作系统显式调用的函数。 定义 main 函数和定义其他函数一样。定义函数必须指定 4 个元素:返回类型、函数名、圆括号内的形参表(可能为空)和函数体。main 函数的形参个数是有限的。 本例中定义的 main 函数形参表为空。 第 7.2.6 节将介绍 main 函数中可以定义的其他形参。 main 函数的返回值必须是 int 型, 该类型表示整数。 int 类型是内置类型,即该类型是由 C+ 语言定义的。 函数体函数定义的最后部分,是以花括号开始并以花括号结束的语句块: return 0; 例中唯一的语句就是 return,该语句终止函数。 注意 retu
3、rn 语句后面的分号。 在 C+ 中多数语句以分号作为结束标记。分号很容被忽略,而漏写分号将会导致莫名其妙的编译错误信息。 当 return 带上一个值(如 0)时,这个值就是函数的返回值。返回值类型必须和函数的返回类型相同, 或者可以转换成函数的返回类型。 对于 main 函数,返回类型必须是 int 型,0 是 int 型的。 在大多数系统中,main 函数的返回值是一个状态指示器。返回值 0 往往表示 main 函数成功执行完毕。任何其他非零的返回值都有操作系统定义的含义。通常非零返回值表明有错误出现。每一种操作系统都有自己的方式告诉用户 main 函数返回什么内容。 已初始化变量和未初
4、始化变量 在 C+ 中,初始化是一个非常重要的概念。 已初始化变量是指变量在定义时就给定一个值。 未初始化变量则未给定初始值: int val1 = 0; / initialized int val2; / uninitialized 给变量一个初始值几乎总是正确的,但不要求必须这样做。当我们确定变量在第一次使用时会赋一个新值,那就不需要创建初始值。 定义变量时,应该给变量赋初始值,除非确定将变量用于其他意图之前会覆盖这个初值。如果不能保证读取变量之前重置变量,就应该初始化变量。 EOF 文件终止符竞赛中常采用 while(scanf( . ) != EOF) . 来实现多组读入。这是因为竞赛
5、经常采用重定向的方式,把输入数据文件输入到程序中。而EOF表示文件结束。(End Of File)从键盘输入文件结束符 操作系统使用不同的值作为文件结束符。Windows 系统下我们通过键入controlz同时键入“ctrl”键和“z”键,来输入文件结束符。nix 系统中,包括 Mac OSX 机器,通常用 controld。 C/C+编码规范一个好的程序,不仅要算法正确,效率高,而且还应该可读性好。所谓程序的可读性,就是程序是否能让人容易读懂。在开发实践中,许多情况下可读性与代码效率同等重要。软件开发是团队工作,接手别人编码的程序并在此基础上进行改进是必不可少的,因此可读性在工程实践中非常重
6、要。即使是自己编写的程序,如果可读性不好,过一段时间需要改进时自己再看,也常会看不懂。如何提高程序的可读性呢?在标识符、书写格式、注释三个方面加以培养,再养成一些好的习惯,就能够有效增强程序的可读性。1.5.1 标识符命名注意事项应该对变量、常量以及函数等标识进行适当的命名。好的命名方法使标识符易于记忆且使程序可读性大大提高。对标识符命名的基本要求是,看到标识符就能想起或猜出它是做什么用的。如果名字能体现变量的类型或作用域等性质,当然更好。标识符命名应注意以下几点:(1)标识符号应能提供足够信息以说明其用途。 一定不要怕麻烦而懒得起足够长的变量名,少按几个键省下的时间,和日后自己读程序或别人读
7、你的程序揣摩该变量的作用所花的时间相比,实在微不足道。在没有国标合作的项目中编写程序,如果英语实在不好,可以使用拼音,但不要使用拼音缩写。(2)为全局变理取长的、描述信息多的名字,为局部变量限稍短的名字。(3)名字太长时可以适当采用单词的缩写。但要注意缩写方式一致,要缩写就全部缩写。比如单词Number,如果在某个变量里缩写成了:int nDoorNum;那么最好包含Number单词的变量都缩写成Num。(4)注意使用单词的复数形式。如int nTotalStudents,nStudents;nStudents容易让人理解成代表学生数目,而nStudent含义就不十分明显。(5)对于返回值为真
8、或假的函数,加“IS”前缀如:int IsCanceled();int isalpha(); /C语言标准库函数BOOL IsButtonPushed();1.5.2 程序的书写格式书写格式好的程序,看起来才有好心情,谁也不愿意看下面这样的程序:void main()int t, x, y;cint;while (t0)min=60000;cinNxymax; plat0.x1=x;plat0.x2=x; plat0.h=y;for (int i=1;iplati.x1plati.x2plati.h;plati.t1=-1;plati.t2=-1;if (plati.hy) i-; N-; p
9、lat0.t1=0;plat0.t2=0;qsort(void*)(&plat1), N, sizeof(plat0), compare);tryway(0);t-;coutmin= 4)printf(“%d”, nAge);for(i = 0; i 100; i+);1.5.4 一些好的编程习惯(1)尽量不要用立即数,而用#define 或 const 定义成常量,以便以后修改。例如:#define MAX_STUDENTS 20struct SStudent aStudents MAX_STUDENTS;比struct SStudent aStudents 20;好。再例如:#define
10、 TOTAL_ELEMENTS 100for(i = 0; i TOTAL_ELEMENTS; i+) (3)稍复杂的表达式中要积极使用括号,以免优先级理解上的混乱以及二义性。n = k+ + j; /不好n = (k+) + j; /好一点(4)不很容易理解的表达式应分几行写:n = (k+) + j;应该写成:n = k + j;k+;(5)嵌套的if else 语句要多使用 if(Condition1()if(condition2()DoSomething();elseNoCondition2();不够好,应该:if(Condition1() if(condition2()DoSomet
11、hing();elseNoCondition2();(6)单个函数的程序行数最好不要超过100 行(两个屏幕高)。(7)尽量使用标准库函数。(8)不要随意定义全局变量,尽量使用局部变量。(9)保持注释与代码完全一致,改了代码别忘改注释。(10)循环、分支层次最好不要超过5层。(11)注释可以与语句在同一行,也可以在上行。(12)一目了然的语句不加注释。1.6 小结与习题通过前几个小节的学习,对顺序结构程序设计和分支程序设计的核心概念和方法,然而对这些进行知识进行总结,并且完成适当的练习是很有必要的。1.6.1 数据类型实验实验A1:表达式11111*11111的值是多少?把5个1改为6个1呢?
12、9个1呢?解答:(1)计算表达式11111*11111的值#include int main()printf(11111*11111=%ld,11111*11111);return 0;程序的运行结果为11111*11111=123454321。(2)计算表达式111111*111111的值只须将(1)中的printf语句改为printf(111111*111111=%ld,111111*111111);,程序的运行结果为111111*111111=-539247567。正确的结果应为12345654321,由于这个数比较大,所以产生了溢出。(3)计算表达式111111111*11111111
13、1的值只须将(1)中的printf改为printf(111111111*111111111=%ld ,111111111*111111111);,程序的运行结果为111111111*111111111=1653732529。正确的结果应为12345678987654321,由于这个数比较大,所以产生了溢出。实验A2:把实验A1中的所有数换成浮点数,结果如何?解答:(1)计算表达式11111.0*11111.0的值#include int main()printf(11111.0*11111.0=%lf,11111.0*11111.0);return 0;程序的运行结果为11111*11111=
14、123454321.000000。(2)计算表达式111111.0*111111.0的值只须将(1)中的printf语句改为printf(11111*11111=%lf,11111*11111);,程序的运行结果为111111.0*111111.0=12345654321.000000。(3)计算表达式111111111.0*111111111.0的值只须将(1)中的printf改为printf(111111111.0*111111111.0=%lf ,111111111.0*111111111.0);,程序的运行结果为111111111.0*111111111.0=1234567898765
15、4320.000000。实验A3:表达式sqrt(-10)的值是多少?尝试用种方法输出。在计算过程中系统会报错吗?解答:#include #include int main()printf(sqrt(-10)=%lf,sqrt(-10);return 0;程序的运行结果为sqrt(-10)=-1.#IND,没有报错,但结果异常。实验A4:表达式1.0/0.0、0.0/0.0的值是多少?尝试用种方法输出。在计算过程中系统会报错吗?解答:#include int main()printf(1.0/0.0=%lf 0.0/0.0=%lf,1.0/0.0,0.0/0.0);return 0;输出结果为
16、1.0/0.0=1.#INF 0.0/0.0=-1.#IND。在计算过程中系统会报错,提示信息为“divdide or mod by zero”。实验A5:表达式1/0的值是多少?在计算过程中系统会报错吗?解答:表达式1/0的值无结果。在计算过程中系统会报错,提示信息为“divdide or mod by zero”。1.6.2 scanf输入格式实验scanf(%d%d,&a,%b);语句用来输入两个数,可用Tab、空格、回车,作为分隔符。实验B1:在同一行中输入12和2,并以空格分隔,是否得到了预期的效果?解答:#include void main() int a,b;scanf(%d%d
17、,&a,&b);printf(%d, %dn,a,b);return;从键盘上输入:12 2,可以达到输入两个数给变量a和b的效果。实验B2:在不同的两行中输入12和2,是否得到了预期的效果?解答:从键盘上输入:122,也可以达到输入两个数给变量a和b的效果。实验B3:在实验B1和B2中,在12和2的前面和后面加入大量的空格或水平制表符(TAB),甚至插入一些空行。解答:从键盘上输入的12和2,也可以前面和后面加入大量的空格或水平制表符(TAB),甚至插入一些空行,达到输入两个数给变量a和b的效果。实验B4:把2换成字符s,重复实验B1B3。解答:从键盘上输入:12 2,而输出的结果为12 -
18、85899360。1.6.3 printf语句输出实验在printf语句中的格式字符串,决定了数据的输入/输出格式。实验C1:仅用一条printf语句,打印1+2和3+4,用两个空行隔开。解答:#include void main() printf(%dnn%d,1+2,3+4);return;实验C2:试着把%d中的两个字符(百分号和小写字)输出到屏幕。解答:#include void main() printf(%dn);return;实验C3:试着把n中的两个字符(反斜线和小写字母n)输出到屏幕。解答:#include void main() printf(n);return;实验C4:
19、像C2、C3那样也需要“特殊方法”才能输出的东西还有哪些?哪些是printf函数引起的问题,哪些不是?解答:输出单引号和双引号需要用和。1.6.4 测试你的实践能力问题1:int型整数的最小值和最大值是多少?(需要精确度)。解答:(1)方法一#include #include int main() int a,b;a=-pow(2,31);b=pow(2,31)-1;printf(%d %dn,a,b);return 0;注意:在TC中int型整数(2字节)的最小值和最大值分别为-32768和32767;在VC6.0中int型整数(4字节)的最小值和最大值分别为-2147483648和2147
20、483647,所以不同的编译系统为整型数据分配的字节数是不相同的。本题程序是在VC6.0中调试的。(2)方法二#include #include int main() int a,b;a=INT_MAX;b=INT_MIN;printf(%d %dn,a,b);return 0;说明:头文件limits.h中定义了用于表示整数类型大小的常量(宏定义)。(1)如果在C:盘上有TC,就可以在“c:TC”用记事本打开头文件limits.h,可以找到“#define INT_MAX 0x7FFF”和“#define INT_MIN (int)0x8000)”。INT_MAX表示在TC中表示最大整数,0
21、x7FFF就是32767;INT_MIN表示在TC中表示最小整数,(int)0x8000就是-32768。(2)如果在C:盘装有VC6.0,就可以在“C:Program FilesMicrosoft Visual StudioVC98Include”用记事本打开头文件limits.h,可以找到“#define INT_MIN (-2147483647-1) /* minimum (signed) int value */”和“#define INT_MAX 2147483647 /* maximum (signed) int value */”。INT_MAX表示在VC6.0中表示最大整数是2
22、147483647;INT_MIN表示在TC中表示最小整数是-2147483648。问题2:double型浮点数能精确到多少位小数?或者,这个问本身值得商榷?解答:#include int main() double a;a=123.0;printf(%lfn,a);return 0;double型浮点数隐含输出小数位数为6位,不过还可以通printf(%.20lfn,a);来重新设置,.20中的20也可以换成其它的数值。问题3:double型浮点数最大正数值和最小正数值分别是多少?解答:#include int main() int y = 1030; for (double x = 0.9
23、99999999; y- ; x *= 2) cout x t; cout endl; y = 1030; for (x = 0.000000001; y- ; x /= 2) cout x t; cout endl; return 0;由程序可得,double型浮点数最大正数值和最小正数值分别是1.79769e+308、1.73832e-319。问题4:逻辑运算符号&、|和!(它表示逻辑非)的相对优先级是怎样的?也就是说,a&b|c应理解成(a&b)|c还是a&(b|c),或者随便怎么理解都可以?解答:逻辑运算符号&、|和!(它表示逻辑非)的相对优先级(由高到低)是! &|。a&b|c应理解
24、为(a&b)|c。问题5:if(a) if(b) x+; else y+;的确切含义是什么?这个else应和哪个if配套?有没有办法明确表达出配套方法,以避免初学者之困惑?解答:if(a) if(b) x+; else y+; 可以换成以下的形式:if(a)if(b) x+;else y+;else与if的配对的原则是else一般与最近没有配对的if进行配对。实际上,如果else与第一个if进行配对,可以采取加的方式进行:if(a) if(b) x+;else y+;如果else与第二个if进行配对,可以采取加的方式进行:if(a)if(b) x+;else y+;以上这种加的方式,就不会引起
25、歧义。1.6.5 小结(1)本章介绍了常见的各种数据类型,以及他们所能表达的范围;(2)本章介绍了scanf和printf语句的使用;(3)本章介绍了逻辑判断的使用,理解并描述复杂的逻辑判断。(4)程序设计是一门实践性很强学科,所以在学习时,给出两点建议:重视实验、学会模仿。1.6.6 上机练习程序设计是一门实践性很强的学科,所以给出下面的练习。习题1-1 平均数(average)输入3个整数,输出它们的平均值,保留3位小数。解答:#include int main() int a,b,c;double d;scanf(%d%d%d,&a,&b,&c);d=(double)(a+b+c);pr
26、intf(%.3lfn,d/3.0);return 0;习题1-2 温度(temperature)输入华式温度f,输出对应的摄氏温度c,保留3位小数。提示:c=5(f-32)/9。解答:#include int main() int f;double c;scanf(%d,&f);c=5*(f-32)/9;printf(%.3lfn,c);return 0;习题1-3 连续和(sum)输入正整数n,输出1+2+n的值。提示:目标是解决问题,而不是练习编程。解答:#include int main() int n;scanf(%d,&n);printf(%dn,(1+n)*n/2);return
27、 0;注意:本题利用了等差数列的公式,而不是像平常编程时,用循环来实现。习题1-4 余弦和正弦(sincos)输入正整数(n360),输出n度的正弦、余弦函数值。提示:使用数学函数。解答:#include #include int main() const double pi = 3.1415926;int n; /* n是角度 */scanf(%d,&n);printf(sin(n)=%lfn,sin(n/180.0)*pi);printf(cos(n)=%lfn,cos(n/180.0)*pi);return 0;习题1-5 距离(distance)输入4个浮点数x1,y1,x2,y2,输
28、出平面坐标系中点(x1,y1)和点(x2,y2)的距离。解答:#include #include int main() double x1,x2,y1,y2;scanf(%lf%lf%lf%lf,&x1,&y1,&x2,&y2);printf(%lfn,sqrt(x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);return 0;习题1-6 偶数(odd)输入一个整数,判断它是否为偶数。如果是,则输出“yes”,否则输出“no”。提示:可以用多种方法判断。解答:#include int main()int n;scanf(%d,&n);if(n%2=0)printf(YESn);e
29、lseprintf(NOn);return 0;习题1-7 打折(discount)一件衣服95元,若消费满300元,可打八五折。输入购买衣服件数,输出需要支付的金额(单位:元),保留两位小数。解答:#include int main() int n;double a;scanf(%d,&n);a=n*95.0;if(a300)printf(%.2lfn,a);elseprintf(%.2lfn,a*0.85);return 0;习题1-8 绝对值(abs)输入一个浮点数,输出它的绝对值,保留两位小数。解答:#include #include int main() double n;scanf
30、(%lf,&n);printf(%.2lf,fabs(n);return 0;习题1-9 三角形(triangle)输入三角形三边长度值(均无正整数),判断它是否能为直角三角形的三个边长。如果可以,则输出“yes”,如果不能,则输出“no”。如果根本无法构成三角形,则输出“not a triangle”。解答:#include int main() int a,b,c;scanf(%d%d%d,&a,&b,&c);if(a=b&b=c) printf(non);if(a*a+b*b=c*c)|(a*a+c*c=b*b)|(b*b+c*c=a*a) printf(yesn);else printf(non);return 0;习题1-10 年份(year)输入年份,判断是否为闰年。如果是,则输出“yes”,否则输出“no”。提示:简单地判断除以4的余数的是不够的。解答:#include int main() int n;scanf(%d,&n);if(n%4=0) if(n%100!=0) printf(non);else if(n%400=0) printf(yesn);elseprintf(non);else printf(non);return 0;布 置 作 业上机练习 习题1-7、1-8、1-9、1-10第 17 页