2017-01-08 1 views
-4

EOF整数(この場合は999999)が入力されるまで入力を受け取るコードを書いた後、数値をソートして私たちの針を検索します。。このプログラムで「すべての制御パスが値を返すわけではない」

「検索」:整数)干し草の山と呼ばれる整数の配列()でそれをコンパイルしている間今、私は私の検索アルゴリズムでの問題に直面していますが、私に警告を示し、すべてのコントロールパスが値を返さないの

私は、関数が何らかのケースで何も返さないかもしれないと思いますが、問題はそのようなケースを考えることができないということです。私のプログラムには多くの価値があり、いつも正しい出力が得られました。問題がどこにあるのか誰でも分かりやすくすることができます。私はいくつかWindowsネイティブツールのコンパイラこれを使用していた。誰もがCS50のpset3はこれに関連している問題を見つけ見ている場合も

は、私もそこに同じ検索機能を使用しますがCS50 IDEでコードをコンパイル中のプログラムは、それが中に針を見つけたかどうかを示したことはありませんヘイスタック。それは、順番にそれらを整理し、その後に停止した。

#include <stdio.h> 
#include "cs50.h" 
#include <stdlib.h> 


bool search(int value, int values[], int n); 
void sort(int values[], int n); 

// maximum amount of hay 
#define MAX 65536 

int main(int argc, string argv[]) 
{ 
    // ensure proper usage 
    if (argc != 2) 
    { 
     printf("Usage: ./find needle\n"); 
     return -1; 
    } 

    // remember needle 
    int needle = atoi(argv[1]); 

    // fill haystack 
    int size; 
    int haystack[MAX]; 
    for (size = 0; size < MAX; size++) 
    { 
     // wait for hay until EOF 
     printf("\nhaystack[%i] = ", size); 
     int straw = GetInt(); 
     if (straw == 999999) 
     { 
      break; 
     } 

     // add hay to stack 
     haystack[size] = straw; 
    } 
    printf("\n"); 

    // sort the haystack 
    sort(haystack, size); 

    // try to find needle in haystack 
    if (search(needle, haystack, size)) 
    { 
     printf("\nFound needle in haystack!\n\n"); 
     return 0; 
    } 
    else 
    { 
     printf("\nDidn't find needle in haystack.\n\n"); 
     return 1; 
    } 
} 

/** 
* Returns true if value is in array of n values, else false. 
*/ 
bool search(int value, int values[], int n) 
{ 
    /* TODO: implement a searching algorithm */ 
    int first = 0; 
    int last = n; 
    int middle = (first + last)/2; 

    while (first + 1 < last) 
    { 
     if (value == values[middle]) 
     { 
      return true; 
      break; 
     } 
     if (value == values[first]) 
     { 
      return true; 
      break; 
     } 
     if (value == values[last]) 
     { 
      return true; 
      break; 
     }   
     if (value < values[middle]) 
     { 
      last = middle; 
      middle = (first + last)/2; 
     } 
     if (value > values[middle]) 
     { 
      first = middle; 
      middle = (first + last)/2; 
     } 
    } 
    if (first + 1 >= last) 
    { 
     return false; 
    } 
} 

/** 
* Sorts array of n values. 
*/ 
void sort(int values[], int n) 
{ 
    // TODO: implement an O(n^2) sorting algorithm 
    for (int j = 1; j < n; j++) 
    { 
     for (int i = 0; i < (n - 1); i++) 
     { 
      if(values[i + 1] < values[i]) 
      { 
       int b = values[i + 1]; 
       values[i + 1] = values[i]; 
       values[i] = b; 
      } 
     } 
    } 
    for (int k = 0; k < n; k++) 
    { 
     printf("haystack[%d] = %d ", k, values[k]); 
    } 
} 
+1

これは、boolなどの特定の型の値を返すことを約束した関数があり、戻り値が返されない関数内でコードが取り得るパスがあることを意味します。 –

+4

'if(first + 1> = last)'は無意味です。これで上記のwhileループを終了しました。 – WhozCraig

+0

BTW 'int last = n;' - > 'int last = n-1;' – BLUEPIXY

答えて

1

コンパイラはコードを実行しません。それは価値の追跡をしません。 は変数と式の値を推論することができますが、これは一般的にコンパイラの解決できない問題です。

コンパイラは、制御が関数の終了時に}に達すると、searchから何を返すかわからないことを伝えます。

ところで、C標準ライブラリには同じ名前の関数が含まれているので、sortという関数を書くのは悪い考えです。

+0

答えをありがとう。私は何が間違っているのか理解しました。私は、ブレークラインコードを削除する必要がありますまた、戻り値falseのif条件を削除し、私のコードが正しいようになります。私のアルゴリズムも正しいですか? – Salmaan

関連する問題