マルチメディアコンピューティングU

第3章:変数を使う

3.1 繰り返し

3.2 計算式と代入文の書き方

3.3 if文

3.4 while文など

3.5 配列

3.6 多角形と折れ線図形

3.7 応用例−グラデーション

付録1. オブジェクト指向とは何か

プログラムを作るための道具は極端に単純化すると(データを表現する)変数と(アルゴリズムを表現する)関数である.道具には名前をつけて区別するが,きれいなプログラムを作るためには適切な名前をつけたい.

サンプル1(非構造化プログラミング)

ターミネータがそれぞれ-1と0である二つの配列aとbの内容をそれぞれ集計するプログラムである.)

main() {
    int a[] = {1,2,3,-1};
    int b[] = {10,20,30,40,0};
    int i1,i2;
    int sum1, sum2;

/* 配列aの集計 */
    i1 = 0; sum1=0; 
    while(a[i1] != -1) {
        sum1 = sum1 + a[i1];
        i1++;
    }
    printf("sum = %d, num = %d\n", sum1, i1);


/* 配列bの集計 */
    i2 = 0; sum2=0;
    while(b[i2] != 0) {
        sum2 = sum2 + b[i2];
        i2++;
    }
    printf("sum = %d, num = %d\n", sum2, i2);
}

サンプル2(構造化プログラミング)

void sum1(int*);
void sum2(int*);

main() {
    int a[] = {1,2,3,-1};
    int b[] = {10,20,30,40,0};

/* 配列aの集計 */
    sum1(a);
/* 配列bの集計 */
    sum2(b);
}

void sum1(int* a) {
    int i = 0;
    int sum = 0;

    while(a[i] != -1) {
        sum = sum + a[i];
        i++;
    }
    printf("sum = %d, num = %d\n", sum, i);
}

void sum2(int* a) {
    int i = 0;
    int sum = 0;

    while(a[i] != 0) {
        sum = sum + a[i];
        i++;
    }
    printf("sum = %d, num = %d\n", sum, i);
}

サンプル3(オブジェクト指向プログラミング)

public class sample3 {
    public static void main(String args[]) {
        arrayA a = new arrayA();
        arrayB b = new arrayB();

        /* 配列aの集計 */
        a.sum();
        /* 配列bの集計 */
        b.sum();
    }
}

class arrayA {
    int[] array = {1,2,3,-1};

    void sum() {
        int i = 0;
        int sum = 0;

        while(array[i] != -1) {
            sum = sum + array[i];
            i++;
        }
        System.out.print("sum = ");
        System.out.print(sum);
        System.out.print(", num = ");
        System.out.println(i);
    }
}

class arrayB {
    int[] array = {10, 20, 30, 40, 0};

    void sum() {
        int i = 0;
        int sum = 0;

        while(array[i] != 0) {
            sum = sum + array[i];
            i++;
        }
        System.out.print("sum = ");
        System.out.print(sum);
        System.out.print(", num = ");
        System.out.println(i);
    }
}

付録2.ベジエ曲線

import java.applet.Applet;
import java.awt.*;
import java.awt.geom.*;

public class bezier extends Applet
{
        public void paint(Graphics g)
        {
        Graphics2D g2=(Graphics2D)g;

        GeneralPath p = new GeneralPath();
        p.moveTo(10,10);

        p.lineTo(200,200);

        p.moveTo(10,10);
        p.quadTo(10,200,200,200);

        p.moveTo(10,10);
        p.curveTo(10,200,200,10,200,200);

        p.closePath();
        g2.setColor(Color.blue);
        g2.fill(p);
        g2.setColor(Color.yellow);
        g2.setStroke(new BasicStroke(2.0f));
        g2.draw(p);

        g.setColor(Color.black);
        g.fillOval(10,200,5,5);
        g.fillOval(200,10,5,5);

        }
}

付録3. 平方根の計算

import java.applet.Applet;
import java.awt.*;

public class sqrt extends Applet
{
        public void paint(Graphics g)
        {
                double d;
                d = Math.sqrt(2.0);
                g.drawString(Double.toString(d),10,10); 
                g.drawString(Integer.toString((int)d),10,30); 
        }
}

付録4. 2次関数の描画(1)

import java.applet.*;
import java.awt.Graphics;

public class equation2 extends Applet
{
        public void paint(Graphics g)
        {
                int a = 1;
                int b = 0;
                int c = 0;
                int x,y,x1,y1;

                for(x=-500;x<500;x++)
                {
                        y=a*x*x+b*x+c;
                        x1=x+1;
                        y1=a*x1*x1+b*x1+c;
                        g.drawLine(500+x*3,500-y,500+x1*3,500-y1);
                }
                g.drawLine(0,500,1000,500);
                g.drawLine(500,0,500,1000);
        }
}

付録5. 2次関数の描画(2)

import java.applet.*;
import java.awt.Graphics;

public class equation21 extends Applet
{
        int left,right,top,bottom;

        public void paint(Graphics g)
        {
                int a = -3;
                int b = 10;
                int c = 50;
                int x,y,x1,y1;
                double xp, yp;

                xp = -b/(2*a);
                yp = a*xp*xp+b*xp+c;

                left = Math.min(0,(int)xp)-10;
                right = Math.max(0,(int)xp)+10 ;
                top = Math.max(0,(int)yp)+10;
                bottom = Math.min(0,(int)yp)-10;

                for(x=left;x<right;x++)
                {
                        y=a*x*x+b*x+c;
                        x1=x+1;
                        y1=a*x1*x1+b*x1+c;
                        g.drawLine(conx(x),cony(y),conx(x1),cony(y1));
                }
                g.drawLine(conx(left),cony(0),conx(right),cony(0));
                g.drawLine(conx(0),cony(bottom),conx(0),cony(top));

        }
        
        int conx(int x)
        {
                return 1000*(x-left)/(right-left);
        }
        int cony(int y)
        {
                return 1000-1000*(y-bottom)/(top-bottom);
        }
}

付録6. 小数の表示

import java.applet.*;
import java.awt.*;

public class decimal extends Applet {
        public void paint(Graphics g) {
                String s = Double.toString(1.0/3.0);
                g.drawString(s, 10, 10);
                g.drawString(s.substring(0,s.indexOf(".")+3), 10, 20);
        }
}

2003.11.19