プロが教えるわが家の防犯対策術!

CASLIIのプログラミングで直接選択ソートまたはバブルソートを用いた1~5までの数字の大きい順に並び替え、というものがあります。C言語でしたらわかるのですがCASLIIだといまいちわかりません。直接選択ソート、バブルソートの原理はわかるのですが。
CASLIIのプログラムの形で答えを教えてください。なおプログラムは部分的に

       START   BGN
BGN  


       RET
DATA    DC    1,4,3,2,5
        END

となっています。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

#5>アドバイスをお願いします


色々まずいところがあります。
ちょっと修正してみました。
比べて見て下さい。
----------------------------------------------------------------
BSORT START BGN
BGNLAD GR2,5
LAD GR3,-1
LAD GR4,0
LOOP1LAD GR3,1,GR3
CPL GR2,GR3
JZE FIN
LD GR0,DATA,GR3
LAD GR4,0,GR3
LOOP2LAD GR4,1,GR4
CPL GR2,GR4
JZE LOOP1
LD GR1,DATA,GR4
CPL GR0,GR1
JMI SWAP
JUMP LOOP2
SWAPST GR1,DATA,GR3
ST GR0,DATA,GR4
LD GR0,GR1
JUMP LOOP2
FINRET
DATADC1,4,3,2,5
END
    • good
    • 0

#4>ありません・・・


http://www.jitec.jp/
からのダウンロードでしょうか
今確認してみたら、バージョンが上がっているのですね。
すみませんでした。
私の持っているのは、v1.03 です。
なんか説明がv1.03より手抜きになってますね。

では、(ホントはダメなような気がしますが)「サンプルプログラムの説明.txt」から部分引用
----------------------------------------------------------------
1)smain.cas
count1.cas
「アセンブラ言語の仕様」のサンプル・プログラムの
メイン と 副プログラム。
アセンブルと実行
>casl2 smain
>casl2 count1
>run smain
----------------------------------------------------------------
casl2 でそれぞれobj を作ります。
run でメインモジュールを指定すると、必要なモジュールがリンク実行されます。
ver2 自体は、持ってないので細部は違うかもしれません。
ver2 の説明をお読み下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。
http://www5a.biglobe.ne.jp/~teamcasl/ からのダウンロードなんですが・・・

自分なりにプログラムを作ってみました。

START BGN
BGNLAD GR2,5
LAD GR3,-1
LAD GR4,0
LAD GR5,1
LOOP1CPL GR2,GR4
JZE FIN
LAD GR2,-1,GR2
LAD GR3,1,GR3
LAD GR0,DATA,GR3
LAD GR4,0,GR3
LOOP2LAD GR4,1,GR4
CPL GR2,GR4
JMI LOOP1
LD GR1,DATA,GR4
CPL GR0,GR1
→JMI LOOP2
LD GR2,GR0
ST GR1,DATA,GR3
ST GR0,DATA,GR4
JUMP LOOP2
FINRET
DATADC 1,4,3,2,5
END

なぜか矢印のところでLOOP2にすべて戻ってしまい、並び変わったデータが書き込まれません。アドバイスをお願いします。(プログラムが非常に見にくくてすみません)

お礼日時:2006/08/21 16:46

>おそらくそうだと思います。


>そうなると,プログラムはどの様になるのでしょうか?
>副プログラムが使えないわけですのでプログラム中にSTART、ENDは1つになるのでしょうか?
インストールしたフォルダに
「サンプルプログラムの説明.txt」
があると思いますが、
これを読めば
副プログラムが有る場合のコンパイルと実行の仕方が分かると思います。
    • good
    • 0
この回答へのお礼

返答ありがとうございます。

>インストールしたフォルダに
>「サンプルプログラムの説明.txt」
>があると思いますが、

ありません・・・

お礼日時:2006/08/12 18:11

#2>END命令の前に複数のSTART命令がある。

またはSTART命令がないのにEND命令がある。
java のCASL2シミュレーターをお使いでしょうか?
あれは、1つ1つのモジュール(1つのソースに1つのモジュール)でないと実行できませんよ。
    • good
    • 0
この回答へのお礼

おそらくそうだと思います。
そうなると,プログラムはどの様になるのでしょうか?
副プログラムが使えないわけですのでプログラム中にSTART、ENDは1つになるのでしょうか?

お礼日時:2006/08/07 15:55

#1>うまく作動しませんでした。

なぜでしょうか?
なぜでしょうと言われても・・
とりあえず、ウチで試したところではちゃんと動作しますし。

#1>直接選択ソート
C言語でわかるのだったら、
概ね、#1の参照先プログラムでCASLでの書き方は分かると思うけど・
    • good
    • 0
この回答へのお礼

アセンブルの結果、表示されるエラーメッセージは

END命令の前に複数のSTART命令がある。またはSTART命令がないのにEND命令がある。

というものです。
確かに構造としてはきちんとしていますし、バブルソートの形になっていますが・・・

お礼日時:2006/08/05 23:36

CASL2 でのバブルソートは、


http://okwave.jp/kotaeru.php3?qid=1969601
が参考になると思います。
    • good
    • 0
この回答へのお礼

返答ありがとうございます。上記ページは知っておりましたがうまく作動しませんでした。なぜでしょうか?
どちらかといえば直接選択ソートのほうを探しているのですが、ご存じないでしょうか。

お礼日時:2006/08/04 16:55

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCASLIIの問題

次のプログラムに、
指定された整数値配列の中から最大値を調べるサブルーチンMAXを作成する、
指定された整数値配列の中から最小値を調べるサブルーチンMAXを作成する、
指定された整数値配列を昇順にソートするサブルーチンSORTを作成する、
指定された整数値配列の平均値(整数値)を調べるサブルーチンAVEを作成する、

これらについて教えてください。

PGM START
LAD GR1, DATA
LD GR2, =10
CALL SUM
ST GR0, RESULT
RET
DATA DC 1,9,3,7,5,10,2,8,4,6
RESULT DS 1
END
SUM START
PUSH 0, GR1
PUSH 0, GR7
LD GR0, =0
LD GR7, =0
MAIN CPA GR7, GR2
JZE QUIT
ADDA GR0, 0, GR1
LAD GR1, 1, GR1
LAD GR7, 1, GR7
JUMP MAIN
QUIT POP GR7
POP GR1
RET
END


GR1はデータの先頭番地、SUMをコールするとGR1が1ずつ加算されてデータが参照できる。
GR2はデータの個数、ラベルMAINで個数を比較している。
などのことはわかるのですが、
プログラムを作るとなるとまったくわかりません。

どなたか教えていただけませんか??
お願いします!!

次のプログラムに、
指定された整数値配列の中から最大値を調べるサブルーチンMAXを作成する、
指定された整数値配列の中から最小値を調べるサブルーチンMAXを作成する、
指定された整数値配列を昇順にソートするサブルーチンSORTを作成する、
指定された整数値配列の平均値(整数値)を調べるサブルーチンAVEを作成する、

これらについて教えてください。

PGM START
LAD GR1, DATA
LD GR2, =10
CALL SUM
ST GR0, RESULT
RET
DATA DC 1,9,3,7,5,10,2,8,4,6
RESULT DS 1
END
SUM S...続きを読む

Aベストアンサー

回答がないので調べてみました。アセンブルは下記を使用しました。バグがあるようなのと知らないのであまり自信がありません。
http://www.chiba-fjb.ac.jp/fjb_labo/casl/index.html

PGM START
LAD GR1, DATA
LD GR2, =10
CALL SUM
ST GR0, RESULT

CALL AVE
ST GR7,WK2

CALL MAX
ST GR0,WK3

DUMP RESULT,3 ;システムコール、結果の確認
RET

DATA DC 1,9,3,7,5,10,2,8,4,6
RESULT DS 1
WK2 DS 1
WK3 DS 1

SUM
PUSH 0, GR1
PUSH 0, GR7
LD GR0, =0
LD GR7, =0
MAIN CPA GR7, GR2
JZE QUIT
ADDA GR0, 0, GR1
LAD GR1, 1, GR1
LAD GR7, 1, GR7
JUMP MAIN
QUIT POP GR7
POP GR1
RET

;---------------------
; 割り算
; GR7=GR0/GR2
;HOLD : GR1-GR6
;---------------------
AVE
LD GR7,=0
LOOP2
SUBA GR0,GR2
JMI QUIT2

LAD GR7,1,GR7
JUMP LOOP2
QUIT2
RET

;-----------------------------
; 最大値の検索
; IN : GR1=DATA TOP
; : GR2=DATA SU
;HOLD : GR1-GR6
;---------------------
MAX
PUSH 0,GR1
LD GR0,0,GR1
LD GR7,=0
LOOP3
LAD GR7,1,GR7
CPA GR7,GR2
JZE QUIT3

LAD GR1,1,GR1
CPA GR0,0,GR1
JPL LOOP3

LD GR0,0,GR1
JUMP LOOP3
QUIT3
POP GR1
RET
END

;--------------
; 以下はソート
;--------------
PGM START
LAD GR1, DATA
LD GR3, =10 ;DATA SU
CALL SORT
DUMP DATA,10 ;システムコール、結果の確認
RET
DATA DC 1,9,3,7,5,10,2,8,4,6
;-------------------------------------
; バブルソート
; IN : GR1=DATA TOP
; : GR3=DATA SU
; WORK : GR2=比較用 DATA TOP
; : GR4=SWAP用WORK
; : GR6=基準データ数カウンタ
; : GR7=比較データ数カウンタ
;DESTORY : GR3,GR5以外すべて
;-------------------------------------
SORT
LD GR6, =0 ;I=0
FOR_I
LAD GR2,0,GR1 ;D[I]=D[J] DATA TOP アドレスを同じにする
LAD GR6,1,GR6 ;I=I+1
CPA GR6, GR3
JZE QUIT ;I==DATA SU

LD GR7,GR6 ;J=I
FOR_J
LAD GR7,1,GR7 ;J=J+1
LAD GR2, 1, GR2 ;D[J] 比較用のデータアドレスを進める
LD GR0,0,GR2 ;GR0=D[I]
CPA GR0,0,GR1
JPL NEXT ;D[J]>D[I] 順の入れ替え不要
JZE NEXT ;D[J]=D[I] ”

LD GR5,GR0 ;GR5=D[J]
LD GR0,0,GR1 ;GR0=D[I]
ST GR0,0,GR2 ;D[J]=GR0
ST GR5,0,GR1 ;D[I]=GR5 SWAP D[I],D[J]
NEXT
CPA GR7, GR3
JMI FOR_J ;J<DATA SU

LAD GR1,1,GR1 ;D[I]のアドレスをつぎの配列に進める
JUMP FOR_I

QUIT
RET
END

回答がないので調べてみました。アセンブルは下記を使用しました。バグがあるようなのと知らないのであまり自信がありません。
http://www.chiba-fjb.ac.jp/fjb_labo/casl/index.html

PGM START
LAD GR1, DATA
LD GR2, =10
CALL SUM
ST GR0, RESULT

CALL AVE
ST GR7,WK2

CALL MAX
ST GR0,WK3

DUMP RESULT,3 ;システムコール、結果の確認
RET

DATA DC 1,9,3,7,5,10,2,8,4,6
RESULT DS 1
WK2 DS 1
WK3 DS 1

SUM
PUSH 0, GR1
PUSH 0, GR7
LD GR0, =0
LD GR7, =0
...続きを読む

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

Qfgetsなどのときのstdinのバッファを消すには?

こんにちは,今C(C++でない)を使用しています。
たとえば,
char str[20]
fgets(str,sizeof(str),stdin)
としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。

C++などでは
fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。

よろしくお願いします。

Aベストアンサー

あ,テキスト入力だからこんな大掛かりなことしなくてもいいんだ.
末尾に'\n'が出るまで掃出せばいいんですよね.

fgets(str, sizeof(str), stdin);
if ( str[strlen(str)-1] != '\n' ){
while( getchar() != '\n' );
}

でいいんだ.失礼しました.

Q構造体の初期化のmemsetの第三引数

memset(&lvitem, 0, sizeof(LVITEM));
memset(&lvitem, 0, sizeof(lvitem));
LVITEMに特化した質問ではなく構造体の初期化について、この2つの書き方によるソース管理やコンパイルでのメリットとデメリットを教えてください。

Aベストアンサー

(1)memset(&lvitem, 0, sizeof(LVITEM));
この書き方は、構造体LVITEMを初期化しているんだな、と分かりやすい。
(2)memset(&lvitem, 0, sizeof(lvitem));
この書き方はとにかく変数lvitemを初期化するんだな、という感じだが、型が分からないので宣言しているところを参照しなければならない。
それともう一つ、ただ単に何回も初期化するんでなければ、こういう書き方もできる。
(3)LVITEM lvitem = {0};

結局どれがいいのかといえば、個人的にはケースバイケースですねえ。初期化を1回すればいいような感じなら(3)、構造体名を明示した方が調べる手間がなくなるようなら(1)、そうでなければ(2)を使います。
コンパイルでのメリット、デメリットは特にないんじゃないかなあ。アセンブラがまだ全盛だった頃ならともかく、いまじゃどのコンパイラだって最適化オプションで同じようなコードはくでしょう。
気にするほどでもないと思うけど…

Q論理加算と算術加算ってなんですか?

論理加算と算術加算ってなんですか?

wikiでしらべたんですが専用ページがないんですね
検索もしてみましたがどうやらしっていてあたりまえのような扱いになっていて説明がありません
caslの勉強をはじめたのですが論理加算と算術加算とは何か教えてください

Aベストアンサー

例えば、
0110+0101
の演算の場合、

論理演算:
0110+0101
→偽真真偽 OR 偽真偽真
→偽真真真
→0111

算術演算:
0110+0101
→6 + 5 (十進数)
→11 (十進数)
→1011

だとか。


> 論理加算と算術加算とは何か教えてください

算術加算は小学校なんかで習う足し算。

論理加算は、通常は論理和の事です。

Wikipedia - 論理演算
http://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E6%BC%94%E7%AE%97

QC言語の標準入力で改行しない方法

端末で入力を受けて、改行せずに次の表示を行いたいのですが、

char str[32];
printf("ほげほげ");
fgets(str, sizeof(str), stdin);
str[strlen(str) - 1] = '\0';
printf("ホゲホゲ");

とすれば
「ほげほげ (入力した内容) ホゲホゲ」
と表示できると考えましたが、これでは改行されて
「ほげほげ (入力した内容)
ホゲホゲ」
になってしまいます。原因がわかりません…

使用している環境は Linux Ubuntu 10.10 で gcc でコンパイルしています。

改行しない方法を説明しているサイトのサンプルをコピペして実行してみても、改行されてしまいました…

Aベストアンサー

>原因がわかりません…
>fgets(str, sizeof(str), stdin);

の時点で、改行文字まで込みでエコーバックされているようですから無理じゃないですかね?
# つまりターミナル上ではfgets()から戻ってきた時点で改行処理が終わっている。

>使用している環境は Linux Ubuntu 10.10 で gcc でコンパイルしています。

http://oshiete.goo.ne.jp/qa/608841.html
ioctl()の利用でなんとかなるかもしれません。
フラグの設定方法次第かも知れませんけど。
# 改行だけエコーバックさせない…ってところでしょうか。
# ECHONLが関係しますかねぇ…。

>改行しない方法を説明しているサイトのサンプルをコピペして

それは「fgets()で取得した文字列から改行コードを取り除く」ではありませんか?
まぁ、fgets()で渡したバッファよりも長い文字列を入力した場合に誤動作すると思われますが。
# 改行コードかどうか判定してから削除しないと…ね。

QCASLIIの数値データ入出力

入出力のときはJISの文字コード表の値が使われ、それ以外の計算などにおいては通常の2進数が使われるとのことですが、その変換はどのように行うのでしょうか。

テキストには「1~9の文字には16進数の(0030)を減算」「A~Fの文字には(0037)を減算」と書いてあります。

例えば
’5’は内部コードでは(0035)、
16進数の数値では(0005)
数値と文字コードの差は16進数で(0030)

というのは理解できます。

ただアルファベットになると理解できません。

例えば
’A’は内部コードで(0041)
16進数の数値では(000A)
数値と文字コードの差は16進数で(0037)

なぜここで(0037)になるのでしょうか・・。
(0041)を(0037)で減算し、(000A)になるまでの過程を教えてください。

Aベストアンサー

文字→数値変換ですね。
説明が面倒ですが、内容はごく単純です。頭をやわらかくして。

0 = 文字コード(0030) - (0030)
1 = 文字コード(0031) - (0030)
2 = 文字コード(0032) - (0030)
5 = 文字コード(0035) - (0030)
9 = 文字コード(0039) - (0030)

ここで、A = 文字コード - 0030 と同様にやりたいところですが、駄目です。
文字コード表を見ればわかる通り、1~9の文字コードとA~Fの文字コードは離れているので。(連続値として変換できない)
A~Fは基準点になる0030という数値が変わってきます。

A = 文字コード(0041) - (0041) + (000A)
B = 文字コード(0042) - (0041) + (000A)
F = 文字コード(0046) - (0041) + (000A)

この、-0041+000A を計算してまとめると、-0037

A = 文字コード(0041) - (0037)

となります。

こんな手法プログラム作成時に本当にやるのか!と言われそうですが、
使う人は使いますし、知っておいて損はないです。

文字→数値変換ですね。
説明が面倒ですが、内容はごく単純です。頭をやわらかくして。

0 = 文字コード(0030) - (0030)
1 = 文字コード(0031) - (0030)
2 = 文字コード(0032) - (0030)
5 = 文字コード(0035) - (0030)
9 = 文字コード(0039) - (0030)

ここで、A = 文字コード - 0030 と同様にやりたいところですが、駄目です。
文字コード表を見ればわかる通り、1~9の文字コードとA~Fの文字コードは離れているので。(連続値として変換できない)
A~Fは基準点になる0030という数値が変わってきます。...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング