Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > странная задачка


Автор: Rauko 13.10.2014, 21:23
условие задачи - организовать ввод с клавиатуры строки(слово и 2 числа) и обрезать указанное слово по числам, например, вводим "he11ow0rld 2 9" и получаем на выходе "e11ow0rl"

при этом не применять каких то замудренных функций(это взято из начала учебника, из примеров до указанного задания - ввод-вывод строк, числа фибоначи, простые формулы)

из 7ми задач только эта не решается

если кому не жалко уделить минут 10 для помощи - подскажите как реализовать чтение и распознование "границ"

так же, если это возможно, подскажите ввод с клавиатуры, компилирующийся на java 1.7+, а то с примеров под 1.5 через раз компилится код...

Автор: sQu1rr 14.10.2014, 13:54
Ну вы покажите что не получается.
Для ввода - new Scanner(System.in) -> scan.nextString(), scan.nextInt(), scan.nextInt()
а что значит распознование границ? если знаете что на вводу идет: слово, число, число, то пользуйтесь сканнером, он сам все распознает
http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

Автор: Rauko 15.10.2014, 06:39
при попытке считать или присвоить значения переменным конфликтуют типы - при считывании в строку заносит char, а при работе с индексами в int

что я делаю не так?

распознавание границ означает, что одной строкой вводятся 
*слово* *номер первого символа* *номер последнего символа*

я спрашивала у более опытных кодеров, как это делается, они сказали как один, что эту фигню надо написать с нуля вручную, что бы потом через несколько глав мне в учебнике показали альтернативу в 3 строки через какую то умную функцию...

еще есть с другой задачкой маленькая проблемка - надо просто поменять местами знаки в словах введенной строки. тут снова проблема типов - если точнее, то читать и заносить считанное в массив компилятор отказывается, выводит ошибку, следовательно и показать определенное значение(определенный символ из строки через str[i] или длинну введенной строки через str.length отказывается - ошибка ввода или не может быть переменной). как это решить?

да, я начинаю только java учить, прошу отнестись с пониманием - вокруг спросить не у кого, а через ваш сайт я когда то за неделю осилила паскаль...

Автор: Rauko 15.10.2014, 10:08
Итого, у меня получилась следующая ерунда с одной ошибкой(это пока та, которую выдал компилятор, о правильности выполнения программы и верности результатов работы вообще речи пока не идет. алгоритм работы скорее всего еще будет правиться): 
Несоответствие типов: невозможно преобразовать Scanner в char[]

Код

import java.io.*;
import java.util.*;                                    

// Ex 1_3(7)

public class VirezatKusokStroki {

    public static void main(String[] args) {
        char[] str, sl_str;
        int i, j, j_fin, j_count, start, end, num;
        System.out.println("Enter your word and frontier for cutting");
        try {
            Scanner sc = new Scanner(System.in);            // read the string
/*!*/        str = sc;                                        // ругается тут
        }  catch (IOException e){
            System.out.println("Input ERROR");
        } 
        i = 0;
        j_count = 0;                                        // start pos for inner counter
        while (i != str.length) {
            if (str[i] == ' ') {                            // find the word
                i++;
            } else {
                j = i; 
                if(str[i] != ' ' || i <= str.length) {        // find the word frontier
                    j_fin = i;
                    sl_str[j_count] = str[i];                // copy the word
                    j_count++;                                // inc counter for word
                    i++;
                } else {                                    // lets find cutting frontier
                    if (str[i] == ' ' || i <= str.length) {    // lets find index 'start'
                        i++;
                    } else {
                        num = 1;
                        if((str[i] >= '0') && (str[i] <= '9')) {
                            start = str[i];
                            num++;
                        } else {
                            System.out.println("ERROR: No frontier. After your word should be nomber of first symbol.");
                            break;
                        }
                        if (start > j_count){
                            System.out.println("ERROR: Frontier is out of word array.");
                            break;
                        }
                        if (num > 1) {
                            System.out.println("ERROR: Frontier must be from 0 to 9.");
                            break;
                        }
                    }
                     
                    if (str[i] == ' ' || i <= str.length) { // lets find index 'end'
                        i++;
                    } else {
                        num = 1;
                        if (str[i] != str.length) {
                            if((str[i] >= '0') && (str[i] <= '9')) {
                                end = str[i];
                                num++;
                            }    
                        } else {
                            System.out.println("ERROR: No end of frontier. In that case, the end of frontier would be the end of the word");
                            end = j_fin;
                        }
                        if (num > 1) {
                            System.out.println("ERROR: Frontier must be from 0 to 9.");
                            break;
                        }
                    }
                    if (start > end){
                        System.out.println("ERROR: Invalid frontier.");
                        break;
                    } else {
                        while (start <= end) {
                            System.out.print(sl_str[start]); 
                            start++;
                        }
                    }
                    
                }
                
            }
        } 
        System.out.println ("Your string contains " + str.length + " symbols, your word is " + j_count + "symbols long.");
    }
    
}



Я уже успела прочитать, что есть какая-то встроенная функция substring, которая весь вышеописанный бред делает самостоятельно и вроде даже по условию, но поставленная задача не включала в себя использование этой функции, а самодельную ее интерпритацию. Заставлю работать эту прогу - сделаю еще через substring для сравнения.

Помогите заставить вышенаписанное запуститься дальше проверки 14ой строки - хочется увидеть результат работы и отладить алгоритм(для общего развития и лишней практики). Чисто в теории может заработать, хотя уверенности нет.

Поясните пожалуйста, что не так и как впредь такого не допускать. И да, я таки краб...

Автор: Rauko 15.10.2014, 16:04
удалось откомпилировать и оргаизовать считывание данных... код, естественно, дальше этого самого считывания оказался более чем нерабочий, но дело еще в другом...

вот так теперь выглядит начало программы:
Код

import java.io.*;
import java.util.*;                                    

// Ex 1_3(7)

public class VirezatKusokStroki {

    public static void main(String[] args) {
        char[] str = "".toCharArray(), sl_str = "".toCharArray();
        int i = 0, j_fin = 0, j_count = 0, start = 0, end = 0, num;
        System.out.println("Enter your word and frontier for cutting");
        try {
            Scanner sc = new Scanner(System.in);            // read the string
            str = sc.next().toCharArray();                                        
            sc.close();
        }  catch (Exception e){
            System.out.println("Input ERROR");
        } 
...


но дело в другом. в конце программы была такая строка:
Код

System.out.println ("Your string contains " + str.length + " symbols, your word is " + j_count +
 " symbols long. Your 'start' frontier is: " + start + " , and the 'end' frontier: " + end);

которая выдает параметры введенной строки. str.length в данном случае выдает только длинну ПЕРВОГО СЛОВА, игнорируя все пробелы, которые могут быть перед этим словом. как сделать так, что бы str.length выдавало полную длинну введенной строки?

другими словами, введя что то вроде:
       qwesdfcvb 2 8
я получаю в ответ от программы только "Your string contains 9 symbols, your word is ..."
почему так происходит и как с этим бороться?

Автор: sQu1rr 17.10.2014, 13:32
Извиняюсь давно не появлялся, приведу код о котором я говорил, но насколько я понял вам нельзя использовать всякие приколы типо String? Это странно так как Scanner почему то можно smile
В любом случае, тут наглядно показано как читать переменные разных типов, именно то что я имел ввиду в своем посте
Код

import java.io.*;
import java.util.*;                                    
// Ex 1_3(7)
class SliceString {
    public static void main(String[] args) {
        String str;
        int a, b;
        System.out.println("Enter your word and range for slicing");
        Scanner sc = new Scanner(System.in); // create scanner
        try {
            str = sc.next(); // read word
            a = sc.nextInt(); // read int
            b = sc.nextInt(); // read int
            if (a > 0 && b < str.length()) { // check range
                System.out.println(str.substring(a, b));
            } else {
                System.out.println("Indices out of range");
            }
        }  catch (Exception e){
            System.out.println("Input ERROR");
        } finally {
            sc.close();
        }
    }
}


Цитата(Rauko @  13.10.2014,  21:23 Найти цитируемый пост)
 "he11ow0rld 2 9" и получаем на выходе "e11ow0rl"

2 - это 3я буква, так что получите 11ow0rl

Добавлено через 10 минут и 24 секунды
Цитата(sQu1rr @  17.10.2014,  13:32 Найти цитируемый пост)
всякие приколы типо String

Или скорее функции типо substr, тогда будет чтото типо того:
Код

while (a < b) {
    str2 += str.charAt(a++);
}
System.out.println(str2);

Автор: Rauko 27.10.2014, 16:56
в учебнике, который я использую, есть пример ввода текста с консоли до задач, но к сожалению, он представлен под старую яву и в новой(1.7 и 1.8) не компилится и не работает, Scanner искался через гугл как "вариант ввода данных с консоли в java"

как я поняла, последний код - это интерпритация substr, только мне не совсем понятна запись... можно немного расшифровать, как оно работает и приминима ли такая запись в других случаях?

еще один вопрос - можно ли как то вычислить длину введенной строки? сканнер обрезает все лишнее просто и возможно в итоге вычислить только длинну значащих символов

еще вопрос - как можно выполнить инициализацию string, что бы в переменной было пусто? компилятор предложил загнать туда значение null, но любая выводимая строка после этого в начале дописывает null... да, вопросы от меня будут идти глупые..

Автор: sQu1rr 27.10.2014, 18:44
Цитата(Rauko @  27.10.2014,  16:56 Найти цитируемый пост)
как я поняла, последний код - это интерпритация substr

Так оно и есть

Цитата(Rauko @  27.10.2014,  16:56 Найти цитируемый пост)
можно немного расшифровать, как оно работает и приминима ли такая запись в других случаях?

Запись применима (только зачем колесо изобретать, если есть готовая функция), она расшифровывается как
Код

выполнять пока A < B
    прибавить к строке str2 символ из str под индексом А
    прибавить к А + 1

Можно записать так
Код

for (int i = a; i < b; ++i) {
    str2 += str.charAt(i);
}


Цитата(Rauko @  27.10.2014,  16:56 Найти цитируемый пост)
можно ли как то вычислить длину введенной строки? сканнер обрезает все лишнее просто и возможно в итоге вычислить только длинну значащих символов

всмысле с пробелами? ну тогда нужно считывать строку целеком. можно даже и сканнером, если использовать
Код

sc.useDelimiter("\r\n");

Автор: Rauko 27.10.2014, 18:56
немного опадзала с правкой поста, повторю еще раз...

Цитата

еще вопрос - как можно выполнить инициализацию string, что бы в переменной было пусто? компилятор предложил загнать туда значение null, но любая выводимая строка после этого в начале дописывает null... да, вопросы от меня будут идти глупые..


Код

str2 += str.charAt(a++);

непонятно значение вот этой строки, вернее роли в ней "+=" - как это правильно читать?

за вычисление длинны строки в сканере спасибо, пригодится(в текущей задаче не спрашивалось, но в дальнейшем может пригодиться)

Автор: sQu1rr 27.10.2014, 20:12
Цитата(Rauko @  27.10.2014,  18:56 Найти цитируемый пост)
вернее роли в ней "+=" - как это правильно читать?

Код

str2 = str2 + str.charAt(a++);
//
int i = 0;
i += 1; // i = 1
i = i + 1; // i = 2

Автор: Rauko 27.10.2014, 21:15
другими словами, эта строка сразу инкрементирует результат с инкрементированием шага а+1 ?


и это... как все таки String инициировать как ПУСТУЮ переменную?

Автор: sQu1rr 27.10.2014, 22:45
Цитата(Rauko @  27.10.2014,  21:15 Найти цитируемый пост)
другими словами, эта строка сразу инкрементирует результат с инкрементированием шага а+1

возвращает символ из str по индексу А, это символ "добавляется" к строке, а ПОТОМ инкрементирует А на 1
то есть str2 + СИМВОЛ - символ прибавиться, это не называется инкрементом строки. я привел целое число лишь для демонстрации того что A += B, это A = A + B

Добавлено через 47 секунд
Цитата(Rauko @  27.10.2014,  21:15 Найти цитируемый пост)
 как все таки String инициировать как ПУСТУЮ переменную?

всмысле?
Код

String str = null; // пустая переменная типа строки
String str = ""; // пустая строка

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)