Консольное приложение на языке java. Запись классов и объектов на java
Выбери формат для чтения
Загружаем конспект в формате doc
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Консольное приложение на языке java. Запись классов и объектов на java
1) Указатели. Динамические объекты на С++
Пример указателя на Си
int main(int argc, char* argv[])
{
int m;
int *k; // указатель на int
k=(int *)calloc(1,sizeof(int)); // выделение памяти для k
*k=2; // переход от указателя к переменной и присваивание
m=*k; // присваивание значения обычной переменной
free(k); // освобождение памяти
}
k=(int *)calloc(1,sizeof(int)); Выделение памяти для указателя. Указатель – адрес, в 32 системе 4 байта, в 64-разрядной – 8 байт.
(int *) -преобразование указателя void в int.
Между указателями char, int, double и т.д. существуют ряд различий, поэтому в C++ принято преобразование, хотя никакие данные не меняются
char *c;
int x,y,z;
c=(char *)calloc(1,sizeof(char));
x=(int)c; // перевод указателя в целое число
c=c+1; // увеличение на 1
y=(int)c;
z=y-x; // z=1
double *c1;
int x,y,z;
c1=(double *)calloc(1,sizeof(char));
x=(double)c1; // перевод указателя в целое число
c1=c1+1; // увеличение на 1
y=(int)c1;
z=y-x; // z=8 !!
c1=c1+1 увеличение адреса на размер переменной, на которую и указывает c1
Для объектов указатели такие же, но вместо calloc и free используются new и delete
class Record
{
public:
void Init(int m,int s);
private:
int min;
int sec;
};
void Record::Init(int m,int s)
{
min=m;
sec=s;
}
int main(int argc, char* argv[])
{
Record *a; // объект - указатель на класс Record динамический объект
a= new Record; // вместо calloc
(*a).Init(6,7); // аналогично обычным переменным
delete a; // вместо free
}
Для доступа к полям через указатель можно использовать операцию -> вместо точки
int main(int argc, char* argv[])
{
Record *a; // объект - указатель на класс Record
a= new Record; // вместо calloc
a->Init(6,7); // вместо (*a).Init(6,7);
delete a; // вместо free
}
Аналогично переменным можно через указатели создавать динамические массивы объектов
int main(int argc, char* argv[])
{
Record *a; // объект - указатель на класс Record
int i;
a= new Record[5]; // массив из 5 объектов
for (i=0;i<5;i++)
{
a[i].Init(6,i); // a[0].min=a[1].min=...=a[4].min=6 a[0].sec=0 a[1].sec=1 a[2].sec=2...
}
delete[] a; // для освобождения памяти массива delete[]
}
Массив результатов у спортсмена (Пример 1).
class Sportsman
{
public:
char* GetFam(); // возвращает строку-фамилию
.......
void InitRez(int *m,int *s); // задание значений min,sec всемрезультатам
int Sumrez();
private:
char Fam[30]; // фамилия
Record Rezults[5]; // массив результатов
};
.......
void Sportsman::InitRez( int *m,int *s)
{
int i;
for(i=0;i<5;i++)
{
Results[i].Init(m[i],s[i]); // всем результатам
}
}
int Sportsman::Sumrez()
{
int i,s;
s=0;
for(i=0;i<5;i++)
s+=Results[i].Numbersec();
return s;
}
int _tmain(int argc, _TCHAR* argv[])
{
int m[5]={3,6,8.2,4};
int s[5]={15,20,25,16,10};
b.InitRez(m,s);
k=b.Sumrez();
.....
}
2) Принцип работы на языке Java
Принцип работы на языке Java – это компиляция в промежуточный язык с последующей интерпретацией
Выполнение программы в данной операционной системе:
Программа на исходном языке компилятор выполняемая программа
(Паскаль, Си, C++… ) машинные коды (myprog.exe)
Программа myprog.exe в другой ОС не запустится.
Принцип работы Java:
Исходная программа на Java (myprog.java) компилятор javac.exe выполняемая
программа
коды java 1 байт
(вкл. классы, аналогичные компонентам свой для каждой ОС myprog.class
C++ Visual Studio)
Программа одинаковая для любой ОС ! одинаковая
Для всех ОС !
Выполнение java программы:
myprog.class JVM (java virtual machine) выполнение
java.exe – своя для каждой ОС программы
интерпретатор байт-кодов java
Чтобы программа myprog.class (байт-коды) запустилась на некотором устройстве нужно только чтобы на устройстве была программа JVM (виртуальная машина java)
(или вшита в телефон)
Варианты java:
java 2 SE (standart edition) – для PC +
java 2 ME (micro edition) – для мобильных устройств -
java 2 EE (enterprise edition) – корпоративные и серверные разработки -
требуемые системы для разработки программ:
jdk-8-windows-x64.exe - для windows java и все классы SE
eclipse – удобная среда с редактором и отладчиком. (запускается без установки)
netbeans - альтернативная среда с возможностью визуальных построений форм
О Microsoft:
Visual J++ , аналогичен Visual C++, программа пишется на языке java, но компилируется в exe-файл. Нет JVM!!! exe запускается только под windows.
Есть и J++ Builder , аналогично C++ Builder фирмы Borland, но с JVM
3) Приложение без классов на java
Выражения, операторы и управляющие структуры (if,while,for) совпадают с Си !
Математические функции java как на Си (примеры):
abs(x),asin(x), sin(x), cos(x), exp(x),log(x),random(x) случ. на [0,1] , round(x), pow(x,y)
Пример программы на java
// программа 1
import java.lang.Math.*; // вместо (include math.h)
public class lab2
{
public static void main (String args[] )
{
int x;
double y;
x=2;
y=x*x+3;
y=y/Math.sin(Math.PI/2); // sin метод класса Math, PI=3.14.. есть в Math
System.out.printf("x= %d y= %f", x,y); // библиотека (пакет) system подцеплен
}
}
Основной класс (с функцией main) должен располагаться в файле с
таким же именем !
Программу можно набрать в блокноте notepad и сохранить в файл lab2.java
Для компиляции и запуска удобно использовать bat-файлы в той же папке, где lab2.java.
Compile.bat
set path=c:\Program Files\Java\jdk1.8.0_51\bin\;%path%
javac.exe -Xstdout diag.txt lab2.java
pause
1 строка – путь к установленному пакету jdk-7-windows-x64.exe
2 строка – запуск компилятора javac.exe для компиляции lab2.java, ошибки компиляции записывать в diag.txt
Если ошибок нет (diag.txt пуст) создается файл lab2.class с байт-кодами.
run.bat
set path=c:\Program Files\Java\jdk1.8.0_51\bin\;%path%
java.exe lab2
pause
2 строка – запуск JVM – интерпретатор байт-кодов программы lab2.class
Вывод на консоли после запуска:
О выводе русских букв на java
В java принята кодировка unicode.
Обычная windows кодировка (1251)
'1' – десятичное :(49) 16: (0x31) битовое: (00110001)
‘Б’ – десятичное : (190) 16: (0xC1) битовое: (11000001)
1символ – 1 байт
Для многоязычных документов кодировка unicode:
1 символ – 2 байта.
‘Б’ - 0xF2 0xE2
1 байт – кодовая страница с требуемым алфавитом (например, кириллица или иврит)
2 байт код символа в данной странице.
Заменим в строке System.out.printf("x= %d y= %f", x,y); y= на ответ:
на консоли появится краказябра.
Исправление – переключение системного вывода через библиотеку java.io.
import java.io.*; // подключение библиотеки ввода-вывода на java
import java.lang.Math.*;
class lab2
{
public static void main (String args[] )
{
try
{
// переключение вывода консоли на кодировку unicode
OutputStreamWriter os = new OutputStreamWriter (System.out,"Cp866");
// создание объекта Pr класса PrintWriter для вывода на консоль
PrintWriter Pr = new PrintWriter (os, true);
// начало консольной программы
int x;
double y;
x=2;
y=x*x+3;
y=y/Math.sin(Math.PI/2);
Pr.printf("%s %d %f","ответ: ",x,y); // объект Pr вызывает свой метод printf
// конец консольной программы
}
catch(Exception е)
{
}
}
}
В среде eclipse также возможен аналог консольного приложения:
В начале работы нужно задать WorkSpace – Общую директорию для всех проектов. (Желательно во всех путях без русских букв!). Для смены – File->Switch WorkSpace
File->new->Java project
File->new->Class
Не требуется перекодировка, система настроена на компьютер. Выводятся русские буквы
О функии scanf:
В отличие от printf в java нет прямого форматного ввода, аналогичного scanf(“%d”,&x).
Используя библиотеку import java.util.*; можно выполнить ввод через класс Scaner, во многом похожий на stdio.h.
4) Запись на java классов и объектов и отличия от С++
public class Record
{
private int min;
private int sec;
public int Numbersec() // (1)
{
return min*60+sec; // (2)
}
public void Init(int m,int s) // (4)
{
min=m;
sec=s;
}
public int GetFirst()
{
return min;
}
public int GetSecond()
{
return sec;
}
public static void main (String args[] )
{
Record a = new Record(); // (3);
int k;
a.Init(2, 4);
k=a.Numbersec();
System.out.printf("ответ %d", k);
}
}
вывод на консоли:
ответ 124
отличия от С++
(1) - public, private указывается для каждого поля и метода
(2) – тело метода (функции) сразу за заголовком. В C++ такие функции называются inline-методы
(3) – необходима инициализация объекта new – конструктор, в C++ используется для динамических объектов
(4) – public можно заменить на private: private void Init(int m,int s), т.к. main принадлежит классу
main – метод класса Record и может вызвать private метод Init.
5) Запись нескольких классов
класс Record вспомогательный, Sportsman основной, в Sportsman есть два поля
объектов вспомогательного класса, т.е. два результата. Кроме этого, в классе Sportsman
есть поле straf , число штрафных минут (как, например, в биатлоне). Добавлен метод
вычисления общего числа секунд за два результата с учетом штрафа.
class Record
{
private int min,sec;
public void Init(int m,int s)
{
min=m;
sec=s;
}
public int Numbersec()
{
return min*60+sec;
}
public int GetFirst()
{
return min;
}
public int GetSecond()
{
return sec;
}
}
public class Sportsman (1)
{
private int Straf; // дополнительное поле
private Record r1 = new Record(); // поле типа Record
private Record r2 = new Record(); // поле типа Record
public void Init(int v,int m1,int s1,int m2,int s2)
{
Straf=v;
r1.Init(m1, s1); // инициализация первого результата
r2.Init(m2, s2); // инициализация второго результата
}
public int Sum() // общее число секунд
{
int k;
k=r1.Numbersec(); // секунды первого
k=k+r2.Numbersec(); // плюс секунды второго
k=k+Straf*60; // штраф
return k;
}
public static void main (String args[] )
{
Sportsman a=new Sportsman();
int k,m;
a.Init(1,2,6,1,55);
k=a.r1.Numbersec();
m=a.Sum();
System.out.printf("ответ %d %d",k,m);
}
}
(1) – в файле должен быть один класс public, имя которого совпадает с именем файла.
sportsman.java
Вывод:
126 301
5) Массивы встроенных типов на java и массивы объектов
.......................
public static void main (String args[] )
{
int i; // обычная переменная
Record a=new Record(); // один объект ссылка с инициализацией
a.Init(3, 40); // вызов метода
int c[] = new int[5]; // инициализация обычного массива int. int c[5]; нельзя!
Record b[]= new Record[5]; // массив ссылок, но ссылки null
for(i=0;i<5;i++)
{
b[i]= new Record(); // каждый элемент массива – ссылка на Record !!
}
for(i=0;i<5;i++)
{
b[i].Init(i, 10); // вызов метода поэлементно
}
for(i=0;i<5;i++)
{
c[i]=b[i].Getmin(); // поэлементная запись в массив c
}
for(i=0;i<5;i++)
{
System.out.printf("%d ",c[i]);
}
System.out.printf("\n");
}
}
вывод на консоли:
0 1 2 3 4
Можно использовать переменные, которым задано значение.
int k=10;
double []x=new double [k];
Пример двумерного массива.
double [][] a;
a=new double [4][3];
for(i=0;i<4;i++)
for(j=0;j<3;j++)
a[i][j]=0.0;
В многомерном массиве достаточно указывать только левую границу.
int[][] m=new int [5][];
n=m.length;
for(i=0;i
Тебе могут подойти лекции
А давай сэкономим
твое время?
твое время?
Дарим 500 рублей на первый заказ,
а ты выбери эксперта и расслабься
Включи камеру на своем телефоне и наведи на Qr-код.
Кампус Хаб бот откроется на устройстве
Не ищи – спроси
у ChatGPT!
у ChatGPT!
Боты в Telegram ответят на учебные вопросы, решат задачу или найдут литературу
Попробовать в Telegram
Оставляя свои контактные данные и нажимая «Попробовать в Telegram», я соглашаюсь пройти процедуру
регистрации на Платформе, принимаю условия
Пользовательского соглашения
и
Политики конфиденциальности
в целях заключения соглашения.
Пишешь реферат?
Попробуй нейросеть, напиши уникальный реферат
с реальными источниками за 5 минут
с реальными источниками за 5 минут
Консольное приложение на языке java. Запись классов и объектов на java
Хочу потратить еще 2 дня на работу и мне нужен только скопированный текст,
пришлите в ТГ