2008年06月13日

変数

では今回から本格的にプログラミングを始めます。
まずは変数を紹介します。Cでやったのとほとんど同じなので
簡単に説明します。(C言語の変数を参照していただくとありがたいです^^;)



class value{
public static void main(String args[]){
int a;
a = 4;


System.out.println("a = "+a);
}
}



これで整数型の変数(int)aを作って、その中に4を代入し、
それを画面に"a = 4"と表示するプログラムです。

System.out.printlnの中身が見慣れない形になっていますね。

("a = "+a)

これはダブルクォーテーション(")で挟まれた部分は文字列としてそのまま画面に出力し、
その後ろの+で連結されたものはその中身(aなら4)を表示するということです。



それでは次に四則演算の結果を表示するプログラムです




class keisan{
public static void main(String args[])
{
int a = 9;
int b = 3;

System.out.println("a + b = "+(a+b));
System.out.println("a - b = "+(a-b));
System.out.println("a * b = "+(a*b));
System.out.println("a / b = "+(a/b));

}
}



これで各演算の結果が出力されます。



C言語でfor文などでよく使うインクリメントデクリメント演算も使えます。


a++;
++b;
c--;
--d;


大体Cと同じような感じですね。
それではまた!
posted by マックス at 13:50| Comment(0) | TrackBack(8) | Java | このブログの読者になる | 更新情報をチェックする

2008年06月12日

JAVA入門-4

前回までで簡単なJavaプログラムの実行と説明をしました。
今日はプログラムのルールです。

プログラムは上から順に実行されていきます。
たとえば

System.out.println("A");
System.out.println("B");

とあったら画面には

A
B

と出力されますが、

System.out.println("B");
System.out.println("A");

と逆になったら当然出力も

B
A

となります。





プログラムは見やすいように改行やスペースをいれましょう。
ここで注意は単語の途中にスペースをいれてはいけません。

pu blic sta tic void main(String args[])

↑ダメです





またプログラムのコメントは

//一行コメント


/* ここはコメント
  ここもコメント
 ここまでコメント */


でできます。

では次回は変数を勉強します。では〜
posted by マックス at 17:55| Comment(0) | TrackBack(0) | Java | このブログの読者になる | 更新情報をチェックする

2008年06月11日

JAVA入門-3

前回実行した、



class Hello{

public static void main(String args[]){
System.out.println("Hello World!");
}
}

という、画面に[Hello World!]と出力するプログラムを部分的に解説していきます。
では上から見ていきます。まず一行目



class Hello{

"class"(クラス)というのはJavaのプログラムの単位というべきものです。
クラスの内部に、このプログラムのもつ属性やどう動くかなどが記述してあります。
そしてそれは"Hello"という名前のクラスであることを示しています。

というわけでここから下はクラスの中身ということになります。



public static void main(String args[])

さて、記述は…
C言語のmain関数ありましたよね。"int main(void)"というやつですが、これはそれのようなものです。
Javaのプログラムには必ず一つこのmainメソッド(Cでいう関数のようなもの)が必要で、
処理はここから始まります。
とりあえずこれはmainメソッドの記述であると覚えておいてください。

そしてその下の行



System.out.println("Hello World!");

は、「画面に"Hello World!"と出力しなさい」という命令です。
これも後に部分的に解説しますがいまはこれだけでいいでしょう。

以上が(とても大雑把ですが)前回のプログラムの説明です。
次回はJavaのプログラムの細かいルールなどを見ていきます。では〜
posted by マックス at 19:23| Comment(0) | TrackBack(0) | Java | このブログの読者になる | 更新情報をチェックする

2008年06月10日

Java入門-2

今回はJavaプログラムをコンパイルして実行する流れを紹介します。
では早速入門的なJavaプログラムを書いてみましょう♪





class Hello{

public static void main(String args[]){
System.out.println("Hello World!");
}
}



これがJavaプログラムのソースコードです。
細かい説明は今はせず、実行までの流れを説明します。
これをHello.javaという名前で保存します。
そして、Cの時のようにコマンドプロンプトを起動しHello.javaを
保存したディレクトリまで移動します。
そしてコンパイルです。プロンプトに



C:\program\JAVA>javac Hello.java


とコマンドすればコンパイルできます。
うまくいけば同じディレクトリにHello.classという
ファイルができます。これが前回説明したバイトコードです。
Cと同じくコンパイル出来ないなんらかの理由があるときはエラーがでますので見直してください。

ではコンパイルができたとして、次は実行です。
先ほどコンパイルが成功した後のプロンプト画面で、



C:\program\JAVA>java Hello


と入力すると、画面に「Hello World!」と出力されます。
これが実行までの流れです。

  1. コンパイル(Javac ソース.java)
  2. 実行 (java クラス名)

というような流れです。

では次回はソースコードの説明とまた簡単なプログラムを作ります。
posted by マックス at 18:51| Comment(0) | TrackBack(0) | Java | このブログの読者になる | 更新情報をチェックする

2008年06月09日

Java入門!

だいぶご無沙汰です^^;
今日からCは一区切りとしてJava勉強して
いきますよ♪

JavaはCと同じプログラム言語です。しかしCとは文法以外は結構違います。
Javaの特徴は以下の3つです。


  1. OSに依存しない

  2. オブジェクト指向

  3. 安全で作りやすい




OSに依存しないのと安全で作りやすいのは言葉どおりでわかると思いますが、オブジェクト指向とはどんなものでしょうか。それは後々わかります^^;


JavaはWebアプリケーションでよく利用されています。
インターネットとの親和性も高いです。またセキュリティ面もしっかりしています。

OS非依存の実現方法はJavaをコンパイルするとバイトコード
とよばれる機械語の手前のものを作ります。
そしてのバイトコードをJava仮想マシンで実行するのです。だからwindows,linux,MACとなんのOSでも動きます。


javaプログラミングを始めるにはJDKとよばれる
ツールが必要です。このなかにはコンパイラなどが入っています。
これをインストールし、環境を設定します。
エディタもメモ帳ではないものが良いでしょう。

それでは次回からJavaのプログラムを作っていきます!では.


posted by マックス at 15:51| Comment(0) | TrackBack(0) | Java | このブログの読者になる | 更新情報をチェックする

2007年12月21日

二分探索法-プログラム

前回説明した二分探索法の例です
と、ここでいつもならソースコードをそのまま載せますが、これからは
空欄を作って穴埋め問題みたいにしたいと思います♪
それではどうぞ





#include

int main(void)
{
int a[] = {1,5,7,13,18,23,24,27,40,48};
int low = 0;
int high = 9;
int middle;
int obj;
int flg=0;

printf("探索する要素を入力:");
scanf("%d",&obj);

while(low <= high)
{
middle = (high+low)/2;

if(a[middle] == obj){
printf("%dは a[%d] です\n",obj, middle);
flg = 1;
break;
}
else if(a[middle] < obj){
/* @ */
}
else{
/* A */
}
}
if(flg == 0)
printf("目的要素は配列中にはありません\n");

return 0;
}



というわけで空欄@、Aを作ってみました。
「あれ、今問題は…」と気づいた方いらっしゃるでしょうか?
今年の秋季の基本情報技術者試験の午前問題にほとんど同じ問題が
出ました。プログラムではなく流れ図でしたが。


では回答です。

/* @  */
入力された要素objとa[middle]を比較してobjの方が大きければ…
ということになっています。
ということはlowをmiddleの位置+1に置き換えるのですから答えは

low = middle + 1

でした。

/* A */
先ほどの条件にあてはまらない、つまりobjがa[middle]より小さい場合ですからhigh = middle - 1に置き換えるのです。
よって

high = middle - 1

です。


どうでしょうか。これができていれば二分探索法も理解できていると
いえるのではないかと思います。
それでは今日はこのへんで!
posted by マックス at 23:16| Comment(0) | TrackBack(0) | 探索 | このブログの読者になる | 更新情報をチェックする

2007年12月20日

二分探索法とは

前回は簡単な探索アルゴリズムとして線形探索法(リニアサーチ)を紹介しました。
今日も探索アルゴリズムをやりますよう♪

今日は線形探索法より効率のよい探索法である二分探索法
を紹介します!
昨日のつづきですが、教頭先生に線形探索法のプログラムをみせたところ、
「これじゃあ遅すぎる!もっと効率のよくて速い検索はできんのかね!?」
と言われてしまいました。そこで今回は二分探索法を用いて
検索しようと思い立ちました。

昇順または降順に整列された配列に対して指定した
学籍番号の生徒のデータを二分探索法を使い表示させる。」

二分探索法とは配列を二分しながら目的のデータを探し出すものです。
この二分の仕組みは↓のようになります。






・配列aの各要素(a[0] = 1, a[1] = 5, ... a[9] = 52)

|1|5|7|13|18|23|24|27|40|48|52|

10の要素を持つ配列 a[] の各要素です。このなかから要素23(a[5])
探し出すとします。



1:配列の両端(この場合0,9)を変数low,highにそれぞれセットする

|1|5|7|13|18|23|24|27|40|48|52|
↑                          ↑
low(0)                        high(9)



2:low と highを足して2で割ったものをmiddleとする

|1|5|7|13|18|23|24|27|40|48|52|
↑        ↑                 ↑
low(0)    middle((0+9)/2)            high(9)
 


これで準備は整いました。

まず a[middle]と目的の要素を比較し、a[middle]と目的の要素が同じであれば
検索終了、結果を報告します。
が、今回は a[middle] = a[4] = 18, 目的の要素は23です。つまり
a[middle] < 23
なのでこの場合はlowの位置をmiddleの位置に置き換えます。すると

|1|5|7|13|18|23|24|27|40|48|52|
↑                 ↑
         low(4)               high(9)
 

探索する範囲がぐっと縮まりました。さて、ここでlow(4)ですが、さきほど
a[middle](=a[4]) と 23を比較して等しくないという結果だったので
a[4]は探索の対象外であるといえますね。というわけで
lowをひとつずらして更に範囲を狭めることができます。
そしてmiddleを再び設定します。

|1|5|7|13|18|23|24|27|40|48|52|
             ↑     ↑        ↑
            low(5)   middle(7)    high(9)
 

ちなみに今回のmiddleは(5+9)/2です。
これからは先ほどと同様の操作です。a[middle]と目的の要素23を比較します
さて今回は
a[middle]=27 > 23
先ほどと違いa[middle]の方が大きいですね。
a[middle]のほうが小さいときはlowをmiddle+1に置き換えましたが、
a[middle]のほうが大きいときはhighをmiddle-1に置き換えます。

するとこうなります。

|1|5|7|13|18|23|24|27|40|48|52|
             ↑  ↑
            low(5) high(6)
           middle(5)


そしてa[middle]=23 と目的の要素23を比較してみると…
等しいです!!!


これが二分探索法です。

注意するのは目的の要素と比較するのはmiddleだけです。
lowやhighはその範囲を決めているに過ぎません。
ですからlowやhighがmiddleより目的の要素を指していようが
middleが指さなければ意味は無いです。



プログラムは明日また紹介します。今日はこの辺で♪
それではまた!
posted by マックス at 00:16| Comment(0) | TrackBack(0) | 探索 | このブログの読者になる | 更新情報をチェックする

2007年12月18日

探索アルゴリズム

アルゴリズム勉強するということは、自分のプログラム能力を向上させることにつながります。

例えばボロい中古のパソコンと最新の良いパーツを載せたパソコンが、同じプログラムを
処理させたらきっと最新のパソコンのほうが処理が速いでしょう。

しかし、目的は同じプログラムだけど、中古のパソコンのほうには
計算量を少なくするために工夫されたアルゴリズムを使い、
最新のパソコンのほうのプログラムには単純なアルゴリズムを使うと
中古のパソコンのほうが処理が速かったということがありえます。
プログラマーの腕次第です。
だからアルゴリズムを勉強して良いプログラマーになりたいですね!


それでは今日は初めてのアルゴリズムなので簡単な探索アルゴリズムをやります。
配列上のある要素を探しだすプログラムです。

例えばクラス名簿というクラス人数分のデータのなかから、
指定した学籍番号の生徒のデータを表示するプログラムを作れと教頭先生に命令されました。
流れはこんな感じでどうでしょう。





指定された学籍番号を記憶する。
     


先頭の学籍番号から最後の学籍番号
まで比較していく。



一致したらその学籍番号の生徒の他の
データを表示。最後まで一致しなかったら
画面に存在しないことを表示。



というわけで早速プログラムを作ってみましょう♪
クラス名簿はこのようにテキストファイルにあるとします。


meibo.txt

101 (学籍番号)
相沢 明 (氏名)
1 (欠席回数)
102
天野 山
0
103
大城 宗徳
3
104
香山 県
2
105
ケビン マイケル
0
106
笹川 京子
10
108
志村 敏郎
3
109
蘇芳 美文
5
110
森瀬 健二
2


H107番の生徒は退学したとします。

このような一人分のデータなどは構造体でまとめるといいですので
データ構造は構造体でこんな感じでよいでしょう


struct STUDENT
{
int number; /* 学籍番号 */
char name[32]; /* 氏名 */
int abs; /* 欠席回数 */
}




それではプログラム例です




#include <stdio.h>

typedef struct STUDENT
{
int number;
char name[32];
int abs;
}student;

int main(void)
{
FILE *fp;
student st[9]; /* 生徒人数分 */
int n;
int i;
int num;

/* ファイルオープン */
fp = fopen("meibo.txt","r");
if(fp == NULL){
perror("file open error");
return -1;
}
/* ファイルからデータを読み込む */
for(i = 0 ; i < 9 ; i ++){
fscanf(fp,"%d",&st[i].number);
fscanf(fp,"%s",&st[i].name);
fscanf(fp,"%d",&st[i].abs);
}

printf("検索する学籍番号を入力:");
scanf("%d",&num);

/* 配列の先頭から比較 */
for(i = 0 ; i < 9 ; i++){
/* 見つかった */
if(st[i].number == num){
printf("学籍番号:%d\n",st[i].number);
printf("氏名:%s\n",st[i].name);
printf("欠席:%d回\n",st[i].abs);
break;
}
}

/* 全ての配列を検査したが見つからなかった */
if(i == 9)
printf("学籍番号%d は名簿にはありません\n",num);

fclose(fp);
return 0;
}



for文で先頭から順番に比較していき、見つかったら表示してbreakで
ループをさっさと抜けるようにしました。

みつからなかった時の条件がなぜ(i == 9)なのかというと
配列の最後の要素の添え字は 8 ですから該当しない場合はiは9になっているからです。
話は少し逸れますがこういうところに"9"という具体的な数字を書くのはよろしくないです。
なぜならあとで生徒40人分をやってみようとなったときはすべての"9"を"40"に換えなければ
いけないからです。ですのですこし改良したプログラムがこちらです。





#include <stdio.h>

typedef struct STUDENT
{
int number;
char name[32];
int abs;
}student;

int main(void)
{
FILE *fp;
student st[9]; /* 生徒人数分 */
int n=0;
int i;
int num;

/* ファイルオープン */
fp = fopen("meibo.txt","r");
if(fp == NULL){
perror("file open error");
return -1;
}
/* ファイルからデータを読み込む */
while(fscanf(fp,"%d %s %d",&st[n].number, &st[n].name, &st[n].abs) != EOF)
n++; /* ←生徒人数 */

printf("検索する学籍番号を入力:");
scanf("%d",&num);

for(i = 0 ; i < n ; i++){
if(st[i].number == num){
printf("学籍番号:%d\n",st[i].number);
printf("氏名:%s\n",st[i].name);
printf("欠席:%d回\n",st[i].abs);
break;
}
}
if(i == n)
printf("学籍番号%d は名簿にはありません\n",num);

fclose(fp);
return 0;
}



fscanfで読み取るときに人数をカウントして使いまわしています。

あとデータの読み込みも改良しました。下線部分を見てください。
while文の中にfscanfを入れ、EOF というものが
でるまで読み込め!ということなのですが、fscanfでデータを読み込んでいくと
データを全て読み込んだあとにこのEOFというものを返してきます。
これはEndOfFileのことでデータの終わりを意味します。
ですから↓の意味は、

while(fscanf(fp,"%d",&a[i]) != EOF)

配列a[i]にfpが読み込んだ値を入れろ!もし値が(データが)なければ終了だ!
という意味です。とりあえずファイルを全部読み込みたいときは使ったほうがいいでしょう。
というわけでデータの探索でした。
このような先頭からひとつずつ比較していく方法は線形探索法といいます。

次回は別の探索アルゴリズムを紹介します。それではまた!
posted by マックス at 20:15| Comment(0) | TrackBack(0) | 探索 | このブログの読者になる | 更新情報をチェックする

2007年12月17日

アルゴリズム

どうもです!かなり久しぶり(にも程がある!)に更新します。
ぽるぽっぽというメンです。

さて前回のファイルの演習でC言語の基本中の基本的な事項は一通り終えたとします。
というわけで今日からはアルゴリズム勉強していきます。

アルゴリズムとはある問題に対しての解決方法やその手順のことをいいます。
例えば、大量のデータから目的のデータを効率よくみつける方法や、
大量のデータを効率よく並べ替える方法をかんがえると、それはアルゴリズムです。
いままでやってきたことはアルゴリズムではないのかというと、今までの事は
その解決方法(手順)を実際にプログラミングできるようにするための練習です。

格闘ゲームで例えると、今までは
「このボタンはパンチ、こっちのボタンでキックか…」
という基礎動作を覚えたことにあたります。アルゴリズムは
「ここでパンチ、そしてキックで相手は倒れる!今だ必殺技!!」
と実際の試合で基礎動作をうまく使いこなし相手を倒すことといえます。

試合の組み立て方(操作の仕方)も一通りではありませんよね。
「はじめにパンチをだして次に回り込んで必殺技のほうがいいかな?」
などもっと効率のよい方法を模索するでしょう。
アルゴリズムも目的は同じでも効率の良い、悪いやりかたがあります。
たとえば先ほどの例の並べ替え(ソート)もたくさん種類が
あります。前に選択法という並べ替えをやりましたが
あれ以外にもいろいろあります。

アルゴリズムの二大巨塔と言われている(?)ものがあります。
それがソートサーチです。
ソートは並べ替えで、サーチは目的のデータを探し出すことです。
この二つはとてもよく使われるので覚えておきたいです。


さて、アルゴリズムを勉強するにはデータ構造にも注目します。
データ構造とはいままでやった配列や連結リストなど、数値などのデータを
どのように確保しておくのかということです。


というわけで次回からはアルゴリズムを勉強していきます!それではまた♪

posted by マックス at 18:23| Comment(0) | TrackBack(0) | アルゴリズム | このブログの読者になる | 更新情報をチェックする

2007年10月25日

練習問題

前回最後に練習問題を提示しました。


menber.txtからデータを読み込み、全員の名前(年齢は表示しなくてよい)、平均年齢を画面に出力するプログラムを作りなさい。

(menber.txt)
----------------------------
サム植田 32
三島拳  29
ナム太郎 55
三条院力 4
クラッシャー仙次郎 100



----------------------------


そしてプログラム例です↓




#include <stdio.h>

int main(void)
{
FILE *fp;
char buf1[32];
int age,count=0;
double ave=0.0;

fp = fopen("menber.txt","r");
if(fp == NULL)
{
perror("file open error");
return -1;
}

while(fscanf(fp,"%s%d",buf1,&age) != EOF)
{
printf("%s\n",buf1);

ave += age;
count++;//データの数(件数)をカウント
}

printf("\n平均年齢:%.2f",ave/count);

fclose(fp);

return 0;
}



ここでのポイントファイルから読み込んだ件数を数えるcountの役割です。
ファイルの内容が変わったらソースも変えなければならないようなプログラムは応用が利きませんね。
これは大事です。


ファイル操作はここで一段落として次回からは別のことをやります。
まだ考えてないのですがやりたいことはいろいろあるから大丈夫です!(何が大丈夫なんでしょう^^;)

それでは今日はこのへんで失礼します。
posted by マックス at 18:29| Comment(2) | TrackBack(0) | C:ファイル操作 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。