アドレス渡しと配列
アドレス渡しと配列
3つの1次元整数型配列a,b,cの先頭アドレスと配列の大きさを受け取り、配列aのデータを配列bには順方向、配列cには逆方向に代入して返す関数を作成せよ。条件として,main関数で最初に配列aに適当な値を初期化で代入し、関数を呼び出したあとは、配列a,b,cの要素を3列で出力せよ。また関数内ではポインタのインクリメント、デクリメントを繰り返す方法を用いよ。という問題が分からなくて困っています。特に分からないのが出力のfor文はどこに書けばいいのかです。自分でできる限り書いては見ましたがこの時点で間違っている点も多々あると思います。どのように改善すればよいかご指摘をよろしくお願いします。
Re: アドレス渡しと配列
まず機械的にできることとして、インデントを整えましょう。
配列bやcに代入する部分は、前の質問のロジックをそのまま使えばいいでしょう。
出力のfor文は、当然出力をする場所、すなわち「関数を呼び出したあと」のmain関数に書けばいいでしょう。
配列bやcに代入する部分は、前の質問のロジックをそのまま使えばいいでしょう。
出力のfor文は、当然出力をする場所、すなわち「関数を呼び出したあと」のmain関数に書けばいいでしょう。
オフトピック
「配列の大きさを受け取り」とは書いてあるが、受け取った大きさを使えとは書いてない…
だから、引数nを無視して定数Nを使ってもいいのだろうか…?
そもそも変化しない「配列の大きさ」として配列の大きさが入った変数へのポインタを渡すのも変な設計である気はするが…
だから、引数nを無視して定数Nを使ってもいいのだろうか…?
そもそも変化しない「配列の大きさ」として配列の大きさが入った変数へのポインタを渡すのも変な設計である気はするが…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: アドレス渡しと配列
こういう事がやりたいんだろうからそもそもaddと言う関数名はおかしいね...。いろんな方法があって
http://dixq.net/forum/viewtopic.php?f=3&t=18646も一つの例でしょう。
(もちろんこんな答えは0点ですよ)
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
続行するには何かキーを押してください . . .
http://dixq.net/forum/viewtopic.php?f=3&t=18646も一つの例でしょう。
(もちろんこんな答えは0点ですよ)
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <vector>
#define N 10
template <typename C> void reverse_sort(C& c) {
using std::begin;
using std::end;
std::sort(begin(c), end(c), std::greater<>());
}
template <typename C> void print(const C& c) {
for (const auto& e : c) {
std::cout << e << " ";
}
std::cout << "\n";
}
int main() {
int a[N] = { 1,2,3,4,5,6,7,8,9,10 };
print(a); reverse_sort(a); print(a);
}
10 9 8 7 6 5 4 3 2 1
続行するには何かキーを押してください . . .
Re: アドレス渡しと配列
普通は#define N 10とかa[N]は要らないでしょう。int a[] = { 1,2,3,4,5,6,7,8,9,10 };でいいでしょう。
Re: アドレス渡しと配列
まずポインターはゆっくりと時間をかけないと落とし穴にはまるので簡単な所から動作確認お願いします。動作OKなら連絡下さい。それからゆっくり考えてください。(デバッグできるのなら変数の動きを確認してみてください。)
//①1つの1次元整数型配列a,b,cの先頭アドレスと配列の大きさを受け取り
//②配列aのデータを配列bには順方向、配列cには逆方向に代入して
//③main関数で最初に配列aに適当な値を初期化で代入し、関数を呼び出したあとは
//④配列a,b,cの要素を3列で出力せよ。
//⑤また関数内ではポインタのインクリメント、デクリメントを繰り返す方法を用いよ。
//⑥という問題が分からなくて困っています。
//Ans⑥1つずつやっつけましょう。
#include <stdio.h> //#define N 10
int N = 10;
int i; int* pa; int* pb; int* pc;
////①1つの1次元整数型配列a,b,cの先頭アドレスと配列の大きさを受け取り
int my_sort(int* a, int* b, int* c, int N){
//重要なソートアルゴリズムを組み込む(難しいので後回し)
//②データを配列bには順方向、配列cには逆方向に代入して
pb = &b[0]; pc = &c[N - 1];
for (i = 0; i < N; i++) {
*pc-- = *pb++; //後置インクリメント
}
return(0);
}
void print(int* d) {
int* pd; pd = &d[0];
for (i = 0; i < N; i++) {
printf("%d,", *pd++); //後置インクリメント
} printf("\b\n");//¥bバックスペース
}
int main(void) {
int a[] = { 1,2,3,4,5,6,7,8,9,10 };
int b[] = { 1,2,3,4,5,6,7,8,9,10 };
int c[] = { 1,2,3,4,5,6,7,8,9,10 };
my_sort(a,b,c,N);
print(a); print(b); print(c);//④配列a,b,cの要素を3列で出力
return(0);
}
Re: アドレス渡しと配列
一応動く様なので載せておきます。(ソートの部分は配列のままです。)ポインターはよく見て理解出来してください。(勘違いしてるかもしれません。動作検証に十分ご注意願います。短くなるように書いたんでなおしていただければと思います。)
//①1つの1次元整数型配列a,b,cの先頭アドレスと配列の大きさを受け取り
//②配列aのデータを配列bには順方向、配列cには逆方向に代入して
//③main関数で最初に配列aに適当な値を初期化で代入し、関数を呼び出したあとは
//④配列a,b,cの要素を3列で出力せよ。
//⑤また関数内ではポインタのインクリメント、デクリメントを繰り返す方法を用いよ。
#include <stdio.h> //#define N 10
//int N = 10;//厳密にはNがグローバルでは int Nの引数の意味がない
//int i; int* pa; int* pb; int* pc;
//①1つの?(3つの)1次元整数型配列a,b,cの先頭アドレスと配列の大きさを受け取り
int my_sort(int* a, int* b, int* c, int N){
int i,j, temp; int* pa; int* pb; int* pc;
pa = &a[0]; pb = &b[0];//bにaをコピー
for (i = 0; i < N; i++) {
*pb++ = *pa++; //後置インクリメント::コピー実行
}
//②データを配列bには順方向=ソートアルゴリズムを組み込む
/////////////////////////////////////////
for (i = 0; i<N; i++) { //全数チェック
for (j = N - 1; j>i; j--) { //右端より比較して
if (b[j] < b[j - 1]) { //小さいものを左に寄せる
temp = b[j];
b[j] = b[j - 1];
b[j - 1] = temp; //左に寄せる
}
}
}
/////////////////////////////////////////
//②配列cには逆方向に代入して
pb = &b[0]; pc = &c[N - 1];
for (i = 0; i < N; i++) {
*pc-- = *pb++; //後置インクリメント::逆方向に代入
}
return(0);
}
void print(int* d,int N) { //配列とその大きさを引数とする
int i; int* pd; pd = &d[0];
for (i = 0; i < N; i++) {
printf("%d ", *pd++); //後置インクリメント::一要素の出力
} printf("\n");
}
int main(void) {
const int N = 10; int a[N] = { 9,2,7,4,5,6,3,8,1,10 }; int b[N]; int c[N];
my_sort(a,b,c,N);
print(a,N); print(b,N); print(c,N); //④配列a,b,cの要素を3列で出力
return(0);
}