• ベストアンサー

配列の問題

配列の問題です。 n個の要素を持つ一次元配列の値(変数値)をまったく逆に入れ替えるプログラムを作りたいのですが、この場合どのようにして逆を表現すればよいのかわかりません。 (nの値は読み込み、配列は奇数個でも偶数個でも使えるプログラムでなければなりません) 参考書を見ながら作ってみたのですが…だめでした。 プログラム初心者です。アドバイスお願いします。 int main(void) { int i,n; int vc[n]; printf("n個の要素を持つ一次元配列をつくる\n"); printf("nの値を入力してください\n"); scanf("%d",&n); for (i=0;i<n+1;i++) vc[i]=i+1; for (i=0;i<5;i++) printf("vc[%d]=%d\n",i,vc[i]); printf("この配列を逆に入れ替えると\n); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.3

こんな感じですかね。 入力値は0~255限定になりますが。 ------------------------------------(Code) #include <stdio.h> int main(void) { int i,n; int vc[255]; int vc_ws[255]; /* ワークスペース */ n = -1; /* 初期値 */ printf("n個の要素を持つ一次元配列をつくる\n"); for (;;){ /* 正しい値が入るまでLoop */ printf("nの値を入力してください[0-255]\n"); scanf("%d",&n); /* 入力チェック*/ if (-1<n && n<256){ break; } } for (i=0;i<n+1;i++) { vc[i]=i+1; printf("vc[%d]=%d\n",i,vc[i]); } printf("この配列を逆に入れ替えると\n"); /* ワークスペースに逆にした配列を格納 */ for (i=0;i<n+1;i++) { vc_ws[i]=vc[n-i]; } /* vc[]に転換 */ for (i=0;i<n+1;i++) { vc[i]=vc_ws[i]; printf("vc[%d]=%d\n",i,vc[i]); } return 0; }

namisem
質問者

お礼

回答ありがとうございます。 vc_ws や && や for (;;) など、基本的なものだと思うのですが、まだ勉強していなくてよくわかりませんでした。 でも何となくですが、上の回答は分かりました。 実際に実行してみたところ、うまくいきました。 今回は範囲の指定がないので、#define N が使えるようです。 もっと勉強しますね…。 ありがとうございました。

その他の回答 (3)

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.4

int vc[n]; 可変長配列の所ですね。 一般的には、malloc, freeを使ってメモリを確保/開放します。 int n; int* vc; // int型のポインタ n=100; // nを指定 vc=malloc(sizeof(int)*n); // int型のサイズ×nの領域を確保 … vc[0]=~;vc[1]=~; … free(vc); // 領域を開放 -- > この場合どのようにして逆を表現すればよいのかわかりません。 ポインタの扱いの演習ですと、指定した変数a,bを入れ替える関数 swap(int *a, int *b); を使うと優等生的かも。

namisem
質問者

お礼

回答ありがとうございます。 そうなんです。 この場合、nを指定しなければならないようです。 やっと少しわかってきました。 >ポインタの扱いの演習ですと、指定した変数a,bを入れ替える関数 swap(int *a, int *b); を使うと優等生的かも。 このようなものもあるのですね。 何通りもやり方があって、面白いです。 もっと勉強して、優等生?になれるように頑張ります。 ありがとうございました。

namisem
質問者

補足

for(i=0;i<n;i++) for(i=n-1;i>=0;i--) を使ってうまく出来そうです。 難しいですけど、他のやり方も知れてとても参考になりました。 みなさん本当にありがとうございました。

noname#6587
noname#6587
回答No.2

私も今C++を勉強中です。Cは以前使ってました。 下記のソフトはCだと思いますが、所々間違っているように思えます。 int vc[n]; /* Cでは可変長配列は定義できない */ for (i=0;i<n+1;i++) /* 仮に定義できたとしても、0からnは要素の数がn+1個で、一つ多い。など、、 */ C++では、STL と云うものを使用すると、vectorと云う可変長配列が使えるそうです。  そして 「アルゴリズム」というものの中に、作ろうとしている機能を持つものがあるようです。

参考URL:
http://www.wakhok.ac.jp/~sumi/stl/index.html
namisem
質問者

お礼

回答ありがとうございます。 「アルゴリズム」を見てみたのですが、難しいですね…。 もっと勉強して理解できるようにしたいです。

回答No.1

int i = 最初 int j = 最後 while ( i < j ) { i番目 と j番目 を交換する ++i; --j; }

namisem
質問者

お礼

回答ありがとうございます。 ++や--の考え方を忘れていました。 これを使えば出来ますね。