和一般的int[]的全排列,同样道理的
可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。
c语言编程全排列Option Explicit
Private Sub Form_Load()
Dim i As Integer, j As Integer, k As Integer, strTemp$
For i = 1 To 3
For j = 1 To 3
For k = 1 To 3
If (i <> j And i <> k And j <> k) Then DebugPrint i & j & k
Next k
Next j
Next i
End Sub
#include <stdioh>
#include <timeh>
void init(int a[], int length);
void p(int a[], int length, int i);
void swap(int a[], int i, int j);
void print(int a[], int length);
int main() {
int i = 0, length;
clock_t start, end;
int a[10];
double t[10];
for (i = 0; i < 10; i++) {
length = i + 1;
init(a, length);
start = clock();
p(a, length, 0);
printf("\n");
end = clock();
t[i] = (double) (end - start) / CLOCKS_PER_SEC;
}
printf("分别耗时:\n");
for (i = 0; i < 10; i++) {
printf("%f\n", t[i]);
}
return 0;
}
void init(int a[], int length) {
int i = 0;
for (i = 0; i < length; i++) {
a[i] = i + 1;
}
}
void p(int a[], int length, int i) {
int j = 0;
if (i == length - 1) {
print(a, length);
return;
}
p(a, length, i + 1);
for (j = i + 1; j < length; j++) {
swap(a, i, j);
p(a, length, i + 1);
swap(a, i, j);
}
}
void swap(int a[], int i, int j) {
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
void print(int a[], int length) {
int i = 0;
for (i = 0; i < length; i++) {
printf("%d ", a[i]);
}
printf("\n");
}
给程序加点注释,让别人也稍微明白一下
呵呵,你确定自己的程序在思想上之类的没有错误么?
在perm后面的for中调用circle_的函数的时候,你传入的l总是会比i大的
这样一来在函数中m接收l,i接收i
然后再circle_中的for循环的判断条件是i-m应该是不会执行吧
至于你说的那个功能我也不是很清楚
呵呵,能帮的就只有这些了
#include<stdioh>
#include<stdlibh>
#define N 5
int a[120][N];//a[line][N]
int get_line(int n)
{
int line=n;
while(--n)
line=linen;
return line;
}
void exchange(int num)
{
int rand_N0,rand_N1,t;
rand_N0=rand()%N;
rand_N1=rand()%N;
t=a[num][rand_N0];
a[num][rand_N0]=a[num][rand_N1];
a[num][rand_N1]=t;
}
int campar(int num0,int num1)
{
int i,times=0;
for(i=0;i<N;i++)
if(a[num0][i]==a[num1][i])
times++;
return times;
}
void main()
{
int i,j,num=0,line,clash=0;
line=get_line(N);
for(i=0;i<line;i++)
for(j=0;j<N;j++)
a[i][j]=j+'a';
while(num<line){
if(clash)
clash=0;
else
{
printf("the %3d line is ",num);
for(i=0;i<N;i++)
printf(" %c ", a[num][i]);
printf("\n");
num++;
}
exchange(num);
for(i=0;i<num;i++){
if(campar(num,i)==N)
clash=1;
}
}
}
var
m,n:integer;
a:array[1100]of integer;
fg:array[1100]of boolean;
procedure print;
var
i:integer;
begin
for i:=1 to m do
write(a[i],' ');
writeln;
end;
procedure try(p:integer);
var
i:integer;
begin
if p>m then exit;
for i:=1 to n do
if not fg[i] then
begin
a[p]:=i;
fg[i]:=true;
if p=m then print
else try(p+1);
fg[i]:=false;
end;
end;
begin
fillchar(fg,sizeof(fg),0);
n:=5;
m:=5;
try(1);
end
不行的话再来找我
一、 引入:
fpc-200i386-win32
程序一:已知长方形的长、宽,求长方形的周长
program circle; 该程序的首部,program是保留字
var chang,kuan,zhouchang:real; 定义变量:设定长,宽,周长为实数类型
begin 开始语句
readln(chang); 读语句,读入长(chang)和宽(kuan)
readln(kuan);
zhouchang:=2(chang+kuan); 赋值语句,将计算结果赋给zhouchang
write(zhouchang); 写语句,将结果(zhouchang)
end 结束语句,与begin成对出现
程序二:已知长方形的长、宽,求长方形的周长,并求出长方形的面积。
rogram circle;
var chang,kuan,zhouchang,mianji:real;
begin
readln(chang);
readln(kuan);
zhouchang:=2(chang+kuan);
mianji:=changkuan;
write(zhouchang,mianji);
end
小结:一个完整的pascal程序结构
Program 程序名(程序参数表);
var
变量说明;
Begin
语句;
语句;
……
End
编译:Alt+F9
运行 Ctrl+F9
返回看结果Alt+F5
思考练习:
1、已知长方体的长、宽、高,求长方体的表面积及体积。
2、已知正方体的边长,求正方体的表面积及体积。
3、已知圆半径,求圆的周长及面积。
作业
已知圆半径,求圆的周长及面积。314若改成314159
第一句为程序首部,每个pascal程序都必须以它开头。
增加程序的可读性,用pi表示
一、常量说明
Const pi=314159
变量说明
VAR 单个变量或用逗号分开的多个变量
<变量表>:<类型>
二、标准数据类型
(一)、实型(real)
1、两种表示方法:小数表示法和指数表示法
小数表示法:125,00025,2582,2530
科学表示法:125e0,13654e+2,25e-3,
0e0,1e2
2、说明方式
const k=126
var m,n:real;
3、运算:+(加),—(减),(乘),/(除)
标准函数:
abs(绝对值),sqr(平方),sqrt(开方),
trunc(取整),round(舍入取整)
(二)、整型(integer)
1、表示方法:25,-456,0
2、说明方法:
const long=150;
wide=65;
var I,j,k:integer;
3、整型量的运算:
+(加),—(减),(乘),div(整除)
/(除)得到的值为实型,mod(取余) 4、用于整数的标准函数
abs(绝对值),sqr(平方),pred(前导)
succ(后续),
三、
读语句一:read
用于在程序执行时,从外部输入数据给变量
一般形式:read(变量表) 其中变量表是一些由逗号分开的变量
程序一、读入2个整数和1个实数,并将这三个数输出。
Program shu;
Var
x,y:integer;
z:real;
begin
read(x);
read(y);
read(z);
write(x);
write(y);
write(z);
end Program shu;
Var
x,y:integer;
z:real;
begin
read(x,y,z);
write(x,y,z);
end
可以将读入与写出语句合并成一句。
注意:从键盘上输入的数据必须与程序中设定的输入变量的类型相同。例如上题,x,y是整型,我们从键盘上输入就必须是整型数,例如:14、-6,而不能是实型数,例如:19、980;而z是实型数,输入可以是小数也可以是整数,例如:236666 ,或者是10。
读语句二:readln
在完成该语句的最后一个变量值的输入以后,将结束包括这个数据值的输入行,使下一个read语句(或readln语句)从下一个新行开始输入数据。
例:
Program shu2;
Var a,b:real;
begin
Read(a,b);
Read(c,d,e,f);
Read(g,h);
Writeln(a,b,c,d,e,f,g,h);
End Program shu2;
Var a,b:real;
begin
Readln(a,b);
Readln(c,d,e,f);
Readln(g,h);
Writeln(a,b,c,d,e,f,g,h);
End
从键盘上输入以下数据:
15 37 24
57 21 89
92 17 53
28 34 29
得到的结果:
a=15 b=37
c=24 d=57 e=21 f=89
g=92 h=17 得到的结果:
a=15 b=37
c=57 d=21 e=89 f=92
g=28 h=34
四、表达式与赋值语句
一般形式:<变量>:=<表达式>
表达式可以是简单的常数、常量、变量、函数或它们之间的算术运算、逻辑运算、关系运算等
例如:2+3x
125×10-5
写表达式时,要注意以下几点:
1、所有表达式必须以线形写出。
2、只能使用合法的标志符
3、乘号必须用符号“”明确地指出,不得省略
4、函数的自变量可以是任意表达式。
注意:赋值语句中,表达式的类型必须与左端变量的类型赋值相容。
(1)、表达式的类型与左端变量的类型相同
(2)、表达式为整型,左端变量为实型
var I,j,k:integer
k:=I/j
X:=x+1 I:=I+1
写语句一:Write语句
将计算结果通过屏幕或打字机输出显示。
例如:write(aa,bb);
一般形式:write(<输出表>:场宽:小数位数)
输出表是一些由逗号分开的输出项。
输出项可以是变量或表达式,或用引号括起来的字符串。
若为变量,则输出变量的值。
若为表达式,则先计算表达式的值,然后将值输出。
若为字符串,则输出字符串本身。
若为用符号’ x+y= ’ ,则将单引号内的值原样输出
例如:输入:x=5,y=6
write(x,y,x+y,xy)
输出结果:5,6,11,30
write(‘x=‘,x,’y=‘,y,’x+y=‘,x+y,’xy=‘,xy);
输出结果:x=5y=6x+y=11xy=30
写语句二:Writeln语句
结果将输出在不同的行上。
在印出输出表的最后一个输出项后,结束当前输出行,使得下一个write(或writeln)语句从下一个新行的开头输出。即:印出输出项后,回车换行,光标移到下一行的首位。
例如:
Writeln 可以单独使用,用于结束当前输出行,指向下一行的开始
writeln(‘x=‘,x,’y=‘,y);
Writeln(’x+y=‘,x+y,’xy=‘,xy);
例:
1、写一程序读入三角形的三个边a,b,c,计算并输出三角形的面积S。可利用下列公式计算:S= ,其中p= 。
2、输入一个三位整数,将它反向输出。例如输入127,输出应为721。
常量说明,不一定要有
三、字符型
1、表示方法: ‘A’,’B’,’C,’,…… ‘a’,’b’,’c’,…… ‘0’,’1’,’2’,’3’,…… ‘+’,’-’,’’,…… ‘’代表空格字符
2、说明方法
const black=‘’ star=‘’ var ch1,ch2:char;
3、用于字符的标准函数
ord(取序号),pred(前导),succ(后继)
chr(65)=‘A’ chr(97)=‘a’ ord(‘A’)=65 ord(‘a’)=97
四、布尔型(boolean)
1、说明
const f=false;
t=true;
var b1,b2,flag:boolean;
2、标准函数
odd(取序号)、pred(前导)、succ(后继)、
odd(false)=0 odd(true)=
pred(true)= succ(false)=
3、用于布尔量运算有布尔逻辑运算(即逻辑运算)
AND(与)OR(或) NOT(非)
B1 B2 NOT B1 B1 AND B2 B1 OR B2
FALSE FALSE
FALSE TRUE
TRUE FALSE
TRUE TRUE
4、关系运算
<(小于),<=(小于等于),=(等于)
>(大于),>=(大于等于),<>(不等于)
关系运算可以用于整型、实型、字符型、布尔类型。
结果均为布尔型
例:3<6=
3<78=
false<true=
‘a’>=‘b’=
判断(x,y)是否在第一象限
6、表达式按下列运算优先规则计算
(1)、所有括起来的子表达式必须首先计算,且子表达式必须从里到外计算。
(2)、在同一表达式中的运算符按下列次序计算:
①函数
②not
③AND,,/,DIV,MOD
④OR,+,-
⑤<,<=,=,>,>=,<>
(3)、同一个表达式中,同一优先级按从左到右注意:赋值语句中,表达式的类型必须与左端变量的类型赋值相容。
a、表达式的类型与左端变量的类型相同
b、表达式为整型,左端变量为实型
var I,j,k:integer
k:=I/j
X:=x+1 I:=I+1
Write语句
将计算结果通过屏幕或打字机输出显示。
例如:write(aa,bb);
一般形式:write(<输出表>:场宽:小数位数)
输出表是一些由逗号分开的输出项。
输出项可以是变量或表达式,或用引号括起来的字符串。
若为变量,则输出变量的值。
若为表达式,则先计算表达式的值,然后将值输出。
若为字符串,则输出字符串本身。
若为用符号’ x+y= ’ ,则将单引号内的值原样输出
例如:输入:x=5,y=6
write(x,y,x+y,xy)
输出结果:5,6,11,30
write(‘x=‘,x,’y=‘,y,’x+y=‘,x+y,’xy=‘,xy);
输出结果:x=5y=6x+y=11xy=30
1、 输入三个字符,然后按输入字符次序输出这三个字符,再输出每个字符的序号,最后按与输入字符相反的次序输出这三个字符。
2、 输入两组x,y值,由程序根据它们是否在斜线区域内,输出不同的值。若在斜线区域内,输出true,否则输出false。
三、选择结构程序设计
程序一:期末成绩,如果成绩在60分以上的为合格,60分以下的为不及格,如何表示
program pd;
var
x:real;
begin
read(x); 读入成绩
if x>=60 then write(‘pass’)
else write(‘not pass’); 用if语句进行判断,如果>=60打印“pass ” 否则打印“not pass”
End
选择结构语句一:If语句格式
IF语句格式1:IF〈条件〉THEN 〈语句1〉
ELSE 〈语句2〉
IF语句格式2:IF〈条件〉THEN 〈语句1〉
程序二:火车托运行李,要根据重量按不同的标准收费。例如不超过50kg,按每公斤035元收费。若超过50k按每公斤035元收费,其余超过部分按每公斤050远收费。现输入托运行李重量,要求计算并输出托运费。
Program compay;
var
weight,pay:real;
begin
readln(weight); 读入行李重量
if weight<=50 then pay:=weight035 判断语句
else pay:=50035+(weight-50)05;
Writeln(‘pay=‘,pay); 打印付费结果
end
注意:If语句中,如果<语句一>或者<语句二>,执行的内容无法用一个语句实现,可以使用复合语句,用begin 和end将执行的语句合并成一个复合语句。
复合语句格式:BEGIN
〈语句1〉;
〈语句2〉;
……;
END;
程序三:输入一个数字,如果该数字大于100,则先输出这个数,并将该数减去100,并将减去100后的结果输出,否则输出“no”。
Program number;
Var x,y:real;
Begin
read(x); 读入该数x
If x>100 then 对x进行判断
Begin 用begin和end将三个语句合并成一个复合语句
writeln(x);
x:=x-100;
writeln(x);
end
else writeln(“no”);
End
复合判断条件语句:当<条件>中包含的不仅只有一个语句,而是多个条件时,可以使用and\or\not复合判断条件
AND:与、和 ,条件都成立时为真
OR:或者,只要有一个条件成立时为真
NOT:非,
程序四:输入一个成绩,如果该成绩小于90并且大于等于70,则输出“ok”
程序:Program score;
var k:real;
begin
read(k);
if (k>=70) and (k<90) then write(‘ok’);
end
复合IF语句
程序五、输入某学生成绩,若成绩在85分以上,输出“A”,若成绩在60分到85分之间,包含60和85,输出“B”,若成绩低于60分,输出“C”。
该题有三重判断,如何实现?
应用复合IF语句:
read(成绩)
IF 成绩>85 then write(’A’) 第一重IF
Else if 成绩>=59 then write (‘B’) 第二重IF
Else write(‘C’);
复合IF语句格式:
IF〈条件1〉 THEN 〈语句1〉
ELSE IF〈条件2〉 THEN〈语句2〉
ELSE〈语句3〉
If语句练习题:
1、 从键盘上输入一个正整数,判断奇数、偶数。如果为奇数则输出“YES”,如果为偶数则输出“NO”。
2、 读入两个数,找出其中最大的数,并输出。
3、 输入一个数,判断该数是正数、负数还是零,为正数输出“zheng”,为负数输出“fu”,为零输出“0”。
Program circle;
Var num:integer;
Begin
Read(num);
If num>0 then writeln(‘zheng’)
Else if num<0 then writeln(‘fu’)
Else writeln(‘0’);
End
4、 对一批货物征收税收。价格在1万元以上的货物征税5%,在5000元以上,1万元以下的货物征税3%,5000元以下的货物征税2%,1000元以下的货物免税。编一程序,读入货物价格,计算并输出税金。
Program test;
Var price,tax:real;
Begin
Read(price);
If price>=10000 then tax:=price005
Else if price>=5000 then tax:=price003
Else if price>=1000
then tax:=price002
Else tax:=0;
Writeln(‘tax=’,tax);
End
5、 输入一个数,如果这个数能同时满足用3除余2,用5除余3,用7除余2的所有整数,则输出“yes”。
Program sum;
Var a:integer;
Begin
If (a mod 3=2) and (a mod 5=3) and (a mod 7=2) then write(‘yes’);
End
6、输入3个字母,按字母表顺序从小到大输出这3个字母。
7、读两个数将大数存于X,小数存于Y。
8、输入一个年份,判断是否是闰年,如果是则输出“yes”,否则输出“no”
目前公认的闰年判断算法,满足下列二者之一,即为闰年:
① 能被4整除,但不能被100整除
② 能被4整除,且能被400整除
9、输入一个加减式,根据输入的式子,判断运算符号,求出结果。例如从键盘上输入:+,5 , 3,则输出为8;例如输入:-,10 , 6,则输出为5。
10、输入一个1000以内的任意一个数,如果这个数中至少有一位数字是5,则输出“yes”,否则输出“no”。
11、输入一个三位的数,判断该数是否为水仙花数,是则输出“flower”。(水仙花数:若三位数abc,a^3+b^3+c^3=abc ,则称该数为水仙花数)
12、输入一个1000以内的数,判断该数是否为守行数(若某数的平方,其低位与该数本身相同,则称该数为守行数。例如25,252=625,62=36,平方值的低位与原数相同,25、6为守行数)。
选择结构语句二:CASE语句:是实现选择结构程序设计的另一种语句。
程序一:输入班号,输出该班学生人数。
班号: 1 2 3 4 5 6
人数: 50 52 50 50 52 55
使用IF语句:
Program number;
Var x:integer;
Begin
Read(x);
If (x=1) or (x=3) or (x=4) then write(50)
Else if x=6 then write(55)
Else write(52);
End
使用CASE语句:
Program number;
Var x:integer;
Begin
Read(x);
Case x of
1, 3, 4:write(50);
6 :write(55);
2, 5 :write(52);
end
end
CASE语句的一般形式是:
CASE <表达式> OF 表达式:必须是有序类型(整型、字符型、布尔型)
<值表1>:<语句1>; 值表1:为具体的值列表,用逗号隔开
<值表2>:<语句2>;
……
<值表n>:<语句n>
END
练习:
1、输入年、月,输出该月有几天。(每年的1、3、5、7、8、10、12,每月有31天;4、6、9、11月,每月有30天;2月闰年有29天,平年有28天。年号能被4整除,但不能被100整除,或者年号能被400整除的年份均是闰年)
2、输入两个运算量及一个运算符(+,-,,/),输出运算结果。
例如:输入 6 9 +
输出 15
3、若已知x在1到8之间,要按如下公式计算y。
y=
4、 输入实数x(已知0<=x<=10),计算y并输出。
2x2+3x+5 x<3
y= (x-3)2 3<=x<6
x>=6
用两种方法编程:
(1) 用IF语句编程;
(2) 用CASE语句编程
<循环体>
循环过程:首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值小于等于终值时,执行循环体。每次执行循环体以后,将循环变量自动加1(即后继值)赋给循环变量,然后再与终值比较,如果与(终值+1)的值相等则退出循环结束For语句,否则再次执行循环体,重复该过程直到循环变量的值与(终值+1)相等。
注意:
1、循环变量必须是有序类型的,且必须与初值与终值的类型相同,例如:整数,字符,而不能是实型。
2、循环变量的初值、终值可以是表达式。
3、循环体可以是任何单个语句或由多个语句组成的复合语句(begin……end)。
4、在循环体内不要随意改变循环变量的值,否则可能会造成死程序循环。
3、 在循环体中,对初、终值表达式值的改变不会影响循环次数及循环变量的取值。
FOR <循环变量>:=<初值> to <终值> do
<循环体>
循环过程:首先将初值赋给循环变量,然后将循环变量与终值比较,当循环变量的值大于等于终值时,执行循环体。每次执行循环体以后,将循环变量自动减1(即前导值)赋给循环变量,然后再与终值比较,如果与(终值-1)的值相等则退出循环结束For语句,否则再次执行循环体,重复该过程直到循环变量的值与(终值-1)相等。
例题二:在1——500中,找出能同时满足用3整除余2,用5整除余3,用7整除余2的所有整除,打印出来。
程序二:
program sunzi;
var I:integer; 仅需一个变量i
begin
for I:=1 to 500 do 直接利用循环变量,对其进行判断
if (I mod 3=2) and (I mod 5=3) and (I mod 7=2) then write(I);
end
例题三:例题二改进:找出满足条件的数打印出,并统计其个数,最后将总个数打印出来。
程序三:program sunzi;
var I,num:integer;
begin
num:=0; 利用变量num统计符合条件的个数,初始化num=0
for I:=1 to 500 do
if (I mod 3=2) and (I mod 5=3) and (I mod 7=2) then
begin write(I);
num:=num+1; 符合条件时,记数自动累加1
end;
writeln(num); 500次判断后将计算结果打印出来
end
多重循环概念:
如果一个循环结构的内部(循环体)又包括一个循环结构,就称为多重循环结构。
注意:多重循环的嵌套次数可以是任意的。可以按照嵌套层次数,分别叫做二重循环、三重循环等。处于内部的循环叫做内循环,处于外部的循环叫做外循环。
练习:
1、打印如下图形:
(1) (2) (3) (4) (5)
(6) (7) (8) (9) (10)
2、打印出如下图形:
1
12
123
1234
12345 1
2 2 2
3 3 3 3 3
4 4 4 4 4 4 4 1
2 3 4
5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23 24 25
A
AB
ABC
ABCD
ABCDE A
A B
A B C
A B C D
……
A B C …… Z 1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
3、打印杨辉三角形
一、WHILE循环
对于for循环有时也称为计数循环,当循环次数未知,只能根据某一条件来决定是否进行循环时,用while 语句或repeat语句实现循环要更方便。
while语句的形式为:
while <布尔表达式> do <语句>;
其意义为:当布尔表达式的值为true时,执行do后面的语句。
while语句的执行过程为:
①判断布尔表达式的值,如果其值为真,执行步骤2,否则执行步骤4;
②执行循环体语句(do后面的语句);
③返回步骤1;
④结束循环,执行while的下一个语句。
说明:这里while和do为保留字,while语句的特点是先判断,后执行。 当布尔表达式成立时,重复执行do后面的语句(循环体)。
例1 、求恰好使s=1+1/2+1/3+…+1/n的值大于10时n的值。
分析:“恰好使s的值大于10”意思是当表达式s的前n-1项的和小于或等于10,而加上了第n项后s的值大于10。从数学角度,我们很难计算这个n的值。故从第一项开始,当s的值小于或等于10时,就继续将下一项值累加起来。当s的值超过10时,最后一项的项数即为要求的n。
程序如下:
var
s : real;
n : integer;{n表示项数}
begin
s:=00;n:=0;
while s<=10 do{当s的值还未超过10时}
begin
n:=n+1;{项数加1}
s:=s+1/n;{将下一项值累加到s}
end;
writlen('n=',n);{输出结果}
end
例2、求两个正整数m和n的最大公约数。
分析:求两个正整数的最大公约数采用的辗转相除法求解。以下是辗转的算法:
分别用m,n,r表示被除数、除数、余数。
①求m/n的余数r
②若r=0,则n为最大公约数若r≠0,执行第③步
③将n的值放在m中,将r的值放在n中
④返回重新执行第①步。
程序如下:
program ex4_4;
var m,n,a,b,r:integer;
begin
write('Input m,n:');
readln(m,n);
a:=m;b:=n;r:=a mod b;
while r<>0 do
begin
a:=b;b:=r;
r:=a mod b;
end;
writeln('The greatest common divide is:',b:8);
end
二、直到循环(REPEAT-until语句)
用while语句可以实现“当型循环”,用repeat-until 语句可以实现“直到型循环”。repeat-until语句的含义是:“重复执行循环,直到指定的条件为真时为止”。
直到循环语句的一般形式:
Repeat
<语句1>;
:
<语句n>;
until <布尔表达式>;
其中Repeat、until是Pascal保留字,repeat与until之间的所有语句称为循环体。
说明:
①repeat语句的特点是:先执行循环,后判断结束条件,因而至少要执行一次循环体。
②repeat-until是一个整体,它是一个(构造型)语句,不要误认为repeat是一个语句,until是另一个语句。
③repeat语句在布尔表达式的值为真时不再执行循环体,且循环体可以是若干个语句,不需用begin和end把它们包起来, repeat 和until已经起了begin和end的作用。while循环和repeat循环是可以相互转化的。
对于例2中求两个正整数的最大公约数,程序可用repeat-until循环实现如下:
var
m,n,a,b,r : integer;
begin
write('Input m,n=');
readln(m,n);
a:=m;b:=n;
repeat
r:=a mod b;
a:=b;b:=r;
until r=0;
writeln('The greatest common divide is',a);
end
以上我们已介绍了三种循环语句。一般说来,用for 循环比较简明,只要能用for循环,就尽量作用for循环。只在无法使用for循环时才用while循环和repeat-until循环, 而且 while 循环和repeat-until循环是可以互相替代的。for 循环在大多数场合也能用whiel和repeat-until循环来代替。
一般for循环用于有确定次数循环,而while和repeat-until循环用于未确定循环次数的循环。
当一个循环的循环体中又包含循环结构程序时,我们就称之为循环嵌套。
三、循环结构程序设计
例3 求1!+2!+…+10!的值。
分析:这个问题是求10自然数的阶乘之和,可以用for 循环来实现。程序结构如下:
for n:=1 to 10 do
begin
①N!的值àt
②累加N!的值t
end
显然,通过10次的循环可求出1!,2!…,10!,并同时累加起来, 可求得S的值。而求T=N!,又可以用一个for循环来实现:
t=1;
for j:=1 to n do
t:=tj;
因此,整个程序为:
program ex4_5;
var t,s:real;
i,j,n:integer;
begin
S:=0;
for n:=1 to 10 do
begin
t:=1;
for j:=1 to n do
t:=tj;
S:=S+t;
end;
writeln(‘s=’,s:0:0);
end
以上的程序是一个二重的for循环嵌套。这是比较好想的方法,但实际上对于求n!,我们可以根据求出的(n-1)!乘上n即可得到,而无需重新从1再累乘到n。
程序可改为:
program ex4_5;
var t,s:real;
i,j,n:integer;
begin
S:=0;t:=1;
for n:=1 to 10 do
begin
t:=tn;
S:=S+t;
end;
writeln(‘s=’,s:0:0);
end
显然第二个程序的效率要比第一个高得多。第一程序要进行1+2+…+10=55次循环,而第二程序进行10次循环。如题目中求的是1!+2!+…+1000!,则两个程序的效率区别更明显。
以上就是关于C语言编程,输入10个字符char a[10],输出这十个字符的全排列全部的内容,包括:C语言编程,输入10个字符char a[10],输出这十个字符的全排列、一个数组中有若干元素,用VB如何编程实现全排列、用请编写递归函数,输出1,2,3,….n的全排列(n小于10),并观察n逐步增大时程序的运行时间。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)