Автор Тема: Въпроси за стрингове  (Прочетена 3328 пъти)

0 Потребители и 1 Гост преглежда(т) тази тема.

hilary

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 6
Въпроси за стрингове
« -: 10 Ноември 2014, 01:25:30 »
Здравейте! Напълно начинаеща съм в програмирането с Java, затова моля да ме извините, ако въпросите ми ви се сторят глупави, но от доста време не мога да се сетя как да реша следните задачи:
1. Иска се с помощта на метода public static String[] splitInput(String input) да разделя стринг, въведен от потребителя. Например:
Код: Java
  1. splitInput("add 20 30")  =>  ["add", "20", "30"]
  2. splitInput(" test 333 -30 50 ") => ["test", "333", "-30", "50"]
  3. splitInput(null) => []
  4. splitInput(" ") => []  
Единственото, което ми хрумва е да създам масив, който да съхранява този стринг. Порових и из Java документацията, но не ми стана ясно как точно става това разделяне.
2. Как да превърна String в Integer? Например "30" => 30 или "-10" =>10
3. Последният ми въпрос е как да представя втория комплемент на бинарно число, което потребителят въвежда? Математически мога да го направя, но все още имам трудности при използването на Java-езика. В конкретния случай предполагам,че трябва да използвам побитовия оператор ~ а след това да прибавя 1. Но не съм сигурна как точно би изглеждал кода.
Бих се радвала, ако някой се отзове и ми помогне. Благодаря предварително :)
« Последна редакция: 15 Ноември 2014, 11:14:30 от Avalanche »

Meniak

  • Full Member
  • ***
  • Благодарности
  • -Казани: 5
  • -Получени: 4
  • Публикации: 224
Re: Въпроси за стрингове
« Отговор #1 -: 10 Ноември 2014, 10:58:03 »
Здравей. и аз съм начинаещ в Java но ще се опитам да ти помогна поне на някои от въпросите ти.

Та ако съм разбрал добре първия въпрос, този код долу би трябва да е отговора
Код: Java
  1. public static void main(String[] args) {
  2.  
  3.         // Стринга splitInput който идва от потребителя.
  4.         String splitInput = "Добре дошла в форума";
  5.  
  6.         // Разделяме стринга splitInput с split по интервали в случея
  7.         // и го пъхаме в масива array.
  8.         String[] array = splitInput.split(" ");
  9.  
  10.         // Завъртаме масива и изкарваме разделения по интервали стринг с конзола.
  11.         for (String a : array) {
  12.             System.out.println(a);
  13.         }
  14. }
  15.  

По втория въпрос. Има доста начини да се превърне String в int. Аз знам как става с Scanner https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html и с парсване но използвам повече начина с парсването.

Код: Java
  1. public static void main(String[] args) {
  2.  
  3.          // Стринг с стойност 10.
  4.         String str = "10";
  5.        
  6.         // Кастваме стринга към инт с име а.
  7.         int a = Integer.parseInt(String.valueOf(str));
  8.         // Кастваме стринга към доубле
  9.         double a1 = Double.parseDouble(String.valueOf(str));
  10.        
  11.         // Инт с стойност 10 и име b
  12.         int b = 10;
  13.        
  14.         // Сръвняваме а == b
  15.         if (a == b){
  16.             System.out.println("true");
  17.         } else {
  18.             System.out.println("false");
  19.         }
  20.     }
  21.  
« Последна редакция: 15 Ноември 2014, 11:14:51 от Avalanche »

hilary

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 6
Re: Въпроси за стрингове
« Отговор #2 -: 10 Ноември 2014, 16:54:28 »
Благодаря за отговора.Иска се точно това, само че тези преобразувания трябва да се извършват в отделни методи, а не в main метода. Това е кодът ми, но все още имам грешки:

Код: Java
  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3.  
  4. public class AssemblerInterpreter {
  5.  
  6.         public static String getInputFromKeyboard ( String prompt ) {
  7.                 String aLine = "";
  8.                 BufferedReader input = new BufferedReader (new
  9.                 InputStreamReader ( System .in));
  10.                 System .out . print ( prompt );
  11.                 try {
  12.                 aLine = input . readLine ();
  13.                 } catch ( Exception e) {
  14.                 e. printStackTrace ();
  15.                 }
  16.                 return aLine ;
  17.                 }
  18.  
  19.  
  20.         public static String[] splitInput(String input){
  21.                 String inputArray[] =input.split(" ");
  22.                 for (int i =0; i<input.length(); i++)
  23.                 return inputArray[i];                                                            //Type dismatch: Cannot convert from String to String[]
  24.         }
  25.  
  26.  
  27.         public static int convertFromStringToInteger(String input) {     // А разделянето би трябвало да изглежда така или бъркам
  28.                 int a = Integer.parseInt(String.valueOf(input));                 
  29.                     return a;
  30.                  }
  31.  
  32.  
  33.         public static void main(String[] args) {
  34.              String input = getInputFromKeyboard("");
  35.              System.out.println(input);
  36.              String Str=new String(getInputFromKeyboard(""));
  37.              System.out.println("");
  38.  
  39.  

Другият ми май най-голям и основен проблем е, че не мога да разбера дали програмата работи. Тоест, когато я компилирам не се появява нормалният прозорец, в който аз като потребител мога да въвеждам дадени стойности. Вместо това мога да пиша в конзолата, но от това няма смисъл.  ???
   
« Последна редакция: 15 Ноември 2014, 11:14:11 от Avalanche »

Meniak

  • Full Member
  • ***
  • Благодарности
  • -Казани: 5
  • -Получени: 4
  • Публикации: 224
Re: Въпроси за стрингове
« Отговор #3 -: 10 Ноември 2014, 17:48:17 »
Другият ми май най-голям и основен проблем е, че не мога да разбера дали програмата работи. Тоест, когато я компилирам не се появява нормалният прозорец, в който аз като потребител мога да въвеждам дадени стойности. Вместо това мога да пиша в конзолата, но от това няма смисъл.  ???

Искаш да кажеш че като стартираш програмата искаш да ти се покаже един прозорец с графичен интерфейс дето има бутончета, полета за писане и т.н.т. и да си кликъш по него а не да пишеш в конзолата?


hilary

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 6
Re: Въпроси за стрингове
« Отговор #4 -: 10 Ноември 2014, 19:33:50 »
:D Не, чак такива чудеса не искам. Но това, което въвеждам в конзолата не мога да го използвам като стойност. Тоест виждам написаното, но не мога да го прилагам в методите. Предполагам, че имам грешка в кода и по-точно в извикването. Но не знам каква и къде.

Avalanche

  • Administrator
  • Hero Member
  • *****
  • Благодарности
  • -Казани: 65
  • -Получени: 275
  • Публикации: 2602
  • meow
Re: Въпроси за стрингове
« Отговор #5 -: 10 Ноември 2014, 20:00:38 »
Здравей и добре дошла в Научи.ме,

В повечето случай грешките си излизат в компилатора и просто трябва да прочетеш какво не е наред. Съдейки по тази грешка:
Код: Java
  1. return inputArray; //Type dismatch: Cannot convert from String to String[]
Компилаторът ти казва че имаш несъотвествие в типовете данни (поне така го разбирам аз, Java-та и на мене не ми е сила), по-уместно би било да върнеш стойност по ключ (въпреки че ми се струва странно да стои return във for, но пробвай така:
Код: Java
  1. return inputArray[i];
"Компютрите не правят каквото искаме, а каквото им кажем." Ако разбереш какво значи това няма да имаш големи проблеми, нито с никоя ОС, нито език, или софтуер.
Аз не съм програмист между другото!

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: Въпроси за стрингове
« Отговор #6 -: 10 Ноември 2014, 20:26:29 »
Другият ми май най-голям и основен проблем е, че не мога да разбера дали програмата работи. Тоест, когато я компилирам не се появява нормалният прозорец, в който аз като потребител мога да въвеждам дадени стойности. Вместо това мога да пиша в конзолата, но от това няма смисъл.  ???

Здравей. Ползваш ли някакво IDЕ като Eclipse или Netbeans?

Програмата представлява една редица от команди които се изпълняват една след друга. Като я стартираш влизаш в main метода и започваш ред по ред да изпълняваш заявките които са в него. В твоя код това означава
Код: Java
  1. public static void main(String[] args) {
  2.     // изпълни метода getInputFromKeyboard и запази резултата в  input.  
  3.     String input = getInputFromKeyboard("");
  4.     // изкарай съдържанието на input на конзолата
  5.     System.out.println(input);
  6.    
  7.     // следдващите два реда са подобни.
  8.     String Str=new String(getInputFromKeyboard(""));
  9.     System.out.println("");
  10. }

Това което подаваш на getInputFromKeyboard като параметър е подканващия текст, който сигнализира на потребитея, че се очаква някакво действие от него. Та хубаво е да му дадеш нещо смислено на този метод. Ако искаш да си тестваш програмата дали функционира трябва да си измислиш тестов сценарий. Примерно:
Код: Java
  1. public static void main(String[] args) {
  2.         // кажи на потребителя да вкара текст съдържащ празни места и запамети вкараното в input
  3.         String input = getInputFromKeyboard("Enter some text with white spaces:\n");
  4.         System.out.println("You entered: " + input);
  5.         // раздели въведения текст и го запамети в tmp
  6.         String tmp[] = splitInput(input);
  7.         //покажи съдържанието на  tmp
  8.         System.out.println("This array came out of your input: ");
  9.         for(int i = 0; i < tmp.length; i++) {
  10.                 System.out.println("tmp[" + i + "] = " + tmp[i]);
  11.         }
  12.        
  13.         // кажи на потребителя да вкара число  и го запамети в input
  14.         input = getInputFromKeyboard("Enter some number:\n");
  15.         System.out.println("You entered the number: " + input);
  16.         // превърни вкараното число от String в int, за да може да го умночим по 2 и да изкараме резултата на екрана.
  17.         int tmp2 = convertFromStringToInteger(input);
  18.         System.out.println(tmp2 + " * 2 = " + tmp2 * 2);
  19. }

И накрая само поправка на метода splitInput
Код: Java
  1. public static String[] splitInput(String input) {
  2.         String inputArray[] = input.split(" ");
  3.         // този метод връща масив от String-ове, така че направо връщаш резултата от split, който също връща масив от String-ове
  4.         return inputArray;
  5. }

Само че си мисля, че изискването ще да е да не се ползва готовата функция split. Даскала най-вероятно иска да обходите цилия стринг буква по буква и така да го разделите на думи.
« Последна редакция: 10 Ноември 2014, 20:29:47 от kjufte »

hilary

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 6
Re: Въпроси за стрингове
« Отговор #7 -: 12 Ноември 2014, 14:09:43 »
Точно това не разбирах, но вече ми стана ясно. Благодаря ти! Ползвам Eclipse. А сега вече имам други проблеми, които не мога да реша. Надявам се да ми помогнете, а именно трябва да създам 3 метода:
1.public static String multiply(String firstBinaryOperand, String secondBinaryOperand) , който да умножава две бинарни числа. Например:
Код: Java
  1. shl("00000001", "00000001") ) "00000001"
  2. shl("00010001", "00000000") ) "00000000"

2.public static String shiftLeft(String firstBinaryOperand, String secondBinaryOperand) , който да премества първото бинарно число на ляво с толкова позиции, на колкото е равно второто число. Например :
Код: Java
  1. shl("00000001", "00000001") ) "00000010"
  2. shl("00000001", "00000011") ) "00001000"
  3. shl("10000000", "00000001") ) "00000000"

3.public static boolean interpretMultiplyCommand(String [] args) този метод трябва да получи от метода splitInput създадения масив и да провери дали въведените числа могат да бъдат умножени. Ако не трябва да се изведе false, в противен случай елементите от args трябва да се обработят и да се умножат. Резултатът трябва да изглежда така:
(first binary operand ) * (second binary operand ) = (result )

Все още нямам код, защото нямам идея как да го напиша. Надявам се да не ме разберете погрешно и да си помислите, че чакам решения наготово. Влагам много усилия и време да се науча, но все още не се получава. На теория съм научила нещата, но нямам идея как трябва да изглежда кода :(
« Последна редакция: 15 Ноември 2014, 11:15:22 от Avalanche »

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: Въпроси за стрингове
« Отговор #8 -: 13 Ноември 2014, 10:57:45 »
Трябва да се опиташ поне някакви идеи за подход да споделиш. Иначе както сама каза на теория ще знаеш всичко, а на практика не можеш да го реализираш.

Метода който  Meniak ти покза за обръщане на String в int има вариант с втори параметър, който казва каква е основата на числото в String параметъра
Код: Java
  1. // обърни String в int, като интерпретираш  String като число с основа 2.
  2. // резултата е 147
  3. int number = Integer.parseInt("10010011", 2);
  4. // обърни int обратно в бинарен String
  5. String numberString = Integer.toBinaryString(number);
« Последна редакция: 13 Ноември 2014, 11:02:36 от kjufte »

hilary

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 6
Re: Въпроси за стрингове
« Отговор #9 -: 15 Ноември 2014, 01:19:38 »
Идеите, които имам:
по втората задача (2.public static String shiftLeft(String firstBinaryOperand, String secondBinaryOperand) , който да премества първото бинарно число на ляво с толкова позиции, на колкото е равно второто число. Например :
Код: Java
  1. shl("00000001", "00000001") ) "00000010"
  2. shl("00000001", "00000011") ) "00001000"
  3. shl("10000000", "00000001") ) "00000000")
  4.  
  5. public static String shiftLeft(String firstBinaryOperand,String secondBinaryOperand) {
  6.         char[] firstBinaryOperandArray = firstBinaryOperand.toCharArray();          // създавам масив от първото число
  7.         char[] shiftLeftArray = new char[firstBinaryOperandArray.length];            // създавам масив, който да съхранява резултата
  8.         int factor = convertBinaryToInteger(secondBinaryOperand);                     // превръщам второто число в int
  9.         for (int i = numberOfBits - 1; i >= 0; i--) {                                               //обхождам масива
  10.                        
  11.                 // .... тук предполагам, че трябва да се използва някакъв метод, който да премества елементите със съответния брой, но не знам какъв точно
  12.  
  13.         String shiftLeft = shiftLeftArray.toString();                                               // отново превръщане в string
  14.         return shiftLeft;
  15. }
  16.  

относно задачата за умножение идеите ми са още по-оскъдни:
Код: Java
  1. public static String multiply(String firstBinaryOperand,
  2.                         String secondBinaryOperand) {
  3.         char[] firstArray = firstBinaryOperand.toCharArray();
  4.         char[] secondArray = secondBinaryOperand.toCharArray();
  5.         char[] multiplyArray = new char[numberOfBits];

после вероятно трябва да започна да преглеждам масива отзад напред и да умножавам елемент по елемент


по третата задача (тя е свързана с друга задача, която не съм публикувала. Става въпрос отново за проверка дали може да се извърши умножение като условията са: дължината на параметъра args от метода public static boolean isMultiplyCommand(String [] args да е 3;първият елемент на string-a да е "mul" , а другите два елемента да са валидни числа. Този метод в моята програма изглежда така
Код: Java
  1. public static boolean isMultiplyCommand(String[] args) {
  2.         if ((args.length == 3) && (args[0].equals( "mul"))
  3.                 && (isValidNumber(args[1]) == true)  
  4.  
  5.         // isValidNumber е метод,който преди това съм  използвала, но няма да ви занимавам с него,защото той функционира
  6.  
  7.         && (isValidNumber(args[2]) == true)) {
  8.                 return true;
  9.         } else {
  10.                 return false;
  11.         }
  12. }
) Сега задачата ми е да свържа public static boolean isMultiplyCommand(String[] args) с public static boolean interpretMultiplyCommand(String [] args). За целта трябва да използвам метода за умножението,който все още нямам.


Edit: Ползвай code тага или горе бутона "код", за да стават нещата по-четими и нагледни. :)
« Последна редакция: 15 Ноември 2014, 11:13:28 от Avalanche »

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: Въпроси за стрингове
« Отговор #10 -: 15 Ноември 2014, 12:23:20 »
Хич не са лоши идеите които имаш :)

1. Няма нужда да превръщаш String в масив от chars, тъй като си имаш метод charAt, който ти връща символа на съответната позиция.
Какво представлява битшифтинга? В твоя случай искаш да шифтнеш Х бита на ляво. Тоест ако имаш следното бинарно число "10010001" и искаш да шифтнеш Х=2 бита, то махаш първите  Х елемента от ляво и добавяш толкова нули в дясно, колкото си махнала от ляво -> "01000100"

Клас String има един метод substring, който връща порция от дадения String започваща от зададения индекс (включително) до края. Пример:
Код: Java
  1. String a = "ABC DEF";
  2. String b = a.substring(2);
  3. // b ="C DEF"

Та един примерен подход с псевдокод
Код: Java
  1. public static String shiftLeft (String firstBinaryOperand, String secondBinaryOperand) {
  2.     // превърни второто число в int X
  3.     // създай String съдържащ порцията от firstBinaryOperand без първите  X символa
  4.     // добави към горесъздадения String толкова "0" накрая, колкото са необходими
  5.     // върни готовия String
  6. }

2. По втората задача ти писах в предния пост за метода, който обръща бинарни стрингове в int. Обърни числата в int, умножи ги, обърни резултата обратно в бинерен стринг и го върни като резултат от метода.

3. Третата ти задача доколкото разбирам се решава от само себе си като решиши втората, или?

hilary

  • Newbie
  • *
  • Благодарности
  • -Казани: 0
  • -Получени: 0
  • Публикации: 6
Re: Въпроси за стрингове
« Отговор #11 -: 15 Ноември 2014, 16:51:22 »
1. Имам проблем с превръщането на бинарното число в десетично:
   
Код: Java
  1. public static int convertBinaryToInteger(String number) {
  2.                 char[] numbers = number.toCharArray();
  3.                 int result=0;          
  4.                 for (int i = numberOfBits; i >=0; i--) {
  5.                         if (numbers[i]=='1' ) {                                                                    // В този ред е проблема
  6.                                 result+= Math.pow(2, numberOfBits - 1-i);
  7.                         }
  8.                 }
  9.                 return result;
  10.         }

Също така искам този код да функционира и за отрицателни числа. Тоест трябва да проверя, с помощта на charAt, дали на първата позиция има 1. След това не знам как да продължа.

2. По втората задача кодът ми изглежда малко странно, но функционира. Използвала съм &, а в задачата пише "За превръщането на числата не използвайте методите на Java-API, както и събиране,умножение и преместване на бинарни числа". Така че все пак би трябвало да не е проблем,или?

Код: Java
  1.         public static String multiply(String firstBinaryOperand, String secondBinaryOperand){
  2.                 int firstNumber = Integer.parseInt(String.valueOf(firstBinaryOperand));
  3.                 int firstBinaryOperandInInt=firstNumber;               
  4.                 int secondNumber = Integer.parseInt(String.valueOf(secondBinaryOperand));
  5.                 int secondBinaryOperandInInt=secondNumber;     
  6.                 int resultOfMultiplication= firstBinaryOperandInInt & secondBinaryOperandInInt;
  7.                 String result=Integer.toString(resultOfMultiplication);
  8.                 String padded="00000000".substring(result.length())+result;                 // Това с нулите не се сетих как да го направя,            използвайки numberOfBits
  9.  
  10.                 return padded;
  11.         }

3. При третата задача трябва да съединя всичко, но имам грешки, които предполагам, че са свързани с неправилно извикване на метода:

 
Код: Java
  1.  public static boolean interpretMultiplyCommand(String [] args){
  2.                 isMultiplyCommand(inputArray);                                      //inputArray cannot be resolved to a variable
  3.                 if (isMultiplyCommand(inputArray)==false){
  4.                         return false;
  5.                 }else{
  6.                         return true;
  7.                
  8.                 } multiply(args);                                                                //The method multiply(String,String) is not applicable for the
  9.                                                                                                             arguments String[]
  10.                
  11.         }

kjufte

  • Sr. Member
  • ****
  • Благодарности
  • -Казани: 1
  • -Получени: 51
  • Публикации: 308
Re: Въпроси за стрингове
« Отговор #12 -: 15 Ноември 2014, 19:40:03 »
Малко ми е трудно да разбера какво правиш. :) На няколко места ползваш numberOfBits, а никъде не е декларирана тази променлива. Същия проблем имаш и в третата задача. Там първо ползваш inputArray, който не е деклариран и после на метода multiply му подаваш масив, а той очаква два стринга.

1. Както вече ти споменах в предния пост, няма нужда да обръщаш String  в char[]
Код: Java
  1. public static int convertBinaryToInteger(String number) {
  2.     // дефинираме тази прослувута променлива :) и и слагаме правилната стойност
  3.     int numberOfBits = number.length();
  4.     int result = 0;
  5.  
  6.     // тука вадим едно от numberOfBits , защото индексите на масивите започват от нула
  7.     // и като имаме 4 символа в String и се опитаме да вземем последният четвърти, то
  8.     //трябва да му посегнем с charAt(3), а не charAt(4)
  9.     for (int i = numberOfBits - 1; i >= 0; i--) {
  10.         if (number.charAt(i) == '1') {
  11.             result += Math.pow(2, numberOfBits - 1 - i);
  12.         }
  13.     }
  14.     return result;
  15. }
  16.  


2. Тука щом са ти казали да не ползваш Java-API и подобни значи parseInt не трябва да го ползваш, но при положение, че вече си  ти си си написала функцията convertBinaryToInteger не виждам защо ползваш parseInt.
Но така или иначе метода не работи. Само с едно & умножение не се прави. Това е bitwiese AND и дава 1 само ако двата бита са 1.
   0111     -> 7
& 0110     -> 6
  ---------
= 0110     -> 6  при  6 * 7 = 42 = 0b101010
Както сама виждаш колкото и нули да му добавиш на '0110' няма да стане '101010'
Виж тука във stackoverflow   има едно решение на проблема ти. Ако нещо не разбираш от него питай.

3. След return се излиза веднага от метода. Та  в твоя код ти проверяваш дали е команда за умножение и ако е връщаш true, a ако не връщаш false и излизаш от метода. Реда в който викаш multiply() никога не се изпълнява.
Код: Java
  1. public static boolean interpretMultiplyCommand(String [] args){
  2.     boolean result = false;
  3.     // тука подаваш масива на който искаш да бъде проверен
  4.     if (isMultiplyCommand(args)) {
  5.         // щом може да се умножава значи първия елемент на args args[0] е 'mul',
  6.         // вторият и третият - args[1] и аrgs[2] - са двете числа които искаш да се умножат
  7.         // и за това подаваш тях на функцията
  8.         multiply(args[1], args[2]);
  9.         result = true;
  10.     }
  11.     // ако горе isMultiplyCommand е върнал false, то result ще си е останал false,
  12.     // защото не се е изпълнил кода в if-a
  13.     return result;
  14. }
« Последна редакция: 15 Ноември 2014, 22:56:02 от kjufte »