综合练习二

一、看程序写结果

1.

var w:string;pd:boolean;

 wl:array[1..100] of string[20];temp:string[20];

i,j,k,l:integer;

begin

 readln(w);

 i:=1;k:=0;

 while i<=length(w) do

  if w[i] in ['a'..'z','A'..'Z'] then

   begin

    j:=1;

    repeat

     temp[j]:=upcase(w[i]);

     i:=i+1; j:=j+1

    until not (w[i] in ['a'..'z','A'..'Z']);

    temp[0]:=chr(j-1);

    pd:=true;

    for l:=k downto 1 do

    if wl[l]=temp then pd:=false;

    if pd then begin k:=k+1;wl[k]:=temp end

   end

  else

   while not(w[i] in ['a'..'z','A'..'Z']) do     
    i:=i+1;

 writeln('the number of word is:',k);

end.

输入:The book is yours, that book is his, where is my book? There it is.
输出:
 

2.

var a,b,c:array[1..201] of char;

 s1,s2:string;

 l1,l2,i,j,k,hejinwei,he,jijinwei,ji:byte;

begin

 fillchar(a,201,'0');fillchar(b,201,'0');
 fillchar(c,201,'0'); {将c数组的每个元素都置为'0'}

 readln(s1); readln(s2);

 l1:=ord(s1[0]);l2:=ord(s2[0]);

 for i:=1 to l1 do a[i]:=s1[l1-i+1];

 for i:=1 to l2 do b[i]:=s2[l2-i+1];

 for i:=1 to l2 do

 begin

  jijinwei:=0;hejinwei:=0;

  for j:=1 to l1 do

  begin

   ji:=(ord(b[i])-ord('0'))*(ord(a[j])
   -ord('0'))+jijinwei;

   jijinwei:=ji div 10;

   he:=(ord(c[j+i-1])-ord('0'))+ji mod
    10+hejinwei;

   c[j+i-1]:=chr(he mod 10+ord('0'));

   hejinwei:=he div 10

  end;

  he:=(ord(c[l1+i])-ord('0'))+hejinwei+jijinwei;

  jijinwei:=0;

  c[l1+i]:=chr(he mod 10+ord('0'));

 end;

 i:=201;

 while c[i]='0' do i:=i-1;

 for j:=i downto 1 do write(c[j]);

 writeln

end.

输入:11111111111111115 输出:
   22

二、填空题:请将每空的正确答案写在横线上

问题描述:将n个整数分成k组(k≤n,要求每组不能为空),显然这k个部分均可得到一个各自的和s1,s2,……sk,定义整数P为:

P=(S1-S2)2+(S1一S3)2+…+(S1-Sk)2+(s2-s3)2+…+(Sk-1-Sk)2

 

问题求解:求出一种分法,使P为最小(若有多种方案仅记一种〉

程序说明:

数组:a[1],a[2],...A[N]存放原数

s[1],s[2],...,s[K]存放每个部分的和

b[1],b[2],...,b[N]穷举用临时空间

d[1],d[2],...,d[N]存放最佳方案

program chu8-4;

Var i,j,n,k : integer;

a :array [1..100] of integer; b,d:array [0..100] of integer; s :array[1..30] of integer;

begin 
readln(n,k);

for I:=1 to n do read(a[I]);

for I:=0 to n do b[I]:=1;

cmin:=1000000;

while (b[0]=1) do

begin

for I:=1 to k do ① 

for I:=1 to n do 

② 

sum:=0;

for I:=1 to k-1 do

for j:= ③ 

sum:=sum+(s[I]-s[j])*(s[I]-s[j]);

if ④ then 

begin

cmin:=sum;

for I:=1 to n do d[I]:=b[I];

end;

j:=n;

while ⑤ do j:=j-1;

b[j]:=b[j]+1;

for I:=j+1 to n do ⑥ 

end;

writeln(cmin);

for I:=1 to n do write(d[I]:40);

writeln;

end.
 

三、编写程序

1.编程将自然数按下图所示的次序依次存放到一个N×N的二维数组中。下图描述了N=5时各个元素的值及其赋值次序。输出时只要输出各元素的值。  

      1→ 2 9→10 25
      ↓ ↑ ↓ ↑
      4← 3 8 11 24
      ↓ ↑ ↓ ↑
      5→ 6 → 7 12 23
      ↓ ↑
     16←15 ← 14← 13 22
     ↓ ↑
     17→18 → 19→ 20→21

2.从文件ex1.in中读入一组数据,将该组数据中的最大值输出到文件ex1.out中。(提示:注意ex1.in的格式)
 存储文件名:ex1.pas


3.在程序中设计一个函数,该函数返回布尔值判别输入的三个字符是按序或无序排列。程序中若输入abc则显示顺序排列,若输入cba则显示逆序排列,其他情况显示无序排列,当输入***程序结束。示例:
  输入:abc
  屏幕显示:shu xu
  输入:rda
  屏幕显示:nu xu
  输入:sbh
  屏幕显示:wu xu
  ……             ——可以反复地做下去
  输入:***
                

  存储文件名:ex2.pas


4.输入一个字符串,对字符串进行插入I,删除D,替换R的处理。当输入Q则退出处理,程序停止执行。具体操作如下:
  输入一个字符串s;
  输入一个操作符:
    若输入I,则必需跟着一个数d和一个字符c,表示在字符串s的第d个位置后插入一个字符c;
    若输入D,则必需跟着一个字符c,表示将字符串s中的所有字符c都删去;
    若输入R,则必需跟着两个字符c1和c2,表示将字符串s中的所有字符c1都替换为c2;
    若输入Q,则表示结束返回。
  示例:
    输入:asdfaab
    输入:I
    输入:3
    输入:q
    屏幕显示:asdqfaab
    输入:R
    输入:a
    输入:b
    屏幕显示:bsdqfbbb
    输入:I
    输入:2
    输入:b
    屏幕显示:bbsdqfbbb
    输入:D
    输入:b
    屏幕显示:sdqf
    输入:Q