|
第一题:下列哪些常量是对的,哪些是错误的,错在哪?
Const
a=30;
b=a;
b=a+1;
c=true and false
d=2,3
f,g=a;
解:1.常量定义不可以出现字母的赋值,如:B=a;B=a+1;
2.定义的数值只可以唯一。如 D=2,3则为非法。
3.常量只可以一个一个定义。如F,g=3为非法,更不用说 F,g=a.
第二题:下面的表达式,哪些是正确的,哪些是错误的;正确的请求出表达式的值,错误的指出其错误。
(其中L为整型变量,R为实型变量)
(1)round(L) and round(L+1)
(2)round(L)〈round(L+1)
(3)odd(L) or odd(L+1)
(4)round(L/r) mod 5
解:1.大家知道round()是取四舍五入的标准函数.odd()是判断奇偶数的函数。
2.and or not 只能连接布尔型常量true或false.并且得到布尔型常量。
而比较符如>,<,<>或odd()函数等也可以得到布尔型常量.
所以:1。错误
2。true
3。true
4。小于5大于等于0的整数
第三题:将下列写成pascal语言的表达式。
(1) Ma+b
(2)tg2(x/2)/(a-x)
a+3
(3) -------------
4/(b+1)+c+d
解:这一题很简单,只要知道括号的运用一般就可以迎刃而解,并且要知道pascal中没有直接的次方函数。正切的函数为tan(),其它三角函数可以通过正切来转化。如sin,cos,ctg等。
1。S:=1;for i:=1 to (a+b) do S:=S*M;M:=S;
2。tan(x/2)*tan(x/2)/(a-x)
3。(a+3)/((4/b+1)+c+d)
第四题:完善下列程序:
问题:给出半径R=100,高H=30,求圆周长、圆面积、圆柱全面积。
源程序:
program lx1(input,output);
var
(1):real;
begin
len:=2*pi*r;
s:=(2);
qs:=len*h+2*s;
writeln('len=',len,'s=',sm,'qs=',qs);
end.
解:我们可以看到变量pi,r,s,qs,len,h均未定义。则(1)为pi,r,s,qs,len,h
由圆面积公式可以很容易得到(2):pi*r*r
注:这一题题目有错,pi,r,h变量未定义。同学们可以自行加上,但不可以不加。
如在begin下加
pi:=3.1415926;
r:=100;
h:=30;
第五题:编写一程序,当程序执行时,输入以秒为单位的时间,输出形式为:“小时:分:秒”
解:这一题用到两个标准函数:mod和div,mod指取余,div指取整商。
用puts表输入,用hours表小时,用minutes表分钟,用seconds表秒。
程序如下:
program name;
var puts,hours,minutes,seconds:integer;
begin
read(puts);
hours:=puts mod 3600;
puts:=puts div 3600;
minutes:=puts mod 60;
seconds:=puts div 60;
writeln(hours,':',minutes,':',seconds)
end.
同学们可以看到puts是输入变量,也是临时变量,变了两次值,仔细想想是如何变化的。
第六题:编写一程序,输入一个三位数的正整数,输出时反向输出。如:输入456,输出654。
解:这一题如果学了数组很简单,没有的话就要用mod和div函数,请同学们在理解上一题的
基础上看下面的程序。
program name;
var three:integer;
begin
read(three);
for i:=1 to 3 do
begin
write(three mod 10);
three:=three div 10;
end;
end.
本程序用到一个for循环,指循环执行三次。同学们想一想最后three的值是什么?对了!是0!
第七题:编写一个程序,输入两个实数a,b,求a,b的乘积。(尤其当a,b两数比较大时,看一下输出结果。)
解:这一题主要是范围问题。
program name;
var a,b:real;
begin
read(a,b);
write(a*b);
end.
虽然实数范围很大可达到10-38--10+38之间,但更大则会:Floating point overflow.
第八题:下面程序或程序段的执行结果是什么?
(1)program sumofpower(input,output);
const n=4;
var
X,power,I,sum:integer;
begin
for X:=1 to n do
begin
power:=1;
for I :=1 to x do
Power:=power*x;
sum:=sum+power;
end;
writeln(sum);
end.
(2)sum:=0.0
for counter:=7 downto 4 do
case counter of
1,4,7:sum:=sum+1;
2,3,6:;
0,5:sum:sum+2;
end;
writeln('sum=',sum:5:2);
解:首先,pascal语言的大小写一样。而且当一个数值变量规定以后,初始值为0,这就是为何程序中sum未赋值就用。(1)求出x的x次方,再累加.(2)题目没有写完,同学们自己加上.(2)的case语句的形式一定要住,在这一点上不要眼高手低.注意只有end没有begin,且要注意':'的位置.case语句是指选择语句.即表达式的值若和冒号前相同则运行冒号后的语句.注意downto与to的不同.
(1)288
(2)sum=4.00
第九题:编写一个程序,输出三个整数中最大的数.
解:虽然此题可以用三个变量来比较并交换,但由于只需输出一个数,于是只要用一个动态变量来储存最大数即可.
程序如下:
program name;
var i,max,temp:integer;
begin
max:=-maxint;
for i:=1 to 3 do
begin
read(temp);
if temp>max then max:=temp;
end;
end.
注:maxint为保留字,是最小整数,同学们可以试一试它是多少.
第十题:编写一个程序,输入三个数,按从大到小的顺序打印出来。
解:由于题目指定三个数,所以题目就变得很简单。只要设三个变量就可以了,然后就比较大小。这个很简单,相信同学们一定会。同学们在学习的时候注意体会write()语句的表达方式。有时候' ' 会很好用。
程序如下:
program name;
var i,max,a,b,c:integer;
begin
read(a,b,c);
for i:=1 to 3 do
begin
max:=-maxint;
if a>=max then max:=a;
if b>=max then max:=b;
if c>=max then max:=c;
write(max,' ');
if a=max then a:=-maxint;
if b=max then b:=-maxint;
if c=max then c:=-maxint;
end;
end.
同学们可以想一想,如果没有指明是几个数,不用数组怎么做?
第十一题:输入一个不多于5位数的下整数,求出它是几位数,并打印出每位的数字.
解:同学很容易就能想到要用mod和div函数,可见这两个函数运用率还是很高的,学到以后就知道,这一题非常重要,同学们一定要好好理解,并学会触类旁通.
程序如下:
program name;
var readin,wei,i,j:integer;
begin
readln(readin);
i:=10000;
wei:=5;
while (readin div i)=0 do
begin
wei:=wei-1;
i:=round(i/10);
end;
writeln(wei);
for j:=1 to wei do
begin
write(readin div i);
readin:=readin mod i;
i:=round(i/10)
end.
同学注意我用了一个round()函数.想想如果不要会出现什么结果?
第十二题:五分币和二分币共有M枚,总金额为N分,写一个程序计算五分币和二分币各有多少枚?将结果输出。
解:这一题不要想单纯用计算机语言来描述,不可能。这是一题解方程题。
{ x+y=M { x=(N-2M)/3
| => |
{ 5x+2y=N { y=M-x
程序如下:
program name;
var N,M,wu:integer;
begin
read(M,N);
wu:=(N-2M)/3;
write(wu,' ',M-wu)
end.
第十三题:写一个程序找出3到1000之间的全部质数。
解质数的方法有很多种,在这里介绍一种最简单也是繁的。注意这一题中判断是否为质数用了哪几个函数。
程序如下:
program name;
var i,j:integer;
judge:boolean;
begin
for i:=3 to 1000 do
begin
judge:=true;
for j:=1 to trunc(sqrt(i)) do
if (i mod j)=0 then judge:=false;
if judge then write(i,' ')
end;
end.
这里引入了一个判断变量judge来测试i是否为质数。sqrt()函数为求完全平方数的标准函数,trunc()函数是取整函数。为什么说为种算法繁呢?同学可以想一想如果将1000改为10000,100000或者更多,会出现什么情况?
第十四题(征求更优解,不允许带数组入内):写一个程序,模拟袖珍计算器的加、减、乘、除四则运算。该程序能读入数据;并按算式计算出结果。如当你在终端键盘上打入:
3.5+0.7*10=
后,程序将显示出结果10.5,且把它输出。
解:这一题有一定的难度。猛一看不知如何下手。因为计算必须得遵循先乘除后加减的法则。这给编程带来一定的难度。但经过分析后发现,任一个算式都是由数字和运算符号交替产生的。且结束控制符号可以让"="来代替,所以我们可以通过对运算符号的判断来决定先过行哪一个运算。不知道是我想错了还是怎么,这一题的难度并不适合初学者,同学们如果可以理解就好,如果不能够理解,以后练习多了慢慢就会知道。这里牵涉到一个将字符类型的数转变为实数的过程.注意我是怎么转化的.当然,如果同学们有更简单的方法,可以告诉我.
程序如下:
program name;
var i,j:integer;
total,first,second1,second2:real;
fu,fu2:char;
function reads:real;
var i,n:integer;
j,k:real;
begin
read(fu2);while fu2=' ' do read(fu2);
j:=0;
while (fu2<>'+') and (fu2<>'-') and (fu2<>'*') and (fu2<>'/') and (fu2<>'=')do
begin
if fu2<>'.' then
begin
j:=10*j+ord(fu2)-ord('0');
read(fu2)
end
else if fu2='.' then
begin
i:=0;
read(fu2);
repeat
i:=i+1;
k:=1;
for n:=1 to i do
begin
k:=k/10;
end;
j:=j+(ord(fu2)-ord('0'))*k;
read(fu2);
until (fu2='+') or (fu2='-') or (fu2='*') or (fu2='/') or (fu2='=');
end;
end;
reads:=j;
end;
begin
first:=reads;
fu:=fu2;
while fu<>'=' do
begin
if fu='*' then begin second1:=reads;first:=first*second1;end
else if fu='/' then begin second1:=reads;first:=first/second1;end
else if fu='+' then
begin
second1:=reads;
while (fu2='*') or (fu2='/') do
begin
if fu2='*' then begin second2:=reads;second1:=second1*second2;end;
if fu2='/' then begin second2:=reads;second1:=second1/second2;end;
end;
first:=first+second1;
end
else if fu='-' then
begin
second1:=reads;
while (fu2='*') or (fu2='/') do
begin
if fu2='*' then begin second2:=reads;second1:=second1*second2;end;
if fu2='/' then begin second2:=reads;second1:=second1/second2;end;
end;
first:=first-second1;
end;
fu:=fu2;
end;
write(first:8:2);
end.
因为它没有数组,所以理解起来很有困难。正因为如此,同学更要好好理解,为以后用数组来做打好基础。
第十五题:写一个程序找出x2+2=y3(1<=x,y<=100)所有整数解。
解:由于x,y的范围不大,这一题明显用穷举法,实际上也没有更好的方法。
程序如下:
program name;
var x,y:integer;
begin
for x:=1 to 100 do
for y:=1 to 100 do
if x*x+2=y*y*y then
writeln(x,' ',y);
end.
第十六题:写一个程序,判断一个数是否为质数。
解:这一题的解法实际上在第十三题已经得到体现。没有什么困难。
程序如下:
program name;
var reads,i,j:integer;
begin
j:=0;
read(reads);
for i:=2 to trunc(sqrt(reads)) do
if (reads mod i)=0 then j:=-1;
if j=0 then write('the number you put if true!')
else write('false!');
end.
注意:进行循环时是从何处开始的。
第十八题:设三段线段长度分别为a、b、c,且a>=b>=c>0,写一个程序,判别给出a、b、c能否组成一个
三角型?
解:只要了解三角型的判别方法,这一题并不难,多用几个if语句而已。
程序如下:
program name;
var a,b,c:integer;
begin
read(a,b,c);
if (a+b>c) and (b+c>a) and (c+a>b)
then writeln('That''s possible!')
else writeln('That''s impossible!')
end.
这题唯一要注意的就是我在引用" ' "的时候是如何引用的.
第十七题:完善下列程序:
(1)计算
{ln|x|+ln|5-x3| x<-3
| ______ _
y=||x+3 -3<=x<3|5
| _
|