②开关语句:switch语句
⑧当循环语句:while语句
④直到循环语句:do—while语句
⑤计数循环语句:for·语句
⑥中止本次循环语句:continue语句
⑦中止整个循环语句:break语句
⑧函数返回语句:return语句
⑨无条件转移语句:goto语句 C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。
1 数据类型关键字(12个): (1) char :声明字符型变量或函数
(2) double :声明双精度变量或函数
(3) enum :声明枚举类型
(4) float:声明浮点型变量或函数
(5) int: 声明整型变量或函数
(6) long :声明长整型变量或函数
(7) short :声明短整型变量或函数
(8) signed:声明有符号类型变量或函数
(9) struct:声明结构体变量或函数
(10) union:声明共用体(联合)数据类型
(11) unsigned:声明无符号类型变量或函数
(12) void :声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用)
2控制语句关键字(12个): A循环语句
(1) for:一种循环语句(可意会不可言传)
(2) do :循环语句的循环体
(3) while :循环语句的循环条件
(4) break:跳出当前循环
(5) continue:结束当前循环,开始下一轮循环
B条件语句
(1)if: 条件语句
(2)else :条件语句否定分支(与 if 连用)
(3)goto:无条件跳转语句
C开关语句
(1)switch :用于开关语句
(2)case:开关语句分支
(3)default:开关语句中的“其他”分支
D返回语句
return :子程序返回语句(可以带参数,也看不带参数)
3 存储类型关键字(4个) (1)auto :声明自动变量 一般不使用
(2)extern:声明变量是在其他文件正声明(也可以看做是引用变量)
(3)register:声明积存器变量
(4)static :声明静态变量 4 其它关键字(4个): (1)const :声明只读变量
(2)sizeof:计算数据类型长度
(3)typedef:用以给数据类型取别名(当然还有其他作用
(4)volatile:说明变量在程序执行中可被隐含地改变
B.插入排序:思路:当前a[1]..a[i-1]已排好序了,现要插入a[i]使a[1]..a[i]有序。
procedure insert_sort
var i,j:integer
begin
for i:=2 to n do begin
a[0]:=a[i]
j:=i-1
while a[0]a[j] then swap(a[i],a[j])
end
D. 冒泡排序
procedure bubble_sort
var i,j,k:integer
begin
for i:=1 to n-1 do
for j:=n downto i+1 do
if a[j]r) or (a[i]<=a[j])) {满足取左边序列当前元素的要求}
then begin
tmp[t]:=a[i]inc(i)
end
else begin
tmp[t]:=a[j]inc(j)
end
inc(t)
end
for i:=p to r do a[i]:=tmp[i]
end{merge}
procedure merge_sort(var a:listtypep,r: integer){合并排序a[p..r]}
var q:integer
begin
if p<>r then begin
q:=(p+r-1) div 2
merge_sort (a,p,q)
merge_sort (a,q+1,r)
merge (a,p,q,r)
end
end
{main}
begin
merge_sort(a,1,n)
end.
G.基数排序
思想:对每个元素按从低位到高位对每一位进行一次排序
五、高精度计算
高精度数的定义:
type
hp=array[1..maxlen] of integer
1.高精度加法
procedure plus ( a,b:hpvar c:hp)
var i,len:integer
begin
fillchar(c,sizeof(c),0)
if a[0]>b[0] then len:=a[0] else len:=b[0]
for i:=1 to len do begin
inc(c[i],a[i]+b[i])
if c[i]>10 then begin dec(c[i],10)inc(c[i+1])end{进位}
end
if c[len+1]>0 then inc(len)
c[0]:=len
end{plus}
2.高精度减法
procedure substract(a,b:hpvar c:hp)
var i,len:integer
begin
fillchar(c,sizeof(c),0)
if a[0]>b[0] then len:=a[0] else len:=b[0]
for i:=1 to len do begin
inc(c[i],a[i]-b[i])
if c[i]<0 then begin inc(c[i],10)dec(c[i+1])end
while (len>1) and (c[len]=0) do dec(len)
c[0]:=len
end
3.高精度乘以低精度
procedure multiply(a:hpb:longintvar c:hp)
var i,len:integer
begin
fillchar(c,sizeof(c),0)
len:=a[0]
for i:=1 to len do begin
inc(c[i],a[i]*b)
inc(c[i+1],(a[i]*b) div 10)
c[i]:=c[i] mod 10
end
inc(len)
while (c[len]>=10) do begin {处理最高位的进位}
c[len+1]:=c[len] div 10
c[len]:=c[len] mod 10
inc(len)
end
while (len>1) and (c[len]=0) do dec(len){若不需进位则调整len}
c[0]:=len
end{multiply}
4.高精度乘以高精度
procedure high_multiply(a,b:hpvar c:hp}
var i,j,len:integer
begin
fillchar(c,sizeof(c),0)
for i:=1 to a[0] do
for j:=1 to b[0] do begin
inc(c[i+j-1],a[i]*b[j])
inc(c[i+j],c[i+j-1] div 10)
c[i+j-1]:=c[i+j-1] mod 10
end
len:=a[0]+b[0]+1
while (len>1) and (c[len]=0) do dec(len)
c[0]:=len
end
5.高精度除以低精度
procedure devide(a:hpb:longintvar c:hpvar d:longint)
{c:=a div bd:= a mod b}
var i,len:integer
begin
fillchar(c,sizeof(c),0)
len:=a[0]d:=0
for i:=len downto 1 do begin
d:=d*10+a[i]
c[i]:=d div b
d:=d mod b
end
while (len>1) and (c[len]=0) then dec(len)
c[0]:=len
end
6.高精度除以高精度
procedure high_devide(a,b:hpvar c,d:hp)
var
i,len:integer
begin
fillchar(c,sizeof(c),0)
fillchar(d,sizeof(d),0)
len:=a[0]d[0]:=1
for i:=len downto 1 do begin
multiply(d,10,d)
d[1]:=a[i]
while(compare(d,b)>=0) do {即d>=b}
begin
Subtract(d,b,d)
inc(c[i])
end
end
while(len>1)and(c.s[len]=0) do dec(len)
c.len:=len
end
六、 树的遍历
1.已知前序中序求后序
procedure Solve(pre,mid:string)
var i:integer
begin
if (pre='''') or (mid='''') then exit
i:=pos(pre[1],mid)
solve(copy(pre,2,i),copy(mid,1,i-1))
solve(copy(pre,i+1,length(pre)-i),copy(mid,i+1,length(mid)-i))
post:=post+pre[1]{加上根,递归结束后post即为后序遍历}
end
2.已知中序后序求前序
procedure Solve(mid,post:string)
var i:integer
begin
if (mid='''') or (post='''') then exit
i:=pos(post[length(post)],mid)
pre:=pre+post[length(post)]{加上根,递归结束后pre即为前序遍历}
solve(copy(mid,1,I-1),copy(post,1,I-1))
solve(copy(mid,I+1,length(mid)-I),copy(post,I,length(post)-i))
end
3.已知前序后序求中序的一种
function ok(s1,s2:string):boolean
var i,l:integer p:boolean
begin
ok:=true
l:=length(s1)
for i:=1 to l do begin
p:=false
for j:=1 to l do
if s1[i]=s2[j] then p:=true
if not p then begin ok:=falseexitend
end
end
procedure solve(pre,post:string)
var i:integer
begin
if (pre='''') or (post='''') then exit
i:=0
repeat
inc(i)
until ok(copy(pre,2,i),copy(post,1,i))
solve(copy(pre,2,i),copy(post,1,i))
midstr:=midstr+pre[1]
solve(copy(pre,i+2,length(pre)-i-1),copy(post,i+1,length(post)-i-1))
end
七 进制转换
1.任意正整数进制间的互化
除n取余
2.实数任意正整数进制间的互化
乘n取整
3.负数进制:
设计一个程序,读入一个十进制数的基数和一个负进制数的基数,并将此十进制数转换为此负进制下的数:-R∈{-2,-3,-4,....-20}
八 全排列与组合的生成
1.排列的生成:(1..n)
procedure solve(dep:integer)
var
i:integer
begin
if dep=n+1 then begin writeln(s)exitend
for i:=1 to n do
if not used[i] then begin
s:=s+chr(i+ord(''0''))used[i]:=true
solve(dep+1)
s:=copy(s,1,length(s)-1)used[i]:=false
end
end
2.组合的生成(1..n中选取k个数的所有方案)
procedure solve(dep,pre:integer)
var
i:integer
begin
if dep=k+1 then begin writeln(s)exitend
for i:=1 to n do
if (not used[i]) and (i>pre) then begin
s:=s+chr(i+ord(''0''))used[i]:=true
solve(dep+1,i)
s:=copy(s,1,length(s)-1)used[i]:=false
end
end
九.查找算法
1.折半查找
function binsearch(k:keytype):integer
var low,hig,mid:integer
begin
low:=1hig:=n
mid:=(low+hig) div 2
while (a[mid].key<>k) and (low<=hig) do begin
if a[mid].key>k then hig:=mid-1
else low:=mid+1
mid:=(low+hig) div 2
end
if low>hig then mid:=0
binsearch:=mid
end
2.树形查找
二叉排序树:每个结点的值都大于其左子树任一结点的值而小于其右子树任一结点的值。
查找
function treesrh(k:keytype):pointer
var q:pointer
begin
q:=root
while (q<>nil) and (q^.key<>k) do
if kgoal then begin {若未移到目标}
Move(k-1,6-now-goal) {剩下的先移到没用的柱上}
Writeln(k moved from now to goal)
H[goal,h[goal,0]+1]:=h[now,nowp]h[now,nowp]:=0
Inc(h[goal,0])dec(h[now,0])
Move(k-1,goal){剩下的移到目标上}
End
十二、DFS框架
NOIP2001 数的划分
procedure work(dep,pre,s:longint){入口为work(1,1,n)}
{dep为当前试放的第dep个数,pre为前一次试放的数,s为当前剩余可分的总数}
var j:longint
begin
if dep=n then begin
if s>=pre then inc(r)exit
end
for j:=pre to s div 2 do work(dep+1,j,s-j)
end
类似:
procedure try(dep:integer)
var i:integer
begin
if dep=k then begin
if tot>=a[dep-1] then inc(sum)
exitend
for i:=a[dep-1] to tot div 2 do begin
a[dep]:=idec(tot,i)
try(dep+1)
inc(tot,i)
end
end{try}
十三、BFS框架
IOI94 房间问题
head:=1tail:=0
while tail=1) and (I<=L.len) then
while j<I do begin p:=p^.nextinc(j)end
loc:=p
end
2.单链表的插入操作
procedure insert(L:linklistI:integerx:datatype)
var p,q:pointer
begin
p:=loc(L,I)
new(q)
q^.data:=x
q^.next:=p^.next
p^.next:=q
inc(L.len)
end
3.单链表的删除操作
procedure delete(L:linklistI:integer)
var p,q:pointer
begin
p:=loc(L,I-1)
q:=p^.next
p^.next:=q^.next
dispose(q)
dec(L.len)
end
4.双链表的插入操作(插入新结点q)
p:=loc(L,I)
new(q)
q^.data:=x
q^.pre:=p
q^.next:=p^.next
p^.next:=q
q^.next^.pre:=q
5.双链表的删除操作
p:=loc(L,I){p为要删除的结点}
p^.pre^.next:=p^.next
p^.next^.pre:=p^.pre
dispose(p)
这种东西简述不了,我给你来份大全C语言语法参考大全(流程控制语句)----------------------------------------------------------------------------------------------------------01条件语句的一般形式为:if(表达式) 语句1else 语句2上述结构表示: 如果表达式的值为非0(TURE)即真, 则执行语句1, 执行完语 句1从语句2后开始继续向下执行如果表达式的值为0(FALSE)即假, 则跳过语句1而执行语句2。注意: 1. 条件执行语句中"else 语句2"部分是选择项, 可以缺省, 此时条件语句变成:if(表达式) 语句1表示若表达式的值为非0则执行语句1 , 否则跳过语句1继续执行。2. 如果语句1或语句2有多于一条语句要执行时, 必须使用"{"和"}" 把这些语句包括在其中, 此时条件语句形式为:if(表达式){语句体1}else{语句体2}3. 条件语句可以嵌套, 这种情况经常碰到, 但条件嵌套语句容易出错, 其原因主要是不知道哪个if对应哪else。例如:if(x>20||x<-10)if(y<=100&&y>x) printf("Good") else printf("Bad")对于上述情况, Turbo C2.0规定: else语句与最近的一个if语句匹配, 上例中的else与if(y<=100&&y>x)相匹配。为了使else与if(x>20||x<-10)相匹配, 必须用花括号。如下所示:if(x>20||x<-10){if(y<=100&&y>x)printf("Good")}elseprintf("Bad")4. 可用阶梯式if-else-if结构。阶梯式结构的一般形式为:if(表达式1) 语句1else if(表达式2) 语句2else if(表达式3)语句3 ..else语句n这种结构是从上到下逐个对条件进行判断, 一旦发现条件满点足就执行与它有关的语句, 并跳过其它剩余阶梯若没有一个条件满足, 则执行最后一个else语句n。最后这个else常起着"缺省条件"的作用。同样, 如果每一个条件中有多于一条语句要执行时, 必须使用"{"和"}"把这 些语句包括在其中。02switch语句在编写程序时, 经常会碰到按不同情况分转的多路问题, 这时可用嵌套if-else-fi语句来实现, 但if-else-if语句使用不方便, 并且容易出错。对这种情况, Turbo C2.0提供了一个开关语句。开关语句格式为:switch(变量){case 常量1: 语句1或空 case 常量2: 语句2或空 . . .case 常量n 语句n或空 default: 语句n+1或空}执行switch开关语句时, 将变量逐个与case后的常量进行比较, 若与其中一个相等, 则执行该常量下的语句, 若不与任何一个常量相等, 则执行default 后面的语句。注意:1. switch中变量可以是数值, 也可以是字符。2. 可以省略一些case和default。3. 每个case或default后的语句可以是语句体, 但不需要使用"{"和"}"括起来。下例的switch中变量为整数型。main(){int testfor(test=0test<=10test++){switch(test) /*变量为整型数的开关语句*/{case 1:printf("%d", test)break/*退出开关语句*/case 2:printf("%d", test)breakcase 3:printf("%d", test)breakdefault:puts("Error")break}}}下例的switch中变量为字符型。#include<stdio.h>main(){char cwhile(c!=27) /*循环直到按Esc键结束*/{c=getch()/*从键盘不回显接收一个字符*/switch(c){case A: /*接收的字符为A*/putchar(c)break/*退出开关语句*/case B:putchar(c)breakdefault: /*接收的字符非A和B*/puts("Error")break}}}03for循环for循环是开界的。它的一般形式为:for(<初始化><条件表过式><增量>) 语句(1)初始化总是一个赋值语句, 它用来给循环控制变量赋初值(2) 条件表达式是一个关系表达式, 它决定什么时候退出循环(3) 增量定义循环控制变量每循环一次后按什么方式变化。这三个部分之间用""分开。例如:for(i=1i<=10i++) 语句上例中先给i赋初值1, 判断i是否小于等于10, 若是则执行语句, 之后值增加1。再重新判断, 直到条件为假, 即i>10时, 结束循环。注意:1. for循环中语句可以为语句体, 但要用"{"和"}"将参加循环的语句括起来。2. for循环中的"初始化"、"条件表达式"和"增量"都是选择项, 即可以缺省, 但""不能缺省。省略了初始化, 表示不对循环控制变量赋初值。 省略了条件表达式, 则不做其它处理时便成为死循环。省略了增量, 则不对循环控制变量进行操作, 这时可在语句体中加入修改循环控制变量的语句。3. for循环可以有多层嵌套。例16:main(){ int i, j, k printf("i j k") for (i=0i<2i++) for(j=0j<2j++) for(k=0k<2k++) printf(%d %d %d", i, j, k)}04while循环与do-while 循环while循环的一般形式为:while(条件)语句while循环表示当条件为真时, 便执行语句。直到条件为假才结束循环。并继续执行循环程序外的后续语句.例17:#include<stdio.h>main(){char cc=/*初始化c*/while(c!=X0D) /*回车结束循环*/c=getche()/*带回显的从键盘接收字符*/}上例中, while循环是以检查c是否为回车符开始, 因其事先被初始化为空,所以条件为真, 进入循环等待键盘输入字符一旦输入回车, 则c=X0D, 条件为假, 循环便告结束。与for循环一样, while循环总是在循环的头部检验条件, 这就意味着循环可能什么也不执行就退出。注意:1. 在while循环体内也允许空语句。例如:while((c=getche())!=X0D)这个循环直到键入回车为止。2. 可以有多层循环嵌套。3. 语句可以是语句体, 此时必须用"{"和"}"括起来。例18:#include<stdio.h>main(){char c, fname[13]FILE *fp/*定义文件指针*/printf("File name:")/*提示输入文件名*/scanf("%s", fname)/*等待输入文件名*/fp=fopen(fname, "r")/*打开文件只读*/while((c=fgetc(fp)!=EOF) /*读取一个字符并判断是否到文件结束*/putchar(c)/*文件未结束时显示该字符*/}05do-while 循环do-while 循环的一般格式为:do语句while(条件)这个循环与while循环的不同在于: 它先执行循环中的语句, 然后再判断条件是否为真, 如果为真则继续循环如果为假, 则终止循环。因此, do-while循环至少要执行一次循环语句。同样当有许多语句参加循环时, 要用"{"和"}"把它们括起来。06continue 语句continue语句的作用是跳过循环本中剩余的语句而强行执行下一次循环。continue语句只用在for、while、do-while等循环体中, 常与if条件语句一起使用, 用来加速循环。 main(){ char c while(c!=0X0D) /*不是回车符则循环*/ { c=getch()if(c==0X1B) continue/*若按Esc键不输出便进行下次循环*/ printf("%c", c) }}07break语句break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时, 可使程序跳出switch而执行switch以后的语句如果没有break语句, 则将成为一个死循环而无法退出。当break语句用于do-while、for、while循环语句中时, 可使程序终止循环而执行循环后面的语句, 通常break语句总是与if语句联在一起。 即满足条件时便跳出循环。main(){ int i=0 char c while(1) /*设置循环*/ {c=/*变量赋初值*/while(c!=13&&c!=27) /*键盘接收字符直到按回车或Esc键*/{ c=getch() printf("%c", c) }if(c==27) break/*判断若按Esc键则退出循环*/i++ printf("The No. is %d", i)}printf("The end")}
望采纳,谢谢