2017-08-25 8 views
0
import java.util.*; 

public class BugFixes 
{ 
    public static void main(String[] args) 
    { 
     Scanner in = new Scanner(System.in); 
     altCaps("Computer Science"); 
    } 

    static void altCaps(String hi) 
    { 
     String hi2 = hi; 
     int locate = 0; 
     for(int i = 0; i < hi2.length();i++) 
     { 
      if((Character.isLetter(hi2.charAt(locate)))) 
      { 
       if(hi2.charAt(locate) % 2 == 0) 
       { 
        System.out.print(hi2.toLowerCase().charAt(locate)); 
        locate++;     
       } 
       else if(hi2.charAt(locate) % 2 == 1) 
       { 
        System.out.print(hi2.toUpperCase().charAt(locate)); 
        locate++; 
       }     
      } 
      else if(hi2.charAt(locate) == ' ') 
      { 
       System.out.print(" "); 
       locate++; 
      } 
     } 
    } 
} 

これは私の現在の研究室での問題の1つです。私はいくつかの間違いを修正することができましたが、私はこれを見つけることができません。forループとcharAt()を使用します。文字列の文字を交互に印刷する

私の質問は「COMpUtER SCIEnCE」を出力する理由です。私はここで何が起こっているのか分からず、私は今一時間それを見てきました。私の目標は "CoMpUtEr ScIeNcE"を出力することです

私は(hi2.charAt(locate)%2 == 0)と思っていましたが、その逆は文字列の偶数と奇数の位置の間で交互になりますが、どこかで間違い。私はそれを見つけることができません。

BlueJのV3.1.7

1年間の高校コンピュータサイエンスの経験を使用して、現在APコンピュータサイエンス

任意のヒントに在籍?

+2

プログラムをデバッグする方法を学ぶ必要があります。次に、出力がどのように生成され、プログラムの状態を見て、バグのプログラミングを見つけるかを段階的に調べることができます。 –

答えて

0

最初に、文字列またはlocate変数を再割り当てする必要はなく、文字がすでに文字であるかどうかを確認する必要はありません。必要な場合は反復整数とパラメータを使用します。

第2に、あなたは位置ではなく文字を改造しています。

とにかく、単純なブールトグルはmoddingよりも理解しやすいでしょう。

void altCaps(String hi) { 
    boolean caps = true; 
    for (char ch : hi.toCharArray()) { 
     if (ch == ' ') { 
      System.out.print(ch); 
     } 
     else if (Character.isLetter(ch)) { 
      if (caps) System.out.print(Character.toUpperCase(ch)); 
      else System.out.print(Character.toLowerCase(ch)); 
      caps = !caps; // switch between upper and lower every character 
     } 
+0

ありがとうございました。 Javaの知識のレベルが低いため、正確に理解できません。 for(char ch:hi.toCharArray()){ if(ch == ''){ 「ch」とは何ですか?コロンの機能は何ですか? 「caps =!caps;」とは何ですか?行う? – TheLoGiiKaLOne

+0

最初の質問:https://stackoverflow.com/questions/11685305/what-is-the-syntax-of-enhanced-for-loop-in-java第2の質問:それは、それ自身の否定された値にブール値を割り当てます –

1

だからhi2.charAt(locate) % 2 == 0は、実際に文字の整数値が奇数か偶数かをチェックしていますが、実際にインデックスが奇数かどうかを確認したい、あるいは正しい場合でもチェックします。言い換えれば:

hi2.charAt(2) % 2 == 0 

mが奇数か偶数であるかどうかを確認しています。しかし、私はあなたが2(インデックス)が奇数か偶数かをチェックしたいと思うと思います。私はここから推測する、それはあなたが変更する必要があると仮定するのは簡単です:これは、あなたが望む正確に出力を与えることはありません

if(hi2.charAt(locate) % 2 == 0) 
    //... 
else if(hi2.charAt(locate) % 2 == 1) 
    //... 

if(locate % 2 == 0) 
    //... 
else if(locate % 2 == 1) 
    //... 

に、それはifを反転するだけです条件や身体をあなたが望むように。また、あなただけやってコードを簡素化することができるようにあなただけの、どちらか奇数か偶数のインデックスを取得したいという意味、操作% 2のための他の例がありません:より良い読み

if(locate % 2 == 0) 
    //... 
else 
    //... 

。お役に立てれば!

1

あなたのコードをリファクタリングして繰り返し呼び出しを減らし、(関数評価の比較ではなく)可能な値の検査を行うことを強くお勧めします。例えば

char currentCharacter = hi2.charAt(locate); 

は、関数呼び出しの4つのインスタンスを置き換え、そしてあなたが実際値が(むしろあなたが値があることを期待ものより)であるものを検査することが可能になります。これにより、エラーがより明確になる可能性があります。それは評価をステップ実行する価値があるかもしれ

hi2 = "Computer Science"; 
locate = 0; 

:次の値を仮定し

0. hi2.charAt(locate) % 2 == 0 
1. "Computer Science".charAt(0) % 2 == 0 
2. 'C' % 2 == 0 
3. 67 % 2 == 0 
4. 1 == 0 
5. false 

根本的な問題は、変数へのあなたの値を割り当てることがないことで、あなたがそれであるかを理解するには時間がかかることはありませんということです。これを変数に代入することにより、デバッガを使用して値を検査することができます。値を調べることによって

、我々は、したがって、あなたはおそらく繰り返しを減らすために、あなたのコードをリファクタリング

0. locate % 2 == 0 
1. 0 % 2 == 0 
2. 0 == 0 
3. true 

ボーナス

を望んでいた、あなたはおそらく0、ない'C'のMODを望んでいることでしょう見ることができます他のエラーも強調表示します。たとえば、次のことを試してください。

assert "CoMpUtEr sCiEnCe".equals(BugFixes.altcaps("Computer Science")); 
assert "CoMpUtEr-sCiEnCe 201".equals(BugFixes.altcaps("Computer-Science 201")); 

はKISS:不必要なロジックの除去が間違って物事の機会を減少させるであろう。

+1

私は 'locate'の代わりに' i'を使うべきだと考えます。 –

+0

@ cricket_007は、大文字小文字の数に空白をスキップするかどうかで決まります。私は、後でもっと明白になるかもしれないもう一つの欠陥があり、修正のために 'locate'を必要としていると思います。 –

関連する問題