メソッドを作る課題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
たかし
記事: 48
登録日時: 12年前

メソッドを作る課題

#1

投稿記事 by たかし » 12年前

大学の課題で以下のような問題が出されましたが、コンパイルがうまく通りません。

《問題文》
長い文字列の先頭の5文字と最後の5文字をプリントし、その間に.....(5つのドット)をプリントするメソッドを作成しなさい。これらは3行に分けてプリントする

"Hellomynameistakeshi"という文字列なら
Hello
.....
keshi
とプリントする

そして、以下が私の作ったプログラムです。

コード:

class period
{
	
	void exchange(char dst[]){
		int i=0;
		int k=0;
		while(dst[i]!=0){
			k++;
		}
		
		for(i=0;i<5;i++){
			System.out.print(dst[i]);
		}
		System.out.println();
		for(i=0;i<5;i++){
			System.out.print('.');
		}
		System.out.println();
		for(i=k-5;i<k;i++){
			System.out.print(dst[i]);
		}
		
	}
}
class report22
{
	public static void main(String args[]){
		
		period p;
		p=new period();
		char[] a;
		a=new char[100];
		a="abcdefghijklmnopq";
		p.exchange(a);
		
		
	}
}
		
エラーメッセージは以下のとおりです。

reoprt22.java:33: エラー: 互換性のない型
a="abcdefghijklmnopq";
^
期待値: char[]
検出値: String
エラー1個

これはメソッドの仮引数が違うということですか?
何故違うのかいまいちよくわかりません。
よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メソッドを作る課題

#2

投稿記事 by softya(ソフト屋) » 12年前

JavaとC++をごっちゃにされている様です。
Javaではchar配列と文字列(String)は別の型ですので、文字列ならStringを使いましょう。

それと
a=new char[100];
a="abcdefghijklmnopq";
って言うのはC++的にも間違っています。newしたメモリがメモリリークします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

たかし
記事: 48
登録日時: 12年前

Re: メソッドを作る課題

#3

投稿記事 by たかし » 12年前

softya(ソフト屋) 様、ご指摘ありがとうございます。
charではなくStringに直してmain文の配列宣言も直して以下のようなプログラムになりました。

コード:

class period
{

	void exchange(String dst[]){
		int i=0;
		int k=0;
		while(dst[i]!="\0"){
			k++;
			i++;
		}

		for(i=0;i<5;i++){
			System.out.print(dst[i]);
		}
		System.out.println();
		for(i=0;i<5;i++){
			System.out.print('.');
		}
		System.out.println();
		for(i=k-5;i<k;i++){
			System.out.print(dst[i]);
		}

	}
}
class report22
{
	public static void main(String args[]){

		period p;
		p=new period();
		String[] stringArray = {"abcdefghijklmnopq"};

		p.exchange(stringArray);


	}
}
コンパイルの成功して実行できたのですが、以下のようなメッセージが表示されてしまいました。


C:\Java>java report22
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at period.exchange(report22.java:7)
at report22.main(report22.java:34)
-- Press any key to exit (Input "c" to continue) --

これはどういう意味なのですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: メソッドを作る課題

#4

投稿記事 by softya(ソフト屋) » 12年前

配列の添字で定義範囲外のアクセスですね。
String はそれだけで文字列ですので、String[] stringArray = {"abcdefghijklmnopq"};だと複数の文字列の配列と言う意味になります。
今回の場合は間違いですが
String[] stringArray = {"abcdefghijklmnopq","xxxxxxooo","zzzzzzoc"};
などと定義したい場合の書き方って事になります。
ただの文字列は
String stringData = "abcdefghijklmnopq";
です。

やりたい事は文字列の部分アクセスで文字を取り出すことですので、StringのcharAtメソッドを使ってください。
「とほほのJava入門」
http://www.tohoho-web.com/java/string.htm
「指定の位置の文字を取得 - Stringクラスを使った文字列処理 - Java入門」
http://www.javadrive.jp/start/string/index5.html

C++とは全然違いますので、まずよく調べてから手を付けてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

たかし
記事: 48
登録日時: 12年前

Re: メソッドを作る課題

#5

投稿記事 by たかし » 12年前

softya(ソフト屋)様、ありがとうございます。
あと返信が遅れてしまいすみませんでした。
今日の朝無事に提出しました。
作成したプログラムを載せます。

コード:

class period
{
 
    void exchange(String dst){
        int i=0;
        int l=0;
		String top;
		String last;
		
		l=dst.length();
		//受け取った文字列の長さをlength()メソッドで求める
		
		
		top=dst.substring(0,5);
		//第一引数(0)から第二引数(5)までの文字列を返すsub()stringメソッドを使用する
		last=dst.substring(l-5,l);
		//同様にして終端までの5文字をlastに入れる

 
        System.out.print(top);
		System.out.println("");
		System.out.print(".....");
		System.out.println("");
		System.out.println(last);
		//結果を出力する。
    }
}
class report22
{
    public static void main(String args[]){
 
        period p;
        p=new period();
		
        String stringArray = "abcdefghijklmnopq";
 
        p.exchange(stringArray);
 
 
    }
}

助かりました。
またわからないことがあったら質問すると思いますが、そのときはよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る