電子書籍の厳選無料作品が豊富!

C言語のプログラミングについて質問です。

入力されたデータの配列とデータ数を渡すと配列に格納された値を逆順にして、格納し直す関数reverse関数を書き結果を出力せよ、というものなのですが下のように書いたのですが、うまく作動しません。どこがいけないのでしょうか...?教えていただきたいです。

#include <stdio.h>

void reverse(int *data[], int n);

#define MAX 100

int main()
{
int data[MAX];
int n, i;

scanf("%d", &n);
if (n >= MAX) n = MAX;

for (i = 0; i < n; i ++){
scanf("%d", &data[i]);
}
reverse(data, n);


for (i = 0; i < n; i ++) {
printf("%d\n", data[i]);
}

return 0;
}

void reverse(int *data[], int n)
{
int c, i;

for (i = 0; i < n; i ++) {
c = *data[i];
*data[i] = *data[n - (i + 1)];
*data[n - (i + 1)] = c;
}
}

A 回答 (9件)

度々失礼します。



よく考えると、最初から何も交換していなかった可能性もあリます。

少し調べてみたら、配列のままでも交換できるみたいです。

”*”を取ってみるとか、試してみたらどうでしょう?

この回答への補足

お返事ありがとうございます。reverse関数の*をすべてとったら、正しく作動しました。

何度も,親切なご回答をありがとうございます。

とても助かりました^^

補足日時:2011/12/09 14:05
    • good
    • 0

「エラーが出る」というなら「どんなエラーが出るのか」くらい書こうとは思わない?

この回答への補足

お返事ありがとうございます。
reverse(data, n)の文に

passing argument 1 of ‘reverse’ from incompatible pointer type

というようなエラーが出ました。しかし、お返事ありがとうございます。n/2に直し、reverse関数の*をすべてとったら、正しく作動しました。

ご回答ありがとうございました。

補足日時:2011/12/09 14:09
    • good
    • 0

> reverse(data, n);


>
> に問題があるようなエラーが出てしまうのですが

dataの型はint *ですがreverseの引数の型はint **なので型が合わないためです。
reverse関数の*は不要です。

この回答への補足

お返事ありがとうございます。

n/2に直し、reverse関数の*をすべてとったら、正しく作動しました。

ご回答ありがとうございました。

補足日時:2011/12/09 14:03
    • good
    • 0

これは数学じゃないです。



パッと見、reverse()の中にあるfor文の中の

> c = *data[i];

が変に見えます。int型であるdata[i]の中の値をアドレスとみてその指す先にアクセスしようとしてる?

この回答への補足

お返事ありがとうございます。

数学の分野の問題として、これを与えられたので自分は数学だと思っていました。
n/2に直し、reverse関数の*をすべてとったら、正しく作動しました。

ご回答ありがとうございました。

補足日時:2011/12/09 14:07
    • good
    • 0

>reverse(data, n);


>
>に問題があるようなエラーが出てしまうのですが、それもおっしゃられた修正で直すことができます>か…?

void reverse(int *data[], int n)
{
int c, i;

for (i = 0; i < n; i ++) {

の、for文のnだけ、n/2に直せばいいと思います。

使用しているコンピュータについてはよく分からないですが、多分大丈夫だと思いますが……?

この回答への補足

お返事ありがとうございます。n/2に直しただけでやってみたら、

reverse(data, n)の文に

passing argument 1 of ‘reverse’ makes pointer from integer without a cast

というようなエラーが出ました。しかし、reverse関数の*をすべてとったら、正しく作動しました。

ご回答ありがとうございました。

補足日時:2011/12/09 14:02
    • good
    • 0

例えば、データが5個だと2回で交換が終わります。



5回だと何もしない1回と、あと残り2回で元に戻ってしまうので、

n/2で、小数点以下切り捨てるようにすればいいのでは?

この回答への補足

補足から失礼します。回答ありがとうございます。
なるほど!たしかにそうですね。

しかし、このプログラムをターミナルで実行すると、

reverse(data, n);

に問題があるようなエラーが出てしまうのですが、それもおっしゃられた修正で直すことができますか…?

補足日時:2011/12/08 20:03
    • good
    • 0

サブルーチンreverse中のfor文の終了条件は,i<nではなくてi<n/2だと思います。

この回答への補足

補足から失礼します。回答ありがとうございます。

ただ、このプログラムをターミナルで実行すると、

reverse(data, n);

に問題があるようなエラーが出てしまいます。それもおっしゃられた修正で直すことができるでしょうか…?

補足日時:2011/12/08 20:05
    • good
    • 0

reverseの中で既に交換の済んだ要素を再度交換して元に戻していませんか。

この回答への補足

補足から失礼します。回答ありがとうございます。
そうです。たしかにもどしてしまっていました。

ただ、このプログラムをターミナルで実行すると、

reverse(data, n);

に問題があるようなエラーが出てしまうのですが、それもおっしゃられたところを修正することで直すことができるでしょうか…?

補足日時:2011/12/08 20:06
    • good
    • 0

俺はC言語詳しくない。



1.
http://stackoverflow.com/questions/859634/c-poin …
を参考に「ポインタの配列」なのか「配列のポインタ」なのかを明確にしてみた。

2.以下のルーチンなんだがな。
3つの要素を逆転しようとして

行われることは
0と2を交換
1と1を交換
2と0を交換
しているから、元に戻るだけなんだよ。

void reverse(int (*data)[], int n)
{
int c, i;

for (i = 0; i < n ; i ++) {
c = (*data)[i];
(*data)[i] = (*data)[n - (i + 1)];
(*data)[n - (i + 1)] = c;
}
}

だから、半分しかやらないとか工夫すればちゃんと逆転されます

http://ideone.com/taQR9

この回答への補足

補足から失礼します。
ご丁寧な回答をありがとうございます。

しかし、このプログラムをターミナルで実行すると、

reverse(data, n);

に問題があるようなエラーが出てしまうのですが、それもおっしゃられた修正で直すことができるでしょうか…?

補足日時:2011/12/08 20:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!