2014-03-19 52 views
0

我寫了一個程序,從一個隨機生成的數組中排序,從最大到最小的50個整數。到目前爲止它可以工作,但它偶爾會在排序數組的末尾返回隨機零。這些零不存在於未排序的數組中,並且它們並不總是顯示。這是我的計劃:爲什麼我的排序數組偶爾會在最後返回0?

#import <Foundation/Foundation.h> 

@interface Number: NSObject 

- (void) start; 
- (int) getValue; 
- (void) counted; 
- (void) placeValue: (int) a; 

@end 

@implementation Number 
{ 
    int x; 
} 

- (void) start 
{ 
    x = arc4random_uniform(1000); 
    if (x == 1) 
    { 
     x = x+1; 
    } 
} 

- (int) getValue 
{ 
    return x; 
} 

- (void) counted 
{ 
    x = 0; 
} 

- (void) placeValue: (int) a 
{ 
    x = a; 
} 

@end 

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

    @autoreleasepool 
    { 
     NSMutableArray *unsortedArray = [[NSMutableArray alloc] initWithCapacity: 50]; 

     for (int n = 0; n < 50; n++) 
     { 
      Number *num = [[Number alloc] init]; 
      [num start]; 
      [unsortedArray addObject: num]; 
     } 

     for (int n = 0; n < 50; n++) 
     { 
      printf("%i, ", [unsortedArray[n] getValue]); 
     } 
     printf ("unsorted array.\n\n"); 

     int x = 0; 
     int y = 1001; 

     for (int n = 0; n < 50; n++) 
     { 
      for (int m = 0; m < 50; m++) 
      { 
       if (([unsortedArray[m] getValue] > x) && ([unsortedArray[m] getValue] < y)) 
       { 
        x = [unsortedArray[m] getValue]; 
       } 
      } 

      printf("%i, ", x); 
      y = x; 
      x = 0; 
     } 

     printf("sorted array.\n"); 
    } return 0; 
} 
+1

你說是隨機生成的陣列?是否允許零? – PaulG

+0

arc4random_uniform確實返回0值:[see](https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man3/arc4random_uniform.3.html) – BoilingLime

回答

0

試試這個:

- (void)start 
{ 
    x = (arc4random_uniform(1000) + 1); 
} 

你不想只是增加X當你打0或1,因爲這將影響結果。在這種情況下,arc4random_uniform將返回一個小於1000的隨機數,所以0 - > 999,將1加到所有值中,給你1 - > 1000。調整你的數字以適合你的需要。

雖然代碼中還存在其他問題。爲什麼要創建自己的Number類?爲什麼要創建自己的排序方法?使用NSNumber和NSArray的排序方法。

這裏是一個更清潔的版本:

int main(int argc, const char * argv[]) 
{ 
    @autoreleasepool 
    { 
     NSMutableArray* unsortedArray = [[NSMutableArray alloc] initWithCapacity:50]; 

     for (NSUInteger n = 0; n < 50; ++n) { 
      [unsortedArray addObject:@(arc4random_uniform(999) + 1)]; 
     } 

     for (NSUInteger n = 0; n < 50; ++n) { 
      printf("%li, ", (long)[unsortedArray[n] integerValue]); 
     } 
     printf ("unsorted array.\n\n"); 

     NSArray* sortedArray = [unsortedArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 
      return [obj2 compare:obj1]; 
     }]; 

     for (NSUInteger n = 0; n < 50; ++n) { 
      printf("%li, ", (long)[sortedArray[n] integerValue]); 
     } 
     printf("sorted array.\n"); 
    } 

    return 0; 
} 
+0

謝謝,這真的有幫助!現在我只需要圍繞整個sortedArrayUsingComparator:^ NSComparisonResult事情。 (請原諒我的noobity。):D – AmiableNebula

+0

'sortedArrayUsingComparator'只是排序數組的一種方法。您所要做的就是決定傳入的兩個對象的順序。在這種情況下,我們讓'compare:'方法確定結果。做[obj2 compare:obj1]'給你一個倒序的數組(通常它會是'[obj1 compare:obj2]')。 –

+0

此外,如果這個答案有幫助,請不要忘記投票並選擇它作爲正確的答案。謝謝。 –

0
- (void) start 
{ 
    x = arc4random_uniform(1000); 
    if (x == 0) 
     x = x + 1; 
} 
+0

我嘗試在我的代碼中輸入該值,但排序後的數組仍然會在其結尾處返回隨機零。即使原始數組沒有零,排序後的數組仍然會在其末尾隨機返回零。這裏是程序返回的例子: – AmiableNebula

+0

148,234,856,382,644,571,289,887,270,54,876,123,443,399,299,17,957,545,614,128 ,785,856,336,754,782,232,951,365,205,1,416,335,756,170,381,11,258,454,700,171,913,893,926,696,273 ,864,251,327,170,312,未排序的數組。 957,951,926,913,893,887,876,864,856,785,782,756,754,700,696,644,614,571,545,454,443,416,339,382, 381,365,336,335,327,312,299,289,273,270,258,251,234,232,205,171,170,148,128,123,54,17, 0,排序數組。 程序以退出碼結束:0 – AmiableNebula

0

每個人都專注於一個事實,即arc4random_uniform可以產生零爲可接受值(這是真的),但有一個問題:你的排序算法是不正確的,因爲它會只有在數組中的值是唯一的時纔有效。但是,如果您有任何重複的值(並且不能保證arc4random_uniform不會生成一些重複項),那麼您的算法將只顯示其中一個值,因此,當您到達最後時,您會看到一個一堆額外的零。

有噸不同sorting algorithms的,但它可能更容易,只是利用的本地NSMutableArray排序方法,它可以讓你從編寫自己的雜草之一的自己。

相關問題