C语言程序设计快速入门.docx
《C语言程序设计快速入门.docx》由会员分享,可在线阅读,更多相关《C语言程序设计快速入门.docx(22页珍藏版)》请在冰豆网上搜索。
C语言程序设计快速入门
第1部分语言篇
第1章程序设计入门
阅读资料[摘录自网络以及专业书籍]
Main函数相关:
每个C++程序都包含一个或多个函数,而且必须有一个命名为main。
函数由执行函数功能的语句序列组成。
操作系统通过调用main函数来执行程序,main函数则执行组成自己的语句并返回一个值给操作系统。
下面是一个简单的main函数,它不执行任何功能,只是返回一个值:
intmain()
{
return0;
}
操作系统通过main函数返回的值来确定程序是否成功执行完毕。
返回0值表明程序程序成功执行完毕。
main函数在很多方面都比较特别,其中最重要的是每个C++程序必须含有main函数,且main函数是(唯一)被操作系统显式调用的函数。
定义main函数和定义其他函数一样。
定义函数必须指定4个元素:
返回类型、函数名、圆括号内的形参表(可能为空)和函数体。
main函数的形参个数是有限的。
本例中定义的main函数形参表为空。
第7.2.6节将介绍main函数中可以定义的其他形参。
main函数的返回值必须是int型,该类型表示整数。
int类型是内置类型,即该类型是由C++语言定义的。
函数体函数定义的最后部分,是以花括号开始并以花括号结束的语句块:
{
return0;
}
例中唯一的语句就是return,该语句终止函数。
注意return语句后面的分号。
在C++中多数语句以分号作为结束标记。
分号很容被忽略,而漏写分号将会导致莫名其妙的编译错误信息。
当return带上一个值(如0)时,这个值就是函数的返回值。
返回值类型必须和函数的返回类型相同,或者可以转换成函数的返回类型。
对于main函数,返回类型必须是int型,0是int型的。
在大多数系统中,main函数的返回值是一个状态指示器。
返回值0往往表示main函数成功执行完毕。
任何其他非零的返回值都有操作系统定义的含义。
通常非零返回值表明有错误出现。
每一种操作系统都有自己的方式告诉用户main函数返回什么内容。
已初始化变量和未初始化变量
在C++中,初始化是一个非常重要的概念。
已初始化变量是指变量在定义时就给定一个值。
未初始化变量则未给定初始值:
intval1=0;//initialized
intval2;//uninitialized
给变量一个初始值几乎总是正确的,但不要求必须这样做。
当我们确定变量在第一次使用时会赋一个新值,那就不需要创建初始值。
定义变量时,应该给变量赋初始值,除非确定将变量用于其他意图之前会覆盖这个初值。
如果不能保证读取变量之前重置变量,就应该初始化变量。
EOF文件终止符
竞赛中常采用while(scanf(...)!
=EOF){...}来实现多组读入。
这是因为竞赛经常采用重定向的方式,把输入数据文件输入到程序中。
而EOF表示文件结束。
(EndOfFile)
从键盘输入文件结束符
操作系统使用不同的值作为文件结束符。
Windows系统下我们通过键入control—z——同时键入“ctrl”键和“z”键,来输入文件结束符。
nix系统中,包括MacOS—X机器,通常用control—d。
C/C++编码规范
一个好的程序,不仅要算法正确,效率高,而且还应该可读性好。
所谓程序的可读性,就是程序是否能让人容易读懂。
在开发实践中,许多情况下可读性与代码效率同等重要。
软件开发是团队工作,接手别人编码的程序并在此基础上进行改进是必不可少的,因此可读性在工程实践中非常重要。
即使是自己编写的程序,如果可读性不好,过一段时间需要改进时自己再看,也常会看不懂。
如何提高程序的可读性呢?
在标识符、书写格式、注释三个方面加以培养,再养成一些好的习惯,就能够有效增强程序的可读性。
1.5.1标识符命名注意事项
应该对变量、常量以及函数等标识进行适当的命名。
好的命名方法使标识符易于记忆且使程序可读性大大提高。
对标识符命名的基本要求是,看到标识符就能想起或猜出它是做什么用的。
如果名字能体现变量的类型或作用域等性质,当然更好。
标识符命名应注意以下几点:
(1)标识符号应能提供足够信息以说明其用途。
一定不要怕麻烦而懒得起足够长的变量名,少按几个键省下的时间,和日后自己读程序或别人读你的程序揣摩该变量的作用所花的时间相比,实在微不足道。
在没有国标合作的项目中编写程序,如果英语实在不好,可以使用拼音,但不要使用拼音缩写。
(2)为全局变理取长的、描述信息多的名字,为局部变量限稍短的名字。
(3)名字太长时可以适当采用单词的缩写。
但要注意缩写方式一致,要缩写就全部缩写。
比如单词Number,如果在某个变量里缩写成了:
intnDoorNum;
那么最好包含Number单词的变量都缩写成Num。
(4)注意使用单词的复数形式。
如
intnTotalStudents,nStudents;
nStudents容易让人理解成代表学生数目,而nStudent含义就不十分明显。
(5)对于返回值为真或假的函数,加“IS”前缀如:
intIsCanceled();
intisalpha();//C语言标准库函数
BOOLIsButtonPushed();
1.5.2程序的书写格式
书写格式好的程序,看起来才有好心情,谁也不愿意看下面这样的程序:
voidmain()
{
intt,x,y;
cin>>t;
while(t>0)
{
min=60000;
cin>>N>>x>>y>>max;plat[0].x1=x;
plat[0].x2=x;plat[0].h=y;
for(inti=1;i<=N;i++)
{
cin>>plat[i].x1>>plat[i].x2>>plat[i].h;
plat[i].t1=-1;
plat[i].t2=-1;
if(plat[i].h>y){i--;N--;}
}
plat[0].t1=0;plat[0].t2=0;
qsort((void*)(&plat[1]),N,sizeof(plat[0]),compare);
tryway(0);
t--;
cout<}
}
因此,如果想要让你的程序看起来赏心悦目,应该注意以下几点:
(1)正确使用缩进
首先,一定要有缩进,否则代码的层次不明显。
缩进应为4个空格较好。
需要缩进时一律按Tab键,或一律按空格键,不要有时用Tab键缩进,有时用空格键缩进。
一般开发环境都能设置一个Tab键相当于多少个空格,此时就都用Tab键。
(2)行宽与折行
一行不要太长,不能超过显示区域,以免阅读不便。
太长则应折行,折行最好发生在运算符前面,不要发生在运算符后面。
如
if(Condition1()&&Condition2()
&&Condition3()){
}
3)‘{’,‘}’位置不可随意放置。
建议将‘{’放在一行的右边,而将‘}’单独放置一行。
如:
if(condition1()){
DoSomething();
}
比较
if(condition1())
{
DoSomething();
}
这种写法,前者既不影响可读性,又能节省一行。
但是对于函数体或结构定义的的第一个‘{’,还是单独一行更为清晰。
(4)变量和运算符之间最好加1个空格,如:
intnAge=5;
nAge=4;
if(nAge>=4)
printf(“%d”,nAge);
for(i=0;i<100;i++);
1.5.4一些好的编程习惯
(1)尽量不要用立即数,而用#define或const定义成常量,以便以后修改。
例如:
#defineMAX_STUDENTS20
structSStudentaStudents[MAX_STUDENTS];
比
structSStudentaStudents[20];
好。
再例如:
#defineTOTAL_ELEMENTS100
for(i=0;i}
(3)稍复杂的表达式中要积极使用括号,以免优先级理解上的混乱以及二义性。
n=k+++j;//不好
n=(k++)+j;//好一点
(4)不很容易理解的表达式应分几行写:
n=(k++)+j;应该写成:
n=k+j;
k++;
(5)嵌套的ifelse语句要多使用{}
if(Condition1())
if(condition2())
DoSomething();
else
NoCondition2();
不够好,应该:
if(Condition1()){
if(condition2())
DoSomething();
else
NoCondition2();
}
(6)单个函数的程序行数最好不要超过100行(两个屏幕高)。
(7)尽量使用标准库函数。
(8)不要随意定义全局变量,尽量使用局部变量。
(9)保持注释与代码完全一致,改了代码别忘改注释。
(10)循环、分支层次最好不要超过5层。
(11)注释可以与语句在同一行,也可以在上行。
(12)一目了然的语句不加注释。
1.6小结与习题
通过前几个小节的学习,对顺序结构程序设计和分支程序设计的核心概念和方法,然而对这些进行知识进行总结,并且完成适当的练习是很有必要的。
1.6.1数据类型实验
实验A1:
表达式11111*11111的值是多少?
把5个1改为6个1呢?
9个1呢?
解答:
(1)计算表达式11111*11111的值
#include
intmain(){
printf("11111*11111=%ld",11111*11111);
return0;
}
程序的运行结果为11111*11111=123454321。
(2)计算表达式111111*111111的值
只须将
(1)中的printf语句改为printf("111111*111111=%ld",111111*111111);,程序的运行结果为111111*111111=-539247567。
正确的结果应为12345654321,由于这个数比较大,所以产生了溢出。
(3)计算表达式111111111*111111111的值
只须将
(1)中的printf改为printf("111111111*111111111=%ld",111111111*1111111
11);,程序的运行结果为111111111*111111111=1653732529。
正确的结果应为12345678987
654321,由于这个数比较大,所以产生了溢出。
实验A2:
把实验A1中的所有数换成浮点数,结果如何?
解答:
(1)计算表达式11111.0*11111.0的值
#include
intmain(){
printf("11111.0*11111.0=%lf",11111.0*11111.0);
return0;
}
程序的运行结果为11111*11111=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=12345678987654320.00000
0。
实验A3:
表达式sqrt(-10)的值是多少?
尝试用种方法输出。
在计算过程中系统会报错吗?
解答:
#include
#include
intmain(){
printf("sqrt(-10)=%lf",sqrt(-10));
return0;
}
程序的运行结果为sqrt(-10)=-1.#IND,没有报错,但结果异常。
实验A4:
表达式1.0/0.0、0.0/0.0的值是多少?
尝试用种方法输出。
在计算过程中系统会报错吗?
解答:
#include
intmain(){
printf("1.0/0.0=%lf0.0/0.0=%lf",1.0/0.0,0.0/0.0);
return0;
}
输出结果为1.0/0.0=1.#INF0.0/0.0=-1.#IND。
在计算过程中系统会报错,提示信息为“divdideormodbyzero”。
实验A5:
表达式1/0的值是多少?
在计算过程中系统会报错吗?
解答:
表达式1/0的值无结果。
在计算过程中系统会报错,提示信息为“divdideormodbyzero”。
1.6.2scanf输入格式实验
scanf("%d%d",&a,%b);语句用来输入两个数,可用Tab、空格、回车,作为分隔符。
实验B1:
在同一行中输入12和2,并以空格分隔,是否得到了预期的效果?
解答:
#include
voidmain(){
inta,b;
scanf("%d%d",&a,&b);
printf("%d,%d\n",a,b);
return;
}
从键盘上输入:
122↙,可以达到输入两个数给变量a和b的效果。
实验B2:
在不同的两行中输入12和2,是否得到了预期的效果?
解答:
从键盘上输入:
12↙
2↙,也可以达到输入两个数给变量a和b的效果。
。
实验B3:
在实验B1和B2中,在12和2的前面和后面加入大量的空格或水平制表符(TAB),甚至插入一些空行。
解答:
从键盘上输入的12和2,也可以前面和后面加入大量的空格或水平制表符(TAB),甚至插入一些空行,达到输入两个数给变量a和b的效果。
实验B4:
把2换成字符s,重复实验B1~B3。
解答:
从键盘上输入:
122↙,而输出的结果为12-85899360。
1.6.3printf语句输出实验
在printf语句中的格式字符串,决定了数据的输入/输出格式。
实验C1:
仅用一条printf语句,打印1+2和3+4,用两个空行隔开。
解答:
#include
voidmain(){
printf("%d\n\n%d",1+2,3+4);
return;
}
实验C2:
试着把%d中的两个字符(百分号和小写字)输出到屏幕。
解答:
#include
voidmain(){
printf("%%d\n");
return;
}
实验C3:
试着把\n中的两个字符(反斜线和小写字母n)输出到屏幕。
解答:
#include
voidmain(){
printf("\\n");
return;
}
实验C4:
像C2、C3那样也需要“特殊方法”才能输出的东西还有哪些?
哪些是printf函数引起的问题,哪些不是?
解答:
输出单引号和双引号需要用\’和\"。
1.6.4测试你的实践能力
问题1:
int型整数的最小值和最大值是多少?
(需要精确度)。
解答:
(1)方法一
#include
#include
intmain(){
inta,b;
a=-pow(2,31);
b=pow(2,31)-1;
printf("%d%d\n",a,b);
return0;
}
注意:
在TC中int型整数(2字节)的最小值和最大值分别为-32768和32767;在VC6.0中int型整数(4字节)的最小值和最大值分别为-2147483648和2147483647,所以不同的编译系统为整型数据分配的字节数是不相同的。
本题程序是在VC6.0中调试的。
(2)方法二
#include
#include
intmain(){
inta,b;
a=INT_MAX;
b=INT_MIN;
printf("%d%d\n",a,b);
return0;
}
说明:
头文件limits.h中定义了用于表示整数类型大小的常量(宏定义)。
(1)如果在C:
盘上有TC,就可以在“c:
\TC”用记事本打开头文件limits.h,可以找到“#defineINT_MAX0x7FFF”和“#defineINT_MIN((int)0x8000)”。
INT_MAX表示在TC中表示最大整数,0x7FFF就是32767;INT_MIN表示在TC中表示最小整数,(int)0x8000就是-32768。
(2)如果在C:
盘装有VC6.0,就可以在“C:
\ProgramFiles\MicrosoftVisualStudio\VC98\Include”用记事本打开头文件limits.h,可以找到“#defineINT_MIN(-2147483647-1)/*minimum(signed)intvalue*/”和“#defineINT_MAX2147483647/*maximum(signed)intvalue*/”。
INT_MAX表示在VC6.0中表示最大整数是2147483647;INT_MIN表示在TC中表示最小整数是-2147483648。
问题2:
double型浮点数能精确到多少位小数?
或者,这个问本身值得商榷?
解答:
#include
intmain(){
doublea;
a=123.0;
printf("%lf\n",a);
return0;
}
double型浮点数隐含输出小数位数为6位,不过还可以通printf("%.20lf\n",a);来重新设置,.20中的20也可以换成其它的数值。
问题3:
double型浮点数最大正数值和最小正数值分别是多少?
解答:
#include
intmain()
{
inty=1030;
for(doublex=0.999999999;y--;x*=2)cout<cout<y=1030;
for(x=0.000000001;y--;x/=2)cout<cout<return0;
}
由程序可得,double型浮点数最大正数值和最小正数值分别是1.79769e+308、1.73832e
-319。
问题4:
逻辑运算符号&&、||和!
(它表示逻辑非)的相对优先级是怎样的?
也就是说,a&&b||c应理解成(a&&b)||c还是a&&(b||c),或者随便怎么理解都可以?
解答:
逻辑运算符号&&、||和!
(它表示逻辑非)的相对优先级(由高到低)是!
→&&→||。
a&&b||c应理解为(a&&b)||c。
问题5:
if(a)if(b)x++;elsey++;的确切含义是什么?
这个else应和哪个if配套?
有没有办法明确表达出配套方法,以避免初学者之困惑?
解答:
if(a)if(b)x++;elsey++;可以换成以下的形式:
if(a)
if(b)x++;
elsey++;
else与if的配对的原则是else一般与最近没有配对的if进行配对。
实际上,如果else与第一个if进行配对,可以采取加{}的方式进行:
if(a)
{if(b)x++;}
elsey++;
如果else与第二个if进行配对,可以采取加{}的方式进行:
if(a){
if(b)x++;
elsey++;
}
以上这种加{}的方式,就不会引起歧义。
1.6.5小结
(1)本章介绍了常见的各种数据类型,以及他们所能表达的范围;
(2)本章介绍了scanf和printf语句的使用;
(3)本章介绍了逻辑判断的使用,理解并描述复杂的逻辑判断。
(4)程序设计是一门实践性很强学科,所以在学习时,给出两点建议:
重视实验、学会模仿。
1.6.6上机练习
程序设计是一门实践性很强的学科,所以给出下面的练习。
习题1-1平均数(average)
输入3个整数,输出它们的平均值,保留3位小数。
解答:
#include
intmain(){
inta,b,c;
doubled;
scanf("%d%d%d",&a,&b,&c);
d=(double)(a+b+c);
printf("%.3lf\n",d/3.0);
return0;
}
习题1-2温度(temperature)
输入华式温度f,输出对应的摄氏温度c,保留3位小数。
提示:
c=5(f-32)/9。
解答:
#include
intmain(){
intf;
doublec;
scanf("%d",&f);
c=5*(f-32)/9;
printf("%.3lf\n",c);
return0;
}
习题1-3连续和(sum)
输入正整数n,输出1+2+…+n的值。
提示:
目标是解决问题,而不是练习编程。
解答:
#include
intmain(){
intn;
scanf("%d",&n);
printf("%d\n",(1+n)*n/2);
return0;
}
注意:
本题利用了等差数列的公式,而不是像平常编程时,用循环来实现。
习题1-4余弦和正弦(sincos)
输入正整数(n<360),输出n度的正弦、余弦函数值。
提示:
使用数学函数。
解答:
#include
#include
intmain(){
constdoublepi=3.1415926;
intn;/*n是角度*/
scanf("%d",&n);
printf("sin(n)=%lf\n",sin((n/180.0)*pi));
printf("cos(n)=%lf\n",cos((n/180.0)*pi));
return0;
}
习题1-5距离(distance)
输入4个浮点数x1,y1,x2,y2,输出平面坐标系中点(x1,y1)和点(x2,y2)的距离。
解答:
#include
#include
intmain(){
doublex1,x2,y1,y2;
scanf("%l