Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions problem-set/PrintThyself.MD
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# PrintThyself

პრობლემა:
```
დაწერეთ პროგრამა, რომელიც წაიკითხავს თAვის თავს ფაილიდან და დაბეჭდავს კონსოლში
```




## პრობლემის გადაჭრის გზა
საკითხი ძალიან მარტივია, უპირველეს ყოვლისა უნდა ვცადოთ ფაილის გახსნა, შემდეგ კი წავიკითხოთ და შევინახოთ თითოეული ხაზი

### როგორ გავხსნათ ფაილი?
ფაილის წასაკითხად საკმარისია გამოვიყენოთ `BufferedReader` და `FileReader` მეთოდები, რომლებიც `java.io` ბიბლიოთეკის ნაწილია. თუმცა მხოლოდ ეს როდია საკმარისი, თუ ფაილის სახელს არასწორად შევიყვანთ ან თუნდაც არარსებულ ფაილს მივუთითებთ მივიღებთ ბაგებს. თუმცა ამის ასარიდებლად შეგვიძლია გამოვიყენოთ `try { .. } catch { .. }`, შედეგად მივიღებთ შემდეგ კოდს

```java
try{

BufferedReader br = new BufferedReader(new FileReader(fileName));
//To-Do ...

}catch(Exception e){
//Error Message
}
```

### როგორ წავიკითხოთ ფაილიდან?
ეს ნაწილი საკმაოდ მარტივია, ფაილიდან ხაზის წაკითხვა შეგვიძლია `BufferedReader-ის` `readLine()` მეთოდის გამოყენებით, შესაბამისად შეგვიძლია ეს ფუნქცია მოვათავსოთ `While(true)` ციკლში, მაგრამ როდის უნდა გავაჩეროთ ციკლი? ესეც ძალიან მარტივია, მაშინ როდესაც `readLine()-ს` ფაილის დასასრულში ვიძახებთ ის აბრუნებს `null-ს`, ამიტომ შეგვიძლია ყოველ `readLine()-ს` გამოძახებას თან დავურთოთ შესაბამისი შემოწმებაც `if(readLine() == null) break;`.

## შესაძლო ხარვეზები
ერთადერთი ხარვეზი რომელიც ზემოთ არ გაგვითვალიწნიებია გახლავთ - ფაილის დახურვა. მართალია ამ შემთხვევაში მოცემულ ამოცანას მაინც შეასრულებს ჩვენი კოდი, მაგრამ სხვა დროს, იმ შემთხვევაში თუ ფაილს არ დავხურავთ, შემდეგ კი მის ხელახლა გამოყენებას ვცდით მივიღებთ უამრავ შეცდომას და ვერც კი მივხვდებით რისი ბრალი შეიძლება იყოს. ამიტომ `while` ციკლის დასასრულს უბრალოდ შეგვიძლია დავწეროთ `br.close()` რომელიც დახურავს ჩვენს მიერ გახსნილ ფაილს
61 changes: 61 additions & 0 deletions problem-set/PrintThyself.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/* File: PrintThyself.java
* ---------------------------------
* დაწერეთ პროგრამა რომელიც წაიკითხავს თავის თავს
* ფაილიდან და დაბეჭდავს კონსოლში
*/

import java.io.BufferedReader;
import java.io.FileReader;

import acm.graphics.GOval;
import acm.program.*;

public class ConsoleProgrammSample extends ConsoleProgram {

private static final String FILE_NOT_FOUND_MESSAGE = "- ERROR - Can't Locate Recevied File - ERROR -";

private String readFile(String fileName) {

//Trying To Open File
try {

String result = "";
BufferedReader br = new BufferedReader(new FileReader(fileName));

while(true) {

//Reading Every Line Of File
String newLine = br.readLine();
//If newLine == null, It Means That There Are No More Line To Read, So While Loop Breaks
if(newLine == null) break;

//Add newLine To "result"
result += newLine + '\n';
}

br.close();
//Return Result
return result;

}catch(Exception e) {

System.out.print(e);
}

//Return Error Message, If Code Catches Errors
return FILE_NOT_FOUND_MESSAGE;
}

public void run(){

//Read File Content
String fileName = readLine("Enter FileName: ");
String result = readFile(fileName);

//Print File Content
println("Received File Contains Text: ");
println(result);

}

}
61 changes: 61 additions & 0 deletions problem-set/Sort.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/* File: Sort.java
* ---------------------------------
* კონსოლიდან შეგყვავს n და შემდეგ n ცალი მთელი რიცხვი, დაალაგეთ რიცხვები
* ზრდადობით და დაბეჭდეთ.
*/

import java.util.ArrayList;
import acm.program.*;

public class ConsoleProgrammSample extends ConsoleProgram {

private ArrayList<Integer> selectionSort(ArrayList<Integer> array) {

int pos;
int temp;

for (int i = 0; i < array.size(); i++) {

pos = i;

//Find minimal elements index
for (int j = i + 1; j < array.size(); j++) {

if (array.get(j) < array.get(pos)) {
pos = j;
}
}

//Swap minimal and i'th elements
temp = array.get(pos);
array.set(pos, array.get(i));
array.set(i, temp);
}

return array;
}

private void printArray(ArrayList<Integer> array) {

for(int i = 0; i < array.size(); i++) {

println(i + " --- " + array.get(i));
}
}

public void run() {

int n = readInt("N: ");
ArrayList<Integer> array = new ArrayList<Integer>();

//Fill ArrayList
for (int i = 0; i < n; i++) {
int newNum = readInt("Enter Num: ");
array.add(newNum);
}

array = selectionSort(array);
printArray(array);
}

}
51 changes: 51 additions & 0 deletions problem-set/Sort.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# Sort

პრობლემა:
```
კონსოლიდან შეგყვავს n და შემდეგ n ცალი მთელი რიცხვი, დაალაგეთ რიცხვები
ზრდადობით და დაბეჭდეთ.
```




## პრობლემის გადაჭრის გზა
ჩვენი ამოცანა შეგვიძლია სამ ნაწილად დავყოთ
1. წავიკითხოთ n ცალი მთელი რიცხვი და შევინახოთ თითოეული ArrayList-ში
2. შევქმნათ ფუნქცია რომელიც მიიღებს Int-ების ArrayList-ს და უკან დაგვიბრუნებს დალაგებულ მიმდევრობას
3. დავბეჭდოთ ჩვენი ფუნქციის მიერ დაბრუნებული მიმდევრობა.

### პრობლემის გადაჭრის გზის კოდად გარდაქმნა
1. წავიკითხოთ n კონსოლიდან, ამისთვის გამოვიყენოთ მეთოდი `readInt();`, ამის შემდეგ კი `for` ციკლის გამოყენებით წავიკითხოთ n ცალი რიცხვი, თითოეული კი შევინახოთ `Integer-ების ArrayList-ში`, შესაბამისად მივიღებთ კოდს
```java
int n = readInt("N: ");
ArrayList<Integer> array = new ArrayList<Integer>();

for(int i = 0; i < n; i++) {
int newNum = readInt("Enter Num: ");
array.add(newNum);
}
```
2. სორტირების ფუნქციის შესაქმნელად დაგვჭირდება რაიმე ალგორითმი, ასეთი კი უამრავია, ამ შემთხვევაში გამოვიყენოთ `selectionSort`, რადგან დასაიმპლემენტირებლადაც და გასააზრებლადაც ძალიან მარტივია. ალგორითმი შემდეგნაირია, წარმოვიდგინოთ რომ ჩვენი რიცხვები გაყოფილია ორ ნაწილად (დალაგებულ და დაულაგებელ), ყოველ ჯერზე კი დაულაგებელ ელემენტებს შორის ვიპოვოთ მინიმალური და გადავიტანოთ დალაგებულში.

![Selection Sort](/problem-set/images/Selection_Sort.png)

3. ბოლოს კი უნდა დავბეჭდოთ ჩვენი რიცცხვები, ამისთვისაც შეგვიძლია ცალკე ფუნქცია შევქმნათ, რომელიც მიიღებს ArrayList-ს და for ციკლის გამოყენებით თითოეულ წევრს დაბეჭდავს შესაბამისად მივიღებთ კოდს
```java
private void printArray(ArrayList<Integer> array) {

for(int i = 0; i < array.size(); i++) {

println(i + " --- " + array.get(i));
}
}
```

## ბონუსი
რა თქმა უნდა selectionSort-ის ნაცვლად შეგვეძლო სხვა უფრო სწრაფი ალგორითმიც გამოგვეყენებინა, მაგალითად mergeSort, რომელიც შემდეგნაირია:
1. გავყოთ n ელემენტიანი მიმდევრობა ორ n / 2 ელემენტის შემცველ ქვემიმდევრობად
2. მიღებული ქვემიმდევრობები კვლავ გავყოთ ორ ტოლ ნაწილად და ასე გავაგრძელოთ მანამ სანამ ყველა ქვემიმდევრობაში ერთი ლემენტი არ დაგვრჩება
3. მიღებული ქვემიმდევრობები გავაერთიანოთ წყვილ-წყვილად ისე, რომ თითოეული გაერთიანებული ქვემიმდევრობა დალაგებული იყოს.

![Merge Sort](/problem-set/images/Merge_Sort.png)

Binary file added problem-set/images/ASCII_codes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added problem-set/images/Merge_Sort.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added problem-set/images/Recursive_stringToInteger.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added problem-set/images/Selection_Sort.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added problem-set/images/stringToInteger_function.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
41 changes: 41 additions & 0 deletions problem-set/stringToInteger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
/* File: StringToInteger.java
* ---------------------------------
* დაწერეთ stringToInteger მეთოდი, რომელსაც გადაეცემა სტრინგი და აბრუნებს მთელ რიცხვს.
* ჩათვალეთ, რომ გადაცემული სტრინგი მხოლოდ ციფრებისგან შედგება და არ იწყება 0-ით.
* მაგალითად “234” გადაცემის შემთხვევაში მეთოდმა უნდა დააბრუნოს 234. ასევე ჩათვალეთ,
* რომ დაბრუნებული მნიშვნელობა დადებითია და ეტევა int-ში.
*/

import acm.program.*;

public class ConsoleProgrammSample extends ConsoleProgram {

//Function bellow transforms received string into the Integer
private int stringToInteger(String num) {

int result = 0;

for(int i = 0; i < num.length(); i++) {
result *= 10;
result += (num.charAt(i) - '0');
}

return result;
}

public void run() {

//Getting input from user
String num = readLine("Enter number in string: ");

//Checking if received string is not empty
if(num.length() != 0) {
int result = stringToInteger(num);
println("Converted: " + result);

}else {
println("No valid string received.");
}
}
}

Loading