① 求C語言練習題答案,這幾個題我不確定,拜託明白的幫忙看下!急用的,最好能解釋一下
9. 設int a[10];則對a數組元素的錯誤引用是( )
A.a[5] B.*(a+1) C.a[10-10] D.a(5)
D是錯誤的,因為a是數組,不是函數。
11.設double * p[6];則( C 這個沒法解釋 )
A.p是指向double型變數的指針
B.p是double型數組
C.p是指針數組,其元素是指向double型變數的指針
D.p是數組指針,指向double型數組
16.設有定義
struct rol{
long x;
float y;
} time;
*timep=&time;
問題呢?
18.C語言中,系統自動打開的文件是( D 輸入輸出設備文件,就是 stdin/stdout/stderr三個文件 )
A.二進制文件 B.隨機文件
C.非緩沖文件 D.設備文件
20.執行下列程序
#include "stdio. h"
min ()
{printf("%d\n",NULL);}
後輸出的結果是( B 一般是0,但是你寫程序的時候不要直接寫零 )
A.-1 B.0 C.1 D.2
21.C語言程序編譯時,程序中的注釋部分( D 這個沒法解釋,注釋在編譯預處理階段就被刪除了 )。
A.參加編譯,並會出現在目標程序中
B.參加編譯,但不會出現在目標程序中
C.不參加編譯,但會出現在目標程序中
D.不參加編譯,也不會出現在目標程序中
26.下列語句定義p為指向float類型變數d的指針,其中哪一個是正確的( B 沒法解釋,根據C語法得出 )。
A. float d,*p=d; B. float d,*p=&d;
C. float d,p=d; D. float *p=&d,d;
27.執行語句「for(i=0;i<10;++i,++a)scanf(〃%d〃,a);」試圖為int類型數組a〔10〕輸入數據,是錯誤的,錯誤的原因是( B )。
A.指針變數不能做自增運算 B.數組首地址不可改變
C.++i應寫作i++ D.++a應寫作a++
28.函數調用語句fun((((1,2),3),4));中參數的個數是( A 只有一個,(((1,2),3),4) 也就是4作為參數被傳遞給函數fun )。
A.1 B.2 C.3 D.4
10.設 int a [2][4], (*p)[4]=a;用指針變數p表示數組元素a[1][2]為___p[1][2]________。
12.計算機演算法通常採用以下三種方法表示:____這個,我不知道_____、___________、__________。
17.在執行輸入語句scanf(「a=%d?b=%d?c=%d」,a,b,c);時,用戶應相應的在屏幕上輸入_______a=8?b=7?c=5_______________________,才能使變數a,b,c的值分別為8,7,5。
能回答的盡量幫忙啊
② pascal 由鍵盤上輸入任意n個一位數數輸出它的全排列
一、 引入:
fpc-2.0.0.i386-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:=chang*kuan;
write(zhouchang,mianji);
end.
小結:一個完整的pascal程序結構
Program 程序名(程序參數表);
var
變數說明;
Begin
語句;
語句;
……
End.
編譯:Alt+F9
運行 Ctrl+F9
返回看結果Alt+F5
思考練習:
1、已知長方體的長、寬、高,求長方體的表面積及體積。
2、已知正方體的邊長,求正方體的表面積及體積。
3、已知圓半徑,求圓的周長及面積。
作業
已知圓半徑,求圓的周長及面積。3.14若改成3.14159
第一句為程序首部,每個pascal程序都必須以它開頭。
增加程序的可讀性,用pi表示
一、常量說明
Const pi=3.14159
變數說明
VAR 單個變數或用逗號分開的多個變數
<變數表>:<類型>
二、標准數據類型
(一)、實型(real)
1、兩種表示方法:小數表示法和指數表示法
小數表示法:1.25,0.0025,258.2,253.0
科學表示法:1.25e0,1.3654e+2,2.5e-3,
0e0,1e2
2、說明方式
const k=1.26
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,而不能是實型數,例如:1.9、98.0;而z是實型數,輸入可以是小數也可以是整數,例如:2.36666 ,或者是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.
從鍵盤上輸入以下數據:
1.5 3.7 2.4
5.7 2.1 8.9
9.2 1.7 5.3
2.8 3.4 2.9
得到的結果:
a=1.5 b=3.7
c=2.4 d=5.7 e=2.1 f=8.9
g=9.2 h=1.7 得到的結果:
a=1.5 b=3.7
c=5.7 d=2.1 e=8.9 f=9.2
g=2.8 h=3.4
四、表達式與賦值語句
一般形式:<變數>:=<表達式>
表達式可以是簡單的常數、常量、變數、函數或它們之間的算術運算、邏輯運算、關系運算等
例如:2+3x
1.25×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,x*y)
輸出結果:5,6,11,30
write(『x=『,x,』y=『,y,』x+y=『,x+y,』x*y=『,x*y);
輸出結果:x=5y=6x+y=11x*y=30
寫語句二:Writeln語句
結果將輸出在不同的行上。
在印出輸出表的最後一個輸出項後,結束當前輸出行,使得下一個write(或writeln)語句從下一個新行的開頭輸出。即:印出輸出項後,回車換行,游標移到下一行的首位。
例如:
Writeln 可以單獨使用,用於結束當前輸出行,指向下一行的開始
writeln(『x=『,x,』y=『,y);
Writeln(』x+y=『,x+y,』x*y=『,x*y);
例:
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<7.8=
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,x*y)
輸出結果:5,6,11,30
write(『x=『,x,』y=『,y,』x+y=『,x+y,』x*y=『,x*y);
輸出結果:x=5y=6x+y=11x*y=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,按每公斤0.35元收費。若超過50k按每公斤0.35元收費,其餘超過部分按每公斤0.50遠收費。現輸入托運行李重量,要求計算並輸出托運費。
Program compay;
var
weight,pay:real;
begin
readln(weight); 讀入行李重量
if weight<=50 then pay:=weight*0.35 判斷語句
else pay:=50*0.35+(weight-50)*0.5;
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:=price*0.05
Else if price>=5000 then tax:=price*0.03
Else if price>=1000
then tax:=price*0.02
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:=0.0;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:=t*j;
因此,整個程序為:
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:=t*j;
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:=t*n;
S:=S+t;
end;
writeln(『s=』,s:0:0);
end.
顯然第二個程序的效率要比第一個高得多。第一程序要進行1+2+…+10=55次循環,而第二程序進行10次循環。如題目中求的是1!+2!+…+1000!,則兩個程序的效率區別更明顯。
③ 按要求設計遞歸演算法。只需寫出偽代碼或畫流程圖,不需語言實現,但演算法必須完整清晰。
arrs[100000][100000];
a[100000];
f(i,){
if(i==4){
arrs[]=a;
return;
}
a[i]=;
f(i+1,+3);
f(i+1,+4);
}
f(0,0)
arrs就是結果,並且是排了序的。
④ 用C語言:根據給定的演算法,判斷輸入的密碼是否正確
#include<stdio.h>
void main()
{
int n,password=123456,i=1;
while(1)
{
printf("輸入密碼:");
scanf("%d",&n);
if(n==password)
printf("Welcome to use the software\n");
else
{
if(i<3)
printf("剩餘的可輸入密碼的次數為:%d\n",3-i);
else
printf("Password error ! You can not use the software\n");
i++;
}
if(i>=4||n==password)break;
}
}
這個是不需要用return的,簡明一點,初學的應該會