Hatena::ブログ(Diary)

it's-profo

2015-12-17 一年課題10 - 配列の使い方 変数の各処理について

一年課題10 - 配列の使い方 変数の各処理について

今回は配列の使い方について説明します。

変数を知らない場合は、先に変数の使い方を見ることをおすすめします。


配列とは

配列とは、変数の機能を拡張して考案された多次元的な変数を指す。

変数ではそれぞれ名前をつけて値を記録していたが、それでは複数の値の関連性や、連続した複数の変数の値を処理することができない。

そのため、それを補うために配列という方法で、一つの変数に番号を振って利用する。

その際には変数の型の後に、必ず[]という記号を入れ、配列であることを示さなければならない。

使用言語:processing

コード1

int[] a = {1,5,23,342}; // aという配列を宣言し値を代入する
float[] b = {3.12,636.1,2.2,-1.442}; // 以下は上の少数、文字の場合
string[] c = {"I","dont","like","processing"};

このように、processingjavaにおいてはその配列宣言した際にその値を代入することが良いとされている。

もし、宣言した際に値が準備されていない場合、代わりの適当な値を代入しておき、値が準備された後にその値を上書きするという方法が使われる。

他の方法として、先に配列として宣言しておき、その後各場所へ値を代入する方法があるが、若干わかりづらくなる。

コード2

int[] a; // aを配列として宣言
a = new int[] {1,5,23,342}; // 配列aの中に値を代入

この方法のメリットは、最初にいくつの値が代入されるか予測できない場合などに利用しやすい。

配列宣言時にいくつの値を代入できるようにするか指定することができる。

また、この宣言方法は、他言語では利用できない可能性が高い。これは、各言語において若干の仕様の違いがあり、共通した書き方が存在しないためである。

また、配列を使用する場合は以下のようになる。

コード3

println(a[0]); // 配列の値を出力する

コード3は、コード1や2で宣言した配列の一部を出力している。

変数の名前(この場合はa)の後に[]で囲った数字があるが、それが配列の値の位置を示している。

一番最初の位置にある値を取得する場合は、1ではなく0で位置を示す。

配列の他の使用方法として、複数の値をwhileやforなどの繰り返し処理で代入、または取り出すことができる。

コード4

int[] a = {2,5,2,62,5}; // 配列内に各値を代入

for(int i = 0; i <= 4;i++){ // for文を利用して内部を繰り返す、for文については同記事内繰り返し処理についてを参照
println(a[i]); // 配列内の値を順次出力
}

コード4では、代入された値をfor文で繰り返し、その配列からデータを取り出している。

このコードの出力の際に使われた部分に注目してもらいたいが、コード3では数字を入れていた部分に、今度は変数を入れていることがわかる。

これは、配列の大きな特徴の一つで、配列の値の位置を変数で表現することができるのだ。

値の位置は数字で表わされるため、int型などの整数変数を利用して処理が可能になる。

また、先ほど書いたとおり、配列の値の位置は0から始まるため、最初から全ての配列の値を取り出す場合は初期値を0にしておく必要がある。

これを利用することで、100個の値をたった数文で書くことができる。


変数の各処理について

プログラミングにおいて、値の演算、分岐、そして繰り返しは重要な要素である。

前回の説明では、変数の概要を説明し、今回は配列について説明したが、重要なこの3要素を飛ばして説明していた。

この章では、主に変数の各処理について解説していく。

演算記号の利用

プログラミングにおいて代入とは、=(イコール)で表されるものを指す。左辺に変数などを置き、右辺に値などを置くことでその値などを変数へ代入することができる。

使用言語:processing

コード5

int a = 24; // 左辺へ右辺の値を代入している

これは前回説明しているが、もし、足し算や引き算、掛け算、割り算を行いたい場合はどうなるのか。

以下はその説明である。

コード6

int a = 5 + 2; // 左辺へ右辺の5+2(足し算、7)を代入している
int b = 4 - 2; // 左辺へ右辺の4-2(引き算、2)を代入している
int c = 3 * 5; // 左辺へ右辺の3*5(掛け算、15)を代入している
int d = 42 / 2; // 左辺へ右辺の42/2(割り算、21)を代入している

このように、足し算、引き算は小学生の頃から使われる計算記号を用いられるが、掛け算、割り算に関しては計算記号がキーボード上に存在しないため、代わりに別の記号が用いられる。

掛け算を行う場合は*(アスタリスク)を用いる。

割り算を行い場合は/(シャープ)を用いる。

これらは四則演算と呼ばれ、通常の計算方法として用いられている。

コード7

int a = 4; // aに4を代入
int b = 6; // bに6を代入
int c = a + c; // cにaとcを足した結果を代入
int d = a - c; // dにaからcを弾いた結果を代入
int e = a * c; // eにaとcを掛けた結果を代入
int f = a / c; // fにaをcで割った結果を代入

四則演算などは変数同士を演算することが可能で、コード7のような方法が利用できる。

もちろん、配列も利用できる。

コード7のfに関して、値はどうなるだろうか。

答えは、0である。

理由は、fは整数型であるということが大きな理由である。

わかりやすく説明すると、4 / 6は0.6666666....となる(循環小数となっているが、今回は考える必要はない)。

見れば分かる通り、これは少数になる。少数は整数値に入りきらない内容が含まれるため、それらは全て切り捨てられる。

そのため、0.6666...は6666...の部分が切り捨てられて0となる。

四則演算の他に%という記号も存在する。

これは、以下の様な使い方をする。

コード8

int a = 5; // aに5を代入
int b = 6; // bに6を代入
int c = a % b; // cにaをbで割った時の余りを代入

%という記号は、コード8のようにaをbで割った際の余りを求める記号である。

つまり、自分で割り算をした際に余りを求めるコードを書く必要がなくなるということである。

なお、コード8を実行すると、cには5が代入される。

これらの記号は演算をするために用いられるため、演算子と呼ばれている。


分岐について

演算をした値を利用する方法として、分岐という方法が使われる。

コード9

int a = 3; // aに3を代入
int b = 6; // bに6を代入

if(a == b){ // aとbが同じであるか
}
if(a != b){ // aとbが同じでないか
}
if(a < b){ // aがb未満か
}
if(a <= b){ // aがb以下か
}
if(a > b){ // aがbより大きいか
}
if(a >= b){ // aがb以上か
}

コード9のように様々な分岐の使い方がある。この分岐の代表例として、ifという関数がある。

if文とは内で記述した条件式が真である場合に内部の処理を実行するというものである。

この条件式は前の演算子に似ているが違い、比較のためなどの条件のために使われるため、条件演算子と呼ばれる。

この条件は複数の条件を一つの式内に入れることができる。

コード10

int a = 5; // aに5を代入
int b = 2; // bに2を代入

if(a != b || a > b){ // aとbが同じでないか、aがbより大きいか
}
if(a != b && a > b){ // aとbが同じでなく、aがbより大きいか
}

コード10のif文で使われている||と&&とは、条件分岐で利用される記号の一つである。

||は、左右にある条件式のどちらかが真であれば内部の処理を実行するということを指す。

逆に&&は左右にある条件式の両方が真でなければ内部の処理を実行しない。


繰り返し処理について

プログラム内では同じ処理を何度も記述していると開発時間が長くなったり、ファイルサイズが大きくなったりと維持が面倒になるため、繰り返しができるような内容は繰り返しをしたり、同じ処理をまとめたりする。

その例としてこの繰り返し処理がある。

これにはwhile文とfor文が使われる。

whileでは、以下の様な使い方をする。

コード11

int a = 0; // aを初期化(0を代入)
int b = 100; // bに100を代入
int c = 1; // cに1を代入

while(a <= b){ // aがb以下の場合
c++; // cを1足す
a++; // aを1足す
}

whileの特徴は条件式が真である間は内部の処理を繰り返すというものである。

コード11のようにaが0の時は100より小さいため繰り返すが、何回か繰り返すとaが100に達するため、その後は条件式に当てはまらなくなるため、繰り返しを抜ける。

for文は以下のようになる。

コード12

int a = 5; // aに5を代入
int b = 0; // bを初期化(0を代入)
for (int i = 0;i <= 5;i++){ // iを初期化して5以下の場合
b = b + i; // bにiを足していく
}

for文の特徴は、条件式を入れる場所に3つの要素を入れることである。

まずひとつ目に、条件式や内部の処理で使われる値の初期化である。

ここで宣言した値は局所変数となり、for文の外では利用できない。

つまり、ここだけの変数として利用できるため、複数のfor文があっても干渉しなくなる。

次の要素として、条件式を当てはめることになる。複数の条件式を||や&&で区切って入れることが可能である。

最後の要素として、条件式や内部で使われる変数の値を足したりすることが可能ということである。

ここで足したり引いたりすることで、whileでは内部で記述していた処理がわかりやすくなる。

for文は実行される順番がわかりづらい点がデメリットであるが、それを克服できれば、非常に使いやすい繰り返しの関数であると思われる。

コード13

for(処理A;処理B;処理C){
処理D
}

コード13のように処理が入っていた場合、順番は以下のようになる。

1.処理Aの実行

2.処理Bの条件を確認、真でなければfor文を終了

3.処理Dを実行

4.処理Cを実行し、2へ戻る

for文も他の言語などでは、処理Aの位置で変数宣言ができないなど、若干の違いがあるため注意が必要である。

これらの繰り返し処理においては、途中で繰り返しから抜ける関数breakが用意されている。

コード14

for(int a = 0; a <= 1000; a++){ // 繰り返し開始
if(a == 50){ // aが50になった時
break; // 繰り返しから抜ける
}
println(a); // aを出力する
}

コード14で使われたbreakは、aが50になった時にfor文の条件が真であっても繰り返しを抜けるため、何か問題があった時や、条件式では表せなかった場合などに繰り返しを抜けることができる。


このように、変数には様々な使い方ができる。

ここで紹介した内容はあくまでも一例だが、他に連結などの方法もある。

2015-11-16

1年生課題8 -ピラミッド

段数の指定だけで、ピラミッドができるプログラムをつくりました。

8-1

int a;

int b=2;

int c;

int dannsuu = 10;

for(c=1;c<dannsuu;c++){

for(a=1;a<b;a++){

print("*");

}

println();

b=b+1;

}

8-2

int dannsu = 3,a = 1;

int count,count1,count2;

for(count = 1;count <= dannsu;count = count + 1){

for(count1 = 1;count1 <= dannsu - a; count1 = count1 + 1){

print(' ');

}

for(count2 = 1;count2 <= a;count2 = count2 + 1){

print('*');

}

a++;

println();

}

8-3

int dannsu = 3,a = 1,b = 1;

int count,count1,count2;



for(count = 1;count <= dannsu;count = count + 1){

for(count1 = 1;count1 <= dannsu - a; count1 = count1 + 1){

print(' ');

}

for(count2 = 1;count2 <= b;count2 = count2 + 1){

print('*');

}

a++;

b = b + 2;

println();

}

基本的に2重for文で書きます。

段ごとに書いていますが、*後の空白は、省略しています。

2015-11-11

一年課題1 - 変数の使い方

今回は変数の使い方について説明します。


変数とは

変数とは、プログラム上で値を一時的に保存するための箱を指す。

プログラムが処理を行う場合、必要な情報を毎回ハードディスクなどから読み出し、一時的に保存するデータをハードディスクへ書き込むのは非常に効率が悪いため、間にメモリと呼ばれる一時記憶装置にデータを入れておくことで、処理を高速化することができる。

そのメモリへのアクセスをプログラム上で簡単にしたものが「変数」である。

変数には、様々なデータを保存することができる。

変数には基本的に好きな名前をつけて良いが、次に当てはまる変数の名前は宣言できない。

  • 数字から始まる名前
  • _(アンダーバー)以外の記号を含む名前

数字から始まる名前では、あくまで先頭に数字が来てはいけないだけであり、2文字目以降に関しては数字を使っても構わない。

これらは主に次のように宣言され、変数として利用できるようになる。

使用言語:processing

コード1

int a;
float b;
string c;

また、上で宣言された場合、次のように値を代入(一時保存)することができる。

コード1続き

コード2

a = 5;
b = 4.12;
c = "ABCDE abcde あいうえお";

コード2では、"="を使って変数に値を代入した。

プログラミングでは、"="は条件分岐の一つである「等しい」という意味ではなく、「右辺を左辺へ代入する」という意味を指す。

もし、変数宣言した場合は、どこかで必ずデータを代入するべきである。

理由として、多くのプログラミング言語では、宣言しただけで代入されていない変数には、何らかの値が入っている場合が多いためである。

そのため、変数宣言と同時に値を代入することが一部を除いて推奨される。

その場合は、コード2の各変数の前にコード1で示したように変数の型名を加えるだけである。


変数の大きさ

一時記憶装置の中は有限である。そのため変数には、種類によって入れられる種類や量が決まっている。

コード1で示したように、intは整数、floatは浮動小数、stringは文字列を代入でき、特にintにおいては、2,147,483,648から-2,147,483,648までの整数しか入らず、もしどちらかから値が飛び出た場合、その逆へ戻ってくる。

コード3

int a = 2147483648; // int型のaという変数にint型の最大値を代入
int b = a + 1; // 最大値に1足した数をint型で宣言したbという変数に代入

コード3の結果は、-2147483648となる。


グローバル(大域)変数とローカル(局所)変数

また、変数にはおおまかに2種類に分けられる。

  1. グローバル変数
  2. ローカル変数

グローバル変数(別名:大域変数)とは、プログラムコード内のどこでも読み出し、書き換えが可能な変数のことである。

コード4

int a = 1000; // 1000という値をint型のaという変数に代入
for(int i = 0; i <= 5; i++){ // for文と呼ばれる関数で、詳細は後日
int b = a + 5; // aと5を足した値をint型のbという変数に代入
}

この時、for文の中は完全にその周りのコードから独立した変数を持っており(この場合は変数b)、aはそのfor文の外で宣言しているため、for文の中からデータを呼び出すことができる。


ローカル変数(別名:局所変数)とは、プログラムコード内のある一定の部分からでないと読み出し、書き換えが不可能な変数のことである。

コード4で示したとおり、変数aはグローバル変数である。では、for文内にある変数bはどうだろうか。

このbは、for文というある流れの中で宣言されている。そのため、そのfor文の外からは読み出すことも、書き込むこともできなくなっている。


これによる利点として、複数の処理で使用する、または最終的に必要となるデータを一時保存するための変数としてグローバル変数が、またある小さな処理の中で一時的にデータを保存するための変数としてローカル変数が、という形で、変数住み分けができるようになる。

住み分けを行うと、ローカル変数においては、他の小さな処理の中でも同じ名前の変数宣言した時、新しくデータを代入することができるため、変数につける名前を増やさなくてすむようになる。

2015-11-04

一年課題7 - 九九表

九九表のソースコードを記述します。

使用言語:C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Multiplication_table
{
    class Program
    {
        static void Main(string[] args)
        {
            string line = ""; // 一行分保存する変数を宣言
            for (int left = 1,right = 1;left <= 9 && right <= 9;right++) {
                int ans = left * right; // 掛け算を一時的に保存
                line += ans + " "; // 掛け算結果とスペースしたものを行へ追加
                if (right == 9) {
                    Console.WriteLine(line); // 行が最大の掛け算を終えた時、結果を出力する
                    if (left != 9)
                    {
                        left++; // 最後まで到達していない場合、左辺を1足す
                        right = 0; // for文で1足されるので、初期化時に0に戻す
                        line = ""; // lineを空っぽに初期化
                    }
                }
            }
            Console.ReadLine(); // 終了の入力待ち
        }
    }
}

九九表とは、小学校二年生で習う内容「九九」の表である。

1から順に横に増え、各段が終わるごとに改行される。

for文でできるだけ条件をつけておき、そこから掛け算、そして条件分岐を行った。

if文を入れ子構造にしてあるため、若干見づらくなった。

また、変数rightはfor文で常に+1されるので、初期化の際に0にしなければならないということ、そして行データの入っているline初期化する必要が有ることを忘れていたため、ぜんぜん違う値が出ていた。

一年課題5 フィボナッチ数列

フィボナッチ数列とは、1,1,2,3,5,8のように前の数字を足していく数列である。


int a;

int b=1;

int c=1;

for(a=1;a<=5;a++){

println(b);

println(c);

b=b+c;

c=c+b;

}

最初、1を2回表示させた後、bをbとcを足し2、cを2になったbとcを足し3にし、それを表示する。その後、bを5、cを8にして、それをまた表示...と繰り返す。よって、この式では、フィボナッチ

数列を表示するために、bとcを足し増えた数値と足されていない数値を足し、またでた数値と前の数値を足す...というように前の数を足していく式を立てた。

2015-08-24

1年生課題6 - FizzBuzz

FizzBuzzソースコードを記入します。

使用言語:Processing


for(int i = 1;i <= 1000;i++)
{
  print(i);
  if((i % 3) == 0){
    print("Fizz");
  }
  if((i % 5) == 0){
    print("Buzz");
  }
  print("\n");
}

FizzBuzzとは、1から順に数を答えていき、3の倍数のときに"Fizz"、5の倍数のときに"Buzz"と答え、3と5の倍数の時には"Fizz Buzz"と答えるゲームである。

今回のプログラムでも、演算子"%"を利用した。

Processingで書いたため間違っていないかわからなかったが問題なく動いたので大丈夫だと思う。

15まで確認したが1000まで出力する。

1年生課題9 - 素数判定

素数判定のソースコードを記入します。

使用言語:C#


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ITProfo_PrimeNumber
{
    class Program
    {
        static void Main(string[] args)
        {
            // 素数を求めるプログラム
            int que;
            Console.WriteLine("素数か確認したい数値を整数で入力してください。");
            que = int.Parse(Console.ReadLine());

            // 簡単な確認開始
            if (que <= 1){
                Console.WriteLine(que + "は素数ではありません。");
                Console.ReadLine(); // コンソール動作を停止
            }else { 
                // 2以降の数字で割り切れるか調べる
                // ただし、自身を2で割った数までしか調べない
                // また、割った際に1になった場合は素数をする(入力された数値は2であるため)
                float ch_count = que / 2.0f;
                if (ch_count == 1.0){
                    Console.WriteLine(que + "は素数です。");
                    Console.ReadLine(); // コンソール動作を停止
                }
                else
                { 
                    // floatをint型にcastして1足す
                    int max_count = (int)ch_count + 1;
                    // for文を利用して調べていく(クラスを利用してみる)
                    Prime p = new Prime();
                    if (p.prime(que, max_count))
                    {
                        // 素数である
                        Console.WriteLine(que + "は素数です。");
                        Console.ReadLine(); // コンソール動作を停止

                    }
                    else
                    {
                        // 素数でない
                        Console.WriteLine(que + "は素数ではありません。");
                        Console.ReadLine(); // コンソール動作を停止
                    }
                }
            }
        }
    }

    class Prime
    {
        public bool prime(int que,float max_count)
        {
            // 受け取った値を使って確認開始
            // for文を利用して割り切れるかを確認する
            for (int i = 2; i < max_count; i++)
            {
                if ((que % i) == 0)
                    // 割り切れたので素数ではない
                    return false;
            }
                // 割り切れなかったので素数
                return true;
        }
    }
}

素数とは自分の値と1以外で割り切れない正の数である。

今回のプログラムでは、演算子"%"を利用して素数を求める仕組みを採用した。

今までに何度か素数を求めるプログラムを制作したが、while文を利用しいちいちfloatを切り捨てして少数がないか調べていたので、読みにくいコードとなっていたが、今回は非常に読みやすいコードがかけた。

また、特に理由もなくクラスを利用した。