2011-07-01 3 views
8

私はコカンの本でObjective-Cを学んでいましたが、私はこのエクササイズプログラムのやり方を理解できません。奇数の演習だけがオンラインでリストされ、この演習は均等です。演習は数字を単語に変換することです。したがって、「932」が入力された場合、プログラムは「9 three two」を返します。数字をテキストに変換するには?

dowhileループを使用しましたが、「two three nine」のように後方に出てきました。誰でもこれに対応するテクニックを提案できますか?

int number, digit; 


NSLog(@"Type in your integer."); 
scanf("%i", &number); 


do 
{ 
    digit = number % 10; 

    if (digit == 0) 
     NSLog(@"zero"); 
    if (digit == 1) 
     NSLog(@"one"); 
    if (digit == 2) 
     NSLog(@"two"); 
    if (digit == 3) 
     NSLog(@"three"); 
    if (digit == 4) 
     NSLog(@"four"); 
    if (digit == 5) 
     NSLog(@"five"); 
    if (digit == 6) 
     NSLog(@"six"); 
    if (digit == 7) 
     NSLog(@"seven"); 
    if (digit == 8) 
     NSLog(@"eight"); 
    if (digit == 9) 
     NSLog(@"nine"); 

    number /= 10; 
} 
while (number != 0); 
+1

@Nadeem結果が "two three nine"の場合、おそらく1桁の数字からループしていて、上の桁からループしたいと思うでしょう。コードを記入してください。 – CajunLuke

+1

私はコードを投稿してくれてありがとう、私は誰かの名前の下に投稿することはできませんでした。それは時間がかかりました。また、皆さんに知ってもらうために:私はそれが間違っている理由を知っている、私はちょうどそれを正しくする方法を知らない。 – Nadeem

答えて

2

あなたは数字が後方にも出力場合、すでに言葉に変換するために得ることができた場合は、途中でそこにいるようまあそれが聞こえます。

データをループして、インデックスをインクリメントし、番号の文字の長さから開始し、インデックスを逆方向に減らして出力を反転させると仮定します。

実際のコードを見ずには、はるかにあなたを助けることはできません。 ;)

+0

申し訳ありませんが、私は先週の勉強を始めたばかりです:私はどのように後ろ向きに作業できるのかよく分かりません。私の現在の方法は右の桁を取得し、右から左に印刷していました。私は何とか左の数字を取得することによって左から右の数字を表示する方法を見つけようとしています。 – Nadeem

+1

このタスクを達成しようとしているコードを投稿してください。答えはたくさんあります; –

5

文字列に数値を追加しているので、右から左に計算したいので、文字列の前にそれぞれ新しい数値を追加します。ような何か:

theNewNumberは(@「6」のような)文字列で、numberStringは、設定が完了したら、あなたは出力したい文字列です
numberString = [NSString stringWithFormat:@"%@ %@", theNewNumber, numberString]; 

...

(ああ、とドン」 tはあなたが何かのように...ループを開始する前にnumberStringを初期化することを忘れ:あなただけの投稿コードに基づいて

NSString *numberString = @""; 

=====

、あなたはどちらかの数学的にそれを行う、あるいは単に前でした守るこのような文字列:あなたが投稿したことを今

- (void) prependNumber:(NSString *)num { 
    numberString = [NSString stringWithFormat:@"%@ %@", num, numberString]; 
} 

NSLog(@"Type in your integer."); 
scanf("%i", &number); 
numberString = @""; 


do 
{ 
    digit = number % 10; 

    if (digit == 0) 
     [self prependNumber:@"zero"]; 
    if (digit == 1) 
     [self prependNumber:@"one"]; 
    if (digit == 2) 
     [self prependNumber:@"two"]; 
    if (digit == 3) 
     [self prependNumber:@"three"]; 
    if (digit == 4) 
     [self prependNumber:@"four"]; 
    if (digit == 5) 
     [self prependNumber:@"five"]; 
    if (digit == 6) 
     [self prependNumber:@"six"]; 
    if (digit == 7) 
     [self prependNumber:@"seven"]; 
    if (digit == 8) 
     [self prependNumber:@"eight"]; 
    if (digit == 9) 
     [self prependNumber:@"nine"]; 

    number /= 10; 
} 
while (number != 0); 

NSLog (@"%@", numberString); 
2
#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int a, b, number, logNum, nThNum; 

    NSLog(@"Please enter a valid integer: "); 
    scanf("%d", &number); // read input as a decimal integer 

    if (!number) // if zero or something other than a number is entered output zero 
     NSLog(@"Zero"); 
    else if (number < 0) { // convert negatives to something that can be used 
     number = -number; 
     NSLog(@"(negative)"); // but output negative first then continue as usual 
    } 

    logNum = (log10(number) + 1); // find how many digits there are in the number 

    for (int j=0; j < logNum; j++) {// loop based on number of digits 
     a = pow(10,logNum-j); 
     b = pow(10,logNum-1-j); 
     nThNum = (number % a)/b;// find the nth digit in a number, in our case 1st 
     switch (nThNum) {// output current digit that was found 
      case 0: 
       NSLog(@"Zero"); 
       break; 
      case 1: 
       NSLog(@"One"); 
       break; 
      case 2: 
       NSLog(@"Two"); 
       break; 
      case 3: 
       NSLog(@"Three"); 
       break; 
      case 4: 
       NSLog(@"Four"); 
       break; 
      case 5: 
       NSLog(@"Five"); 
       break; 
      case 6: 
       NSLog(@"Six"); 
       break; 
      case 7: 
       NSLog(@"Seven"); 
       break; 
      case 8: 
       NSLog(@"Eight"); 
       break; 
      case 9: 
       NSLog(@"Nine"); 
       break; 
      default: 
       break; 
     } 
    } 

    [pool drain]; 
    return 0; 
} 

まあ、:

NSString *numberString; 

は、その後、あなた.Mでこれを置く:

は、あなたの.hファイルで、この変数を入れてあなたのコードは、あなたのメソッドは最初に番号が素晴らしい場合に動作します。だから、あなたはそれを行うための短いルーチンを書くことができますし、独自のコードを使用してください。

+0

私が掲載しようとしていたソリューションとほぼ同じです:正確に同じ内部ロジックを維持し、結果を直接ログに記録しますが、最も高い桁を見つけて、逆の順序で元のコードに反復処理します。ここに投稿された他のソリューション(NSStringを使用して結果を蓄積するなど)は同様に機能しますが、これは元のスループットに最も近いと思います。 – Tommy

+0

それより簡単なものはありますか? – Nadeem

+0

@ Nadeem。確かに。あなたは逆の数字のために素晴らしい作品です。入力番号を反転してメソッドを適用する短い関数を記述します。私のメソッドは数値を数字として扱いますが、文字列に変換して文字を取得することもできます。そこには多くのソリューションがあります、私は確信しています。 – PengOne

12

これは正確欲しいものが、あなたの検討のためではありません。

NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; 
[f setNumberStyle:NSNumberFormatterSpellOutStyle]; 

NSString *s = [f stringFromNumber:[NSNumber numberWithInt:932]]; 
NSLog(@"%@", s); 
[f release]; 

これは、ログに記録します。

nine hundred and thirty-two 

を繰り返しますが、それはあなたが欲しい「9 3 2」ではありませんしかし、それはまた素敵で短いです。

+0

DeLongまだ学習しているので、コードを修正しました。 – JAL

+0

素晴らしいコードです。 – Warewolf

1

学習練習として、私はDaveのコードを修正:):

私が使用
+(NSString*)doIt:(NSString*)inString delimiter:(NSString*)delimiter{ 
    NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; 
    [f setNumberStyle:NSNumberFormatterSpellOutStyle]; 
    NSMutableString* outString= [[NSMutableString alloc]init]; 
    for (int i=0; i< [inString length]; i++) { 
     unsigned char oneChar= [inString characterAtIndex:i]; 
     if (oneChar>47 && oneChar<58) { 
      NSString* temp=[f stringFromNumber:[NSNumber numberWithUnsignedChar:oneChar-48]]; 
      [outString appendFormat:@"%@",temp]; 
      [outString appendString:delimiter]; 
     } 
    } 
    [f release]; 
    [outString autorelease]; 
    return outString; 
} 
0
#import <Foundation/Foundation.h> 

int main(int argc, const char * argv[]) 
{ 

@autoreleasepool { 

    // insert code here... 
    int number;  //store the value the user enter 
    int lastDigit; //pick of the last digit of the integer 
    int tempNum; //a temporary storage of the integer the user enter 
    int count = 0; //used to count how many digits were entered 
    int count2;  //going to be use as a duplicate of count 



    NSLog(@"Enter an integer"); 
    scanf("%i", &number); 
    tempNum = number; 


    //Loop to find out how many digits were entered 
    for (; number != 0; number /= 10) { 
     count +=1; 
     } 

    //Loop to convert the numbers into words 
    for (; count != 0; count -= 1) { 
     count2 = count;  //set count2 to count so the for and while loop use them independently 
     number = tempNum; //restore the value entered by by the user to the number variable 


     //Loop to reverse the order of the last digit 

     while (count2 != 0) {   //loops to the same number of counts to get the first digit 
      lastDigit = number % 10; //picks off the last value in the integer 
      number /= 10;    //enables the loop to set the last value of the integer to zero 
      count2 -=1;     //loops one less time to get the numbers from front to back 

     } 
     //switch statements 
     switch (lastDigit) { 
      case 9: 
       NSLog(@"nine"); 
       break; 
      case 8: 
       NSLog(@"eight"); 
       break; 
      case 7: 
       NSLog(@"seven"); 
       break; 
      case 6: 
       NSLog(@"six"); 
       break; 
      case 5: 
       NSLog(@"five"); 
       break; 
      case 4: 
       NSLog(@"four"); 
       break; 
      case 3: 
       NSLog(@"three"); 
       break; 
      case 2: 
       NSLog(@"two"); 
       break; 
      case 1: 
       NSLog(@"one"); 
       break; 
      case 0: 
       NSLog(@"zero"); 
       break; 
      default: 
       break; 
     } 
    } 
    } 
return 0; 
} 
+0

これは、目的Cの基礎を使ってこの問題を解決する私の方法でした。理解するまでには時間がかかりましたが、言語を学び始めたばかりの人に役立つことを願っています。 – user2669841

0

は、ネストされたループの下にネストされたが、これは非常に

int i, j, number, reversenumber = 0; 

    NSLog(@" Input Number:"); 
    scanf("%i", &number); 

    if (number != 0) 
     // chekcing for zero entry 
    { 
     for (;number!= 0; number = number/10) 
      //for reversing the number entered so that the words doesn't come reversed when printed 
     { 
      i = number%10; 
      reversenumber = reversenumber * 10 + i; 
     } 

     NSLog(@"Reverser Number for the input number is %i", reversenumber); 
     // mid routine check to print the reversed number 

     while(reversenumber != 0) 
     { 
      j = reversenumber % 10; 
      switch (j) 
      { 
       case 9: 
        NSLog(@"nine"); 
        break; 
       case 8: 
        NSLog(@"eight"); 
        break; 
       case 7: 
        NSLog(@"seven"); 
        break; 
       case 6: 
        NSLog(@"six"); 
        break; 
       case 5: 
        NSLog(@"five"); 
        break; 
       case 4: 
        NSLog(@"four"); 
        break; 
       case 3: 
        NSLog(@"three"); 
        break; 
       case 2: 
        NSLog(@"two"); 
        break; 
       case 1: 
        NSLog(@"one"); 
        break; 
       default: 
        NSLog(@"zero"); 
      } 
      reversenumber /= 10; 
     } 

    } 
    else 
     NSLog(@"Zero"); 
} 

    return 0; 

}

0

を動作することを信じています簡単に、アプローチの数がありますが、私は通常これを試してください:

do 
    { 
     digit = number % 10; 
     switch (digit) { 
      case 0: 
       [self prependNumber:@"zero"]; 
       break; 
      case 1: 
       [self prependNumber:@"one"]; 
       break; 
      case 2: 
       [self prependNumber:@"two"]; 
       break; 
      case 3: 
       [self prependNumber:@"three"]; 
       break; 
      case 4: 
       [self prependNumber:@"four"]; 
       break; 
      case 5: 
       [self prependNumber:@"five"]; 
       break; 
      case 6: 
       [self prependNumber:@"six"]; 
       break; 
      case 7: 
       [self prependNumber:@"seven"]; 
       break; 
      case 8: 
       [self prependNumber:@"eight"]; 
       break; 
      case 9: 
       [self prependNumber:@"nine"]; 
       break; 
      default: 
       break; 
     } 


     number /= 10; 
    } 
    while (number != 0); 

/************/ 
-(void) prependNumber:(NSString*)str{ 
NSLog(str); 
}