2013年11月8日金曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の6章(条件分岐)、6.5(練習問題)、9をDartで解いてみる。

その他参考書籍

6.5(練習問題)、9。

コード

sample.dart

import 'dart:html';

void main(){
  var run = querySelector('#run'),
      clear = querySelector('#clear'),
      pre0 = querySelector('#pre0');
  run.onClick.listen((MouseEvent event){
    var result = window.navigator.userAgent + '\n';
    result += 'Comparison\n';
    result += units.map((e) => e + ' ').join();
    result += '\n';
    try{
      for(double t = 300.00; t >= -260; t -= 10.00){
        result +=
            formatNum2Str(temperatures(t, 'Celsius', units[0]), 7, 2) + ' ' +
            formatNum2Str(temperatures(t, 'Celsius', units[1]), 10, 2) + ' ' +
            formatNum2Str(temperatures(t, 'Celsius', units[2]), 6, 2) + ' ' +
            formatNum2Str(temperatures(t, 'Celsius', units[3]), 7, 2) + ' ' +
            formatNum2Str(temperatures(t, 'Celsius', units[4]), 7, 2) + ' ' +
            formatNum2Str(temperatures(t, 'Celsius', units[5]), 6, 2) + ' ' +
            formatNum2Str(temperatures(t, 'Celsius', units[6]), 7, 2) + ' ' +
            formatNum2Str(temperatures(t, 'Celsius', units[7]), 8, 2) + '\n';
      }
    } catch (e){
      result += e;
    } finally {
      pre0.text = result;
    }
  });
  clear.onClick.listen((MouseEvent event){
    pre0.text = '';
  });
}

double temperatures(double t, String source, String target){
  return fromCelsius(toCelsius(t, source), target);
}

String formatNum2Str(double a, int width, int n){
  var s = a.toStringAsFixed(n),
      spaces = width - s.length;
  return replicate(spaces, ' ') + s;
}

double toCelsius(double t, String source){
  switch(source){
    case 'Kelvin':
      return t - 273.15;
    case 'Celsius':
      return t;
    case 'Fahrenheit':
      return (t - 32) * 5 / 9;
    case 'Rankine':
      return (t - 492.67) * 5 / 9;
    case 'Delisle':
      return 100 - t * 2 / 3;
    case 'Newton':
      return 100 / 33;
    case 'Reasumur':
      return t * 5 / 4;
    case 'Romer':
      return (t - 7.5) * 40 / 21;
    default:
      throw '${source}は摂氏に変換できない。';
  }
}

double fromCelsius(double t, String target){
  switch(target){
    case 'Kelvin':
      return t + 273.15;
    case 'Celsius':
      return t;
    case 'Fahrenheit':
      return t * 9 / 5 + 32;
    case 'Rankine':
      return (t + 272.15) * 9 / 5;
    case 'Delisle':
      return (100 - t) * 3 / 2;
    case 'Newton':
      return t * 33 / 100;
    case 'Reaumur':
      return t * 4 / 5;
    case 'Romer':
      return t * 21 / 40 + 7.5;
    default:
      throw '摂氏から${target}に変換できない。';
  }
}

List<String> units = ['Celsius', 'Fahrenheit', 'Kelvin', 'Rankine', 'Delisle',
                      'Newton', 'Reaumur', 'Romer'];

String replicate(int n, String s){
  return new List.filled(n, s).join();
}















						

0 コメント:

コメントを投稿