ktanaka@ux019> java -version java version "1.3.0" Java(TM) 2 Runtime Environment, Standard Edition (build 1.3.0) Java HotSpot(TM) Client VM (build 1.3.0, mixed mode)のようにして,バージョンを確認するように.
BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
str=d.readLine();
のようにBufferedReader を作っている人がいた.続けて入力を繰り返す場合
は最初に一度だけ作って,d.readLine()を繰り返すようにしないとおかしな結
果が得られることがある(課題提出プログラムではうまくいかないはず).
dell.tanaka.ecc.u-tokyo.ac.jp% java Kadai1025 10 10.0 * 3 30.0 + 4 34.0 / 4 8.5 - 0.5 8.0 =
//名前 XXXXX
//学生証番号 XXXXXX
//a,rは変数,bは記号に使いました。
//まずaに数字を入力します。
//その後ループに入り,記号、数字、記号のように入力していきます。
//ループは無限に続き,=を入力することで終了し,結果を返します。
import java.io.*;
class Kadai1025{
public static void main(String[] args) throws IOException{
BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
System.out.println("数字の入力");
double r=Double.parseDouble(d.readLine());
for (;;){
System.out.println("四則演算記号または等号の入力");
String b=d.readLine();
if(b.equals("=")){
System.out.println("終了しました");
System.out.println("結果は"+r+"です");
break;
}
else{
System.out.println("数字の入力");
double a=Double.parseDouble(d.readLine());
if(b.equals("+"))
r=r+a;
else if(b.equals("-"))
r=r-a;
else if(b.equals("*"))
r=r*a;
else if(b.equals("/"))
r=r/a;
else System.out.println("四則演算記号の入力が間違っています");
System.out.println(r);
}
}
}
}
//名前:XXXX
//学生証番号:XXXX
//入力した演算子に応じて変数modeが変化し,modeの値によって数字入力直後に
//分岐するようにしました。ただ、数字入力の時に数字以外のものを入力すると
//エラーが起きるのに対して,どのように対応したらいいのか良くわかりません(
//わかれば再提出します)。
import java.io.*;
class Kadai1025{
public static void main(String[] args) throws IOException{
BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
String num;
int mode=0;
double result=0;
toploop: for(;;){
System.out.print("数字を入力してください(=を入力すると終了します)>");
num=d.readLine();
if(num.equals("=")) break;
switch(mode){
case 0:
result=result+Double.parseDouble(num);
break;
case 1:
result=result-Double.parseDouble(num);
break;
case 2:
result=result*Double.parseDouble(num);
break;
case 3:
result=result/Double.parseDouble(num);
break;
}
System.out.println(result);
for(;;){
System.out.print("演算子(+,-,*,/)を入力してください(=を入力すると終了し
ます)>");
mode=5;
num=d.readLine();
if(num.equals("=")) break toploop;
if(num.equals("+")) mode=0;
if(num.equals("-")) mode=1;
if(num.equals("*")) mode=2;
if(num.equals("/")) mode=3;
if(mode!=5) break;
if(mode==5)System.out.println("適切な演算子が入力されませんでした。");
}
}
}
}
/* 簡易電卓プログラム
学生番号 : XXXXX
氏名 : XXXXX
コンストラクタを使って本格的なものにしようと思いましたが、時間がなくて
こんなモノになってしまいました(泣
月曜のオプションでリベンジします(笑
*/
import java.io.*;
class Kadai1025 {
public static void main(String args[]) throws IOException {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double answer;
dentaku den = new dentaku();
System.out.println("Please input a number!");
answer = den.keisan(br , Double.parseDouble(br.readLine()));
System.out.println("Final answer: " + answer);
}
catch (IOException e) {
System.err.println("Error!");
}
}
}
class dentaku {
double keisan(BufferedReader br , double val) throws IOException {
try {
System.out.println("answer: " + val);
String s = br.readLine();
char c = s.charAt(0);
if ((Character.isDigit(c)) == true)
val = keisan(br , (Double.parseDouble(s)));
else if (c != '=') {
switch (c) {
case '+':
val = keisan(br , (val + Double.parseDouble(br.readLine())));
break;
case '-':
val = keisan(br , (val - Double.parseDouble(br.readLine())));
break;
case '*':
val = keisan(br , (val * Double.parseDouble(br.readLine())));
break;
case '/':
val = keisan(br , (val / Double.parseDouble(br.readLine())));
break;
default:
System.err.println("Error!");
break;
}
}
}
catch (IOException e) {
System.err.println("Error!");
}
return val;
}
}
//名前: XXXXX
//学生証番号: XXXXX
//とりあえず配列を使ってみようとしてこういう形になりました。
//if~elseの羅列にしたくなかったのでswitchを使ったのですが
//caseの値にstringが使えないことから下のような回りくどい
//プログラムになってしまいました。
//配列を使用しない方がスマートに書けたかもしれません。
//それともう一つ。
//入力の順番に関して、下記(a)の行がなかったとき
//(最初に入力されるのが演算子の場合)には、プログラムは
//正常動作しているにも関わらず課題提出でエラーが出て
//困ってしまいました。入力サンプルを良く見れば
//すぐ気づいたのでしょうが、思わぬところで
//足をすくわれてしまいました。
import java.io.*;
class Kadai1025
{
public static void main(String[] args) throws IOException
{
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
double tmp = 0;
String a , b;
String s[] = {"+","-","*","/","="};
boolean state = true;
tmp = Double.parseDouble(buf.readLine()); //(a)
while(state)
{
System.out.println(tmp);
a = buf.readLine();
b = buf.readLine();
//if~elseを羅列するのがいやだったのでこんなやってみました
//でも回りくどいですねぇ
for(int i=0;i<5;i++)
{
if(a.equals(s[i]))
{
switch(i)
{
case 0:
tmp+=Double.parseDouble(b);
break;
case 1:
tmp-=Double.parseDouble(b);
break;
case 2:
tmp*=Double.parseDouble(b);
break;
case 3:
tmp/=Double.parseDouble(b);
break;
case 4:
state = false;
}
}
}
}
}
}
解答例(1)
時間があったので少し改良してみました。
今度は関数電卓のように答えを覚えれるようにしました。
まだまだ三角関数などは入れることができますが同じ繰り返しなので省きました。
説明書
使える記号は+,-,*,/,log,e,pow1,pow2です。
logは自然対数値を e は自然対数の巾乗をpow1はAnsの〜乗をpow2は〜のAns乗を計算します。
log,eは
Ans=2.0 Ans=1.0
+ log
log とも Ans=0.0 使えます。
1
Ans=2.0
一度 = を入力するとAns[1]を覚えれます。
覚えたすぐ後にまた = を入力すると答えを覚えるのをやめ
答え同士の計算になります。ここでは 1 は Ans[1]のことです。
使える演算子はさっきまでと同じです
終了はもう一度 = を入力します。
プログラム
import java.io.*;
class keisan{
public static void main(String[] args) throws IOException{
BufferedReader d=new BufferedReader(new InputStreamReader(System.in));
int x;
double y[]=new double[10000];
toploop: for(x=1;;x++){
double Ans;
for(;;){
String a=d.readLine();
if(a.equals("="))break toploop;
try{
Ans=Double.parseDouble(a);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
break;
}
System.out.println("Ans="+Ans);
for(;;){
String sign,suji;
sign=d.readLine();
double fig;
if(sign.equals("="))break;
if(sign.equals("+")){
for(;;){
suji=d.readLine();
if(suji.equals("log")){
suji=d.readLine();
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans+Math.log(fig);
System.out.println("Ans="+Ans);
break;
}
else if(suji.equals("e")){
suji=d.readLine();
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans+Math.exp(fig);
System.out.println("Ans="+Ans);
break;
}
else{
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans+fig;
System.out.println("Ans="+Ans);
break;
}
}
}
else if(sign.equals("-")){
for(;;){
suji=d.readLine();
if(suji.equals("log")){
suji=d.readLine();
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans-Math.log(fig);
System.out.println("Ans="+Ans);
break;
}
else if(suji.equals("e")){
suji=d.readLine();
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans-Math.exp(fig);
System.out.println("Ans="+Ans);
break;
}
else{
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans-fig;
System.out.println("Ans="+Ans);
break;
}
}
}
else if(sign.equals("*")){
for(;;){
suji=d.readLine();
if(suji.equals("log")){
suji=d.readLine();
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans*Math.log(fig);
System.out.println("Ans="+Ans);
break;
}
else if(suji.equals("e")){
suji=d.readLine();
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans*Math.exp(fig);
System.out.println("Ans="+Ans);
break;
}
else{
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans*fig;
System.out.println("Ans="+Ans);
break;
}
}
}
else if(sign.equals("/")){
for(;;){
suji=d.readLine();
if(suji.equals("log")){
suji=d.readLine();
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans/Math.log(fig);
System.out.println("Ans="+Ans);
break;
}
else if(suji.equals("e")){
suji=d.readLine();
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans/Math.exp(fig);
System.out.println("Ans="+Ans);
break;
}
else{
try{
fig=Double.parseDouble(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Ans/fig;
System.out.println("Ans="+Ans);
break;
}
}
}
else if(sign.equals("log")){
Ans=Math.log(Ans);
System.out.println("Ans="+Ans);
}
else if(sign.equals("e")){
Ans=Math.exp(Ans);
System.out.println("Ans="+Ans);
}
else if(sign.equals("pow1")){
for(;;){
try{
fig=Double.parseDouble(d.readLine());
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Math.pow(Ans,fig);
System.out.println("Ans="+Ans);
break;
}
}
else if(sign.equals("pow2")){
for(;;){
try{
fig=Double.parseDouble(d.readLine());
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
Ans=Math.pow(fig,Ans);
System.out.println("Ans="+Ans);
break;
}
}
else{
System.out.println("記号を入力してください");
}
}
y[x]=Ans;
System.out.println("Asn["+x+"]="+y[x]);
}
toploop: for(;;){
double Ans;
int n;
for(;;){
String a=d.readLine();
if(a.equals("="))break toploop;
try{
n=Integer.parseInt(a);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(n<1 || n >x-1){
System.out.println("Ans["+n+"]は定義されてません");
}
else{
Ans=y[n];
break;
}
}
System.out.println("Ans="+y[n]);
for(;;){
String sign,suji;
sign=d.readLine();
int fig;
if(sign.equals("="))break toploop;
if(sign.equals("+")){
for(;;){
suji=d.readLine();
if(suji.equals("log")){
suji=d.readLine();
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans+Math.log(y[fig]);
System.out.println("Ans="+Ans);
break;
}
}
else if(suji.equals("e")){
suji=d.readLine();
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans+Math.exp(y[fig]);
System.out.println("Ans="+Ans);
break;
}
}
else{
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans+y[fig];
System.out.println("Ans="+Ans);
break;
}
}
}
}
else if(sign.equals("-")){
for(;;){
suji=d.readLine();
if(suji.equals("log")){
suji=d.readLine();
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans-Math.log(y[fig]);
System.out.println("Ans="+Ans);
break;
}
}
else if(suji.equals("e")){
suji=d.readLine();
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans-Math.exp(fig);
System.out.println("Ans="+Ans);
break;
}
}
else{
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans-y[fig];
System.out.println("Ans="+Ans);
break;
}
}
}
}
else if(sign.equals("*")){
for(;;){
suji=d.readLine();
if(suji.equals("log")){
suji=d.readLine();
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans*Math.log(y[fig]);
System.out.println("Ans="+Ans);
break;
}
}
else if(suji.equals("e")){
suji=d.readLine();
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans*Math.exp(y[fig]);
System.out.println("Ans="+Ans);
break;
}
}
else{
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans*y[fig];
System.out.println("Ans="+Ans);
break;
}
}
}
}
else if(sign.equals("/")){
for(;;){
suji=d.readLine();
if(suji.equals("log")){
suji=d.readLine();
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans/Math.log(y[fig]);
System.out.println("Ans="+Ans);
break;
}
}
else if(suji.equals("e")){
suji=d.readLine();
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans/Math.exp(y[fig]);
System.out.println("Ans="+Ans);
break;
}
}
else{
try{
fig=Integer.parseInt(suji);
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Ans/y[fig];
System.out.println("Ans="+Ans);
break;
}
}
}
}
else if(sign.equals("log")){
Ans=Math.log(Ans);
System.out.println("Ans="+Ans);
}
else if(sign.equals("e")){
Ans=Math.exp(Ans);
System.out.println("Ans="+Ans);
}
else if(sign.equals("pow1")){
for(;;){
try{
fig=Integer.parseInt(d.readLine());
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Math.pow(Ans,y[fig]);
System.out.println("Ans="+Ans);
break;
}
}
}
else if(sign.equals("pow2")){
for(;;){
try{
fig=Integer.parseInt(d.readLine());
}
catch(java.lang.NumberFormatException e){
System.out.println("数字を入力してください");
continue;
}
if(fig<1 || fig >x-1){
System.out.println("Ans["+fig+"]は定義されてません");
}
else{
Ans=Math.pow(y[fig],Ans);
System.out.println("Ans="+Ans);
break;
}
}
}
else{
System.out.println("記号を入力してください");
}
}
}
}
}
10月25日のオプション課題: 電卓プログラムというと、改造していけば数式をそのまま計算できるようにな り、変数が使えるようになり(bcコマンドみたいに)、果てはプログラム言語に まで発展しかねませんが、ここでは「普通の」電卓(関数電卓でない)の便利さ を活かしつつすこし発展させ、メモリを10個使えるようにしたプログラムをつ くりました。 使い方は以下の通りです。 起動: java OptKadai1025 java OptKadai10252個目の例では、数値 があらかじめ入力された状態で起動されます。 起動後の入力 (大文字と小文字は区別しないが、余計なスペースはだめ): +<数値> 現在の数値に加算する <数値> 現在の数値に加算する(省略形) -<数値> 現在の数値に減算する *<数値> 現在の数値に乗算する /<数値> 現在の数値に除算する r 現在の数値の正の平方根を取る c 現在の数値を0.0にする q 終了する mp メモリの内容を表示する m = 番目のメモリを現在の数値に設定する m + 番目のメモリに現在の数値を加算する m - 番目のメモリに現在の数値を減算する m * 番目のメモリに現在の数値を乗算する m / 番目のメモリに現在の数値を除算する m c 番目のメモリを0.0にする m r 現在の数値を 番目のメモリの値にする ( は0から9までの数) 以下、コードです。 ########################## プログラムの始まり [OptKadai1025.java] import java.io.*; class OptKadai1025 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double acc = 0.0, mem[] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; if (args.length > 1) // 引数は0個か1個 { System.err.println("Too many arguments; " + "excessive arguments will be ignored."); } if (args.length >= 1) // 引数は数値と見做して累算器を初期化 { try { acc = Double.parseDouble(args[0]); } catch (NumberFormatException nfe) { System.err.println("Bad argument; ignored."); } } while (true) // 無限ループ { System.out.print("[ " + acc + " ] "); // プロンプト表示 System.out.flush(); char inputChars[] = br.readLine().toCharArray(); if (inputChars.length > 0) // 空行は無視 { switch (inputChars[0]) { case '+': case '-': case '*': case '/': try { double inputNum = Double.parseDouble (String.valueOf(inputChars, 1, inputChars.length - 1)); switch (inputChars[0]) { case '+': acc += inputNum; break; case '-': acc -= inputNum; break; case '*': acc *= inputNum; break; case '/': if (inputNum != 0.0) // オーバーフローは強制終了にまかせるが0除算は確認 { acc /= inputNum; } else { System.err.println("Cannot divide by zero."); } break; } } catch (NumberFormatException nfe) { System.err.println("Syntax error: bad number format."); } break; case 'R': // acc = sqrt(acc) case 'r': if (inputChars.length == 1) { acc = Math.sqrt(acc); } else { System.err.println("Syntax error."); } break; case 'C': // acc = 0.0 case 'c': if (inputChars.length == 1) { acc = 0.0; } else { System.err.println("Syntax error."); } break; case 'M': // メモリ操作 case 'm': if (inputChars.length == 2) { switch (inputChars[1]) { case 'P': case 'p': System.out.print(" M0 = " + mem[0]); System.out.print("\tM1 = " + mem[1]); System.out.print("\tM2 = " + mem[2]); System.out.print("\tM3 = " + mem[3]); System.out.println("\tM4 = " + mem[4]); System.out.print(" M5 = " + mem[5]); System.out.print("\tM6 = " + mem[6]); System.out.print("\tM7 = " + mem[7]); System.out.print("\tM8 = " + mem[8]); System.out.println("\tM9 = " + mem[9]); break; default: System.err.println("Syntax error."); break; } } else if (inputChars.length == 3) { try { int memInd = Integer.parseInt (String.valueOf(inputChars, 1, 1)); switch (inputChars[2]) { case '=': mem[memInd] = acc; break; case '+': mem[memInd] += acc; break; case '-': mem[memInd] -= acc; break; case '*': mem[memInd] *= acc; break; case '/': if (acc != 0.0) // オーバーフローは強制終了にまかせるが // 0除算は確認 { mem[memInd] /= acc; } else { System.err.println("Cannot divide by zero."); } break; case 'C': case 'c': mem[memInd] = 0.0; break; case 'R': case 'r': acc = mem[memInd]; break; default: System.err.println("Syntax error."); break; } } catch (NumberFormatException nfe) { System.err.println("Syntax error."); } } else { System.err.println("Syntax errer."); } break; case 'Q': // 終了 case 'q': if (inputChars.length == 1) { System.exit(0); } else { System.err.println("Syntax error."); } default: // 数値だけなら加算 try { double inputNum = Double.parseDouble (String.valueOf(inputChars)); acc += inputNum; } catch (NumberFormatException nfe) { System.err.println("Syntax error: bad number format."); } break; } // switch } // if (inputChars.length > 0) } // while (true) } // main() } // class OptKadai1025 ########################## プログラムの終り
Forbidden You don't have permission to access /~ktanaka/programming00/kadai1101.html on this server.とうメッセージが出てアクセ スできないはずである.17:00以降にも同様のエラーが出る時は,Shiftキーを 押しながら,再読み込み(Reload)を押してみること.