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

基本情報処理試験を2連敗中のものです。
1度目は確実に勉強不足だったと自覚しています。
今年の4月の試験では、合格を狙っていましたが、午後が58点で不合格でした。
午前は80点だったのでこちらの勉強方法はよしとしているのですが、
いかんせん午後が苦手です。

今までjavaを少し勉強していたので、javaで受験していました。
サーティファイの2級程度です。
過去問の、平成21年までは、1、2問間違える程度で解けているのに、
平成22年より最新のものになると、全く解けません。
すごく難しくなっているように感じます。

4月のアルゴリズムは1問間違えでした。
なので、それなりにアルゴリズムは理解できているのではと思っているのですが、
javaが全く解けるようになりません。
4月の試験では0点でした。

もう2回も落ちてしまっているので、言語を変えたほうがよいのかと悩んでいます。
今後に役立つとかはもういっそ置いておこうと思っています。
アセンブラの方が合格率が高い、解きやすい、javaより簡単、という記述をよくネットで見かけるのですが、
それも1、2年前の記述なので、今はどうなのでしょうか。
2年違うとかなり難易度が変わるのでは、とjavaを見ていて思ってしまっています。

javaでもよい参考書などがあれば教えていただきたいです。
最近の傾向に即したアドバイスをいただきたいです。

言語は最悪駄目でも、80点中60点取れれば、と勉強して望んだ結果がこれです。
午前62点、午後60点で合格している人をみて、すごく悔しくなります。
全く勉強していなかった子に、同じ扱いをされてすごく悔しいです。
同じ不合格だから仕方ないっていう結果が情けないやら悲しいやらで嫌になります。
次こそ合格したいです。
もうギリギリのラインは嫌です・・・。
自信を持ちたいです・・・。
勉強したいのですが、どう勉強したらよいかわからなくなっています。

宜しくお願いいたします。

A 回答 (10件)

> ちなみに4月の空欄aも、なぜvoid GhostLegではなくGhostLegなのかがわかりません。



これはコンストラクタだからですよ。
クラスをインスタンス化した時、真っ先にコンストラクタというものが呼び出されます。
コンストラクタは、戻り値定義のない、クラス名と同一のメソッドです。

Class GhostLeg {
 public GhostLeg() {
  // これ、コンストラクタ。インスタンス化すると必ず呼び出されます。
 }

 public GhostLeg(int n) {
  // これもコンストラクタ。インスタンス化すると必ず呼び出されます。
  // どちらのコンストラクタが呼び出されるかは、インスタンス化した時の引数に依存します。
 }

 public void GhostLeg() {
  // これはただのメソッド。インスタンス化した後に、hoge.GhostLeg()として呼び出さないと機能しません。
 }
}


今回の場合、
GhostLeg gh = new GhostLeg(4);
となっているので、引数int nのコンストラクタが呼び出されます。

public void GhostLeg()は
GhostLeg gh = new GhostLeg(4);
gh.GhostLeg();
としないと処理しません。
    • good
    • 0
この回答へのお礼

ご説明ありがとうございます。
解説を読んで、思い出しました。
そのような決まりもありましたね。

知識が浅いですね。
ありがとうございます。

お礼日時:2013/05/21 10:47

ちょっと別件ということで、追加で回答いたします。



おそらく、オブジェクト指向の概要をあまり理解されていない、もしくは浅すぎると思われます。
クラスとはなんぞや、継承とは、インターフェースとは。。。

Javaはある程度読めるようですから、そもそもオブジェクト指向の概要を理解された方がいいかもしれません。
クラスが2, 3本あるくらいなら、インスタンス化が必要な程度だから、クラスとして特に意識することなく追いかけることができるが、継承やインターフェースが使われていると行き詰ってしまう可能性があるというなら、それを摘んだ方がいいです。

インターフェースの説明はこの辺が分かりやすいかもしれません。
http://www.atmarkit.co.jp/ait/articles/0504/02/n …
    • good
    • 0
この回答へのお礼

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

半年ほど前に勉強したのですが、完璧に流れ落ちていました。
半年前もトレースはできていなかったのですが。

もう一度基礎を振り返ってみて、アセンブラと悩んでみようと思います。
ご丁寧にありがとうございました。

お礼日時:2013/05/21 10:49

> ArrayAppendableCharSequenceではなくAppendableCharSequenceが入るのかも理解できていません。



おっと、これは理解しておられると思っていましたが、インターフェースの知識が
あまりないようですね。

ArrayAppendableCharSequenceクラスとListAppendableCharSequenceクラスは、AppendableCharSequenceインターフェースを実装しています。(implements AppendableCharSequence)


つまり、ArrayAppendableCharSequenceクラスとListAppendableCharSequenceクラスは、AppendableCharSequenceインターフェースのメソッドならば、AppendableCharSequenceとして
利用することができるのです。
それがArrayAppendableCharSequenceなのか、ListAppendableCharSequenceなのかは
問題ではないんです。

ですから、measureTime()を呼び出す時にはArrayAppendableCharSequence、ListAppendableCharSequence
と異なるクラスをインスタンス化していますが、measureTime()内で利用したいメソッドは
AppendableCharSequenceインターフェースのメソッドなので、受け口としてAppendableCharSequence
で通用するのです。
それによって、ArrayAppendableCharSequenceなのかListAppendableCharSequenceなのかを意識する
ことなく、measureTime()の処理を一本化することができています。


今回はmeasureTime()の引数としてそれぞれのクラスをインスタンス化しているから視覚的に
見づらいかもしれませんが、今回の例だと、下記のようなインスタンス生成が可能です。
AppendableCharSequence arrayAcs = new ArrayAppendableCharSequence();
AppendableCharSequence listAcs = new ListAppendableCharSequence();


例えばこのページをご覧ください。
http://docs.oracle.com/javase/jp/6/api/java/util …

ArrayListというクラスですが、ArrayListはいくつかのインターフェースを実装しています。
この時、ArrayListはArrayListではなく、List<E>としても利用できます。
但し、List<E>として利用する時は、List<E>に含まれるメソッドしか利用できません。
http://docs.oracle.com/javase/jp/6/api/java/util …
    • good
    • 0
この回答へのお礼

ご丁寧にご説明ありがとうございます。
おっしゃっている通り、落ち着いて考えたらその通りですね。
4月からjavaに触れていなかったもので、考えがごっそり抜けていました・・・。

ちなみに4月の空欄aも、なぜvoid GhostLegではなくGhostLegなのかがわかりません。
voidって戻り値のないものだと思っていたのですが。

やっぱり基礎が足らないのですね。

お礼日時:2013/05/21 10:30

色々書きすぎて、間違っちゃいました。



× Bucket.getBucket(length - 1)
○ ListAppendableCharSequence.getBucket(length - 1)

でした。
    • good
    • 0

#2です。



> Bucket型のnextってなに?とか(nextに何か入れるのでしょうが、入れた後Bucket型で何をどうしたい
> のかがわからないなど)
これ、調べてみたら23年度春期のやつですね。これは文字でだらだら書きやがって(笑)図解もないし、
かなりやっかいなやつでしょう。
ちょっとだけ試験問題からソースを追ってみました。

これは、問題文にある通り、1つのBucketには最大10文字までしか格納することができません。
そこで、10 / EXT_SIZE(10)などで余り0になった時(つまり11文字目を格納しようとした時)、
最新のBucketのnextプロパティに、次に続く文字が格納されるBucketを格納しています。
Bucket bucket = getBucket(length - 1);
if (offset == 0 & length != 0) {
 bucket.next = new Bucket();
 bucket = bucket.next;
}

つまり、例えば29文字格納したいならば、Bucketクラスは3つ使われます。
length:0(1文字目)~9(10文字目)はBucketA
length:10(11文字目)~9(19文字目)はBucketB
length:20(21文字目)~9(29文字目)はBucketC
nextは、BucketAの次はBucketB(BucketA.nextの値はBucketB)で、
BucketBの次はBucketC(BucketB.nextの値はBucketC)だよと教えてあげているにすぎません。

ここで、Bucket.getBucket(length - 1)が使われています。
length - 1になるのは、10文字目まで格納したら、lengthは11になってしまっているので、
10文字目まで格納された状態で調べたいからです。
> private Bucket getBucket(int index) {
>  int n = index / EXT_SIZE;
>  Bucket b = bucketList;
>  for (int i= 0; i < n; i++) {
>   b = b.next;
>  }
>  return b;
> }
これが何をしているかというと、前述した流れがある以上、最新の(処理中の値を格納すべき)Bucketを
知る必要があります。
ですから、bucketList(つまり、最も最初に利用されているBucket)から、nextを呼び続け、今操作
すべきBucketを見つけ出しています。(getBucket()という命名則が悪いことは試験だし、置いておきます)
その結果、getBucket()から戻ってきたあとのif()にある条件の、1文字目ではなくて、
11文字目、21文字目などの場合に新しいBucketを作り、前のBucketに新しいBucketをひも付け、
操作するBucketは、新しいBucketに切り替えています。


今回のような箇所が分からない場合、main()から目的の部分だけトレースするといいです。
今回の場合はそれを目的とした穴埋めなのか、main()の後はすぐにListAppendableCharSequence()を
利用しているので、必要最小限のトレースが出来るので楽です。
途中、1つ穴埋め(length - 1)部分に引っ掛かりますが、その後続処理ではEXT_SIZEで割り算を
行っていますので、そこまで想像に難くありません。



> >そのメソッドが何を処理し、何を結果とするのかを理解しながらトレース
> 本当にこちらの理解が足りていないのだなと思います。

JDKで用意されているクラスやメソッドの使いどこ自体が分からないならば、
それは調べるしかありません。暗記と一緒で、覚えるしかないのです。
なんなら、Javaをインストールして試すっていう手もありますが、模擬を
していれば、調べて覚えるものもいくつかあるでしょう。
BufferedReader、BufferedWriter、FileReader、FileWriter、ArrayList、HashMapとか
あたりを覚えておけば何とかなるような気もしますが、Iteratableインターフェースの
例もあることだし何とも・・・。



> で、何がしたかったの?for文でリスト分xに値が入りました。
> そのxがなんなのか、なんのためにxに値を入れたのかが、
> 自分ではわからない・・・という感じで躓きます。

これは問題文に記されているか、ロジックの流れがある為、そこだけ見ても絶対わかりません。
トレースしかないのです。
しかし、ロジック1つ1つは分からなくても、問題文とメソッド名だけで、ひとまず何をしようと
しているのかは分かったりするものです。



> 基本情報の講習などを受けて講師の方に直接教えてもらった方がよいのでしょうか・・・。

私は中学時代から独学で始め、専門学校へ通って取得した為、どれが一番いいかと言われたら、
やはりみっちりやってくれる専門学校と思います。
今の専門学校ではきっと、Javaのセットアップを行い、授業で覚えたあとに模擬試験をこなすでしょうから。
が、そんなことはどうでもいいです。
私が学校で習ったことをお伝えしました。

『問題に正解しようが間違おうが、全て理解するまでその問題をトレースをする。
トレースしているだけではダメ。流れを把握しながらトレースする。それの反復。』

これに限ります。
その時の変数をメモってるだけでは意味ないわけですし、そいつが何を意味しているのかを
状況が変化する度に考えながらトレースします。
正解してても、ちょっと認識が間違っている部分もあったりするので、とにかく
完全に理解するまで復習をしまくることです。
同じ問題を日を空けてやるのも悪くありません。日を空けても暗記してしまうくらい回数をこなしましょう。



> なので、過去問の解説が詳しい参考書が欲しいと思ったのですが、午後は言語が抜かれた参考書が多
> く・・・。

午後の試験は、あまり解説は役に立ちません。というか、役に立つような解説を見たことがありません。
たまに書店でぺらぺら最近の問題集を見たりすることがありますが、
一部解説をすっ飛ばしたりしてて、ここの部分説明せんでいいんかよっていうのがあります。
あなたのレベルまで達していると、参考書は、模擬問題を紙で欲しいから、くらいにしか考えない方がいいですよ。
IPAからダウンロードしたのは印刷する手間がかかりますからね。
    • good
    • 0
この回答へのお礼

ご丁寧に解説ありがとうございます。

大変申し訳ないのですが、やっぱり導き方が思いつきません。
ご説明していただければ、なんとなく「そういう考え方でトレースするんだな」と思いますが、
いざ自分で真っ白なところから追っていくと、何も進みません。
いってしまえば、一番最初の
static void measureTime(int n, 【空欄e】 a) {~
というところも、なぜ
ArrayAppendableCharSequenceではなくAppendableCharSequenceが入るのかも理解できていません。

トレースするにしても、もう少し簡単な問題から徐々にこのような問題がトレースできるような問題集のようなものが欲しいです。
今まで過去問を丁寧にトレースすればきっと解けると思って、何度か試していましたが、
結局行き詰って終わります。
行き詰った時の解説が欲しいのです。
こればっかりは「トレースすれば」とかいう話しではないと思っています。

もう落ちたくないのです。
同じ方法で一人で頑張っても何も成長が見られない気がします。
二度も同じ事を繰り返して、三度目はきっと、とはもう思えません。
しかも、やっかいな問題が出たときに解く自信もありません。

アルゴリズムは、色々な参考書を使って勉強し直したら、力の伸びが確認できましたが、
javaはあまりいい参考書がないそうで、一人でトレースしか方法がないのですね。

とても参考になりました。
何度もご回答ありがとうございました。

お礼日時:2013/05/21 10:08

> 2年ほど前のお話ですよね。

表計算は難化しているとあり、

プログラミング言語問題で得点できない受験者の多くは,問8の必須問題も苦手としているように思います。
特定のプログラミング言語だけが苦手であるなら他の言語を選択すればよいわけですが,アルゴリズム理解力・プログラミングの実力が怪しいようですと,ヘタをすると問8の20点と問9~問12の20点の計40点近くをまるまる落とす危険性すらあるということです。

他のプログラミング言語問題が4~5ページなのに対して,問13の表計算は9ページほどと長文問題になっているのは確かですが,
回答No.4のリンク先で理由を述べたとおり,表計算問題は,プログラミングが苦手な受験者でも前半の問題は得点しやすい出題形式になっていると思います。

後半のマクロ言語の出題まですべて含めて問13で20点満点を得点することを,私は想定していません(それができる受験生は,問8~問13のどの問題でも半分以上の得点ができるのではないでしょうか)。
問8~問12でいつも苦労している受験生にとって,コンスタントに10点の得点を期待できて傷を広げる可能性を小さくできる選択問題が表計算だと,そういう私見を持っているということです。


> アセンブラは傾向が変わってきたりということはないでしょうか。

情報処理技術者試験関係の出版社が発表している講評を参考にしてみてはいかがでしょう。
http://www.itec.co.jp/auto_mark/comment/index.html
http://www.wenet.co.jp/jyohoken/bunseki/index.html
    • good
    • 0
この回答へのお礼

再びご回答ありがとうございます。

質問内容は読んでいただけましたでしょうか・・・。
アルゴリズムはそれなりに力がついてきたと思っています。
今回も1問間違いでした。
自分なりに手応えはありました。
苦手というよりも、力試しができるとむしろやる気があるなかで解いていました。
当方、言語のインスタンスなどの仕組みの理解が足りていないように感じております・・・。
せっかくアルゴリズムの力も伸びてきたので、言語で得点をと思っていたのですが、
それでもアルゴリズムが多少伸びたくらいでは表計算で傷を広げないような対応をした方が無難なのですかね・・・。
考えが浅はかだったのかもしれません。
言語が解けないうちはアルゴリズムもまだまだということですかね。

講評のリンクありがとうございます。
参考にさせていただきます。

お礼日時:2013/05/20 19:00
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
実はこちら一度拝見させていただいており、今回の質問にいたりました。

2年ほど前のお話ですよね。
表計算は難化しているとあり、javaもそうだと感じております。
アセンブラは傾向が変わってきたりということはないでしょうか。

お礼日時:2013/05/20 17:21

> 「これは簡単です」といわれても、やっぱりわからないので、受からないのも当然なのでしょうね。


すみません、ちょっと不愉快にさせてしまったかもしれませんでしたね。
25年度春期は、周辺の開催時期と比べたら比較的安直だったという個人的感想なだけです。
今回合格した人たちの中にはラッキーだった人も少なからずいると思いますし、
逆にやたら難しいものが出ると、当然のように点数が落ちてしまうと思われますから、
トレースする能力と、問題の解き方を強めた方がいいです。
(その場合には合格点基準も下がる場合もありますが、それをアテにしたら終わりです)


> 問題文をトレースだけで対策になりますでしょうか・・・。
問題をトレースするのは、素早くメソッド・ブロック単位で処理を読み解くための練習です。
ある程度トレースできなければ設問を見ても結局分かりませんし、
トレースするだけでは問題は解けません。

実際に試験する時は、大体さっと中身を見てメソッド名で決め打ちだったり、
中身が複雑なところでも「処理の流れ的にこういうことしたいんだろうな多分」
レベルでいいんです。
ざっくりプログラムを追った時に、それがすぐに想像できるかどうかが問題です。


Javaのそれぞれのクラスをある程度把握しているなら、追う力を養いましょう。
Javaを試験としてしか学習していないのならば、知識が足りないと思われます。
たとえば
if (n.containsKey(key)) {
 ~
}
とかってなってて、containsKey()がそもそも何だか分からないというレベルなら、
そのメソッドが何を処理し、何を結果とするのかを理解しながらトレースする練習を
した方がいいと思います。


今まででJavaのお作法を少なからず学習してきているわけですから、また1からとなる
Cやアセンブラ、COBOLなどは選択しない方がいいと個人的には思います。

分からないものを分からないまま進めても分からないことに変わりはありません。
それは『正解率が問題に依存する』ことになってしまって、運任せになってしまいます。
解けた過去問も、ダメだった過去問も、処理を1行1行全て理解するまで調べたりした方がいいです。
その継続が力にも自信にもなります。

また、今現状でやってるかどうかわかりませんが、クラス、メソッド単位、難しくて
忘れそうな処理ブロック単位などで、問題文にコメントを書いたりすると人間というか
自分に優しくなるので、問題を進めやすくなると思います。
    • good
    • 0
この回答へのお礼

再度ご回答ありがとうございます。

おっしゃるとおり、そういったメソッドの類が非常に苦手です。

例えばなのですが、

private Bucket getBucket(int index) {
int n = index / EXT_SIZE;
Bucket b = bucketList;
for (int i= 0; i < n; i++) {
b = b.next;
}
return b;
}

private static class Bucket {
private Bucket next;
private char[] data = new char[EXT_SIZE];
}


Bucket型のnextってなに?とか(nextに何か入れるのでしょうが、入れた後Bucket型で何をどうしたいのかがわからないなど)
ここだけ抜き出せばわかるのですが、もっとインスタンスを作成していたりとかで、わからなくなることがたくさんあります。

>そのメソッドが何を処理し、何を結果とするのかを理解しながらトレース
本当にこちらの理解が足りていないのだなと思います。
ですが、その、「何を結果とするのかを理解」というところでつまずきます。
で、何がしたかったの?for文でリスト分xに値が入りました。
そのxがなんなのか、なんのためにxに値を入れたのかが、
自分ではわからない・・・という感じで躓きます。
読解力にも問題があるのですよね。
基本情報の講習などを受けて講師の方に直接教えてもらった方がよいのでしょうか・・・。
家庭教師でもいればなあ、と思ってしまいます。
細かい解説があればきっとわかるのですが、その解説がないまま一人で考えていても先に進めない状態です。

なので、過去問の解説が詳しい参考書が欲しいと思ったのですが、午後は言語が抜かれた参考書が多く・・・。

2度も落ちているのでもう次では落ちたくありません。
確実に点を取れるほうへどうしても走りたくなってしまいます・・・。
こういうのがいけないのでしょうね。
javaでなんとかいきたいのですが、今の勉強方での独学に限界を感じております。

お礼日時:2013/05/20 17:10

25年度春期のJava部分をやってみました。


https://www.jitec.ipa.go.jp/1_04hanni_sukiru/mon …

パソコン上で上下にスクロールするのが面倒でテキトーに流し見30分くらいで
問題を解いてみました。


特に難しいことをしてるとは思えません。
プログラム的には、クラス、インスタンス、25年度春期ではArrayList・SortedMapの
それぞれの命令を把握していれば回答可能だと思います。
加えて、どういう出力結果を得たいのかということを念頭に置くと、設問2のc、d、
設問3は、ほぼプログラムを見なくても回答可能ではないでしょうか。


22年度までをざっと見てみましたが、特に継承・インターフェースを多用して複雑構造
にはなっていないので、2年間も勉強して言語を把握しているなら、問題の解き方か、
プログラムをトレースする能力に欠けていると思われます。


他の参考書を購入して学習するなんて方法より、
public void main()から処理をトレースしていって、
xの値はいくつ、yの値はいくつ、ループになってるならそれをループの度に1つ1つと、
値をA4用紙にトレースしていく。
これは、トレースの練習でしかありません。

それをひたすら過去問でもやっていると、このようになると思います。
 1.事前にあらかたトレースして、どのクラスからどのメソッドを呼び、
   それぞれのメソッドが何をしようとしているかが分かるようになる。
   (当然、穴埋め部分はこの時点では不明、しかし想像がつくものも出てくる)
 2.設問文と解答群を見る。この時点で、そもそもの問題を振り返る。
 3.問題が結果的に何を求めようとしているのか、対象ロジックが何をしようとして
   いるのかを把握している為、解答群から自然と候補が見つかる。

それでも候補が2つになってしまうならば、その解答を当てはめてトレースするだけです。
プログラム解析にばかり躍起になって、そもそも問題は何をしようとしているのかという
ことを置き去りにすると、解けるものも解けませんよ。

ざっと見た感じだと、25年度春期の問題は内部クラスがあるだけですから、ここ2,3年の
過去問では最も楽な問題だと思いますよ。
(22年度だか23年度に自前イテレータを作ってるようなのがあったので、それにぶつかって
受験した人の方が悲惨そう・・・)

この回答への補足

>プログラム解析にばかり躍起になって、そもそも問題は何をしようとしているのかということを置き去りにすると、解けるものも解けませんよ。

なんというか、プログラムを追っていって、出した結果が問題にどう反映しているのかが理解しきれていない部分があります。
おっしゃるとおりですね。
リバーシのときはまだわかり易かったし、ある程度解けたのですが・・・。
問題文を読み解く力も足りていないようですね。

たくさんのご指摘ありがとうございました。

補足日時:2013/05/20 15:36
    • good
    • 0
この回答へのお礼

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

>特に継承・インターフェースを多用して複雑構造にはなっていない
とのことですが、平成21年度までを解いた後だと、複雑に感じてしまっています。
おっしゃるとおり、トレースする能力に欠けているのだと思います。
また、継承、インターフェースを利用していて、トレースし切れません。
データを他のクラスに持っていって結局何がしたかったのか、
というのが理解できないことが多々あります。
多分基礎がなっていないのでしょうね。

問題文をトレースだけで対策になりますでしょうか・・・。
とりあえずやってみようとは思います。

「これは簡単です」といわれても、やっぱりわからないので、受からないのも当然なのでしょうね。
語弊を招いて申し訳ないのですが、javaの勉強を始めてまだ1年経っていないので、
基礎が足りていない可能性が高いのかもしれません。
トレースしてやっぱりわからなかったら基礎から勉強し直します。

お礼日時:2013/05/20 15:30

IT系の専門学校ではアセンブラが一番多いです。

ハードウェアの勉強にもなりますし、なによりプログラムが短いという利点があります。唯一の欠点は就職後に役に立たない事。

Javaはおそらく選択言語の中では難しい方だと思います。表計算も難化してきています。
    • good
    • 0
この回答へのお礼

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

アセンブラはハードウェアの勉強にもなるのですね。
初耳でした。
仕事で使える使えないはまずおいておこうかと思います・・・。
上司にも、とりあえず試験に合格できるように言われているので・・・。
本当はいけないのでしょうが。
検討してみます。

お礼日時:2013/05/20 15:33

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