• ベストアンサー

CASL(2)の問題について

今年の夏ごろから興味があってCASL(2)の勉強をはじめたのですが、書籍などを調べても参考のようなものが載っておらず、どうしても分からない問題がありましたので、どなたかお分かりの方いらっしゃいましたらアドバイスをお願いいたします。 【問題】キーボードから得点(1~10)を複数件入力し、「入力された得点」、「平均点」、「合計点」を出力せよ。ただし、0(ゼロ)入力でデータ終了とする。 注)平均点は、小数点以下切り捨て可。 〔出力例〕 3 9 6  GOKEI= 18 HEIKIN= 6

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

;;正の数値を入力して、合計と平均を出す ;;0が入力されたら、結果を表示 MAIN START LAD GR0,0 ST GR0,N ;入力した個数のクリア ST GR0,SUM ;合計のクリア LOOP IN INBUFF,INLEN LD GR1,RADIX LAD GR2,INBUFF LAD GR3,INLEN CALL STR2DEC ;数値に変換してGR0に求める CPL GR0,=0 ;入力した数値が0だったら結果を表示して終了 JZE DISPNUM LD GR4,N ;GR4はインデックスレジスタ ST GR0,ARRAY,GR4 ;配列に保存 ADDL GR4,=1 ;N=N+1 ST GR4,N ADDL GR0,SUM ;符号無しの足し算、入力は正の数 ST GR0,SUM JUMP LOOP DISPNUM LAD GR4,0 NEXTN LD GR0,ARRAY,GR4 CALL PUTNUM ;入力された数値の表示 ADDL GR4,=1 CPL GR4,N JNZ NEXTN DISPSUM OUT SUMMES,OUTLEN LD GR0,SUM CALL PUTNUM CALCAVE LD GR1,SUM LD GR2,N CALL DIV ;GR3に商を求める(小数なし) DISPAVE OUT AVEMES,OUTLEN LD GR0,GR3 CALL PUTNUM EXIT RET SUM DS 1 ;合計 N DS 1 ;入力した数字の個数 ARRAY DS 20 ;入力した数字の配列 RADIX DC 10 ;入力を解釈する基数(10進数で解釈) INBUFF DS 256 ;入力領域 INLEN DS 1 ;入力文字数 SUMMES DC 'GOUKEI=' AVEMES DC 'HEIKIN=' OUTLEN DC 7 END ; ;GR0に入力された数字を出力する PUTNUM START PUSH 0,GR1 PUSH 0,GR2 PUSH 0,GR3 PUSH 0,GR4 LD GR1,GR0 LD GR2,BASE LAD GR3,DISPNUM LAD GR4,LEN CALL DEC2STR OUT DISPNUM,LEN POP GR4 POP GR3 POP GR2 POP GR1 RET DISPNUM DS 5 ;表示に使う領域たかだか5桁(65536) LEN DS 1 ;表示に使う文字の長さ BASE DC 10 ;表示に使う基数 END ; ;文字列を数字に変換する ;GR0 は破壊される ;GR1 基数 ;GR2 文字列アドレス ;GR3 文字数アドレス ;文字列を指定された基数で解釈して数字として、GR0に格納する ;BASEより大きい文字が使われているかどうかは調べない STR2DEC START PUSH 0,GR4 ST GR2,STR ST GR3,LEN LD GR3,0,GR3 LAD GR4,0 集計するために初期化 TEST CPL GR3,=0 文字数が0になるまで JZE EXIT LD GR0,0,GR2 文字を1文字読み出す CALL TOUPPER GR0の文字を大文字にする ST GR0,X CALL STRCHR TABLEから文字Xの位置を調べる LD GR0,POS JMI NEXT 無効な文字の時無視する, PUSH 0,GR2 LD GR2,GR4 GR4=GR4*BASE CALL MULT GR0=GR1*GR2 LD GR4,GR0 ADDL GR4,POS GR4=GR4*BASE+POS POP GR2 NEXT ADDL GR2,ONE SUBL GR3,ONE JUMP TEST EXIT LD GR0,GR4 LD GR2,STR LD GR3,LEN POP GR4 RET ONE DC 1 STR DS 1 LEN DS 1 ;X で示される文字をTABLEから探して位置をPOSにセットする ;位置は0で始まる、見つからない時-1 X DS 1 POS DS 1 STRCHR PUSH 0,GR1 PUSH 0,GR2 PUSH 0,GR3 LD GR1,X LAD GR2,0 LOOP LD GR3,TABLE,GR2 CPL GR1,GR3 JZE FINDED ;見つかった CPL GR3,='Z' JZE NOTFIND ADDL GR2,=1 JUMP LOOP NOTFIND LAD GR2,-1 FINDED ST GR2,POS POP GR3 POP GR2 POP GR1 RET TABLE DC '0123456789ABCDEFGHIJKLMNOPQRSTRVWXYZ' END ; ;数字を文字列に変換する ;GR0 は破壊される ;GR1 変換する数 ;GR2 基数 ;GR3 文字列アドレス ;GR4 文字数アドレス ;数字を基数で示されたn進数の文字列に変換する DEC2STR START PUSH 0,GR5 アドレスポインタ PUSH 0,GR1 PUSH 0,GR2 ST GR1,N ST GR3,STR ST GR4,STRLEN LAD GR5,0 TEST CPL GR1,GR2 ;数>=基数 JMI EXIT LOOP CALL DIV ;GR3=GR1/GR2,GR4=GR1%GR2 LD GR0,TABLE,GR4 c=TABLE[GR4] LD GR4,STR ADDL GR4,GR5 ST GR0,0,GR4 STR[GR5]=c ADDL GR5,ONE ST GR3,N NEXT LD GR1,N JUMP TEST EXIT LD GR4,N LD GR0,TABLE,GR4 LD GR4,STR ADDL GR4,GR5 ST GR0,0,GR4 ADDL GR5,ONE LD GR4,STRLEN ST GR5,0,GR4 [STRLEN] に文字数をセット LD GR1,STR LD GR2,STRLEN CALL REVERSE POP GR2 POP GR1 POP GR5 RET TABLE DC '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' ONE DC 1 N DS 1 STR DS 1 STRLEN DS 1 END ; ;割り算する ;GR1 x ;GR2 y ;GR3 [x/y] ;GR4 x%y ;符号無しで商及び余りを求める DIV START PUSH 0,GR1 PUSH 0,GR2 ST GR1,X ST GR2,Y LAD GR3,0 LAD GR4,0 CPL GR2,ZERO 除数が0でないか? JNZ COUNTY OUT ='DIVIDED BY ZERO',=15 JUMP EXIT COUNTY ADDL GR4,ONE ;カウンタ+1 SRL GR2,1 JNZ COUNTY ST GR4,YLEN ;Yのビット数が出る。 CHECK CPL GR1,Y ;x < y になったら JMI QUIT LAD GR4,0 ;カウンタ初期化 COUNTX ADDL GR4,ONE ;カウンタ+1 SRL GR1,1 JNZ COUNTX ST GR4,XLEN ;Xのビット数が出る。 SUBL GR4,YLEN ;XLEN - YLEN LD GR0,ONE SLL GR0,0,GR4 LD GR2,Y SLL GR2,0,GR4 ;YをXに桁合わせする LD GR1,X CPL GR1,GR2 ;YがXより大きくなってしまった? JPL SUB JZE SUB SRL GR0,1 ;1個シフトを戻す SRL GR2,1 SUB ADDL GR3,GR0 SUBL GR1,GR2 ST GR1,X JUMP CHECK QUIT LD GR4,GR1 ;余りのセット EXIT POP GR2 POP GR1 RET X DS 1 Y DS 1 XLEN DS 1 ;Xのビット数 YLEN DS 1 ;Yのビット数 ZERO DC 0 ONE DC 1 END ; ;掛け算する ;GR1 x ;GR2 y ;GR0 SUM=x*y ;符号無し乗算,オーバーフロー検査なし MULT START PUSH 0,GR1 PUSH 0,GR2 LAD GR0,0 ;SUM=0 CPL GR1,ZERO JZE EXIT ;x=0なら終了 TEST CPL GR2,ZERO JZE EXIT ;yが0になったら終了 SRL GR2,1 ;最下位ビットがOVビットに入る JOV ADD ;yの最下位ビットが立っているか? JUMP SHIFT ADD ADDL GR0,GR1 ;SUM=SUM+x SHIFT SLL GR1,1 ;x=x*2 JUMP TEST EXIT POP GR2 POP GR1 RET ZERO DC 0 END ; ;GR0 に入れた文字を大文字にする TOUPPER START PUSH 0,GR1 IF CPL GR0,SMALLA ;IF 'z' >= GR0 >= 'a' JMI EXIT CPL GR0,='z' JPL EXIT THEN LD GR1,SMALLA SUBL GR1,LARGEA SUBL GR0,GR1 ENDIF DS 0 EXIT POP GR1 RET SMALLA DC 'a' LARGEA DC 'A' END ; ;文字列を反対に並べる ;GR0 は破壊される ;GR1 文字バッファアドレス ;GR2 文字数アドレス ;反対に並べる REVERSE START PUSH 0,GR3 FRONTアドレスポインタ PUSH 0,GR4 BACKアドレスポインタ LD GR3,GR1 LD GR0,0,GR2 LD GR4,GR1 ADDL GR4,GR0 BACK = FRONT + LEN -1 SUBL GR4,=1 TEST CPL GR3,GR4 FRONT - BACK < 0? JMI LOOP JUMP EXIT LOOP LD GR0,0,GR3 SWAP(*GR3,*GR4) ST GR0,WK LD GR0,0,GR4 ST GR0,0,GR3 LD GR0,WK ST GR0,0,GR4 NEXT LAD GR3,1,GR3 GR3++ LAD GR4,-1,GR4 GR4-- JUMP TEST EXIT POP GR4 POP GR3 RET WK DS 1 避難所 END

h5k3t5
質問者

お礼

とてもお忙しい中、回答くださってありがとうございます。かなり長いので苦労なさったのではないかと思います。本当にありがとうございました。 些細なことなのですが、内容に関して質問がありまして、一番最後から7行目にある『GR4--』や8行目の『GR3++』などは入力しなくてもいいのでしょうか?すいませんかなり基礎的なことですが・・・。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1>一番最後から7行目にある『GR4--』や8行目の『GR3++』などは入力しなくてもいいのでしょうか? それは、コメントなので入力しなくてもいいです。 CASLIIの仕様で、 オペランドが無い場合にコメントを書くには、セミコロン';'が必要ですが、 オペランドがある場合、 オペランドの次にスペースをはさんでコメントを書くことができます。 一般的には、統一的に;を書くようですが、仕様上はそうなっています。 入力するより、メールで来た内容をコピー&ペーストすれば、いいと思いますけどね。 以前に、割り算するルーチンなどは作ってあったので、 今回作ったのは、MAINの部分とPUTNUMだけですが、 そのために、冗長になっていますね。 まあ、使い回しができるとは思います。 なので、それほど、労力は掛かっていません。 まあ、人のプログラムを読み解くのは、難しいと思いますが、がんばって下さい。 別に、これに惑わされずに、自分でも書いてみれば良いと思います。 動作がおかしいとか、わからんとかあれば、 また、遠慮せず聞いて下さい。

h5k3t5
質問者

お礼

ありがとうございます。なんとか一通りし終えてうまく成功することができました!!まだCASL(2)をはじめて間もないですが、このような問題を自分で頑張ってできるように日々努力して行きたいと思います。ほんとうにありがとございました。また別の内容で不明な点が出てくるかも知れません。そのときはまたお世話になるかもしれませんが、よろしくお願いします。

関連するQ&A

  • CASL(II)で・・・

    CASLで キーボードから数値を入力して、それに応じて 三角形(右下が直角な直角三角形) * ** *** **** ***** や ピラミッド * *** ***** を表示したいのですが自分のでは空白を出力してか改行してしまって思い通りできません 改行しない命令があればそれを教えてください。 あと できればそのソースも載せてほしいです。。。 お願いします

  • CASL1

    CASL1の問題でわからないものがありました。お手伝いいただけると助かります。問題に解説も載っていたので一緒に載せておきます。きっとそれほど難しくない問題なのでしょうが、CASLになれない為参考書を読んでもよく理解できません。。 10進入力と数字コード 入力 1~4個の10進数字の列。 出力 入力を正の10進数とみなしたときの2進表現。但し、有効数字のみを出力すること。 例:入力 2006[Enter] 出力 11111010110(メモリーの16ビット表現をそのまま出力した 0000011111010110は不可) 解説: (1)CASLの入出力はメモリー上の連続する領域(入出力バッファ)に文字データとして置かれた内容をINマクロ、OUT マクロでバッファの名前(先頭番地に付けたラベル)、バッファの長さを指定して行う。 (2)文字列を10進数として処理するためには、各文字が意味として0~9の数値をもつこと、各桁が10の冪乗の重みをもつことを理解する必要がある。前者では文字データから数値への変換(文字0~9に対するJIS の文字コードは連続しているので文字0に対するデータを引けば数値になる)し、後者では(それまでに処理した)上位桁の数値を10倍して次の新しい桁の数値を加えればよい。CASLには乗算の命令はないので2倍したもの(左1ビットシフト)と8倍(更に左2ビットシフト)したものとを加えればよい。 (3)数値を2進数字の列として求めるには1ビットずつ処理してシフトすればよい。例えば、1とAND を取ると最下位ビットが抽出される。

  • CASLIIの問題について

    CASLIIの勉強をはじめたのですが、書籍などを調べても参考のようなものが載っておらず、どうしても分からない問題がありましたので、どなたかお分かりの方いらっしゃいましたらアドバイスをお願いいたします。 【問題】キーボードから入力し出力する電卓を作成せよ。 注)割り算は、余りも出力する事。 〔入力例〕 3 * 5 〔出力例〕 15

  • プログラミングお願いします(JAVA)

    キーボードより数値データを10件連続入力し、そのデータの平均値を求め、その平均値より大 きな値のみを1行で連続出力するプログラムを作成しなさい。平均値の小数点以下は切り捨てでかま いません。できたら配列を使い、for文やif文を使って簡単にお願いします 数値1> 81 数値2> -12 数値3> -3 数値4> 12 数値5> 16 数値6> 65 数値7> -45 数値8> 2 数値9> -74 数値10> 55 平均値 : 9 81 12 16 65 55

  • どこが間違っているのか教えてください。。

    C言語の勉強をしています。 プログラムを作成してみましたが、うまくいきません。 どこが間違っているのか、なぜそうなるのか、教えていただけると助かります。 よろしくお願いします。 あるクラスの試験の点数を整数で繰り返し入力し、点数の合計と平均点を出力するプログラムを作成しなさい。 点数は、0点以上100点以下とし、この範囲外の点(0点未満または100点より大きい点)が入力されたときは、入力を終了し、点数の合計と平均点を出力する(最後に入力された範囲外の点は集計の対象としない)。 また、平均は小数点以下2桁まで出力する。 繰り返しの命令は、何を使ってもよい。 ▼実行例 点数:10 点数:100 点数:20 点数:35 点数:120 合計:165点 平均: 41.25点 ******************************************* 考えたプログラム #include<stdio.h> int main(void) { int   ten,hito,goukei; double           heikin; goukei=0; hito=0; while(1){ printf("¥n点数:"); scanf ("%d", &ten); if(ten<0||100<ten) break; goukei=goukei+ten; hito=hito+1; break; } printf("¥n合計:%d点",goukei); heikin=(double)goukei/(double)hito; printf("¥n平均:%.2lf点",heikin); }

  • c言語プログラミングについて

    回答お願いします!! 3つの整数値をキーボードから入力し、その平均値を求めるものを出力しなさい。 ただし、3つの整数値から平均値を戻り値として返す。 関数double average(intx,inty,intz)を作成し、これを使って平均値の値を出力すること 平均値は小数第二位まで出力せよ 上記の問題がどうしても分かりません!

  • 四捨五入と切り捨て

    平均を出す問題について教えてください。 「答えは、小数点以下を切り捨てにして整数で出す。あらかじめ概数にして計算する」とあった場合、「あらかじめ概数にして」というのは、切り捨てにすればよろしいのでしょうか? それとも、四捨五入でしょうか? 教えてください。

  • C++の配列についてなんですが

    #include <iostream> using namespace std; int main() { int i,goukei=0; int kokugo[5]; float heikin; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績を入力してください\n"; cin >> kokugo[i]; goukei = goukei + kokugo[i]; } heikin = (float)goukei/5.0; cout << "平均点は" << heikin << "点です\n"; for(i=0;i<5;i++) { cout << "出席番号" << i+1 << "番の国語の成績は" << kokugo[i]; cout << "点で、平均との差は" << heikin-(float)kokugo[i] << "です\n"; } return 0; } これを基に 数学の点数も入力する 数学の平均も出力する 国語と数学の総合的な平均点も出力する ようにするにはどうすればいいんですか?

  • 確率統計の問題が分かりません。問題を教えてください

    確率統計の問題でどうしても解けない問題があり、質問させていただきます。どなたかご教授していただくと非常に助かります。 [問題] 定員150名のある体育大学の入試に500人が応募した。入試では体育の実技と国語のテストがあり,応募者 の得点分布は,実技が200点満点で平均150点、標準偏差20点,国語が100点満点で,平均45点、標準偏差 15点であった。実技の得点と国語の得点はそれそれ独立な正規分布とするとき ⑴ 実技の得点と国語の得点の合計点の平均,および,標準偏差を求めよ。 ⑵ 合計得点200点の受験生は,上から何番くらいの順位か。 ⑶ 合否のボーダーラインは,ほぼ何点か。

  • -1を使う???

     私は今C言語の学習をしています。しかし以下の問いのプログラムがなかなか出来ません・・・。どうか助けてください。お願いしますm(__)m 【問】while文とif文を使う問題 (1)キーボードから各教科のテストの点数を入力し、その合計と平均点を出力しなさい。ただし、入力データの終わりには-1を使うようにして、何科目でも対応できるようにすること。 (2)(1)と同様にキーボードから各教科のテストの点数を入力し、80~100までは優、65~79までは良、50~64までは可、0~49までは不可とし、それぞれの各科目数を出力しなさい。 (3)(1)と同様にキーボードから各教科のテストの点数を入力し、最高点と最低点を出力しなさい。 私は(1)に対してまず、科目数が決められている場合の合計と平均を求めるプログラムを作りました。 そのあと、それを何科目でも対応できるようにfor文を使い書き換えました。 そしてif文をつかって-1が入力されたら、breakとしました。しかしそれではwhile文をまったく使っていないのです・・・。どうしたらいいのでしょう? 何科目にでも対応させるというのは・・・?

専門家に質問してみよう