Исходный текст
Ответ 6,00000
На java вызов методов точно такой же.
import java.lang.Math. *;
public class Treug
{
private double P()
{
return a+b+c;
}
private double a,b,c;
public void Init(double aa, double bb, double cc)
{
a=aa;
b=bb;
c=cc;
}
public double S()
{
double p,s;
p=P()/2;
s=Math. sqrt (p*(p-a)*(p-b)*(p-c));
return s;
}
public static void main (String args[])
{
Treug Z = new Treug();
double y;
Z.Init(3,4,5);
y=Z.S();
System. out. printf("ответ %f",y);
y=Z.P(); // нетошибки, хотя private
}
}
вывод на консоли:
4) Константы на C++ и Java
В Си константы определялись:
#define MaxTime 80int main(int argc, char* argv[])
{
Record a[MaxTime];
.......
}
В C++ можно использовать:
const MaxTime=80;
.......
int main(int argc, char* argv[])
{
Record a[MaxTime];
.......
}
На java константа записывается:
final static MaxTime=80;
.......
Record b[] = new Record[MaxTime];
5) Передача параметров методов на C++ и Java и перегрузка функций
Вариант метода Numbersec класса Record результат получается через параметр.
class Record
{
public:
void Init(int m,int s);
int Numbersec();
private:
int min;
int sec;
};
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
int Record::Numbersec()
{
return min*60+sec;
}
int main(int argc, char* argv[])
{
Record a;
int k;
a.Init(2,20);
k=a.Numbersec(); // k=2*60+20=140
|
|
return 0;
}
Вариант Numbersec с параметром (пример с ошибкой!!)
public:
void Init(int m,int s);
void Numbersec(int Rez); // в Rez – результат вычисления числа секунд
int Record::Numbersec(int Rez)
{
Rez=min*60+sec;
return;
}
int main(int argc, char* argv[])
{
Record a;
int k;
a.Init(2,20);
k=5;
a.Numbersec(k); // ошибка!! ожидалось k=140, но k=5!!
return 0;
}
В Си и C++ параметр передается по значению, значение не возвращается.
Исправление на Си (работает и на С++)
public:
void Init(int m,int s);
void Numbersec(int *Rez); // параметр – указатель
int Record::Numbersec(int *Rez)
{
*Rez=min*60+sec;
return;
}
int main(int argc, char* argv[])
{
Record a;
int k;
a.Init(2,20);
k=5;
a.Numbersec(&k); // правильно k=140 передача адреса
return 0;
}
На С++ можно использовать более удобный параметр – ссылку.
public:
void Init(int m,int s);
void Numbersec(int &Rez); // параметр – указатель
int Record::Numbersec(int &Rez)
{
Rez=min*60+sec;
return;
}
int main(int argc, char* argv[])
{
Record a;
int k;
a.Init(2,20);
k=5;
a.Numbersec(k); // правильно k=140 обычная передача
return 0;
}
Ссылка - аналог var в списке параметров Паскаля.
Примитивные типы (int, double) передаются только по значению и не возвращают изменение значений
public class Record
{
private int min;
private int sec;
public void Numbersec(int k)
{
k=min*60+sec; // здесьk=124
return;
}
public void Init(int m, int s)
{
min=m;
sec=s;
}
public static void main (String args[])
{
Record a;
int k;
a= new Record();
a.Init(2, 4);
k=5;
a.Numbersec(k);
System. out. printf("ответ %d", k); // k=5 не изменился
}
}
ответ 5
Параметры – объекты передаются по ссылке, при изменении после выхода, меняется значение фактического параметра
class Rezult // вспомогательный класс
{
public int param; // поле для возврата результата
}
public class Record
{
private int min;
private int sec;
public void Numbersec(Rezult k) // аргумент - объект
{
k.param=min*60+sec;
return;
}
public void Init(int m, int s)
{
min=m;
sec=s;
}
public static void main (String args[])
|
|
{
Record a;
Rezult c= new Rezult();
a= new Record();
a.Init(2, 4);
c.param=6; //
a.Numbersec(c);
System. out. printf("ответ %d", c.param); // 124 у c param изменился
}
}