2016-12-15 6 views
-2

私はCのプログラミングとstackoverflowの新機能です。私は明日の中間があり、勉強中にこの質問に遭遇しました。フォーマットに関する私の間違いに対して、深くお詫び申し上げます。整数ポインタ

質問:2つの整数と整数ポインタを取るdivideという名前の関数を記述します。この関数は、最初の整数を2番目の整数に分割し、その結果を整数として返し、余りを整数ポインタパラメータで指定されたアドレスに配置する必要があります。

与えられたメインコードは、a、bという2つの整数を読み込み、初期化なしで2つの整数res、remを作成します。 res変数が/ bになるように関数呼び出しを完了し、呼び出し後にrem変数が残りの変数になるようにします。

例:

Input 12 5 Output 2 2 
Input 57 7 Output 8 1 

は、私が書いたコードは次のとおりです。私はこれを実行すると

int divide (int a , int b); 
int divide (int a , int b) 
{ 
    int res; 
    int rem; 
    res = a/b; 
    rem = a - res * b ; 
    return res, rem; 
} 

int main(void) 
{ 
    int a,b; 
    scanf("%d%d", &a, &b); 
    int res, rem; 
    res = divide(a,b); 
    printf("%d %d", res, rem); 
    return 0; 
} 

、私は解像度の正しい値を取得しますが、レムは常にゼロに等しいです。 rem値に整数ポインタを使用するにはどうすればよいですか? ありがとうございます。

+4

* "2つの整数と整数ポインタをとる関数" * - 関数には2つの整数しかかかりません。 C言語のように、複数のプリミティブ値を返す必要があるときは、これらの値を保持する 'struct'を定義するか、ポインタパラメータで1つ以上の値を返します。 Tldr;関数のプロトタイプは 'int divide(int a、int b、int * rem)'でなければなりません。 – Groo

+0

あなたは 'divide'の代わりに標準関数[div](http://en.cppreference.com/w/c/numeric/math/div)を使うことができます。あなたはすでに存在するものを作るべきではありません。 – BLUEPIXY

+0

Cでは、1つの値だけを返すことができます。 –

答えて

1
int divide (int a , int b, int* rem) 
{ 
    int res; 
    res = a/b; 
    *rem = a - res * b ; 
    return res; 
} 

int main(void) 
{ 
    int a,b; 
    scanf("%d%d", &a, &b); 
    int res, rem; 
    res = divide(a,b, &rem); 
    printf("%d %d", res, rem); 
    return 0; 
} 

これは動作するはずです。

  1. 関数から複数の値を返すことはできません。 return res, rem;はカンマ演算子のために単にremを返します。
  2. 呼び出し元で複数の値を参照するには、ポインタを使用します。
+2

あなたは 'rem'という名前のローカル変数を持っているので、おそらく動作しません。 – Groo

+0

@Grooを吐いて、修正しました。ありがとう – instance

+0

"関数から複数の値を返すことはできません" - > Trueでも、関数は 'div_t div(int numer、 int denom); ' – chux

0

問題ここでは、

return res, rem; 

が原因あなたが期待したものではありませんcomma operatorの性質に

return rem; 

と同じである、です。

はあなたがrem(剰余)を格納するdivide()関数へのポインタを渡す

  • になっています。
  • 結果をresにします。
0

あなたはあなただけのリンクを提示し、いくつかのソリューションがありますcomma operator

を使用しているやっている方法ではありませんreturn multiple values in C ことができ、あなたが望むすべての値を含む構造体または配列を返すことができます。

typedef struct your_return { 
    int res; 
    int rem; 
} division_return; 

division_return divide (int a , int b) 
{ 
    division_return ret; 
    ret.res = a/b; 
    ret.rem = a - ret.res * b; 
    return ret; 
} 

int main(void) 
{ 
    int a,b; 
    scanf("%d%d", &a, &b); 
    division_return dr; 
    dr = divide(a,b); 
    printf("%d %d", dr.res, dr.rem); 
    return 0; 
} 

コピーは高価なことができますように、それは、値によって構造体を渡すために良い習慣ではありませんが、あなたは、私がコードに多くの複雑さを追加したくない言語に新しいしているよう。 残念ながら、CにはC++としてreferencesがありません。これによりすべてが簡単になります。

ポインタを使用して関数内の値を変更することもできます。

int divide (int a , int b, int* rem) 
{ 
    int res; 
    res = a/b; 
    *rem = a - res * b ; 
    return res; 
} 
+0

ただし、構造体を値渡しするのは、速度が遅くスタックメモリを奪うため、悪い習慣とみなされます。 – Lundin

+0

はい、私はメモとしてそれを追加します、私はちょうど複雑さを追加したくありませんOPは彼が言語に新しいことを言って、Cはそれをより簡単にするための 'references'がないと言います。 – danielfranca

2

また、構造体を返すことができます。

すでに part of standard Cとして実装されている
typedef struct 
{ 
    int quot; 
    int rem; 
} div_t; 

div_t div(int numerator, int denominator) 
{ 
    div_t result; 
    result.quot = numerator/denominator; 
    result.rem = numerator % denominator; 

    return(result); 
} 

7.22.6.2 divldiv、およびlldiv機能

の概要

#include <stdlib.h> 
div_t div(int numer, int denom); 
ldiv_t ldiv(long int numer, long int denom); 
lldiv_t lldiv(long long int numer, long long int denom); 

説明

divldiv、及びlldiv、機能は、単一の操作でnumer/denomnumer % denomを計算します。

戻り

divldiv、及びlldiv機能は 商と剰余の両方を含む、それぞれ、タイプ div_tldiv_tの構造を返し、lldiv_t。構造体は、(商)とrem(剰余)のメンバー( のいずれか)と、それぞれnumerおよび denomの引数と同じ型を持つ を含んでいなければなりません。結果のいずれかの部分を表現できない場合、動作は定義されていません。

div()ldiv()、又はをコールする可能性がはるかに効率的で最も除算マシン命令は、2つの別々のレジスタで商と剰余の両方を生成するように、2回の別々の操作で商と剰余の両方を計算するよりもあることに留意されたいです。

+0

この回答を見ることに興味があり、有益な投票があります。それは要件を明確に無視するので、質問に答えません:**名前付き関数を書く:divideは2つの整数と整数ポインタを取る** – Gerhardh

関連する問題