-1

この関数は、配列内の要素の数である整数配列を取り、配列内の多数要素を見つけようとします。大部分の要素が存在する場合、それは *result に配置され、関数は true を返します。大部分の要素が存在しない場合、関数は false を返します。その場合、*result は使用しないでください。

私の出力は、私が書いているプログラムに対して正しく機能していません。これは、この findMajority 関数が原因だと思います。

これは、出力が次のようになるはずです: http://pastebin.com/Q5ycXHrg

これは私の出力がどのように見えるかです: http://pastebin.com/7P1ZTpML

これは入力です:

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3
1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1 2 2 1 1
1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1
1 2 3
1 1 1
1 2 1
1 2
1 1
2
1 1 1 1 2 3 4 5 6 7

関数は次のとおりです。

int findMajority(int *array, int count, int *result){ 
  int i, counter, bcount = 0, ccount = 0, candidate, j;    

  if(count == 1) {
      *result = *array;
      return true;
  }

  if(count % 2 != 0 ) {
    for(i = 0; i < count; i++) {
      if(*(array + i) == *(array + count)) {
        counter++;
      }
    }

    if(counter > (count/2)) {
      *result = *(array + count);
      return true;
    }
    else {
      *(array + count) = 0;
      count--;
    }
  }

  for(j=0; j <= count; j += 2) {
    if(*(array + j) == *(array + (j + 1))) {
      *(array + (count + 1)) = *(array + j);
      bcount++;//how many numbers on the end of the array
    }
  }

  if(bcount == 1) {
    int k = count;
    while(*(array + k) == 0) {
      candidate = *(array + k);
    }
  }
  else
    findMajority((array + count), count, result);

  for(j=0; j <= count; j += 2) {
    if(*(array + j) == candidate) {
      ccount++;
    }
  }

  if(ccount > (count/2)) {
    *result = candidate;
    return true;
  }
  else
    return false;  
}
4

2 に答える 2

1

あなたの機能には多くの問題があります。

  1. 初期化せずcounterにインクリメントしています
  2. array[count]が有効な最後の要素であるかarray[count-1]、正しい要素であるかを確認します
  3. このコードでは for(j=0; j <= count; j += 2){

       if(*(array + j) == *(array + (j + 1))){
           *(array + (count + 1)) = *(array + j);
           bcount++;//how many numbers on the end of the array
       }}
    

    などcount= 3にアクセスしています。array[4] array[5]

  4. そして、これは無限ループです。ループ内で条件変数を変更していません while(*(array + k) == 0) { candidate = *(array + k); }
于 2013-03-02T01:46:38.823 に答える
1

デバッガーを使用してプログラムをデバッグする方法を学ぶことをお勧めします。たとえば、コードを次のようにラップした後:

#include <stdio.h>

typedef enum { false, true } boolean;

 // ((( your function here )))

int main(int argc, char* argv[])
{
   int result = 0;
   int number = 0;

   int test[] = { 1, 1, 1, 1, 1, 1, 1 };


   result = findMajority(&test[0], sizeof(test) / sizeof(int), &number);

   printf("Result = %d, Number = %d\n", result, number);

   return 0;
}

これを「question.c」に入れると仮定すると、コマンドを発行できます (gcc と gdb があると仮定します):

$ gcc -g -o question question.c
$ gdb ./question
(gdb) b findMajority
Breakpoint 1 at 0x80483ea: file question.c, line 6.
(gdb) run
Starting program: ./question
Breakpoint 1, findMajority (array=0xbffff4bc, count=7, result=0xbffff4d8) at question.c:6
6     int i, counter, bcount = 0, ccount = 0, candidate, j;    

コマンドを使用nして次の行に進み、pコマンドを使用して変数を出力して何が問題なのかを確認できます。たとえば、Toms が指摘するいくつかの問題を比較的迅速に見つけることができます。

39     while(*(array + k) == 0){
(gdb) n
40         candidate = *(array + k);
(gdb) n
39     while(*(array + k) == 0){
(gdb) n
40         candidate = *(array + k);
(gdb) n
39     while(*(array + k) == 0){
(gdb) n

あなたの無限ループがあります。

(gdb) p counter
$3 = -1207959944

そして、初期化されていないカウンターがあります。

プログラミング学習の一部は、何がうまくいかなかったのかを判断するための戦略を考え出すことです。のようなテキストベースのデバッガーを使用するのが好きな人もいますgdb。Eclipse CDT に見られるようなグラフィカル デバッガーが好きな人もいます。printf()コード全体にステートメントを入れる人もいます。

Toms のように本当に上手になれば、それを読んで問題を解きほぐすことができます。;-)

于 2013-03-02T02:02:42.870 に答える