プロが教えるわが家の防犯対策術!

intを要素とする二つの配列a、bとその配列の要素数を受け取り、配列aのすべての要素の値を配列bにコピーする関数を定義し、その関数の機能を確認するプログラム作成するという問題について質問です。
(1)配列aを配列bに「先頭から順番に」コピーする関数を作成する
(2)配列aを配列bに「後ろから順番に」コピーする関数を作成する
ただし、配列の要素数(例では4)が変更されても処理できる関数を作成したいです。また、配列の要素の値は関数main()内で表示したいです。
[ヒント]
(1)関数宣言の例
void array_copy(コピー元の配列, コピー先の配列, 配列の要素数)
[実行結果の例]
(1)先頭から順番にコピーする
コピー前
a[0]: 1 b[0]: 0
a[1]: 2 b[1]: 0
a[2]: 3 b[2]: 0
a[3]: 4 b[3]: 0
コピー後
a[0]: 1 b[0]: 1
a[1]: 2 b[1]: 2
a[2]: 3 b[2]: 3
a[3]: 4 b[3]: 4
(2)後ろから順番にコピーする
コピー前
a[0]: 1 b[0]: 0
a[1]: 2 b[1]: 0
a[2]: 3 b[2]: 0
a[3]: 4 b[3]: 0
コピー後
a[0]: 1 b[0]: 4
a[1]: 2 b[1]: 3
a[2]: 3 b[2]: 2
a[3]: 4 b[3]: 1


#include <stdio.h>

void array_copy()

から始めて

int main(void)
{

とプログラムを作成したいのですが教えてください。

A 回答 (4件)

(1)


順向きに配列の内容をコピーする関数の処理
iを0からN-1までループさせる。ループ内で行う処理は
to[i] = from[i]; である。

(2)
逆向きに配列の内容をコピーする関数の処理
iを0からN-1までループさせる。ループ内で行う処理は
to[i] = from[N-(i+1)]; である。


#include <stdio.h>

//順向きにコピーする関数
void array_copy(int *to , int *from , int N)
{
int i;

//(1)を記述
}

//逆向きにコピーする関数
void reverse_array_copy(int *to , int *from , int N)
{
int i;

//(2)を記述
}

//配列を0からN個分表示する関数
void view_array(int *dat , int N)
{
int i;

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

int main(void)
{
int a[4] = {4,7,6,5};
int b[4] = {0,0,0,0};

view_array(a,4);//Aの表示
view_array(b,4);//Bの表示

array_copy(b,a,4);//Aの内容をBにコピーする

view_array(a,4);//Aの表示
view_array(b,4);//Bの表示

reverse_array_copy(b,a,4);//Aの内容を逆向きにBへコピーする

view_array(a,4);//Aの表示
view_array(b,4);//Bの表示


return 0;
}


関数 array_copy だけで順向き/逆向きを切り替えたいなら
引数の数をもうひとつ増やして、順向きにしたいのか逆向きにしたいのか
を判断させるような情報を付けなければできないです。
    • good
    • 0

No.1です。


では、書き方を変えましょう。

関数がわからなければ、main関数の中だけでコピーの処理を作ってください。
これが出来なければ関数化は先の話です。
    • good
    • 0

#include <stdio.h>



//#define REVERSE/* 定義すると逆向きにコピー コメントアウトで順向きにコピー */

//Aの内容をBにコピーする関数
void array_copy(int *to , int *from , int N)
{
int i;

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

#ifdef REVERSE/* 逆向きの場合の処理 */
to[i] = from[N-(i+1)];
//to[0]にfrom[N-(0+1)]、to[1]にfrom[N-(1+1)]、to[2]にfrom[N-(2+1)]の代入作業をto[N-1]まで行う
#else/* 順向きの場合の処理 */
//単純にto[0]にfrom[0]を代入、to[1]にfrom[1]を代入をN-1まで行う

#endif

}

}

//配列を0からN個分表示する関数
void view_array(int *dat , int N)
{
int i;

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

int main(void)
{
int a[4] = {4,7,6,5};
int b[4] = {0,0,0,0};

view_array(a,4);//Aの表示
view_array(b,4);//Bの表示

array_copy(b,a,4);//Aの内容をBにコピーする

view_array(a,4);//Aの表示
view_array(b,4);//Bの表示

return 0;
}

この回答への補足

申し訳ありませんが#defineや#ifdefなどを用いずにプログラムすることは可能ですか?
お願いします。

補足日時:2009/01/19 20:26
    • good
    • 0

丸投げは禁止行為です。


少なくとも、「作れるだけ」は作ってみてそのソースを提示してください。

コピーの方法が分からなくても、関数の呼び出しまでくらいなら作成どきませんか?

この回答への補足

申し訳ありません。
考えてみたのですが、for文を用いて作成するのかなぁと思う程度しか分かりません。
#include <stdio.h>

void array_copy(int a[], int b[], int s)
もしくは
void array_copy(int *a[], int *b[], int s)
を用いて関数を呼び出すのかなぁと思いました。

少しずつでもいいので教えてください。
お願いします。

補足日時:2009/01/19 19:51
    • good
    • 0

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