2017-11-19 18 views
0

私はCを学ぼうとしています。私が入力した数値と配列の数値を比較するプログラムを作りたいと思います。唯一の問題は、実際にはそうしないということです。その配列の番号を入力したとしても、その配列の番号ではないことがわかります。intをdouble配列と比較する

#include <stdio.h> 
    void getMark(int findMark, double crswk1[]); 
    void changePartMark(double crswk1[], int findMark); 

    int main() 
    { 
    int findMark; 
    double crswk1[10]={67, 77, 80, 40}; 

    getMark(findMark, crswk1); 
    changePartMark(crswk1, findMark); 
} 

void getMark(int findMark, double crswk1[]) 
{ 
    printf("Enter the mark you want to change: "); 
    scanf("%d", &findMark); 

} 

void changePartMark(double crswk1[], int findMark) 
{ 
    int i; 
     if(findMark == crswk1[i]) 
      { 
      printf("It is equal"); 
      } 
     else 
      { 
      printf("It is not equal"); 
      } 
} 
+0

はを警告することhttps://stackoverflow.com/questions/588004/is-floating-point-math-broken – Yunnosch

答えて

2

数は決してあなたのmain機能にfindMarkに戻ってきません。

void getMark(int findMark, double crswk1[]) 
{ 
    printf("Enter the mark you want to change: "); 
    scanf("%d", &findMark); 

} 

この関数は、ローカルパラメータfindMarkの値を保存しています。 C言語のすべてのパラメータは値渡しであるため、このローカル変数への変更は呼び出し元に反映されないため、mainfindMarkは変更されません。のアドレスを渡すことによって

getMark(&findMark, crswk1); 

:あなたは `

void getMark(int *findMark, double crswk1[]) 
{ 
    printf("Enter the mark you want to change: "); 
    scanf("%d", findMark); 
} 

をint型、あなたはこのようなmainからこの関数を呼び出すのアドレスを取るために、この機能を変更する必要が

findMark、関数はそのアドレスに書き込むことができます。

また、changePartMark関数は配列全体を検索しません。それはインデックスiだけを見ます。しかし、それでもあなたはiを決して設定しないので、それは問題です。

配列内の各要素に対して値を確認するには、配列をループする必要があります。

int i; 
for (i=0; i<4 i++) { 
    if(findMark == crswk1[i]) 
     { 
     printf("It is equal"); 
     } 
    else 
     { 
     printf("It is not equal"); 
     } 
} 
+0

と同等のものを、私はちょうどそれはそれはそれを見せず、等しく表示する場合ではありません –

+0

@nikunikuD一致を見つけたかどうかにフラグを立て、falseに初期化する別の変数を用意しておきます。一致するものが見つかった場合は、フラグをtrueに設定し、そうでない場合は何もしないでください。ループが終了したら、フラグの値を確認します。 – dbush

+0

ありがとう、それは働いた –

1

二つの主要な問題:

まず、あなたが入力した番号が戻されることはありません。あなたは

void getMark(int findMark, double crswk1[]) { 
    printf("Enter the mark you want to change: "); 
    scanf("%d", &findMark); 
} 

を書くとき、あなたは、ローカルコピーfindMarkではなく、呼び出し側で使用されるものでは値を読み込みます。 BTW:crswk1は使用されません。だから私はあなたのvoid changePartMark(double crswk1[], int findMark)は、ループを欠いて、iが初期化されていない、

int getMark() { 
    int findMark = 0; 
    printf("Enter the mark you want to change: "); 
    scanf("%d", &findMark); 
    return findMark; 
} 

セカンドを書くことをお勧めしたいです。コードは、次のようになります。あなたが読んでいる

void changePartMark(double crswk1[], int findMark) 
{ 
    for (int i=0; i<4; i++) { 
     if(findMark == crswk1[i]) 
      { 
      printf("It is equal"); 
      } 
     else 
      { 
      printf("It is not equal"); 
      } 
    } 
}