ka1

面積が3000000平方キロメートル以上で、地域がヨーロッパの国名は?

 

Picked up _JAVA_OPTIONS: -XX:+UseSerialGC
<文 主辞="4">
<文節 id="0" 係り先="1">
<形態素 表層="面積" 品詞="名詞,一般,*,*" 活用形="*" 活用型="*" 原形="面積" 読み="メンセキ" 発音="メンセキ" />
<形態素 表層="が" 品詞="助詞,格助詞,一般,*" 活用形="*" 活用型="*" 原形="が" 読み="ガ" 発音="ガ" />
</文節>
<文節 id="1" 係り先="4" 係り元="0">
<形態素 表層="3000000" 品詞="名詞,数,*,*" 活用形="*" 活用型="*" 原形="*" 読み="" 発音="" />
<形態素 表層="平方キロメートル" 品詞="名詞,接尾,助数詞,*" 活用形="*" 活用型="*" 原形="平方キロメートル" 読み="ヘイホウキロメートル" 発音="ヘイホーキロメートル" />
<形態素 表層="以上" 品詞="名詞,非自立,副詞可能,*" 活用形="*" 活用型="*" 原形="以上" 読み="イジョウ" 発音="イジョー" />
<形態素 表層="で" 品詞="助詞,格助詞,一般,*" 活用形="*" 活用型="*" 原形="で" 読み="デ" 発音="デ" />
<形態素 表層="、" 品詞="記号,読点,*,*" 活用形="*" 活用型="*" 原形="、" 読み="、" 発音="、" />
</文節>
<文節 id="2" 係り先="4">
<形態素 表層="地域" 品詞="名詞,一般,*,*" 活用形="*" 活用型="*" 原形="地域" 読み="チイキ" 発音="チイキ" />
<形態素 表層="が" 品詞="助詞,格助詞,一般,*" 活用形="*" 活用型="*" 原形="が" 読み="ガ" 発音="ガ" />
</文節>
<文節 id="3" 係り先="4">
<形態素 表層="ヨーロッパ" 品詞="名詞,固有名詞,地域,一般" 活用形="*" 活用型="*" 原形="ヨーロッパ" 読み="ヨーロッパ" 発音="ヨーロッパ" />
<形態素 表層="の" 品詞="助詞,連体化,*,*" 活用形="*" 活用型="*" 原形="の" 読み="ノ" 発音="ノ" />
</文節>
<文節 id="4" 係り先="-1" 係り元="1,2,3">
<形態素 表層="国名" 品詞="名詞,一般,*,*" 活用形="*" 活用型="*" 原形="国名" 読み="コクメイ" 発音="コクメイ" />
<形態素 表層="は" 品詞="助詞,係助詞,*,*" 活用形="*" 活用型="*" 原形="は" 読み="ハ" 発音="ワ" />
<形態素 表層="?" 品詞="記号,一般,*,*" 活用形="*" 活用型="*" 原形="?" 読み="?" 発音="?" />
</文節>
</文>
【検索条件】
検索する属性→国名
面積: 3000000平方キロメートル以上
地域: ヨーロッパ

================================

 

 

地球からの距離が100光年以内で、半径が太陽半径の1.5倍以上の恒星は?

 

<文 主辞="6">
 <文節 id="0" 係り先="1">
  <形態素 表層="地球" 品詞="名詞,一般,*,*" 活用形="*" 活用型="*" 原形="地球" 読み="チキュウ" 発音="チキュー" />
  <形態素 表層="から" 品詞="助詞,格助詞,一般,*" 活用形="*" 活用型="*" 原形="から" 読み="カラ" 発音="カラ" />
  <形態素 表層="の" 品詞="助詞,連体化,*,*" 活用形="*" 活用型="*" 原形="の" 読み="ノ" 発音="ノ" />
 </文節>
 <文節 id="1" 係り先="2" 係り元="0">
  <形態素 表層="距離" 品詞="名詞,一般,*,*" 活用形="*" 活用型="*" 原形="距離" 読み="キョリ" 発音="キョリ" />
  <形態素 表層="が" 品詞="助詞,格助詞,一般,*" 活用形="*" 活用型="*" 原形="が" 読み="ガ" 発音="ガ" />
 </文節>
 <文節 id="2" 係り先="6" 係り元="1">
  <形態素 表層="100" 品詞="名詞,数,*,*" 活用形="*" 活用型="*" 原形="*" 読み="" 発音="" />
  <形態素 表層="光年" 品詞="名詞,接尾,助数詞,*" 活用形="*" 活用型="*" 原形="光年" 読み="コウネン" 発音="コーネン" />
  <形態素 表層="以内" 品詞="名詞,非自立,副詞可能,*" 活用形="*" 活用型="*" 原形="以内" 読み="イナイ" 発音="イナイ" />
  <形態素 表層="で" 品詞="助詞,格助詞,一般,*" 活用形="*" 活用型="*" 原形="で" 読み="デ" 発音="デ" />
  <形態素 表層="、" 品詞="記号,読点,*,*" 活用形="*" 活用型="*" 原形="、" 読み="、" 発音="、" />
 </文節>
 <文節 id="3" 係り先="6">
  <形態素 表層="半径" 品詞="名詞,一般,*,*" 活用形="*" 活用型="*" 原形="半径" 読み="ハンケイ" 発音="ハンケイ" />
  <形態素 表層="が" 品詞="助詞,格助詞,一般,*" 活用形="*" 活用型="*" 原形="が" 読み="ガ" 発音="ガ" />
 </文節>
 <文節 id="4" 係り先="5">
  <形態素 表層="太陽" 品詞="名詞,一般,*,*" 活用形="*" 活用型="*" 原形="太陽" 読み="タイヨウ" 発音="タイヨー" />
  <形態素 表層="半径" 品詞="名詞,一般,*,*" 活用形="*" 活用型="*" 原形="半径" 読み="ハンケイ" 発音="ハンケイ" />
  <形態素 表層="の" 品詞="助詞,連体化,*,*" 活用形="*" 活用型="*" 原形="の" 読み="ノ" 発音="ノ" />
 </文節>
 <文節 id="5" 係り先="6" 係り元="4">
  <形態素 表層="1" 品詞="名詞,数,*,*" 活用形="*" 活用型="*" 原形="*" 読み="" 発音="" />
  <形態素 表層="." 品詞="名詞,サ変接続,*,*" 活用形="*" 活用型="*" 原形="*" 読み="" 発音="" />
  <形態素 表層="5" 品詞="名詞,数,*,*" 活用形="*" 活用型="*" 原形="*" 読み="" 発音="" />
  <形態素 表層="倍" 品詞="名詞,接尾,助数詞,*" 活用形="*" 活用型="*" 原形="倍" 読み="バイ" 発音="バイ" />
  <形態素 表層="以上" 品詞="名詞,非自立,副詞可能,*" 活用形="*" 活用型="*" 原形="以上" 読み="イジョウ" 発音="イジョー" />
  <形態素 表層="の" 品詞="助詞,連体化,*,*" 活用形="*" 活用型="*" 原形="の" 読み="ノ" 発音="ノ" />
 </文節>
 <文節 id="6" 係り先="-1" 係り元="2,3,5">
  <形態素 表層="恒星" 品詞="名詞,一般,*,*" 活用形="*" 活用型="*" 原形="恒星" 読み="コウセイ" 発音="コーセイ" />
  <形態素 表層="は" 品詞="助詞,係助詞,*,*" 活用形="*" 活用型="*" 原形="は" 読み="ハ" 発音="ワ" />
  <形態素 表層="?" 品詞="記号,一般,*,*" 活用形="*" 活用型="*" 原形="?" 読み="?" 発音="?" />
 </文節>
</文>
【検索条件】
検索する属性→恒星
地球からの距離: 100光年以内
半径: 太陽半径の1.5倍以上
!!検索対象外の属性を検出しました!! → 地球からの距離
!!検索対象外の属性を検出しました!! → 半径
!!検索対象外の属性を検出しました!! → 恒星

 

spimB-2

.data
str1: .asciiz "Enter int-number:"
ans1: .asciiz "square:"
ans2: .asciiz "square root:"
Unsuitable_text: .asciiz "! The square root of a negative number does not exist !"
eol: .asciiz "\n"
.text
.globl main


main:
li $v0, 4
la $a0, str1
syscall

li $v0, 5
syscall
move $a1, $v0
mul $t0, $a1, $a1

li $v0, 4
la $a0, ans1
syscall
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, eol
syscall

bgt $zero, $a1, Unsuitable
jal sqrt
move $t1, $v0

li $v0, 4
la $a0, ans2
syscall
li $v0, 1
move $a0, $t1
syscall
li $v0, 4
la $a0, eol
syscall
j main


Unsuitable:
li $v0, 4
la $a0, Unsuitable_text
syscall
la $a0, eol
syscall
j main

sqrt:
move $v0, $zero
sqrt_loop:
mul $t0, $v0, $v0
bgt $t0, $a1, exit
addi $v0, $v0, 1
j sqrt_loop
exit:
addi $t1, $v0, -1
mul $t1, $t1, $t1
sub $t0, $a1, $t0 # $t0 > $a1 なので負の数
sub $t1, $a1, $t1 # $t1 < $a1 なので正の数
add $t2, $t0, $t1 # $t1の絶対値が小さければ負=>$v0 - 1がより近似解,$t0の絶対値が小さければ正=>$v0 - 0がより近似解
slti $t0, $t2, 0 # $t2が負ならば1、正ならば0を返す
sub $v0, $v0, $t0 # $v0と$v0 ー 1 の近似解が得られる
jr $ra

spimB-1

.data
open_bracket: .asciiz "["
close_bracket: .asciiz "] = "
str1: .asciiz "Enter int-number:"
str2: .asciiz "Print"
str3: .asciiz "Enter Array size:"
error: .asciiz "!negative number has entered!"
eol: .asciiz "\n"
.text
.globl main

main:
jal Enter
jal Sort
jal Print

Enter:

# "Enter Array size:"を表示
li $v0, 4
la $a0, str3
syscall

#配列のサイズを指定
li $v0, 5
syscall

bgt $v0, $zero, Enter_num

li $v0, 4
la $a0, error
syscall
la $a0, eol
syscall

j Enter

Enter_num:
move $s1, $v0
sll $a0, $v0, 2
li $v0, 9
syscall

move $s0, $v0
move $t0, $zero


Enter_loop:

#"Enter int-number:" を表示
li $v0, 4
la $a0, str1
syscall

# "[n]= "と出力して、入力された整数を格納
la $a0, open_bracket
syscall
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, close_bracket
syscall
li $v0, 5
syscall


sll $t1, $t0, 2 # $t0 * 4
add $t1, $t1, $s0 # ベースレジスタを追加
sw $v0, 0($t1)


addi $t0, $t0, 1 #オフセットを更新
bne $t0, $s1, Enter_loop #配列が埋まっていなければ入力を続ける

#改行
li $v0, 4
la $a0, eol

syscall

jr $ra


Print:
move $t0, $zero
li $v0, 4
la $a0, str2
syscall
la $a0, eol
syscall

Print_loop:
la $a0, open_bracket
syscall
li $v0, 1
move $a0, $t0
syscall
li $v0, 4
la $a0, close_bracket
syscall

sll $t1, $t0, 2
add $t1, $t1, $s0
li $v0, 1
lw $a0, 0($t1)
syscall
li $v0, 4
la $a0, eol
syscall

addi $t0, $t0, 1

bne $t0, $s1, Print_loop

la $a0, eol
syscall

jr $ra


Sort:
addi $sp, $sp, -20
sw $ra, 16($sp)
sw $s3, 12($sp)
sw $s2, 8($sp)
sw $s1, 4($sp)
sw $s0, 0($sp)

move $s2, $s0
move $s3, $s1

move $s0, $zero
for1tst:
slt $t0, $s0, $s3
beq $t0, $zero, exit1

addi $s1, $s0, -1
for2tst:
slti $t0, $s1, 0
bne $t0, $zero, exit2
sll $t1, $s1, 2
add $t2, $s2, $t1
lw $t3, 0($t2)
lw $t4, 4($t2)
slt $t0, $t4, $t3
beq $t0, $zero, exit2

move $a0, $s2
move $a1, $s1
jal swap

addi $s1, $s1, -1
j for2tst

exit2:
addi $s0, $s0, 1
j for1tst

exit1:
lw $s0, 0($sp)
lw $s1, 4($sp)
lw $s2, 8($sp)
lw $s3, 12($sp)
lw $ra, 16($sp)
addi $sp, $sp, 20

jr $ra


swap:
sll $t1, $a1, 2
add $t1, $a0, $t1

lw $t0, 0($t1) #
lw $t2, 4($t1) #

sw $t2, 0($t1) #
sw $t0, 4($t1) #

jr $ra

.data
buffer: .space 64
str1: .asciiz "Enter int-number:"
str2: .asciiz "Enter float-number:"
str3: .asciiz "Enter double-number:"
str4: .asciiz "Enter String:"
str5: .asciiz "Enter char:"
ans1: .asciiz "this number is =>"
ans2: .asciiz "this string is =>"
ans3: .asciiz "this char is =>"
eol: .asciiz "\n"
.text
.globl main
main: li $v0,4 # print_stringを格納
la $a0,str1 # asciizの文字列を格納
syscall # 文字列の出力
li $v0,5 # read_int
syscall
move $t0,$v0 # 読み込んだ値を$t0に
li $v0,4 # print_stringを格納
la $a0,ans1 # asciizの文字列を格納
syscall
li $v0,1 # print_intを格納
move $a0,$t0 # 出力する整数を$a0に格納
syscall
li $v0,4 # print_stringを格納
la $a0,eol # 改行
syscall

li $v0,4 # print_stringを格納
la $a0,str2 # asciizの文字列を格納
syscall # 文字列の出力
li $v0,6 # read_float
syscall
li $v0,4 # print_stringを格納
la $a0,ans1 # asciizの文字列を格納
syscall
li $v0,2 # print_floatを格納
mov.s $f12,$f0 # 出力する整数を$f12に格納、単精度
syscall
li $v0,4 # print_stringを格納
la $a0,eol # 改行
syscall

li $v0,4 # print_stringを格納
la $a0,str3 # asciizの文字列を格納
syscall
li $v0,7 # read_doubleを格納
syscall
li $v0,4 # print_stringを格納
la $a0,ans1 # asciizの文字列を格納
syscall
li $v0,3 # print_doubleを格納
mov.d $f12,$f0 # 出力する整数を$f12に格納、倍精度
syscall
li $v0,4 # print_stringを格納
la $a0,eol # 改行
syscall

li $v0,4 # print_stringを格納
la $a0,str4 # asciizの文字列を格納
syscall
li $v0,8 # read_string
la $a0,buffer # 文字サイズbufferを格納
li $a1,20 # Stringのための語長
move $t0,$a0 # $a0を$t0に格納
syscall
li $v0,4 # print_stringを格納
la $a0,ans2 # asciizの文字列を格納
syscall
la $a0,buffer # 語長を再読み込み
move $a0,$t0 # $a0を$t0に格納(読み込みのアドレス)
syscall

li $v0,4 # print_stringを格納
la $a0,str5 # asciizの文字列を格納
syscall
li $v0,12 # read_charを格納
syscall
move $t0,$v0 # 読み込んだ値を$t0に
li $v0,4 # print_stringを格納
la $a0,eol # 改行
syscall
la $a0,ans3 # asciizの文字列を格納
syscall
li $v0,11 # print_charを格納
move $a0,$t0 # $a0を$t0に格納(読み込みのアドレス)
syscall
li $v0,4 # print_stringを格納
la $a0,eol # 改行
syscall


jr $ra


実行結果例
Enter int-number:1
this number is =>1
Enter float-number:1.2345678
this number is =>1.23456776
Enter double-number:1.2345678
this number is =>1.23456779999999999
Enter String:hogehoge
this string is =>hogehoge
Enter char:!
this char is =>!

考察:int float double String charで読み込んだものをそのまま出力するプログラムを作成した。
   指定されたシステムコールの動作をすべて確認することには成功したが、疑問が残る部分もある。
   5つめに確認をしたchar型の読み込みと出力が1文字しか取ることができず、改行をする前に次の命令に移行してしまう。
   調べたところ、read_charのアウトプットには”$v0 = 文字(改行なし)をエコーする”とあった。
   うまく実行できなかった原因は、print_charのインプットが”$a0 = 文字(下位8ビット)”であるため1文字しか出力できないことかと推測したが、
   解決策はみつからなかった。あるいは、自分が情報をうまく探すことができていないだけでこのchar型ではこれで正しく実行できているのかもしれない。
   1文字は正しく動作しているため大きく間違っているということはないが、より理解を深める必要があるように感じた。
   その他4つについては、String型で語長の設定にとまどった程度で課題スライドと参考資料をもとに作成することができた。

spim

.data
buffer: .space 64
str1: .asciiz "Enter int-number:"
str2: .asciiz "Enter float-number:"
str3: .asciiz "Enter double-number:"
str4: .asciiz "Enter String:"
str5: .asciiz "Enter char:"
ans1: .asciiz "this number is =>"
ans2: .asciiz "this string is =>"
ans3: .asciiz "this char is =>"
eol: .asciiz "\n"
.text
.globl main
main: li $v0,4 # print_stringを格納
la $a0,str1 # asciizの文字列を格納
syscall # 文字列の出力
li $v0,5 # read_int
syscall
move $t0,$v0 # 読み込んだ値を$t0に
li $v0,4 # print_stringを格納
la $a0,ans1 # asciizの文字列を格納
syscall
li $v0,1 # print_intを格納
move $a0,$t0 # 出力する整数を$a0に格納
syscall
li $v0,4 # print_stringを格納
la $a0,eol # 改行
syscall

li $v0,4 # print_stringを格納
la $a0,str2 # asciizの文字列を格納
syscall # 文字列の出力
li $v0,6 # read_float
syscall
li $v0,4 # print_stringを格納
la $a0,ans1 # asciizの文字列を格納
syscall
li $v0,2 # print_floatを格納
mov.s $f12,$f0 # 出力する整数を$f12に格納
syscall
li $v0,4 # print_stringを格納
la $a0,eol # 改行
syscall

li $v0,4 # print_stringを格納
la $a0,str3 # asciizの文字列を格納
syscall # 文字列の出力
li $v0,7 # read_double
syscall
li $v0,4 # print_stringを格納
la $a0,ans1 # asciizの文字列を格納
syscall
li $v0,3 # print_doubleを格納
la $f0,$f1
mov.s $f12,$f0 # 出力する整数を$f12に格納
syscall
li $v0,4 # print_stringを格納
la $a0,eol # 改行
syscall

li $v0,4 # print_stringを格納
la $a0,str4 # asciizの文字列を格納
syscall # 文字列の出力
li $v0,8 # read_string
la $a0,buffer # 文字サイズbufferを格納
li $a1,20 # Stringのための語長
move $t0,$a0 # $a0を$t0に格納
syscall
li $v0,4 # print_stringを格納
la $a0,ans2 # asciizの文字列を格納
syscall
la $a0,buffer # 語長を再読み込み
move $a0,$t0 # $a0を$t0に格納(読み込みのアドレス)
syscall

li $v0,4 # print_stringを格納
la $a0,str5 # asciizの文字列を格納
syscall # 文字列の出力
li $v0,12 # read_char
syscall

move $t0,$v0 # 読み込んだ値を$t0に
li $v0,4 # print_stringを格納
la $a0,ans3 # asciizの文字列を格納
syscall
li $v0,11 # print_charを格納
move $a0,$t0 # $a0を$t0に格納(読み込みのアドレス)
syscall


jr $ra

a

import java.util.*;
import java.io.*;

public class WUGraph {
int numOfNodes;
ArrayList<Edge> list = new ArrayList<Edge>(); //隣接ノード、重さ//

class Edge implements Comparable<Edge> {
private int to; // 辺番号//
private int weight; //重さ//
private int nodeU, nodeV; //両端ノード//
Edge(int to,int nodeU, int nodeV ,int weight) {this.to = to; this.weight = weight; this.nodeU = nodeU; this.nodeV = nodeV;}
int To() { return to;}
int NodeU() { return nodeU;}
int NodeV() { return nodeV;}
int Weight() { return weight;}
@Override
public int compareTo(Edge e) {
return this.weight - e.weight;
}
}

ArrayList<Edge> getSortedEdges(){
ArrayList<Edge> al = new ArrayList<>(list);
Collections.sort(al);
return al;
}


void LoadGraph(String filename){
try{
Scanner scan = new Scanner(new File(filename));

String Line = scan.nextLine();
String r = Line.split(",",2); //頂点数、 辺の数//

numOfNodes = Integer.parseInt(r[0]);

for(int i = 0; i < Integer.parseInt(r[1]); i++){
String line = scan.nextLine();
String s = line.split(":",0);
String[] t = s[1].split(",",3);

Edge e = new Edge(Integer.parseInt(s[0]),Integer.parseInt(t[0]), Integer.parseInt(t[1]),Integer.parseInt(t[2]));
list.add(e);

}
} catch (java.io.FileNotFoundException e){
System.out.println(e);
System.exit(0);
}
}

ArrayList<Edge> getMST() {
ArrayList<Edge> mst = new ArrayList<Edge>();
ArrayList<Edge> selst = getSortedEdges();
UnionFind uf = new UnionFind(numOfNodes);
for (Edge e : selst) {
if (uf.unite(e.nodeU, e.nodeV)) {
mst.add(e);
}
}
return mst;
}

int getMSTcost() {
ArrayList<Edge> edges= getMST();
int cost = 0;
for (int i = 0; i < edges.size(); i++)
cost = cost + edges.get(i).Weight();
return cost;
}

void printGraph(){
ArrayList<Edge> edges= getMST();
System.out.println(getMSTcost());
System.out.println(numOfNodes + "," + edges.size());
for (int j = 0; j < edges.size() ; j++) {
System.out.println(edges.get(j).To() + ":" + edges.get(j).NodeU() + "," + edges.get(j).NodeV() + "," + edges.get(j).Weight());
}
}
}