2016-10-26 4 views
-7

Ну, мой учитель дал мне домашнюю работу с java. Ему нужна программа, которая анализирует предложение. Я написал коды, но он не работает. Что я сделал неправильно, вы можете просто проверить это? (Ну, я дал мои часы, чтобы узнать Java по моей и писать эти коды, так что это очень много значит для меня!)Проверка ответа Java Java

Для страницы Ödev1.java ==>

package Ödev1; 

import javax.swing.JOptionPane; 

public class Ödev1 { 

    public static void main(String[] args) { 
     String input = JOptionPane.showInputDialog("Enter a sentence"); 
     System.out.print(input); 
     odev1 cumle = new odev1(); 
     cumle.analiz(); 
    } 
} 

Для страницы odev1 .java ==>

package odev1; 

public class odev1 { 
    String input; 
    int characters; 
    int words; 
    int gaps; 
    int lowerletters; 
    int capitalletters; 
    int vowels; 
    int sibilancies; 

    public odev1(int characters, int words, int gaps, int lowerletters, int capitalletters, int vowels, int sibilancies) { 
     this.characters = characters; 
     this.words = words; 
     this.gaps = gaps; 
     this.lowerletters = lowerletters; 
     this.capitalletters = capitalletters; 
     this.vowels = vowels; 
     this.sibilancies = sibilancies; 
    } 

    public void analysis() 
    { 
characters=input.length(); 
     char[] array = input.toCharArray(); 
int n=0; 
for(int a=0;a<characters;a++) { 
do{ 
n=n+1; 
}while(array[a]!='0'); } 
words=characters-n; 
gaps=words-1; 
capitalletters=0; 
lowerletters=0; 
for(int b=0;b<characters;b++) { 
    if (Character.isUpperCase(input.charAt(b))) capitalletters++; 
    if (Character.isLowerCase(input.charAt(b))) lowerletters++; } 
vowels=0; 
for(int c=0; c< input.length();c++) { 
    switch(input.charAt(c)) { 
     case 'a': 
     case 'e': 
     case 'ı':  
     case 'i': 
     case 'o': 
     case 'ö': 
     case 'u': 
     case 'ü': 
      vowel++; 
      break;   } 
} 
sibilancies=characters-gaps-vowels; 
System.out.println("Count of characters="+characters); 
System.out.println("Count of words="+words); 
System.out.println("Count of gaps="+gaps); 
System.out.println("Count of capital letters="+capitalletters); 
System.out.println("Count of lower letters="+lowerletters); 
System.out.println("Count of vowels="+vowels); 
System.out.println("Count of sibilancies="+sibilancies); 
} 
} 
+2

Очевидно, что вы знаете, как копировать/вставлять код в вопрос, поэтому, пожалуйста, сделайте это для всего * соответствующего * кода. Не вставляйте ссылки на скриншоты кода. --- * Подсказка: * Исправьте углубления вашего кода, чтобы сделать его доступным для чтения для людей. И при вставке под вопрос, отступ дополнительных 4 пробелов, поэтому код будет правильно отформатирован здесь. – Andreas

+0

Слишком много места для этого, мой код читабельен, почему вы так думаете? – Student

+0

Я не знаю, что значит «слишком много места для этого». «Слишком мало» может иметь смысл, за исключением того, что есть более чем достаточное пространство для отступов вашего кода. Код отступов для отображения * структуры * кода делает его более читаемым и менее подверженным ошибкам. Вот почему я (и большинство других) так думаю. Что касается ссылок на скриншоты, это просто плохо/лениво, и если вопрос становится бессмысленным, когда связанный сервер не работает. Кроме того, «это не работает» - это * отвратительное * описание вашей проблемы !!!! – Andreas

ответ

3

Ваш код сбит с толку, но, насколько я понял, вы хотите проанализировать определенную фразу.

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

Во-вторых, существует соглашение о назначении Java, а для классов имена начинаются с заглавной буквы. Проверьте этот документ от Oracle: http://www.oracle.com/technetwork/java/codeconventions-135099.html

Таким образом, класс должен быть чем-то вроде этого:

public class Odev1 { 

    private final String phase; 

    public Odev1(String phrase) { 
     this.phrase = phrase; 
    } 

    //Remaining code... 
} 

Что касается самого анализа есть несколько вещей, которые вы должны иметь в виду:

Во-первых, вам не нужно создавать массив из char из String, вы можете просто получить char напрямую с помощью метода StringcharAt(int index).

Во-вторых, если у вас есть для цикла, вы можете использовать те же leters, поскольку переменные являются локальными, и для этого они не будут видны из ряда для цикла

В-третьих, когда вы построить цикл, вы должны убедиться, что вы можете выйти из цикла. В качестве примера, вы написали:

int n=0; 
for(int a=0;a<characters;a++) { 
    do{ 
     n=n+1; 
    }while(array[a]!='0'); 
} 
words=characters-n; 

Просто здесь у вас бесконечный цикл. Почему вы в то время занимаетесь тем же char? Следуйте за этим: int n = 0; =>int a=0; =>do =>n = n + 1 ->n = 1 => условие while =>array[a]!='0' ->true => повторить do-while петлю ... Навсегда ...

Вместо этого, вы можете перебирать над String и использовать if-else условия для его анализа. Что-то вроде этого:

int n=0; 
boolean isWord = false; //Use it to track the letters 
boolean isSpace = false; 
for(int i=0;i<characters;i++) { 
    char charToAnalyse = input.getCharAt(i); 

    if(charToAnalyse == ' ') { //Taking the simple case where you don't have breaklines 
     isSpace = true; 
     isWord = false; 
    } 
    else { 
     isSpace = false; 
     if(!isWord) { 
      isWord = true; //once it is counted, we should avoid recount. 
      n++; //Its is the same as n = n + 1; 
     } 
    } 
} 
words=characters-n; 

Как более простым способом, можно использовать метод split(String regex), но я дал выше пример, чтобы помочь вам понять.

String[] wordsArray = input.split(" "); 
words = wordsArray.lenght; 

Forth, используйте else-if вместо того, чтобы постоянно if «S, если включение одного означает исключение оставать. То есть в вашем коде выше вы перебираете буквы, чтобы узнать, являются ли они капиталом или нет.

Кроме того, вам не нужно писать цикл для каждой переменной. Каждый персонаж имеет несколько atributes, так что просто проверить их все в одном цикле:

int capitalletters = 0; 
int lowerletters = 0; 
int vowel = 0; 

for(int i=0;i<characters;i++) { 
    char charToAnalyse = input.charAt(i); 

    if (Character.isUpperCase(charToAnalyse)) { 
     capitalletters++; 
    } 
    else if (Character.isLowerCase(charToAnalyse )){ 
     lowerletters++; 
    } 
    //Imagine if there were many if statement and the condition 
    //was already true in the first... 

    //count vowels; 
    switch(charToAnalyse ) { 
     case 'a': 
     case 'e': 
     case 'ı':  
     case 'i': 
     case 'o': 
     case 'ö': 
     case 'u': 
     case 'ü': 
      vowel++; 
     break; //You can omit this one if it is at the end; 
    } 

} 

В конце концов, чтобы использовать класс Odev1, просто сделать:

Odev1 cumle = new Odev1(input); 
cumle.analyse(); 

Я надеюсь, что я помог.

Имейте славный день. :)

+0

* «но я привел пример выше, чтобы помочь вам разобраться». * Хорошая работа. Плюс один для вашего всестороннего ответа с объяснениями. –

+0

Это действительно помогло мне! Ты потрясающий, потрясающий, спасибо <3: D – Student

Смежные вопросы