C程序复习.docx
《C程序复习.docx》由会员分享,可在线阅读,更多相关《C程序复习.docx(27页珍藏版)》请在冰豆网上搜索。
C程序复习
第1章程序设计和C语言
1、C语言是一种结构化语言。
2、C语言程序结构的特点:
(1)一个程序由一个或多个源程序文件组成。
(预处理指令、全局声明、函数定义)
(2)函数是C程序的主要组成部分。
1 函数是C程序的基本单位。
2 一个C语言程序是由一个或多个函数组成的,其中必须包含一个main函数(且只能有一个main函数)。
(3)一个函数包括两个部分:
函数首部、函数体(声明部分、执行部分)。
(4)程序总是从main函数开始执行的,到main函数结束。
而不论main函数在整个程序中的位置如何(main函数的位置是任意的)。
(5)程序中对计算机的操作是由函数中的C语句完成的。
(6)在每个数据声明和语句的最后必须有一个分号。
(7)C语言本身不提供输入和输出语句。
(8)程序应当包含注释。
3、运行C程序的步骤:
编辑(源程序f.c)、编译(f.obj)、连接(f.exe)、执行(f.exe)。
(注意P13图1.2)
4、C语言是面向对象的语言。
第二章算法
1、沃斯公式:
算法+数据结构=程序
2、算法的定义:
算法——为解决一个问题而采取的方法和步骤。
3、有效算法的特点:
(1)有穷性
(2)确定性
(3)有零个或者多个输入
(4)有一个或者多个输出
(5)有效性
4、三种基本结构:
(1)顺序结构
(2)选择结构
(3)循环结构(当型循环结构、直到型循环结构)
5、结构化程序设计方法的基本思路:
把一个复杂问的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。
第三章最简单的C程序设计——顺序程序设计
1、符号常量:
用#define指令,指定用一个符号名称代表一个常量。
(#definePI3.1416,这样用一个符号代表一个常量的,称为符号常量)
2、标识符:
C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。
3、数据类型
基本整形(int)
短整型(shortint)
长整型(longint)
整形类型*双长整型(longlongint)
字符型(char)
*布尔型
基本类型
单精度浮点型(float)
浮点类型双精度浮点型(double)
复数浮点型(float-complex...)
数据类型枚举类型(enum)
空类型(void)
指针类型(*)
数组类型([])
派生类型结构体类型(struct)
共用体类型(union)
函数类型
4、字符与字符代码:
目前大多数系统采用ASCII字符集。
各种字符集(包括ASCII字符集)的基本集都包括了127个字符。
其中包括:
●字母:
大学英文字母A~Z,小写英文字母a~z。
●数字:
1~9.
●专门符号:
29个:
!
”#&‘()*+,—·/:
<=>?
[\]ˆ_﹛﹜~
●空格符:
空格、水平制表符(tab)、垂直制表符、换行、换页(formfeed)。
●不能显示的字符:
空(null)字符(以'0'表示)、警告(以'\a'表示)、退格(以'\b'表示)、回车(以'\r'表示)等。
5、最常用的算术运算符
运算符
含义
举例
结果
+
正号运算符(单项运算符)
+a
a的值
-
负号运算符(单项运算符)
-a
a的算数负值
*
乘法运算符
a*b
a和b的乘积
/
除法运算符
a/b
a除b的商
%
求余运算符
a%b
a除b的余数
+
加法运算符
a+b
a和b的和
-
减法运算符
a-b
a和b的差
6、自增、自减运算符
作用是使变量的值加1或减1(++i、--i、i++、i--)
例如:
a的初始值为3,
(a++)+(a++)+(a++)=9
(++a)+(++a)+(++a)=18
7、运算符的优先级(详见第四章)与结合性
自左向右(又称“左结合性”,即运算对象先与左面的运算符结合):
算数运算符
结合性
自右向左(即右结合性):
赋值运算符
8、不同类型数据间的混合运算:
编译时,从左至右扫描。
(规律:
同一个字母,用小写表示的字符的ASCII代码比大写的大32,'a'的ASCII码为97,'A'的ASCII码为65)
9、C运算符
除了算数运算符外,C还提供其他运算符,共有以下几类:
(1)算术运算符(+-*/++--)
(2)关系运算符(> < == <= >= !
=)
(3)逻辑运算符(!
&&||)
(4)位运算符(针对二进制的运算)(<<>>~|^&)
例如:
&&和&
2&&0=02&&3=1(非零即为1)
2&3=2(2:
0103:
011010&011=010)
(5)赋值运算符(=及其扩展赋值运算符)
(6)条件运算符(?
:
)
(7)逗号运算符(优先级最低)(,)
(8)指针运算符(*和&)
(9)求字节数运算符(sizeof)
(10)强制类型转换运算符((类型))
(11)成员运算符(.->)
(12)下标运算符([])
(13)其他
10、用printf函数输出数据
Printf函数的一般格式为:
printf(格式控制、输出列表)
Printf函数的一般形式可以表示为:
printf(参数1,参数2,...,参数n)
11、用scanf函数输出数据
Scanf函数的一般形式:
scanf(格式控制,地址列表)
12、用putchar函数输出一个字符,puts输出一个字符串
Putchar函数的一般形式为:
putchar(c)
用getchar函数输入一个字符,gets输入一个字符串
Getchar函数的一般形式为:
getchar()
第4章选择结构程序设计
1、if语句的一般形式:
if(表达式)语句1
[else语句2]
方括号内的部分(即else子句)为可选的,即可有可无。
嵌套(就近原则,向上就近且为配套的)
2、关系运算符及其优先次序
C语言提供6种关系运算符:
(1)
<(小于)算术运算符(高)
(2)<=(小于或等于)优先级相同(高)
(3)>(大于)关系运算符
(4)>=(大于或等于)
(5)
==(等于)优先级相同(低)赋值运算符(低)
(6)!
=(不等于)
3、逻辑运算符及其优先次序
运算符
含义
举例
说明
&&
逻辑与
a&&a
如果a和b都为真,则结果为真,否则为假
||
逻辑或
a||a
如果a和b有一个以上为真,则结果为真,二者都为假时,结果为假
!
逻辑非
!
a
如果a为假,则!
a为真,如果a为真,则!
a为假
!
(非)(高)
算术运算符
关系运算符
&&和||
赋值运算符(低)
4、条件表达式的一般形式:
表达式1?
表达式2:
表达式3
真(非0)假(0)
5、例题:
输入一个字符,判别它是否为大写字母,如果是,将它转化为小写字母;如果不是,不转换。
然后输出最后得到的字符。
(p99例4.4)(重点掌握大小写的转换)
解题思路:
用条件表达式来处理,当字母是大写时,转换成小写字母,否则不转换。
编写程序:
#include
intmain()
{
charch;
scanf("%c",&ch);
ch=(ch>='A'&&ch<='z')?
(ch+32):
ch;//或ch=(ch<=65&&ch<=90)?
(ch+32):
ch;
printf("%c\n",ch);
return0;
}
运行结果:
A
a
输入大写字母A,输出小写字母a。
6、有三个整数a,b,c,由键盘输入,输出其中最大的数。
(P112T4)
程序如下:
#include
intmain()
{
inta,b,c;
printf("请输入三个数:
");
scanf("%d,%d,%d",&a,&b,&c);运行结果:
if(a
12,34,9
if(bprintf("max=%d\n",c);
else
printf("max=%d\n",b);
elseif(aprintf("max=%d\n",c);
else
printf("max=%d\n",a);
return0;
}
方法二:
使用条件表达式:
#include
intmain()
{inta,b,c,temp,max;
printf("请输入三个数:
");
scanf("%d,%d,%d",&a,&b,&c);
temp=(a>b)?
a:
b;//将a和b中的大者放入temp中
max=(temp>c)?
temp:
c;//将a和b中的大者和c比较,取最大者
printf("三个整数中最大数是%d\n",max);
return0;
}
7、给一个不多余5位的正整数,要求:
1 求出它是几位数;
2 分别输出每一位数字;
3 按逆序输出各位数字,如原数为234,应输出321。
(P113T9)
解:
程序如下:
#include
#include
intmain()
{
intnum,indiv,ten,hundred,thousand,ten_thousand,place;
printf("请输入一个整数(0-99999):
");
scanf("%d",&num);
if(num>9999)
place=5;
elseif(num>999)
place=4;
elseif(num>99)
place=3;
elseif(num>9)
place=2;
elseplace=1;
printf("位数:
%d\n",place);
printf("每位数字为:
");
ten_thousand=num/10000;
thousand=(int)(num-ten_thousand*10000)/1000;
hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;
ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);
switch(place)
{case5:
printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundred,ten,indiv);
printf("\n反序数字为:
");
printf("%d%d%d%d%d\n",indiv,ten,hundred,thousand,ten_thousand);
break;
case4:
printf("%d,%d,%d,%d",thousand,hundred,ten,indiv);
printf("\n反序数字为:
");
printf("%d%d%d%d\n",indiv,ten,hundred,thousand);
break;
case3:
printf("%d,%d,%d",hundred,ten,indiv);
printf("\n反序数字为:
");
printf("%d%d%d\n",indiv,ten,hundred);
break;
case2:
printf("%d,%d",ten,indiv);
printf("\n反序数字为:
");
printf("%d%d\n",indiv,ten);
break;运行结果:
case1:
printf("%d",indiv);请输入一个整数(0~99999):
98423printf("\n反序数字为:
");位数:
5
printf("%d\n",indiv);每位数组为:
9,8,4,2,3
break;反序数字为:
32489
}
return0;
}
8、输入四个整数,要求按由大到小的顺序输出。
(P113T11)
程序如下:
#include
intmain()
{intt,a,b,c,d;
printf("请输入四个数:
");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(a>d)
{t=a;a=d;d=t;}
if(b>c)
{t=b;b=c;c=t;}
if(b>d)
{t=b;b=d;d=t;}
if(c>d)运行结果:
请输入四个数字:
6,8,1,4
{t=c;c=d;d=t;}a=6,b=8,c=1,d=4
printf("排序结果如下:
\n");排序结果如下:
printf("%d%d%d%d\n",a,b,c,d);1468
return0;
}
第5章循环结构程序设计
1、循环结构:
while;dowhile;for。
2、while语句:
只要当循环表达式为真(即给定的条件成立),就执行循环体语句
循环特点:
先判断条件表达式,后执行循环体语句。
一般形式:
while(表达式)语句
3、dowhile语句特点:
无条件地执行循环体,然后判断循环条件是否成立。
一般形式:
do
语句
while(表达式)
4、for语句一般形式:
for(表达式1;表达式2;表达式3)
语句
3个表达式的主要作用:
表达式1:
设置初始条件,只执行一次。
表达式2:
是循环条件表达式,用来判断是否继续循环。
在每次执行循环体前先执行此表达式,决定是否继续执行循环体。
表达式3:
作为循环的调整。
即:
for(循环变量赋初值;循环条件;循环变量增值)
语句
说明:
for(表达式1;表达式2;表达式3)语句
可以该写为while循环的形式:
while表达式2
{
语句
表达式3
}
5、集中循环的比较:
1)3种循环都可以用来处理同一问题,一般情况下可以相互代替。
2)在while循环和do...while循环中,只在while后面的括号内制定循环条件,因此为了使循环能正常结束,应在循环体中包含是循环趋于结束的语句。
for循环可以在表达式3中包含使循环区域结束的操作,甚至可以将循环体中的操作全部放到表达式3中。
因此,for语句的功能能强,凡能用while循环能完成的,用for循环都能实现。
3)用while和dowhile循环时,循环变量初始化的操作应在while和do...while语句完成之前完成。
而for语句可以在表达式1中实现循环变量的初始化。
4)While循环、do...while循环和for循环,都可以用break语句跳出循环,用continue语句结束本次循环。
6.break语句和continue语句的区别:
Continue语句只结束本次循环而不是终止整个循环的执行。
而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
7、P128例题5.6程序语句:
if(n%5==0)printf("\n")控制在输出5个数据后换行。
8、输入两个正数m和n,求其最大公约数和最小公倍数。
(P140T3)
#include
intmain()
{
intp,r,n,m,temp;
printf("请输入两个正整数n,m:
");
scanf("%d,%d",&n,&m);
if(n{
temp=n;
n=m;
m=temp;
}
p=n*m;
while(m!
=0)
{
r=n%m;
n=m;
m=r;
}运行结果:
printf("它们的最大公约数为:
%d\n",n);请输入两个正整数n,m:
35,49
printf("它们的最小公倍数为:
%d\n",p/n);他们的最大公约数是:
7
return0;他们的最小公倍数是:
245
}
9、输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.(P140T4!
!
重点)
程序如下:
#include
intmain()
{
charc;
intletters=0,space=0,digit=0,other=0;
printf("请输入一行字符:
\n");
while((c=getchar())!
='\n')
{
if(c>='a'&&c<='z'||c>='A'&&c<='Z')运行结果:
letters++;请输入一行字符:
elseif(c=='')Iamastudent.
space++;字母数:
11
elseif(c>='0'&&c<='9')空格数:
3
digit++;数字数:
0
Else其他字符:
1
other++;
}
printf("字母数:
%d\n空格数:
%d\n数字数:
%d\n其他字符数数:
%d\n",letter,apace,digit,other);
return0;
}
10、求
,即1+2!
+3!
+4!
+…+20!
.(P140T6,重点掌握求一个数的阶乘)
程序如下:
#include
main()
{
doubles=0,t=1;
intn;
for(n=1;n<=20;n++)
{
t=t*n;
s=s+t;
}运行结果:
printf("1!
+2!
+…+20!
=%22.15e\n",s);1!
+2!
+…+20!
=2.561327494111820e+018
return0;
}
11、一个数恰好等于它的因子之和,这个数就称为完数。
例如,6的因子为1,2,3,而6=1+2+3,因此6是完数。
编程找出1000以内的所有完数,并按下面的格式输出其因子:
(P141T9)
6itsfactorsare1,2,3
程序如下:
#defineM1000//定义寻找范围
#include
intmain()
{
intk1,k2,k3,k4,k5,k6,k7,k8,k9,k10;
inti,a,n,s;
for(a=2;a<=M;a++)//a是2~1000之间的整数,检查它是否完数
{n=0;//n用来积累a的因子个数
s=a;//s用来存放尚未求出的因子之和,并开始等于a
for(i=1;iif(a%i==0)//如果i是a的因子
{n++;//n加一表示新找到一个因子
s=s-i;//s减去已找到的因子,s的新值是尚未求出的因子之和
switch(n)//将找到的因子赋给k1~k9,或k10
{case1:
k1=i;break;//找出第1个因子赋值给k1
case2:
k2=i;break;//找出第2个因子赋值给k2
case3:
k2=i;break;//找出第3个因子赋值给k3
case4:
k4=i;break;//找出第4个因子赋值给k4
case5:
k5=i;break;//找出第5个因子赋值给k5
case6:
k6=i;break;//找出第6个因子赋值给k6
case7:
k7=i;break;//找出第7个因子赋值给k7
case8:
k8=i;break;//找出第8个因子赋值给k8
case9:
k9=i;break;//找出第9个因子赋值给k9
case10:
k10=i;break;//找出第10个因子赋值给k10
}
}
if(s==0)
{
printf("%d,itsfactorsare",a);
if(n>1)printf("%d,%d",k1,k2);//n>1表示a至少有2个因子
if(n>2)printf(",%d",k3);//n>2表示至少有3个因子,故再输出一个因子
if(n>3)printf(",%d",k4);//n>3表示至少有4个因子,故再输出一个因子
if(n>4)printf(",%d",k5);//以下类推
if(n>5)printf(",%d",k6);
if(n>6)printf(",%d",k7);
if(n>7)printf(",%d",k8);
if(n>8)printf(",%d",k9);
if(n>9)printf(",%d",k10);
printf("\n");运行结果:
}
}6,itsfactorsare1,2,3
return0;28,itsfactorsare1,2,4,7,14
}496,itsfactorsare1,2,4,8,16,31,62,124,248
方法二:
#include
intmain()
{intm,s,i;
for(m=2;m<1000;m++)
{s=0;
for(i=1;iif((m%i)==0)s=s+i;
if(s==m)
{printf("%d,itsfactorsare",m);
for(i=1;iif(m%i==0)printf("%d",i);
printf("\n");
}
}
return0;
}
第6章利用数组处理批量数据
1、定义一维数组的一般形式为:
类型符数组名[常量表达式]
注意:
下标从0开始,常量表达式中可以包括常量和符号常量,不能包含变量。
2、应用数组元素的表示形式为:
数组名[下标]
注意:
只能引用数组元素而不能一次整体调用整个数组的全部元素的值。
3、对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9,要求按逆序输出。
(P144例题6.1)
程序如下:
#include
intmain()
{
inti,a[10];
for(i=0;i<=9,i++)
a[i]=i;
for(i=9;i>=0,i--)运行结果:
pri