Advertisement
Guest User

control

a guest
May 28th, 2014
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 4.61 KB | None | 0 0
  1. open System
  2. open FsUnit
  3. open NUnit.Framework
  4.  
  5.  
  6. module aln =
  7.     //Описание типов
  8.     type LineElement =
  9.         |Word of string
  10.         |Space of int
  11.  
  12.     type NewLineElement = Line of (LineElement list)*int*int
  13.     //Функция рисующая n пробелов
  14.     let nspace n =
  15.         let rec nspace' n str =
  16.            match n with
  17.            |0->str
  18.            |_->nspace' (n-1) (str+" ")
  19.         nspace' n ""
  20.    //Функция делящая слова на отдельные строчки и вставляющая по одному пробелу между словами
  21.    let divide list num =
  22.        let rec divide' list num acc list' list'' numwd =
  23.             match list with
  24.                |hd::tl ->
  25.                    match hd with
  26.                        |Word a when (list''=[]) -> divide' tl num (String.length a) (list') ([Word(a)]) (numwd+1)
  27.                        |Word a when ((acc+String.length a+1<=num)) -> divide' tl num (acc+String.length a+1) (list') (list''@[Space(1)]@[Word(a)]) (numwd+1)
  28.                        |Word a when ((acc+String.length a+1)>num)-> divide' (hd::tl) num (0) (list'@ [Line(list'', acc, numwd)]) ([]) (0)
  29.                |[]->list'@[Line(list'',acc, numwd)]
  30.         divide' list num 0 [] [] 0
  31.    //Функции выравнивания по различным краям
  32.    let rec alignleft list num =
  33.        match list with
  34.            |hd::tl->
  35.                match hd with
  36.                    |Line(list',a, numwd)->[Line(list'@[Space(num-a)], a, numwd)] @ alignleft tl num
  37.            |[]->[]
  38.  
  39.    let rec aligncenter list num =
  40.        match list with
  41.            |hd::tl->
  42.                match hd with
  43.                    |Line(list',a, numwd)->[Line([Space((num-a)%2 + (num-a)/2)]@list'@[Space((num-a)/2)], a, numwd)] @ aligncenter tl num
  44.            |[]->[]
  45.  
  46.    let rec alignright list num =
  47.        match list with
  48.            |Line(list',a, numwd)::tl->[Line([Space(num-a)]@list', a, numwd)] @ alignright tl num
  49.            |[]->[]
  50.    //Функция вставляющая нужное количество пробелов при выравнивании по ширине
  51.    let newline list numwd numlet num =
  52.        let rec newline' list numwd numlet num listnak=
  53.            match list with
  54.            |(Space k)::tl-> newline' tl (numwd-1) numlet num (Space (k+int(floor(float(num-numlet)/float(numwd-1))))::listnak)
  55.           |(Word k)::tl -> newline' tl numwd numlet num (Word k::listnak)
  56.            |[]->listnak
  57.         Line(newline' list numwd numlet num [], numlet, numwd)
  58.  
  59.    //функция выравнивания по ширине
  60.    let rec alignwidth list num =
  61.          match list with
  62.            |Line(list',a, numwd)::tl->(newline list' numwd a num)::(alignwidth tl num)
  63.            |[]->[]
  64.  
  65.    //Функция пещатающая линию
  66.    let rec printline line str=
  67.        match line with
  68.            |Space(k)::tl-> printline tl (str+nspace(k))
  69.            |Word(k)::tl->  printline tl (str+k)
  70.            |[]->printfn "%A" str
  71.    //Функция печатающая текст
  72.    let rec printtext list =
  73.        match list with
  74.            |Line(list', a, b)::tl->printline list' ""; printtext tl
  75.            |[]->printfn  "";
  76.  
  77. [<TestFixture>]
  78. module test =
  79.    [<Test>]
  80.    let ``Test`` () =
  81.        let src = [aln.Word("jgxzczx") ; aln.Word ("svyaza"); aln.Word ("korova"); aln.Word ("at"); aln.Word("let"); aln.Word("kok"); aln.Word("s"); aln.Word("ere"); aln.Word("oblom"); aln.Word("Kirovreporting")]                
  82.        let temp = aln.divide src 20
  83.        let out = aln.alignwidth temp
  84.        out |> should equal [aln.Line ([aln.Word "svyaza"; aln.Space 7; aln.Word "jgxzczx"],14,2);
  85.                                  aln.Line([aln.Word "s"; aln.Space 2; aln.Word "kok"; aln.Space 1; aln.Word "let"; aln.Space 1; aln.Word "at"; aln.Space 1; aln.Word "korova"],19,5);
  86.                                  aln.Line ([aln.Word "oblom"; aln.Space 12; aln.Word "ere"],9,2);
  87.                                  aln.Line ([aln.Word "Kirovreporting"],14,1)]
  88.  
  89.  
  90.    [<EntryPoint>]
  91.    let main argv =
  92.    
  93.        let list = [aln.Word("jgxzczx") ; aln.Word ("svyaza"); aln.Word ("korova"); aln.Word ("at"); aln.Word("let"); aln.Word("kok"); aln.Word("s"); aln.Word("ere"); aln.Word("oblom"); aln.Word("Kirovreporting")]                
  94.  
  95.        let sc = aln.divide list 20
  96.  
  97.        let m = aln.alignright sc 20
  98.  
  99.        let r = aln.printtext m
  100.        printfn "%A" argv
  101.        0 // возвращение целочисленного кода выхода
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement