Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> странная задачка, интерпритация substring 
V
    Опции темы
Rauko
Дата 13.10.2014, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.6.2009

Репутация: нет
Всего: нет



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

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

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

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

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

Это сообщение отредактировал(а) Rauko - 13.10.2014, 22:08
PM MAIL   Вверх
sQu1rr
Дата 14.10.2014, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 1
Всего: 13



Ну вы покажите что не получается.
Для ввода - new Scanner(System.in) -> scan.nextString(), scan.nextInt(), scan.nextInt()
а что значит распознование границ? если знаете что на вводу идет: слово, число, число, то пользуйтесь сканнером, он сам все распознает
http://docs.oracle.com/javase/7/docs/api/j...il/Scanner.html
PM MAIL Skype GTalk   Вверх
Rauko
Дата 15.10.2014, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.6.2009

Репутация: нет
Всего: нет



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

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

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

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

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

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

PM MAIL   Вверх
Rauko
Дата 15.10.2014, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.6.2009

Репутация: нет
Всего: нет



Итого, у меня получилась следующая ерунда с одной ошибкой(это пока та, которую выдал компилятор, о правильности выполнения программы и верности результатов работы вообще речи пока не идет. алгоритм работы скорее всего еще будет правиться): 
Несоответствие типов: невозможно преобразовать 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ой строки - хочется увидеть результат работы и отладить алгоритм(для общего развития и лишней практики). Чисто в теории может заработать, хотя уверенности нет.

Поясните пожалуйста, что не так и как впредь такого не допускать. И да, я таки краб...
PM MAIL   Вверх
Rauko
Дата 15.10.2014, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.6.2009

Репутация: нет
Всего: нет



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

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

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 ..."
почему так происходит и как с этим бороться?


Это сообщение отредактировал(а) Rauko - 15.10.2014, 16:06
PM MAIL   Вверх
sQu1rr
Дата 17.10.2014, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 1
Всего: 13



Извиняюсь давно не появлялся, приведу код о котором я говорил, но насколько я понял вам нельзя использовать всякие приколы типо 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);

PM MAIL Skype GTalk   Вверх
Rauko
Дата 27.10.2014, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.6.2009

Репутация: нет
Всего: нет



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

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

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

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


Это сообщение отредактировал(а) Rauko - 27.10.2014, 18:51
PM MAIL   Вверх
sQu1rr
Дата 27.10.2014, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 1
Всего: 13



Цитата(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");

PM MAIL Skype GTalk   Вверх
Rauko
Дата 27.10.2014, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.6.2009

Репутация: нет
Всего: нет



немного опадзала с правкой поста, повторю еще раз...

Цитата

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


Код

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

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

за вычисление длинны строки в сканере спасибо, пригодится(в текущей задаче не спрашивалось, но в дальнейшем может пригодиться)
PM MAIL   Вверх
sQu1rr
Дата 27.10.2014, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 1
Всего: 13



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

Код

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

PM MAIL Skype GTalk   Вверх
Rauko
Дата 27.10.2014, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 22.6.2009

Репутация: нет
Всего: нет



другими словами, эта строка сразу инкрементирует результат с инкрементированием шага а+1 ?


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

Это сообщение отредактировал(а) Rauko - 27.10.2014, 21:19
PM MAIL   Вверх
sQu1rr
Дата 27.10.2014, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 597
Регистрация: 11.11.2008
Где: london

Репутация: 1
Всего: 13



Цитата(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 = ""; // пустая строка

PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.