问题描述:已知三角形三边长,求其周长和面积。
一.C程序
#include <stdio.h>
#include <math.h>
int perimeter(int m,int n,int k)
{
return m+n+k;
}
double area(int m,int n,int k)
{
double p=1.0*(m+n+k)/2;
return sqrt(p*(p-m)*(p-n)*(p-k));
}
int main()
{
int a,b,c;
a = 3;
b = 4;
c = 5;
printf("%d %lf",perimeter(a,b,c),area(a,b,c));
}
此程序的不足:a,b,c可以是任意三个值。即使实参是年,月,日也可计算周长,面积。即a,b,c和周长,面积不是一个整体。即数据和数据的操作分离。
二.java程序
C程序通过定义变量,再定义函数进行操作解决问题。java则不同。java采用面向对象的思想:要解决求周长,面积这个问题,先要把三角形这个事物模拟出来。而事物的模拟(面向对象)在于两个方面:静态的属性,动态的可执行的操作。
从C的角度模拟三角形
struct Triangle
{
int a;
int b;
int c;
//实际在C中以下操作时不允许的
int perimeter(int a,int b,int c)
{
....
}
double area(int a,int b,int c)
{
....
}
}
而在java中允许上述方式。即:
//class类似c中的struct。
//class中定义的变量模拟事物静态的属性,定义的函数模拟事物可执行的操作。
//java中的函数也叫方法。方法代表的是对一个事物的操作。
class Triangle
{//构造事物模型---类
int a;
int b;
int c;
//事物的方法可以直接访问事物的变量。因为他们是有机的整体。因此不必定义形参
int perimeter()
{
return a+b+c;
}
double area()
{
double p = 1.0*(a+b+c)/2;
return Math.sqrt(p*(p-a)*(p-b)*(p-c));//使用Math工具中的sqrt,不同于c中的文件包含。
}
}
class M
{
public static void main(String[] args)
{
//int i;
//int *p =(int*)malloc(sizeof(int));
//A * q = (A*)malloc(sizeof(A));q指向A
//Triangle * r = (Triangle *)malloc(sizeof(Triangle));
Triangle s = new Triangle();//等价于上一句。此语句生成Triangle类型的事物。用s指向它。
s.a = 3;
s.b = 4;
s.c = 4;
System.out.printf("%d %f",s.perimeter(),s.area());
//java中float和double都用%f输出。C中double用%lf输出。
//数据和数据的操作是一个有机整体。所以以下语句错误
// perimeter(); 操作是事物的操作。周长这个函数只能被三角形这个事物调用,不能被其他事物调用。java能更好的模拟现实事物。
}
}