• ベストアンサー

やさしいJavaで理論演算子をやったのですが、写真

やさしいJavaで理論演算子をやったのですが、写真の通りに入力した際に ifの (res == "y" ~ ) の部分と else ifの (res == "n" ~ ) の部分がエラーになり 「非互換オペランド型charとString」 となり、実効出来ないです。 カッコの中がエラーとなってます。 なにか分かりませんか?よろしくお願いします

  • PHP
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.1

resはcharでしょうか? resはchar、"y"は文字列となります。 charなら'y'と記述します。

youno87ntsy
質問者

お礼

なるほど、そんな簡単な所で間違っていたのですね! ありがとうございます!

その他の回答 (1)

  • memphis
  • ベストアンサー率40% (975/2395)
回答No.2

書籍の通りに設定しましょう。 >(res == "y" ~ ) 本には、'y'と書いてあります。 ”で囲むとString型です。'はchar型です。

youno87ntsy
質問者

お礼

文章をもっとしっかり見るべきでしたね!初歩的なミスだったのですか!ありがとうございます!

関連するQ&A

  • 【JAVAエラー】互換性のない型、演算子が適用されませんetc

    学校の課題で電卓を作っています。 dentaku.BOはabstractではなく、java.awtevent.ActionListener内の abstractメソッド actionPerformed(java.awt.event.ActionEvent) をオーバーライドしません というエラーと、 互換性のない型 検出値:java.lang.String 期待値:boolean if(fugo="+") ^ と、 演算子 - はjava.lang.String,java.lang.String に適応出来ません str= num1-num2; ^ この3種類のエラーはざくざく出てくるのですが、具体的にどう修正したらいいのか分かりません。どなたか教えてくださいm(_ _)m ソース載せようとしたら文字数オーバーしてしまいましたorz

  • C++で>>演算子のオーバーロード

    C++学習者です。 Visual Studio Community 上で、ある教本を使って勉強しています。 現在Stringというクラスを作って、文字列に対して連結や部分文字列の取り出しなどができるようにするための色々な演算子のオーバーロードをする関数を定義していますが、疑問点がありますので、お聞きしたいと思います。 Stringクラスのプライベート変数は、文字列の長さを表すlength と、new 演算子で動的に確保するメモリー領域の始まりのアドレスを表す *sPtr の二つです。 クラス内ではパブリックなメンバー関数としていろいろな演算子がオーバーロードされていて、これらについてはよく理解できるのですが、friend 関数として定義されている入力演算子(>>)について納得がいかない部分があります。 その関数は次のようになっています。 istream &operator>>(istream &input, String &s) { char temp[100]; input >> setw(100) >> temp; s = temp; return input; } わからないのは s = temp; の部分です。 sはStringクラスのオブジェクトで、temp は単なる文字列なのに、なぜ代入できるのでしょうか? 代入演算子=のオーバーロード関数も下に挙げますが、この中でも単なる文字列をStringクラスのオブジェクトに代入できるようにはなってないように見えます。 const String &String::operator=(const String &right) { if (&right != this){ // avoid assignment of itself delete [ ] sPtr; length = right.length; sPtr = new char[ length + 1]; strcpy(sPtr, right.sPtr); } else cout<< "attempted to assign a String to itself \n\n"; return *this; } どなたか答えて頂けると有難いです。

  • 演算対象の数字と演算子を入力して計算させる

    数字と演算子をそれぞれ入力し、優先順位の高い順に四則演算させるにはどのような考え方をすればよいのでしょうか。 数字をa[7]とおいて、演算子をop[7]としてそれぞれ配列に格納しましたが、そこから先に進めません。 オペランドと演算子の組み合わせならば優先順に計算してくれるのはわかっていますが、オペランドと演算子を格納した配列では上手く行きません。 実は既に全ての演算子の組み合わせをIfで表示させるプログラムを根性で作ったのですが、最適解を知りたいです。 言語はCでvisualstudioを使っております。 条件はn回数字を入力したらn-1回演算子を入力し、n回目に=を入力する。nの最大値は7とする。です。 だらだらと見辛い文章で申し訳ありませんが、何卒宜しくお願いします。

  • not演算子についてなんですけど

    つまらない質問ですみません。 char x,y; x = 0x01 + 0x00 + 0x04 + 0x03 + 0x02;    y = ~x; printf("%x\n", x); printf("%x\n", y); これを実行したところ xにはaと表示されたんですが、yにはfffffff5と表示されました。 なぜ「fffffff5」なんでしょうか?ただの「5」だと思うんですけど。 xは2進数で1010で、yはnot演算子より0101になるので 16進数では5ではないんでしょうか・・・? 変な質問ですみません。 お願いします。。。

  • perlの論理演算子の「and」と「&&」の違い

    perlの論理演算子の「and」と「&&」の違いは、 「弱い結合」と「強い結合」とかで説明されている のを見かけますが、これは、 「短絡評価」(左側が偽だと右側が実行されない)と 「短絡評価でない」(左側の真偽に関係なく右側が実行される) のと同じ意味になるのでしょうか。 例えば、 sub x {  print "sub x\n";  return 0; } sub y {  print "sub y\n";  return 1; } の2つのサブルーチンがある場合に、 (1) if(&x==1 and &y==1){    print '真',"\n";   } else {    print '偽',"\n";   } (2) if(&x==1 && &y==1){    print '真',"\n";   } else {    print '偽',"\n";   } を、実行した場合、サブルーチンyは、 (1)では実行されず、(2)では実行される という理解で正しいでしょうか。 (実際にはどちらも実行されていないようなのですが)

    • ベストアンサー
    • Perl
  • 四則演算のプログラム

    自力で解きたかったのですが、二時間考えても、とけないので 投稿させていただきます。どこを直せばよいのでしょうか 実行するときは%プログラム名 + 5 12 と入力して実行したいです。加えて参照にしている部分の %の扱いについても教えていただけると幸いです。 #include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]){ char kigou; double num1,num2; kigou=atof(argv[1]); num1=atof(argv[2]); num2=atof(argv[3]); if(kigou=='+'){ printf("%f+%f=%f\n",num1,num2,num1+num2); } else if(kigou=='-'){ printf("%f-%f=%f\n",num1,num2,num1-num2); } else if(kigou=='x'){ printf("%f*%f=%f\n",num1,num2,num1*num2); } else if(kigou=='/'){ printf("%f/%f=%f\n",num1,num2,num1/num2); } /* else if(kigou=='%'){ printf("%f%%f=%f\n",num1,num2,num1%num2); }*/ else{ printf("Please input +,-,x,%%.\n");} }

  • java

    Base64にエンコードしたものをデコードするプログラムです。(汎用性が低いのは仕様です)コンパイルは通ったのですが、実行したら以下のエラーが出てきました。 C:\Users\Owner\Documents\javadev>java Base64Decode2 hello.dat hello2.txt java.lang.ArrayIndexOutOfBoundsException: 97 at Base64Decode2.decode(Base64Decode2.java:51) at Base64Decode2.main(Base64Decode2.java:23) 指定の行を見ても原因がよく分かりません。とても初歩的な質問なのかもしれませんが、お願いします。 以下がプログラムコードです import java.io.*; public class Base64Decode2 { public static void main(String[] args) { // 変換テーブル char[] table = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; InputStream in = null; // 入力データ OutputStream out = null; // 出力先 try { in = new FileInputStream(args[0]); out = new FileOutputStream(args[1]); char[] cs; while ((cs=read4(in)) != null) { int[] buf = decode(cs, table);//ここが問題? for (int i=0; i<buf.length; i++) { System.out.print(buf[i]+", "); } System.out.println(); int[] buf2 = convert6to8(buf); write3(out, buf2); } } catch (Exception e) { e.printStackTrace(); // 例外の情報を表示する } finally { // in, out を閉じる try { in.close(); out.close(); } catch (Exception e) { } } } /** * 8ビットの2進数の列を復号化する. * @param cs * @param table 符号テーブル * @return */ public static int[] decode(char[] cs, char[] table) { int[] buf = new int[cs.length]; for (int i=0; i<buf.length; i++) { buf[i] = table[cs[i]];//ここが問題? } return buf; } public static int[] convert6to8(int[] buf) { String b; int[] buf2; if (buf.length == 2) { b = toBinary(buf[0], 6); buf2 = new int[1]; buf2[0] = fromBinary(b.substring(0, 8)); } else if (buf.length == 3) { b = toBinary(buf[0], 6) + toBinary(buf[1], 6); buf2 = new int[2]; buf2[0] = fromBinary(b.substring(0, 8)); buf2[1] = fromBinary(b.substring(8, 16)); } else { b = toBinary(buf[0], 6) + toBinary(buf[1], 6) + toBinary(buf[2], 6); buf2 = new int[3]; buf2[0] = fromBinary(b.substring(0, 8)); buf2[1] = fromBinary(b.substring(8, 16)); buf2[2] = fromBinary(b.substring(16, 24)); } return buf2; } /** * バイト列 bt の数を順に出力する. * @param bt 数の配列。長さは 3以下. 各数は8ビットの整数 */ public static void write3(OutputStream out, int[] bt) throws IOException { for (int i=0; i<3; i++) { if (i<bt.length) { out.write(bt[i]); } } } /** * in から文字を最大4つ読み出す. * @param in 入力ストリーム * @return 文字の配列。配列長は最大4. 入力終了したときには null を返す. */ public static char[] read4(InputStream in) throws IOException { char[] bs; int n0=in.read(); int n1=in.read(); int n2=in.read(); int n3=in.read(); if (n0 < 0) { // 読み込み終了 bs = null; } else if (n2 < 0 || (char) n2=='=') { bs = new char[2]; bs[0] = (char) n0; bs[1] = (char) n1; } else if (n3 < 0 || (char) n3=='=') { bs = new char[3]; bs[0] = (char) n0; bs[1] = (char) n1; bs[2] = (char) n2; } else { bs = new char[4]; bs[0] = (char) n0; bs[1] = (char) n1; bs[2] = (char) n2; bs[3] = (char) n3; } return bs; } /** * 数を読み取って、nビットの2進数を表す文字列に変換する * @param bt 1バイトの数 * @param n 2進数のビット数 * @return 2進数を表す文字列 */ public static String toBinary(int bt, int n) { String s = Integer.toBinaryString(bt); for (int i=s.length(); i<n; i++) { s = "0" + s; } return s; } /** * 2進数を表す文字列を数に変換する * @param b 2進数を表す文字列 * @return b が表す数 */ public static int fromBinary(String b) { return Integer.parseInt(b, 2); } }

    • ベストアンサー
    • Java
  • C++

    ICPCの過去問です。 問題文:http://www.deqnotes.net/acmicpc/p0003/ja 過去問を解いたのですが実行が上手くいかずに困っています。 私の書いたソースコード: #include <iostream> #include <string> using namespace std; class Line{ public: char* Read(){ char number[1024];//数字を入れる配列 static char sentence[76];//できあがった文字列を入れる配列 char word;//現在の文字 int i=0;//カウンタ int s=0;//sentenceのカウンタ int y=0;//数字が何回連続したかを数える char one[5]={'.',',','!','?',' '}; char two[3]={'a','b','c'}; char three[3]={'d','e','f'}; char four[3]={'g','h','i'}; char five[3]={'j','k','l'}; char six[3]={'m','n','o'}; char seven[4]={'p','q','r','s'}; char eight[3]={'t','u','v'}; char nine[4]={'w','x','y','z'}; int c; while(c = getchar() != '\n'){//数を一文字ずつ配列にいれていく number[i] = c; i++; } for(int x=0;x<(i+1);x++){ if(number[x]=='0'){ if(word == 'N'){} else{sentence[s]=word;s++;y=0;word='N';} } else{ if(number[x]=='1'){ word=one[y]; y++; y=y%5;} else if(number[x]=='2'){ word=two[y]; y++; y=y%3;} else if(number[x]=='3'){ word=three[y]; y++; y=y%3; } else if(number[x]=='4'){ word=four[y]; y++; y=y%3; } else if(number[x]=='5'){ word=five[y]; y++; y=y%3; } else if(number[x]=='6'){ word=six[y]; y++; y=y%3; } else if(number[x]=='7'){ word=seven[y]; y++; y=y%4; } else if(number[x]=='8'){ word=eight[y]; y++; y=y%3; } else{ word=nine[y]; y++; y=y%4; } } } sentence[i]='N'; return sentence;//配列の先頭のポインタを返す } }; int main(){ int n;//行数 cin>>n; getchar();//改行をとる char *first[n]; int i; int x=0; char ch; char *Fir; for(i=0;i<n;i++){ Line line; first[i] = line.Read(); } for(int j=0;j<i;j++){ Fir = first[i]; while((ch = Fir[x]) != 'N'){ cout << ch ; x++; } cout << '\n'; } return 0; } 実行結果: 1 20 Segmentation fault となってしまいます。 coutやコメントアウトで動きを追ってみたところ、下から8行目くらいのwhile文がなければ、segumentation faultはおきませんでした。ポインタの扱いが間違っているのかなとは思うのですが、どこが悪いのか考えても分かりません。どなたか教えてください。

  • Javaのeval関数処理

    Javaのeval関数処理 はじめまして、こんばんわ。 いつも利用させて頂いております。 現在、Javaの課題を出されており、InputStreamを使って、1行の四則計算のプログラムを作成しております。 もうすこしで成功!!っというところで、減算の処理がDoubleでキャストしたときに例外として処理されてしまうため、非常に困っております。 もしよろしければどなたかご教授おねがいします。 protected String startCalc(String numerical) { // 初期値を設定 double addVal = 0; double minusVal = 0; while (true) { String val; // 加算演算子の位置を検索 int addPosition = numerical.indexOf("+"); if (addPosition < 0) { val = numerical; } else { // 加算の演算子の前の式 val = numerical.substring(0, addPosition); } // 乗算、除算の計算を行う addVal += procCalc(val); if (addPosition < 0) { break; } else { // 加算の演算子の後の式 numerical = numerical.substring(addPosition + 1); } } return new DecimalFormat("0").format(addVal + minusVal); } private double procCalc(String numerical) { // 乗算、除算の初期値を設定 double valNum = 1; while (true) { String mNum = ""; // 乗算の演算子の位置を取得 int multiPosition = numerical.indexOf("*"); if (multiPosition < 0) { mNum = numerical; } else { // 乗算の前の式を抜き取る mNum = numerical.substring(0, multiPosition); } int kai = 0; double value = 1; while (true) { String dNum = ""; int dPosition = mNum.indexOf("/"); // "/"がない場合 if (dPosition < 0) { dNum = mNum; } else { // 最初の / より前の項 dNum = mNum.substring(0, dPosition); } // 最初の計算の場合 if (kai == 0) { value = Double.parseDouble(dNum); // TODO マイナスの場合、ここで例外 } else { value /= Double.parseDouble(dNum); } // "/"がない場合 if (dPosition < 0) { break; } else { kai++; // 最初の / より以降の項 mNum = mNum.substring(dPosition + 1); } } valNum *= value; // "*"がない場合 if (multiPosition < 0) { break; } else { // 乗算の演算子の位置を取得 numerical = numerical.substring(multiPosition + 1); } } return valNum; } }

    • ベストアンサー
    • Java
  • javaプログラムについて

    javaのプログラムで入力項目をDBに書き込むというプログラムを作成しているのですが、 コンソール形式だと成功するのですが、テキストボックスなどをおいて、GUI形式でやろうとするとキーイベントの中の変数ににうまく値が参照されません 以下ソース import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import java.awt.Container; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.sql.Statement; import java.text.SimpleDateFormat; import java.util.Date; class meibo3 extends JFrame implements KeyListener { public static void main(String args[]) { meibo3 frame = new meibo3("タイトル"); frame.setVisible(true); } // private String name; // private String shu; // private int id; // private int su; meibo3(String title) { setTitle(title); setBounds(100, 100, 300, 250); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JPanel p = new JPanel(); p.setLayout(null); JLabel lmeibo = new JLabel("【名簿入力】", SwingConstants.CENTER); lmeibo.setBounds(100, 10, 80, 30); JLabel lgakuno = new JLabel("学生番号", SwingConstants.CENTER); lgakuno.setBounds(30, 40, 80, 30); JLabel lname = new JLabel("氏 名", SwingConstants.CENTER); lname.setBounds(200, 40, 80, 30); JLabel lshu = new JLabel("入力を終了しますか?(Y/N)"); lshu.setBounds(30, 120, 200, 30); JTextField gaku = new JTextField(4); gaku.setBounds(30, 70, 80, 30); JTextField namae = new JTextField(20); namae.setBounds(200, 70, 80, 30); JTextField y = new JTextField(20); y.setBounds(200, 120, 20, 30); y.addKeyListener(this); ; p.add(lmeibo); p.add(lgakuno); p.add(lname); p.add(gaku); p.add(namae); p.add(y); p.add(lshu); Container contentPane = getContentPane(); contentPane.add(p, BorderLayout.CENTER); int id = Integer.valueOf(gaku.getText()).intValue(); String name = namae.getText(); int nsu = namae.getText().length(); String yn =y.getText(); //method(id,name,nsu,yn); } public void keyPressed(KeyEvent ke) { // TODO 自動生成されたメソッド・スタブ if (ke.getKeyCode() == ke.VK_ENTER) { //private void method(int id, String name, int nsu, String yn){ Date d = new Date(); SimpleDateFormat dfd = new SimpleDateFormat("yyyy-MM-dd"); Connection con = null; String day = dfd.format(d); // System.out.print(day); PreparedStatement ps = null; try { // ドライバクラスをロード Class.forName("com.mysql.jdbc.Driver"); // データベースへ接続 con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/hellodb", "root", "root"); Statement stmt = (Statement) con.createStatement(); // name,bloodType,ageのデータを検索するSQL文を作成 String sql = "INSERT INTO hellodb.meibo VALUES(" + id + ",'" + name + "','" + day + "');"; System.out.println(sql); if (id > 4 && nsu > 20) { // JOptionPane.showMessageDialog(this, "学生番号が4桁以上、氏名が20文字以上になっています。", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (id < 5) { // JOptionPane.showMessageDialog(this, // "学生番号が4桁以上になっています", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (nsu > 20) { // JOptionPane.showMessageDialog(this, // "氏名が20文字以上になっています。", "Error", // JOptionPane.ERROR_MESSAGE); } else { if (yn.equals("y") || yn.equals("y") || yn.equals("Y") || yn.equals("Y")) { // ps = con.prepareStatement(sql); stmt.execute(sql); // JOptionPane.showMessageDialog(this, // "成功しました", "Info", // JOptionPane.INFORMATION_MESSAGE); } else if (yn.equals("n") || yn.equals("n") || yn.equals("N") || yn.equals("N")) { } } } } } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } finally { try { // close処理 if (ps != null) { ps.close(); } // close処理 if (con != null) { con.close(); } } catch (SQLException e) { e.printStackTrace(); } } } } public void keyReleased(KeyEvent arg0) { // TODO 自動生成されたメソッド・スタブ } public void keyTyped(KeyEvent arg0) { // TOD

専門家に質問してみよう