動作環境はWindowsVista C++ 2008です。
要素数がマクロNUMBERで与えられる配列aとbがある。それぞれの配列の
要素は小さい順に並んでいるものとする。このとき、要素数が2*NUMBERの
配列cへ、配列aとbに現れる全ての要素を、小さい順に格納せよ。
a b c
値 値 値
a[0] 3 b[0] 2 c[0] 2
a[1] 7 b[1] 2 c[1] 2
a[2] 9 b[2] 8 c[2] 3
c[3] 7
c[4] 8
c[5] 9
という具合に動作するプログラムを組みたいのですが、どうすればいいのか
わからずこのように、
#include <stdio.h>
#define NUMBER 3
int main(void)
{
int i,a[NUMBER], b[NUMBER],c[2*NUMBER];
printf(a[%d]:,i)
ほとんど手つかずの状態です。
だれか、わかる人がいれば是非教えて下さい。
最初に、大きさを判定しないで配列Cに全部格納してはいかがですか?
それはできますか?
std::mergeでイッパツですねー
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a[3] = { 3, 7, 9 };
int b[3] = { 2, 2, 8 };
int c[6];
merge(a, a+3, b, b+3, c);
for ( int i = 0; i < 6; ++i ) {
cout << c[i] << ' ';
}
}
この場合、宿題を出した学校の先生は
merge();
の中はどうなっているのか説明しなさい、
説明できなきゃダメ、
と言うはずです。
え? これ宿題なの?
だったらなおさら自分でやんなきゃ。
> 最初に、大きさを判定しないで配列Cに全部格納してはいかがですか?
んでもって一気にソート?
最初の配列がソート済みなのが台無しになりますが。
Betty様
配列Cに全てを格納するとは、このことでよろしいですか?
(違っていたらすみません)
int c[6] = {2, 2, 3, 7, 8, 9}
それと、これはif文ではなくmergeやるのが一般的なのでしょうか?
そもそも、merge自体見たことも使ったこともないのですが
今、手元にある本には載っていないようなのですが
mergeを実装するとこんなかんじ。
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a[3] = { 3, 7, 9 };
int b[3] = { 2, 2, 8 };
int c[6];
int* pa = a;
int* pb = b;
int* pc = c;
while ( pa != a+3 && pb != b+3 ) *pc++ = (*pa < *pb) ? *pa++ : *pb++;
while ( pa != a+3 ) *pc++ = *pa++;
while ( pb != b+3 ) *pc++ = *pb++;
for ( int i = 0; i < 6; ++i ) cout << c[i] << ' ';
}
mergeに関して知りたいのであれば、
STLについて勉強された方がよろしいかと思います。
あとは、実装にSTLを使って良いかどうかでしょうね。
もし宿題だと言うのであれば、出題者の意図を理解する
必要が有りますよ。
出題内容に理解できない部分があるならきちんと確認するべきです。
STLを使わずにC++言語の範疇だけで実装せよと言う話なら
επιστημηさんが書かれている様に地道に詰め替えると言う
話になると思います。
この時に配列aと配列bの注目要素を比べて小さい方を先に入れる
と言うのがミソかな。
いきなりコードを書くのではなくて図でも何でも書いて見て
どういう風に処理して行くのかを頭と紙の上でシュミレートする事が
必要でしょう。なれれば、頭の中だけでシュミレートできるように
なると思います。まずはそこを目指すべきではないかと思います。
PATIO様
επιστημη様
お答えいただきありがとうございます。
一度、STLについて詳しく調べてみようと思います。
矢頭さんはそもそもプログラミングの初心者なのでしょう?
STLよりもまずは基本的なC++の勉強をすべきです。
επιστημη氏のおっしゃることはとりあえず今回は無視するのがよいと思います
よ。
明らかに宿題の趣旨に反していますし。
επιστημη [E-Mail] [HomePage] 2010/06/14(月) 23:05:18
は理想的な回答の一つだと思うのだが…無視しちゃうの?
基礎から勉強しろというのは真っ当な意見だが、その回答がこういう系統の掲示板でどれ
だけ有用なのだろうか?範囲が広すぎて質問者が現在抱えている問題解決のきっかけには
為り得ないと思われるのだが。
シンプルなコードを示して質問者にそのコードを理解する努力を促す事は、掲示板という
場所を考慮すると良い手法だと思うんだがなぁ。
まあ、御本人のスキル次第と言う部分もあります。
提示したソースを一から説明しないといけないレベルなら
基礎から勉強しなさいというのは最もな話です。
せめて提示されたソースを読める程度の知識は必要でしょう。
もっとも、今回の場合は基本の文法は勉強されているようなので
ソース提示でも参考になるとは思いますけれど。
但し、そのソースが生まれる元になっている考え方の部分は
また別の話かなと言う気はしますね。
> 基礎から勉強しなさいというのは最もな話です。
掲示板という場でそれを言っても多くを齎さないし、後続者が過去ログでその回答に辿り
着いても何も得られない。面向かって指導しているとかならともかく、たかが掲示板での
やり取りにおいてその文句に有用性あるの?って話。
既に出ている回答の無視を勧められて出された代案が「基礎から勉強しろ」だけじゃ初心
者は困惑しない?
「Hello world」もとりあえずコードを打ち込んでから中身の理解に入るのだから、今回
も同じようにすれば良いじゃん。
掲示板で手取り足取り教えるなんて無いのだから、質問者が前に踏み出すとっかかりとし
ては十分な回答。
シンプルなコードで辿り着くべき解答が示されてる。後は質問者が努力してコードの理解
を進めるだけなんだし。
良く考えるまでもなく、質問に関係無いレスを付けてしまったな…自重する。
>επιστημη氏のおっしゃることはとりあえず今回は無視するのがよいと
>思いますよ。
すべての回答は出してませんが、
2010/06/14(月) 23:05:18に、一部回答を出しています。
すべてを無視するのでなく、質問者に考えるとっかかりは出していると思います。
>明らかに宿題の趣旨に反していますし。
趣旨に沿っていればすべて答えていいわけではないと思います。
宿題には変わりがないのだから質問者が考えるようにしないといけないと思います。
>良く考えるまでもなく、質問に関係無いレスを付けてしまったな…自重する。
スレと関係のない議論が10回以上続いたことが過去にある。
少なく止めるのならいいと思う。