Програма компонувальник візитних карток

Інформація про навчальний заклад

ВУЗ:
Ужгородський національний університет
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра програмного забезпечення

Інформація про роботу

Рік:
2016
Тип роботи:
Курсова робота
Предмет:
Інформаційні технології

Частина тексту файла (без зображень, графіків і формул):

Ужгородський національний університет Факультет інформаційних технологій Кафедра програмного забезпечення систем Курсова робота На тему: «Програма компонувальник візитних карток» Завдання на курсову роботу Розробити програму для ПК - компонувальник візитних карток мовою програмування Java. Програма повинна відповідати наступним вимогам: Повинен бути реалізований інтерфейс користувача, що дозволить легко компонувати візитні картки. Програма повинна надавати можливість свмостійно розроблювати шаблони візитних карток, та змінювати вже існуючі. Процес створення/редагування шаблону має включати в себе вибір: зображення; шрифту зображуваного тексту; розмір шрифту зображуваного тексту; колір шрифту зображуваного тексту; положення полів візитної картки. Програма повинна надавати можливість друку скомпонованої візитної картки. Програма повинна надавати можливість зберігати скомпоновану візитну картку в форматі png. Візитна картка включає в себе зображення та чотири поля: Прізвище, ім'я та побатькові; Контактний телефон; Адреса; Кроткий опис діяльності. ЗМІСТ Вступ................................................................................................................................4 1. Опис розроблюваного ПЗ......................................................................................5 1.1. Опис середовища програмування, JAVA. Аналоги..........................5 1.2. Програма Візитка – компонувальник візитних карток..................6 2. Опис структурно – логічної схеми ПЗ.................................................................9 2.1. Загальна структура проекту. Опис класів.........................................9 2.2. Опис основних алгоритмів роботи ПЗ...............................................12 3. Тестування розроблюваного ПЗ……….............................................................16 3.1. Створення візитки.................................................................................16 3.2. Друк візитки...........................................................................................16 3.3. Збереження в файл................................................................................17 3.4. Редагування шаблону...........................................................................17 Висновок.......................................................................................................................19 Використана література.............................................................................................20 Додатки..........................................................................................................................21 Вступ Дана курсова робота присвячена розробці програми, що буде реалізовувати можливості компонувальника візитних карток мовою програмування Java. «Програма компонувальник візитних карток» (Візитка) - програма, що дозволяє створювати візитки, зберігати їх в png формат, та подавати їх на друк. Метою курсової роботи є розробка програмного продукту за допомогою мови програмування Java - Компонувальник візитних карток (Візитка). Для досягнення даної мети були обрані засоби розробки: середовище програмування Eclipse з використанням JFrame, що входить до пакету javax.swing. В процесі виконання даної курсової роботи буде досліджено ряд подібних додатків, будуть визначені їх хороші і погані сторони. Для досягнення мети курсової роботи необхідно виконати наступні завдання: - Проаналізувати існуючі програми; - Розробити структурну організацію ПЗ; - Розробити інтерфейс користувача програми; - Виконати реалізацію ПЗ відповідно до технічного завдання (ТЗ); - Виконати тестування розробленої програми; - Оформити документацію з курсової роботи. Пояснювальна записка складається з завдання на курсову роботу, вступу, трьох розділів, висновку, списку використаних джерел (4 шт.), додатків. Робота містить 12 малюнків, лістингів коду (один повністю і 7 обраними частинами) і 1 таблицю. Загальний обсяг роботи - 39 друкованих сторінок. 1. Опис розроблюваного ПЗ 1.1 Опис середовища програмування, JAVA. Аналоги. Для виконання даної курсової роботи було використано Eclipse. Eclipse дозволяє швидко і легко розробляти настільні, мобільні і веб-додатки не лише мовою Java, а іншими: C/C++, PHP, JavaScript. За допомогою спеціальних плагінів можна розширити список підтримуваних мов.  Малюнок 1. Вікно Eclipse з відкритим проектом. В редакторі Eclipse обробляються відступи ліній, зіставляються слова і дужки, а також виділяється вихідний код як синтаксично, так і семантично. Він також надає шаблони коду, поради з написання коду і інструменти реорганізації. [1] Мовою розробки програми є Java. Java - одина з найважливіших і популярних мов програмування в світі. Завдяки Java стала можливою сучасна революція смартфонів, оскільки вона використовується для написання програм для платформи Android. Основна причина успіху мови Java - швидка пристосованість до потреб програмістів. Починаючи з її першого випуску 1.0 ця мова безперервно адаптується до змін в середовищі програмування та підходів до програмування. Найголовніше - вона не просто слідує тенденціям, а бере участь у їх створенні. Здатність адаптації мови Java до високої швидкості змін в комп'ютерному світі - основна причина, по якій вона залишається такою успішною мовою. [2] Додатково для розробки схем, діаграм і інших графічних даних курсової роботи було використано програми yEd Graph Editor і Enterprise Architect. В процесі аналізу існуючих програм було знайдено наступні аналоги (окрім онлайн додатків): «Визитка Дизайн» - дозволяє створювати візитки, зберігати їх, та здійснювати замовлення на друк в поліграфії безпосередньо онлайн, не виходячи з дому. «Easy Card Creator Express» - дозволяє друкувати штрих-код, додавати підписи, має доволі хороші платні можливості. «Визитка офис» - дуже проста програма, що не дозволяє змінювати фон, дозволяє працювати лише з текстом. Після аналізу, стало ясно, що існує безліч додатків подібної тематики. Одні гірші, інші кращі. Висновком до аналізу можна вказати, що наша програма для покращення може запозичити ряд можливостей від інших програм, наприклад збереження самої візитки як проекту, з подальшим її відкриттям і редагуванням, можливість вставлення фотографії чи логотипу, додавання підпису та інше. 1.2 Програма Візитка – компонувальник візитних карток. Об'єктом даної курсової роботи є розроблювана програма компонувальник візитних карток: Візитка. В ході виконання роботи було реалізовано працюючу програму. Наведемо результат виконання роботи. Всього програма має дві форми: Головна форма – Main, та форма що відповідає за створення та редагування шаблонів – EditFrame. На головній формі програми розміщуються дві панелі: панель компонування візиток, та панель шаблонів; а також меню програми. Панель шаблонів містить шаблони для компонування візитних карток. Для створення візитки обираємо шаблон, і одразу на панелі компонування відображається візитка. Вводимо наш текст і можна створену візитку зберігати чи подавати на друк принтеру. Для редагування тексту просто клікаємо по ньому і в виникаючому полі введення редагуємо чи вводимо новий текст. Щоб подати візитку на друк створюємо її, та натискаємо File->Print. Вспливає звичайне вікно для друку з вибором параметрів друку. Для збереження візитки в png, заходимо в File->Save, і обираємо місце та ім’я для збереження візитки. Для редагування шаблону обираємо необхідний, і натискаємо File->Add/Edit pattern(-s). При виборі шаблону його можна відредагувати, або зберегти як новий. Коли шаблон не обрано, активна кнопка лише зберегти. Шаблон зберігаеться в файл формату *.pattern приклади якого відображено нижче (Таблиця 1): Таблиця 1. Файл збереженої діаграми Arial Black 14 pictures/1460054459987.jpg name: 5;22 phone: 336;273 address: 381;93 color: 204;51;0 about: 3;271 Arial Black 14 pictures/2.jpg name: 20;20 phone: 60;60 address: 100;100 color: 255;255;255 about: 250;250 Arial Black 14 pictures/3.jpg name: 20;20 phone: 60;60 address: 100;100 color: 255;255;255 about: 250;250  По рядкам збережено інформацію: шрифт, розмір шрифту, шлях до зображення, положення полів: ПІБ, телефон, адреса; колір, та положення поля вид діяльності.   Малюнок 4. Створена візитка в Visitka та вікно редагування шаблону   2. Опис структурно – логічної схеми ПЗ 2.1 Загальна структура проекту. Опис класів.   Малюнок 5. Структура проекту курсової работи в Eclipse   При виконанні даної курсової роботи ми використовували середовище розробки Eclipse. Загалом дане середовище розробки пропонує нам структуру яка відображена на малюнку 5. В цілому проект має невелику структуру, тому створено один пакет: ua. Java package - механізм, що дозволяє організувати Java класи в просторі імен. [3]. Package ua має три класи: Main, EditFrame, PatternList. Зобразимо всі класи з їх полями і методами на малюнках нижче. В об'єктно-орієнтованому програмуванні, клас - це спеціальна конструкція, яка використовується для угруповання пов'язаних змінних і функцій. При цьому згідно з термінологією ООП глобальні змінні класу (члени-змінні) називаються полями даних (також властивостями або атрибутами), а члени-функції називають методами класу. Main – головне вікно програми, EditFrame – форма редагування і створення шаблонів, PatternList – клас, що дозволяє працювати з шаблонами.   Малюнок 6. Опис класів програми 1.    Малюнок 7. Опис класів програми 2.  Клас Main має методи, що дозволяють перевірити місце кліку, чи це текст з іменем, чи текст з телефоном, адресою чи діяльністю. Всі вони ідентичні. Наведемо код одного з них: private boolean clickOnName(int x, int y) { if(x>this.x[0] && x<this.x[0]+100 && y>this.y[0]-f.getSize() && y<this.y[0]) return true; return false; } Всі інші складові поточного класу це переважно слухачі для мишки, та інші допоміжні методи в яких відсутня складна логіка, що варта уваги. Класи PaternList та Pattern(внутрішній клас для PaternList) реалізують можливість працювати з шаблонами, працювати з іх полями: розміщення основних полів, зображення, інформація про шрифти, та інше. Найцікаішим в цих класах є метод завантаження шаблонів до програми. (private void loadPattern()): private void loadPattern(){ File theDir = new File(PATH_TO_PATTERN); //String extension = ""; int position; patterns = new ArrayList<PatternList.Pattern>(); if (!theDir.exists()) // Якщо папка не існує створити її. { theDir.mkdir(); File theDirPic = new File(PATH_TO_PATTERN + "/pictures"); // Створення папки з картинками theDirPic.mkdir(); System.out.println("Створено папку: " + PATH_TO_PATTERN); } else { // Якщо існує отримуємо всі файли формату pattern ArrayList<String> tmp = new ArrayList<String>(); // Тут зберігаємо всі файли з теки. for(File file : theDir.listFiles()){ position = file.getName().lastIndexOf('.'); if (position < 0) continue; // Перевіряємо розширення файлу. Якщо підходить, то додаємо шаблон до списку. if(file.getName().substring(position+1).equals("pattern")) patterns.add(new Pattern(file.getAbsolutePath())); } } } В курсовій роботі (в коді використано механізм GET-SET), який контролює доступ до приватних полів об’єкту. В цілому в цій роботі можна було обійтися без написання get і set методів, але їх застосування в житті всіляко вітається. Наприклад, для деяких змінних потрібно встановити межі його можливих значень. З модифікатором доступу public можна встановити значення, які виходять за межі, які нам потрібні. Для уникнення цього ми повинні встановити якісь правила завдання значень змінним. Тому для захисту і уникнення певних помилок був придуманий механізм доступу до змінних класу за допомогою get і set (геттер і сетер). Get дозволяє отримати значення (читати значення), а Set - записати значення в змінну. У коді вони представляють собою звичайні методи. Але ім'я методу завжди починається з префікса get або set. [4] 2.2 Опис основних алгоритмів роботи ПЗ Цікавим в коді є конструктор класу Pattern, де відбувається зчитування всіх необхідних даних з файлу. У випадку помилки, шаблон ініціалізуться значеннями по замовчуванню. Наведемо код даного конструктора: public Pattern(String filepath){ path = filepath; image = null; try { BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream(new File(filepath)), "Cp1251")); String str = ""; String tmp = ""; while((tmp = br.readLine()) != null) str += tmp + "\n"; String[] info = str.split("\n"); if(info.length==8){ int r = 125, g=125, b=125; font = new Font(info[0], Font.PLAIN, Integer.parseInt(info[1])); picWay = info[2]; try { image = ImageIO.read(new File(PATH_TO_PATTERN + "/" + picWay)); } catch (Exception ex) { ex.printStackTrace();} tmp = info[3].split(" ")[1]; xName = Integer.parseInt(tmp.split(";")[0]); yName = Integer.parseInt(tmp.split(";")[1]); tmp = info[4].split(" ")[1]; xPhone = Integer.parseInt(tmp.split(";")[0]); yPhone = Integer.parseInt(tmp.split(";")[1]); tmp = info[5].split(" ")[1]; xAddress = Integer.parseInt(tmp.split(";")[0]); yAddress = Integer.parseInt(tmp.split(";")[1]); tmp = info[6].split(" ")[1]; r = Integer.parseInt(tmp.split(";")[0]); g = Integer.parseInt(tmp.split(";")[1]); b = Integer.parseInt(tmp.split(";")[2]); tmp = info[7].split(" ")[1]; xAbout = Integer.parseInt(tmp.split(";")[0]); yAbout = Integer.parseInt(tmp.split(";")[1]); color = new Color(r, g, b); //System.out.println(color); } else { font = new Font("Verdana", Font.PLAIN, 14); picWay = ""; xName = yName = 0; xPhone = yPhone = 100; xAddress = yAddress = 200; xAbout = yAbout = 250; color = Color.YELLOW; } if(patterns.size()!=0){ x = padding; y = patterns.get(patterns.size()-1).y+patterns.get(patterns.size()-1).height+padding; width = (int) (parent.getPreferredSize().getWidth()-2*padding); // widht:heigh=16:9 height = (int) (width*9f/16f); } else{ x = y = padding; width = (int) (parent.getPreferredSize().getWidth()-2*padding); // widht:heigh=16:9 height = (int) (width*9f/16f); } Dimension d = new Dimension((int)parent.getPreferredSize().getWidth(), (int)((height+padding)*patterns.size() + padding)); parent.setPreferredSize(d); } catch (Exception e) { e.printStackTrace(); } } Також виникала необхідність глибокого копіювання зображення шаблону: public BufferedImage getCopyImage() { BufferedImage b = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); Graphics g = b.getGraphics(); g.drawImage(image, 0, 0, null); g.dispose(); return b; } Також уваги вартий слухач дій, що прив’язаний до кнопок на EditFrame. Дозволяє відкривати вікно для вибору файлів, відкриває вікно вибору кольору, і тому подібне: private ActionListener bl = new ActionListener (){ @Override public void actionPerformed(ActionEvent e) { String str = ((JButton) e.getSource()).getText(); if(str == "Color"){ Color c = JColorChooser.showDialog(null, "Choose a Color", color); color = c; } else if(str == "Picture"){ JFileChooser chooser = new JFileChooser(); FileNameExtensionFilter filter = new FileNameExtensionFilter("JPEG file", "jpg", "jpeg"); chooser.setFileFilter(filter); int returnVal = chooser.showOpenDialog(null); if(returnVal == JFileChooser.APPROVE_OPTION) { try{ ifront = ImageIO.read(chooser.getSelectedFile()); selectIm = true; } catch(Exception ex){ } } } else if(str == "S"){ if(!selectIm){ JOptionPane.showMessageDialog(null, "Спочатку оберіть зображення!"); } else { long name = System.currentTimeMillis(); String filePicName = Long.toString(name) + ".jpg"; String save = ""; save += f.getFontName() + "\n"; save += f.getSize() + "\n"; save += "pictures/" + filePicName + "\n"; save += "name: " + x[0]+ ";" + y[0] + "\n"; save += "phone: " + x[1]+ ";" + y[1] + "\n"; save += "address: " + x[2]+ ";" + y[2] + "\n"; save += "color: " + color.getRed()+ ";" + color.getGreen()+ ";" + color.getBlue() + "\n"; save += "about: " + x[3]+ ";" + y[3]; File outputfile = new File(PatternList.PATH_TO_PATTERN + "/pictures/" + filePicName); try { ImageIO.write(ifront, "jpg", outputfile); File file = new File(PatternList.PATH_TO_PATTERN + "/" + Long.toString(name) + ".pattern"); // creates the file file.createNewFile(); // creates a FileWriter Object FileWriter writer = new FileWriter(file); // Writes the content to the file writer.write(save); writer.flush(); writer.close(); Main.app.reload(); setVisible(false); dispose(); } catch (Exception e1) { e1.printStackTrace(); } } } else if(str == "E"){ if(!selectIm){ JOptionPane.showMessageDialog(null, "Спочатку оберіть зображення!"); } else{ long name = System.currentTimeMillis(); String filePicName = Long.toString(name) + ".jpg"; String save = ""; save += f.getFontName() + "\n"; save += f.getSize() + "\n"; save += "pictures/" + filePicName + "\n"; save += "name: " + x[0]+ ";" + y[0] + "\n"; save += "phone: " + x[1]+ ";" + y[1] + "\n"; save += "address: " + x[2]+ ";" + y[2] + "\n"; save += "color: " + color.getRed()+ ";" + color.getGreen()+ ";" + color.getBlue() + "\n"; save += "about: " + x[3]+ ";" + y[3]; File outputfile = new File(PatternList.PATH_TO_PATTERN + "/pictures/" + filePicName); try { ImageIO.write(ifront, "jpg", outputfile); File file = new File(Main.app.getPatternList().getFilename(IndexSelected)); // creates the file file.createNewFile(); // creates a FileWriter Object FileWriter writer = new FileWriter(file, false); // Writes the content to the file writer.write(save); writer.flush(); writer.close(); Main.app.reload(); setVisible(false); dispose(); } catch (Exception e1) { e1.printStackTrace(); } } } } } Виникала проблема з завантаженням назв шрифтів в Windows 8.1. Тому було вирішено просто створити перелік найпопулярніших шрифтів: private void initListFonts(){ //В коментарі код, який дозволяє отримати всі шрифти системи.. Але цей процес повільний //тому я вибра найбільш поширені. //final GraphicsEnvironment gEnv = GraphicsEnvironment.getLocalGraphicsEnvironment(); //String[] allfonts = gEnv.getAvailableFontFamilyNames(Locale.US); String[] allfonts = new String[]{"Arial", "Arial Black", "Comic Sans MS", "Courier New", "Franklin Gothic Medium", "Georgia", "Impact", "Lucida Console", "Lucida Sans Unicod", "Microsoft Sans Serif", "Palatino Linotype", "Sylfaen", "Tahoma", "Times New Roman", "Trebuchet MS", "Verdana"}; Vector vector = new Vector(); for (int i = 1; i < allfonts.length; i++) vector.addElement(allfonts[i]); fonts = new JComboBox(vector); fonts.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(f!=null){ f = new Font(fonts.getSelectedItem().toString(), f.getStyle(), f.getSize()); } } }); fonts.setBounds(fontX, fontY, fontWeight, 20); this.add(fonts); } 3. Тестування розроблюваного ПЗ 3.1Створення візитки   Малюнок 9. Створення візитки.  Відкриваю программу. Обраю з панелі шаблонів шаблон. Ввожу необхідний текст. Програма працює. 3.2 Друк візитки Для друку візитки знахожу в меню File->Pint. Обраю параметри друку і друкую візитку на папір. Результат А4 лист з візиткою.   Малюнок 10. Друк візитки.   На А4 надрукована візитка. Тест успішно пройдено. 3.3 Збереження в файл Натискаю File->Save. Оберю місце для збереження візитки. Натискаю зберегти.   Малюнок 11. Результат збереження візитки.  Файл збережено в вказаному місці. Тест пройдено 3.4 Редагування шаблону Захожу в меню File->Add/Edit… і змінюю колір шрифту і його розмір та натискаю кнопку Enter.   Малюнок 12. Результат редагування шаблону.  Колір та розмір шрифту змінено. Тест пройдено. Висновок Метою даної курсової роботи була розробка програмного продукту за допомогою мови програмування Java - Компонувальник візитних карток (Візитка). Підставою для розробки стало завдання на виконання курсової роботи. В результаті виконання даної курсової роботи було реалізовано повністю робочий додаток - Візитка, що відповідає вказівкам з технічного завдання. В процесі виконання даної курсової роботи були повторені і засвоєні знання з програмування на мові Java. Java - об'єктно-орієнтована мова програмування, розроблена і випущена компанією Sun Microsystems в 1995 році як основний компонент платформи Java. Зараз мовою займається компанія Oracle. Синтаксис мови багато в чому схожий на C і C ++. Java є мовою кроссплатформенного програмування. В процесі розробки основним чим ми користувалися це JFrame використовуючи Swing. Swing - інструментарій для створення графічного інтерфейсу користувача (GUI) на мові програмування Java. Розробку програм за допомогою даних інструментів можна порівняти з розробкою додатків на Windows Froms C#. Додатково в процесі виконанная курсової роботи було повторено роботу з файлами в Java, і взаємодія з вікном друку, подача докумнту на друк через власний додаток. Перспективним напрямком подальшого дослідження даної тематики є доопрацювання програми та його подання в публічний доступ. З приводу доопрацювання: можна додати більшку кількість шаблонів, покращити спосіб збереження візитки, додати зберження візитки як проекту, перенесення і доопрацювання розробленого додатка під мобільний пристрій. Одним із першочергових, ща варто було б реалізувати для покращення це можливість вставлення фотографії чи логотипу компанії, вставка підпису та збереження створеної візитки як проекту з можливістю повторного її використання та доопрацювання. Використана література Eclipse [Електронний ресурс]. URL: https://uk.wikipedia.org/wiki/Eclipse (дата звернення: 03.04.2016). Герберт Шилдт Java. Полное руководство [Електронний ресурс] Москва 2015. Package (Java) [Електронний ресурс]. URL: https://ru.wikipedia.org/wiki/Package_(Java) (дата звернення: 03.04.2016). Getters and Setters [Електронний ресурс] Опубліковано 18 липня 2013 користувачем Віталієм Нікіфоренко. URL: http://gooodjava.blogspot.com/2013/07/getters-and-setters.html (дата звернення: 03.04.2016). Додаток №1. Приклад розробленої візитки  Додаток №2. Повний лістинг коду Main.java package ua; public class Main extends JFrame { public static Main app = null; private static final int FRAME_WIDTH = 800; // ширина вікна private static final int FRAME_HEIGHT = 625; // висота вікна private PatternList pl; private String name, phone, address, about; private int[] x, y; private Font f; private Color color; private byte whatEdit; private int lastPatternSelect; private JTextPane textPane = null; // JTextPane для редагування тексту. private JScrollPane scrollPane = null; // Полоса прокрутки для JTextPane. int tpX, tpY; public static final int zoom = 2; public static final float size = 255/16f; // or 141/9 public static final int width = (int) (16*size)*zoom; //255 - ширина візитки public static final int height = (int) (9*size)*zoom; //141 - висота візитки private JPanel visitPanel; // Панель на якій створюємо візитку private JPanel visitPanelBack; // Панель на якій створюємо візитку private JPanel patternPanel; // Панель шаблонів. private BufferedImage imageFront, imageBack; private BufferedImage toPrint; private JScrollPane sppatternPanel; // Полоса прокрутки для sppatternPanel. public Main(){ super("Visitka"); // Заголовок вікна setBounds(100, 50, FRAME_WIDTH, FRAME_HEIGHT+20); // Розмір та положення вікна +20 меню setResizable(false); // Заборона змінювати розмір вікна setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Закриваємо вікно, закривається программа setLayout(null); // Слой з абсолютним положенням елементів. name = "Іванов Іван"; phone = "555-666-999"; address = "Хрещатик буд. 5"; about = "Ремонт ПК"; f=null; color = Color.WHITE; whatEdit = 0; lastPatternSelect = -1; initMenu(); initPanels(); } public PatternList getPatternList(){ return this.pl; } // Ініціалізація панелей програми. private void initPanels(){ // Для перемальовування панелі з елементами. visitPanel = new JPanel(){ @Override public void paintComponent(Graphics g) { g.drawImage(imageFront, 0, 0, visitPanel.getWidth(), visitPanel.getHeight(), null); if(x!=null && y!=null && x.length == 4 && y.length == 4){ if(f!=null) { setFont(new Font(f.getName(), f.getStyle(), f.getSize()*
Антиботан аватар за замовчуванням

26.09.2017 21:09-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!