C/C++の宿題を片付けます 59代目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/01/27(金) 09:08:40【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[1] 授業単元:
[2] 問題文(含コード&リンク):
[3] 環境
[3.1] OS: (Windows/Linux/等々)
[3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
[3.3] 言語: (C/C++/どちらでも可 のいずれか)
[4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか)
[5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々)
【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに)
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
【C 関数検索 man on WWW】
http://www.linux.or.jp/JM/index.html
【前スレ】
C/C++の宿題を片付けます 58代目
http://pc8.2ch.net/test/read.cgi/tech/1137522945/
【過去スレ一覧】
http://makimo.to/cgi-bin/search/search.cgi?q=C%2B%2B%82%CC%8Fh%91%E8&andor=AND&sf=2&H=&view=table&D=tech&shw=2000
0232デフォルトの名無しさん
2006/01/28(土) 23:30:10EOFって何ですか?
0233デフォルトの名無しさん
2006/01/28(土) 23:31:55End Of File
0234デフォルトの名無しさん
2006/01/28(土) 23:32:04ファイルの終端。コンソールから入力するときは CTRL+Z や CTRL+D など。つーかググれ。
0235デフォルトの名無しさん
2006/01/28(土) 23:32:06あなたはまずgoogleの使い方を知るべきです。
0236デフォルトの名無しさん
2006/01/28(土) 23:34:37読もうと努力したけど、アルゴリズムのところ、値を負にしてマークしたりしてて、理解が追いつかなかった。
0237デフォルトの名無しさん
2006/01/28(土) 23:36:02すみません。ありがとうございます!
後>>210をコンパイルしてもエラーが出るんですがどうしてでしょうか?
0238デフォルトの名無しさん
2006/01/28(土) 23:38:030239デフォルトの名無しさん
2006/01/28(土) 23:40:450240デフォルトの名無しさん
2006/01/28(土) 23:45:36#include<assert.h> // assert を使うためのヘッダ
class stack
{
private:
static const int max = 100; int data[max]; int sp;
public:
void push(int); void pop(); bool empty() const;
int top() const; int size() const;
friend bool equal(const stack&,const stack&);
stack(); ~stack();
};
void stack::push(int d){ assert(sp<max); data[sp++] = d; }
void stack::pop(){ assert(0<sp); --sp; }
bool stack::empty() const{ return sp==0; }
int stack::top() const{return data[sp-1]; }
int stack::size() const{ return sp; }
bool equal(const stack& s1,const stack& s2){
bool eq = true;
if(s1.sp!=s2.sp) eq = false;
else{
for(int j=0; j<s1.sp && eq; j++)if(s1.data[j]!=s2.data[j]) eq = false;
return eq;
}
}
stack::stack(){sp = 0;}
stack::~stack(){}
このクラスを実行すると、スタックが同じ場合には1,スタックが異なる場合には56と表示されました。これで合っているのでしょうか?
0241デフォルトの名無しさん
2006/01/28(土) 23:46:11エラーメッセージが長くて貼れませんでした。なので一応途中まで。
C:\MyC>gcc x.cpp -o x
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text+0x62):x.cpp: undefined reference
to `cin'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text+0x14f):x.cpp: undefined referenc
e to `cout'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text+0x1f0):x.cpp: undefined referenc
e to `cout'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$_S_oom_malloc__t23__malloc_alloc
_template1i0Ui+0x1a):x.cpp: undefined reference to `endl(ostream &)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$_S_oom_malloc__t23__malloc_alloc
_template1i0Ui+0x27):x.cpp: undefined reference to `cerr'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$_S_oom_malloc__t23__malloc_alloc
_template1i0Ui+0x2c):x.cpp: undefined reference to `ostream::operator<<(char con
st *)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$replace__t12basic_string3ZcZt18s
tring_char_traits1ZcZt24__default_alloc_template2b0i0UiUiUic+0x34):x.cpp: undefi
ned reference to `__out_of_range(char const *)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$replace__t12basic_string3ZcZt18s
tring_char_traits1ZcZt24__default_alloc_template2b0i0UiUiUic+0x8e):x.cpp: undefi
ned reference to `__length_error(char const *)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$resize__t12basic_string3ZcZt18st
ring_char_traits1ZcZt24__default_alloc_template2b0i0Uic+0x2c):x.cpp: undefined r
eference to `__length_error(char const *)'
C:\DOCUME~1\USER\LOCALS~1\Temp\ccqQcaaa.o(.text$__rs__H3ZcZt18string_char_traits
1ZcZt24__default_alloc_template2b0i0_R7istreamRt12basic_string3ZX01ZX11ZX21_R7is
tream+0xad):x.cpp: undefined reference to `streambuf::sungetc(void)'
0242240 ◆OtZ3csKgUQ
2006/01/28(土) 23:46:17[1] 授業単元:C++によるプログラミング
[2] 問題文(含コード&リンク):
stackにequal(const&,const&)(下のプログラム参照)を追加したプログラムを実行し、スタックを比較した結果を確認せよ。
[3] 環境
[3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc 2.90 [3.3] 言語:C++
[4] 期限:1月29日12:00 [5] その他の制限:特にありません
#include<iostream>
#include<assert.h> // assert を使うためのヘッダ
0243デフォルトの名無しさん
2006/01/28(土) 23:48:14gcc は C のコンパイラ。 C++ をコンパイルするときは g++ を使う。
0244デフォルトの名無しさん
2006/01/28(土) 23:48:46自分で実装したけど、コードの穴埋めをする気にはなれない。
たぶん途中の値を負にしたりするのは、そのノードが確定かどうかの
フラグに使っていると思うんだが、読むのはストレスが溜まる。
穴埋め以外不許可なら、変数表つけるとか出題者はもっと考えるべきだな。
0246デフォルトの名無しさん
2006/01/28(土) 23:52:21わかりました。やってみます。
0247デフォルトの名無しさん
2006/01/28(土) 23:53:01どうを実行して56を表示させたんだ?↓のテストは 1 0 ときちんと表示されるが?
int main() {
stack s1, s2, s3;
s1.push(10); s2.push(10); s3.push(11);
std::cout << (equal(s1,s2)) << std::endl << (equal(s1,s3)) << std::endl;
}
0248デフォルトの名無しさん
2006/01/29(日) 00:05:09遅レスだけど。内容はヒントの2番目の通り。ソースが汚いのは行数規制のせいなので許して。
#include <stdio.h>
void swap(int *x, int *y) {int temp = *x; *x = *y; *y = temp;}
void reverse(int *first, int *last) {for(; ; ) if (first == last || first == --last) return; else swap(first++, last);}
int next_permutation(int *first, int *last) {
int *i = last - 1, *j, *k;
if (first == last || first + 1 == last) return 0;
for(; ; ) {
j = i--;
if (*i < *j) {k = last; while (!(*i < *--k)){} swap(i, k); reverse(j, last); return 1;}
if (i == first) {reverse(first, last); return 0;}
}
}
int is_derangement(int *a, int *p, unsigned int n) {
while (n--) if (a[n] == p[n]) return 0;
return 1;
}
int main() {
int i, a[] = {0, 1, 2, 3, 4}, p[sizeof(a) / sizeof(a[0])], count = 0;
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++) p[i] = a[i];
do {
if (is_derangement(a, p, sizeof(a) / sizeof(a[0]))) {
printf("(");
for (i = 0; i < sizeof(a) / sizeof(a[0]) - 1; i++) printf("%d,", a[i]);
printf("%d)\n", a[i]);
count++;
}
} while (next_permutation(a, a + sizeof(a) / sizeof(a[0])));
printf("number of derangement for %d = %d\n", sizeof(a) / sizeof(a[0]), count);
return 0;
}
0249240 ◆OtZ3csKgUQ
2006/01/29(日) 00:09:06すみません。main()を書き忘れておりました。
int main()
{
stack s1,s2;
s1.push(5);s1.push(8);s1.push(9);
s2.push(5);s2.push(8);s2.push(9);s2.push(10);
std::cout << equal(s1,s2) << std::endl;
s2.pop();
std::cout << equal(s1,s2) << std::endl;
return 0;
}
>>247さんが書かれたmain()では確かに 1 0 と表示されました。
0250デフォルトの名無しさん
2006/01/29(日) 00:13:14できました!ありがとうございます!
>>210の方もありがとうございました!
0251デフォルトの名無しさん
2006/01/29(日) 00:14:14[1] 授業単元: プログラミング基礎演習
[2] 問題文(含コード&リンク):
1.整数 P, X (1 < X < P で, P, X は互いに素) を与えて, X × Y を P で割った余りが 1 になるもっとも小さな正整数 Y を求めるプログラムを書いてください。
2.ユークリッドの互除法(正整数 X, Y (X > Y) の最大公約数は X を Y で割った余りと Y の最大公約数に等しい)の手順を使って最大公約数を見つけるプログラムを作れ
3.2を利用して1のプログラムを作り直せ。(P と X は「互いに素」なので,両者の最大公約数は必ず 1 というのを使う)
[3] 環境
[3.1] unix
[3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
[3.3] C
[4] 期限:2006年1月末
0252デフォルトの名無しさん
2006/01/29(日) 00:14:16equal関数でs1.sp!=s2.spの時に関数の最後でreturnしていないから。
0253デフォルトの名無しさん
2006/01/29(日) 00:14:37[2] 問題文(含コード&リンク):
ライツアウト(ttp://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%84%E3%82%A2%E3%82%A6%E3%83%88)を作成せよ。
どの場所のライトを点灯/消灯させるかをキー入力させて盤面を更新し、終了条件(すべて消灯)を満たすまでループするようにする。最初にどこが点灯しているかという「問題」は各自で適当に作成してよい。
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C
[4] 期限: 1月30日まで
[5] その他の制限:
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1564.txt
↑のように表示させる部分まではできたのですが点灯/消灯がどうしてもできません。
0254デフォルトの名無しさん
2006/01/29(日) 00:15:16[2] 問題文(含コード&リンク):
1.getchar, putchar を用いて標準入力(stdin) からテキストデータを読み込みそのまま 標準出力(stdout) に書くプログラムを作成せよ。
ファイル末尾に達すると getchar の値が EOF になるのを利用するとよいだろう。
2.1のプログラムを改良して,アルファベット文字に関して大文字は小文字に変換,小文字は大文字に変換して表示するプログラムを作成しなさい。
3.1のプログラムを改良してそのままじゃなくて「行番号」を付けて表示させよ。
4.英文テキストファイルを読込んで,文字数,単語数,行数をカウントして表示するプログラム mywc を作成しなさい。
[3] 環境
[3.1] unix
[3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
[3.3] C
[4] 期限:2006年1月末
0255デフォルトの名無しさん
2006/01/29(日) 00:15:47[2] 問題文(含コード&リンク):
1.2つの分数(fraction)を入力し,その四則演算(+,-,*,/)を計算するプログラムを作成してください.
ただし,次の構造体を利用すること.ここでは,四則演算を関数化しないこと.また,既約分数にしなくとも良いです.
/*fraction_t型の定義*/
typedef struct {
int numerator; /*分子*/
int denominator; /*分母*/
} fraction_t;
/*fraction_t型の変数の宣言*/
fraction_t frt;
2.和(add),差(subtract),積(multi),商(quotient)を計算する4つの関数を作成せよ.
その関数を利用し,1のプログラムと同じ構造体を利用し,同じ動作をするプログラムを作成せよ.
3.2のプログラムで,計算が正しく行われない場合を列挙して,その対応策を考えよ.
(例 1/-2 のような計算結果は,美しい表示方法とはいえません)
4.3で列挙した対応策を,2で作成したプログラム上で実現せよ.
[3] 環境
[3.1] unix
[3.2] コンパイラ名とバージョン: (gcc 2.9 VC 6.0等)
[3.3] C
[4] 期限:2006年1月末
0256240 ◆OtZ3csKgUQ
2006/01/29(日) 00:21:570257デフォルトの名無しさん
2006/01/29(日) 00:25:442.の時点では適切に表示されないようにせよということかな?
そういう美しくない問題はいただけないなぁ。
0258デフォルトの名無しさん
2006/01/29(日) 00:27:04「単語」の定義は?「空白」で囲まれたもの?だとしたら「空白」の定義は?
isspace()が真を返すものでいいの?
0259デフォルトの名無しさん
2006/01/29(日) 00:27:511,2,3のみ
行数制限のために改行をけしているから適当に改行するように
(1)
#include<stdio.h>
int main(void){int ch;while((ch=getchar())!=EOF)putchar(ch);return 0;}
(2)
#include<stdio.h>
#include<ctype.h>
int main(void){int ch;while((ch=getchar())!=EOF)putchar(islower(ch)?toupper(ch):tolower(ch));return 0;}
(3)
#include<stdio.h>
int main(void){int ch,l=1,w=0;for(;(ch=getchar())!=EOF;l+=(w=ch=='\n'?0:w+1)==0)w||printf("%3d: ",l),putchar(ch);return 0;}
0260デフォルトの名無しさん
2006/01/29(日) 00:33:463 に 2をどう使ったらいいかわからんかったので,拡張GCDを新たに書いて使った.
わざわざプログラム三つ書くの面倒だったから適当に直してください.
void f(int P, int X) { /* 問1 */
int Y;
for (Y = 1; (X * Y) % P != 1; ++Y);
printf("Y = %d\n", Y);
}
int gcd(int X, int Y) { /* 問2 */
return Y > 0 ? gcd(Y, X % Y) : X;
}
/* 問3 で使う拡張GCD:
* aX + bY = gcd(X,Y) なる gcd(X,Y), a, b を求める */
int extgcd(int X, int Y, int *a, int *b) {
int g = X; *a = 1, *b = 0;
if (Y > 0) g = extgcd(Y, X % Y, b, a), *b -= (X / Y) * (*a);
return g;
}
void g(int P, int X) { /* 問3 */
int Y, dummy;
extgcd(X, P, &Y, &dummy);
while (Y < 0) Y += P;
printf("Y = %d\n", Y % P);
}
0261デフォルトの名無しさん
2006/01/29(日) 00:41:42>>222にあるような実行例の場合、式を正しく読み込めず
value = 0となってしまいます。
原因分かる方いらっしゃいますか?
0262デフォルトの名無しさん
2006/01/29(日) 00:47:05そうみたいですね。2では動作すればいいだけで4で改良。
>>258
たぶんisspaceというのは聞いたことないです。
>>259
ありがとうございます。でもよく分かりません。
>>260
ありがとうございます。
0263231
2006/01/29(日) 00:47:07こちらではきちんと value = 114 が表示されました.
・割り算でゼロになってないか
・不正な入力をしなかったか(入力にスペースが含まれてはいけない)
などを確認してみてください.
0265デフォルトの名無しさん
2006/01/29(日) 00:56:38[2] 問題文(含コード&リンク):長いので後で書きます。
[3] 環境
[3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc 2.90 [3.3] 言語:C++
[4] 期限:1月29日12:00 [5] その他の制限:特にありません
main()で上手くいくようにComplexのデータを<<を用いて出力できるような関数
std::ostream& operator<<(std::ostream& os,Complex& c){
c.print(os);
return os;
} を以下のプログラムに追加・必要であれば修正するようなのですが、どうすればよいのか分かりません。
#include<iostream>
class Complex
{
private: double real; double imag;
public:Complex(){ real = 0.0; imag = 0.0; }Complex(double r,double i){ real = r; imag = i; } ~Complex() {};
double re() const {return real;} double im() const {return imag;}
void set_re(double r){ real = r; } void set_im(double i){ imag = i; }
void print(std::ostream& os) const{
os << real << "+" << imag << "i";
}
};
int main(){
Complex a[3];
a[0] = Complex(1.00,2.00); a[1] = a[0] + Complex(0.00,1.00);
Complex *c = &(a[2]); *c = a[0];
for(int i=0; i<3; i++) std::cout << a[i] << std::endl;
Complex *b = new Complex[3]; for(int i=0; i<3; i++)b[i]=a[i]+Complex(1.00,1.00);
for(int i=0; i<3; i++)std::cout<<b[i]<<std::endl; delete [] b; return 0;
}
0266259
2006/01/29(日) 01:00:11具体的にソースのどの部分が分からないのか該当箇所を列挙してくれ。
それによって書き換える場所と書き方を変えないといけないから。
まぁ多分(3)は全書き直ししないといけないだろうなぁとは推測してるけどw
0267デフォルトの名無しさん
2006/01/29(日) 01:06:249*9*9
value = 729 (これは正しい)
(2*3)+5
value = 0
3*(2+2)
value = 1
3+2
value = 5 (これも正しい)
おかしいのはfactorなのかな…
ちょっと弄ってみるか
0268デフォルトの名無しさん
2006/01/29(日) 01:18:02「入力される式の中の数が1桁の正整数」という与えられた前提では、
これでうまく計算されるはず。
int factor(char **p) {
int x;
if (**p == '(') ++(*p), x = expression(p), ++(*p);
else x = **p - '0', ++(*p);
return x;
}
0269231
2006/01/29(日) 01:19:53うーん,手元では,真ん中の二つも正しい結果が出てるんですけどねえ…….むーう.
とりあえずソース全文置いときますね http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1565.c
0270デフォルトの名無しさん
2006/01/29(日) 02:10:140271デフォルトの名無しさん
2006/01/29(日) 02:19:350272デフォルトの名無しさん
2006/01/29(日) 02:28:48・・・VC++が予想以上に多かったかなぁ・・・漏れも導入を検討します。
使おうかと思ってたのがg++(gcc 3.3.2)だったんで、ちと調べてみます。
0273デフォルトの名無しさん
2006/01/29(日) 02:52:07islower(ch)?toupper(ch):tolower(ch)
と
(3)は全然分からないorz
0274デフォルトの名無しさん
2006/01/29(日) 03:04:36OKOK。
三項演算子が分からんのかな? もしかするとislower()とかの関数の方かも知れんけど、
まーとりあえず三項演算子を排除して書く。
(3)は20秒位で書いたカオスなソースなんで全部書き直しっと。
//(2)
#include<stdio.h>
#include<ctype.h>
int main(void){
int ch;
while((ch=getchar())!=EOF){
if(islower(ch))
ch = toupper(ch);
else
ch = tolower(ch);
putchar(ch);
}
return 0;
}
//(3)
#include<stdio.h>
int main(void){
int ch,old='\n',line=0;
while((ch=getchar())!=EOF){
if(old == '\n')printf("%3d: ",++line);
old = ch;
putchar(ch);
}
return 0;
}
0275デフォルトの名無しさん
2006/01/29(日) 03:35:03すみません。islower、toupper、tolowerも分からないですorz
たぶん'a'=97,'A'=65を利用するのかと思います。
0276デフォルトの名無しさん
2006/01/29(日) 03:40:38ってことはASCIIコード前提でOKなんだね
(2)
#include<stdio.h>
#include<ctype.h>
int main(void){
int ch;
while((ch=getchar())!=EOF){
if('a' <= ch && ch <='z')
ch = ch + 'A' -'a';
else if('A' <=ch && ch <='Z')
ch = ch + 'a' -'A';
putchar(ch);
}
return 0;
}
0277276
2006/01/29(日) 03:42:520278デフォルトの名無しさん
2006/01/29(日) 03:52:15神様ありがとうございます。
こうやって見ると自分でもできそうなのに全然できないorz感謝です。
もし暇があれば明日でもいいので>>254の4も教えていただけると最高です。
0279焼豚
2006/01/29(日) 03:55:42[2] 問題文(含コード&リンク):「グラフ作成プログラム」
プログラムを実行したら、まずグラフ名と数値の入力を求められ、
数値データを入力したら、自動でXwindow上に二次元座標でグラフをプロットするプログラム。数値に対して座標軸などがオートで決定される。
[3] 環境
OS:TurboLinux
言語:C++
[4] 期限: 2/1
どうかお願いします
0280デフォルトの名無しさん
2006/01/29(日) 04:00:27どこまで使っていいの?gnuplotとか、pgplotとか使っていいの?
0281デフォルトの名無しさん
2006/01/29(日) 04:23:14なんだか出題内容をきちんと理解していないような気がするな。
こういうことか?
1.起動したら標準入力から二次元座標の列を手作業で入力する。
2.入力が終了したらEOFでも入れる。
3.x軸とy軸の最大値最小値を元に描画範囲を決定する。
4.gnuplotにデータを渡す。
0282デフォルトの名無しさん
2006/01/29(日) 04:25:46isspaceは確か授業で習ってないと言ってた気がするので(真面目に読んでないんで自信なし)
適当に空白は指定しておいた。
#include<stdio.h>
int main(void){
int ch;
int in_word = 0;
int line = 0,word = 0,bytes= 0;
while((ch=getchar())!=EOF){
++bytes;
if(ch=='\n' || ch==' ' || ch=='\t'){
if(ch=='\n')++line;
in_word=0;
}else{
if(in_word == 0){
++word;
in_word = 1;
}
}
}
printf(" %d %d %d",line,word,bytes);
return 0;
}
0283デフォルトの名無しさん
2006/01/29(日) 04:31:05あと、オレの知り合いの大学の先生でここチェックしている人がいるから気をつけろよ
0284デフォルトの名無しさん
2006/01/29(日) 08:43:34丸投げするような奴はその程度のことすらしないのかと改めて悲しくなった
0285焼豚
2006/01/29(日) 10:54:52遅れて申し訳ありません。そんな感じです。おねがいします
0286デフォルトの名無しさん
2006/01/29(日) 11:14:23前スレでも聞いたのですがよくわかりませんでした。
プログラミングが全然わかってないので少しやさしめに答えてもらえるとうれしいです。
0287デフォルトの名無しさん
2006/01/29(日) 11:24:46数列とか
構造体はたくさんのパターンが同じ物入れたいときとか
100人分の身長体重視力・・・とか
参照する時もname.weightとかで出せて便利でしょて思う
0288デフォルトの名無しさん
2006/01/29(日) 11:32:27構造体というか線形リスト(連結リスト)のことだな。
287に付け加えると配列は必要な分だけあらかじめ領域を確保するから
格納するデータ数が決まって(又は予想出来る)いる場合じゃないと駄目(後から配列を大きくする事は出来ない)だけど
線形リストはデータ数が決まってなくても使える。
追加はノードを新しく作成してポインタでつなげればいいし、削除もポインタを繋ぎかえてノードを解放すればいい。
ソートなんかもポインタのつなぎかえだけでOK。
ただしプログラムが面倒になる。
0289デフォルトの名無しさん
2006/01/29(日) 11:42:30[2] 問題文(含コード&リンク):
以下のプロトタイプ宣言で示すインターフェイスを持つ関数を、各問の指示に従って作りなさい。
ただし与えられたデータ構造、インターフェイスを変更しないこと。
(問)
配列内のデータを昇順に並び替える関数、及び降順に並び替える関数をそれぞれ作成せよ。
void sort(int[], int n);
/* d[] : データが格納されている関数, n : 配列内のデータの個数 */
OS:vineLinux
言語:C
コンパイラ : gcc
[4] 期限: 06/1/31まで
[5]
・#include<stdio.h>のみでお願いします。
・アルゴリズム (探索、整列)に絡む範囲は未習です。
神様お助けください。
0290デフォルトの名無しさん
2006/01/29(日) 11:43:52STUDENT:氏名、学生番号、性別・・・
とかやらずにそれぞれのグローバル配列持っておいて、
IDで管理すればいいじゃないか、と思ってた。
それでもできる、それがCクォリティ。
>>288のような連結リストのとき以外で使う意味がたいしてない。
と思っていたのはオブジェクト指向を勉強する前までだな。
0291デフォルトの名無しさん
2006/01/29(日) 11:44:450292デフォルトの名無しさん
2006/01/29(日) 11:46:08いやそうでもなくても構造体使うと
例えば多数の座標を持ちたい時とか
プログラム組む時にわかりやすいんだよ
0293デフォルトの名無しさん
2006/01/29(日) 11:55:17今では構造体なしの生活は考えられないです。
彼女と知り合えて幸せです。
0294デフォルトの名無しさん
2006/01/29(日) 11:55:21#define swap(type, x, y) do { type t = x; x = y; y = t; } while(0)
void sort(int d[], int n)
{
int i,j;
for(i = 0; i < n; i++) {
for(j = 1; j < n -1; j++)
if(d[j-1] > d[j])
swap(int d[j - 1], a[j]);
}
}
これは昇順だから降順はif(d[j-1] > d[j])をif(d[j-1] < d[j])とすればいい。
これは前後を比較して交換するバブルソートというソーティングアルゴリズム。
0295294
2006/01/29(日) 11:57:25正しくはswap(int, d[j - 1] , d[j]);
0297265 ◆H4LNFsCSUE
2006/01/29(日) 13:05:39期限は明日でも構いませんので。
0298デフォルトの名無しさん
2006/01/29(日) 13:13:300299デフォルトの名無しさん
2006/01/29(日) 13:46:391)オペレーターの記述は教科書に書いてあるはず
2)教科書無いなら、書店や図書館に置いてあるC++の本でオペレーターの定義が書いてある本を読む
3)ぐぐる
だいたい、そんな回答だった気がする。
0300デフォルトの名無しさん
2006/01/29(日) 14:39:180301デフォルトの名無しさん
2006/01/29(日) 14:42:36しかも前の締め切りは日曜の12時だし。
簡単な問題だが、答える気なくすな。
0302265 ◆H4LNFsCSUE
2006/01/29(日) 14:53:40>>301申し訳ないです。できるだけ早めにご回答を頂きたかったので、
早めに設定してしまいました。
0303デフォルトの名無しさん
2006/01/29(日) 15:00:56そういう時は嘘でも「教授に頼んで延ばしてもらった」と言うもんだ。
以下を追加。これで動く。
Complex operator+(const Complex& x, const Complex& y) {
return Complex(x.re() + y.re(), x.im() + y.im());
}
0304265 ◆H4LNFsCSUE
2006/01/29(日) 15:17:26std::ostream& operator<<(std::ostream& os,Complex& c){
c.print(os);
return os;
}
はどこに書けばいいでしょうか?
0305デフォルトの名無しさん
2006/01/29(日) 15:22:20#include<iostream>
class Complex
{
// 略
};
Complex operator+(const Complex& x, const Complex& y) {
// 略
}
std::ostream& operator<<(std::ostream& os, Complex& c){
// 略
}
int main(){
// 略
}
0306デフォルトの名無しさん
2006/01/29(日) 15:28:22ほい。かなりいい加減だから、適当に直してね。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1569.txt
#操作間違って、スレたてちゃった。削除しなきゃ。orz
0307デフォルトの名無しさん
2006/01/29(日) 15:34:34#include<stdio.h>
#include<stdlib.h>
#define ON 1
#define OFF 0
int main(void)
{
int i,j,x,y, LIGHT[5][5]={{ON,ON,OFF,OFF,OFF},
{ON,OFF,OFF,OFF,OFF},
{OFF,OFF,OFF,ON,OFF},
{OFF,OFF,ON,ON,ON},
{OFF,OFF,OFF,ON,OFF}};
int flag;
while(1){
printf(" 01234\n");
for(i=0; i<5; i++){ printf("%d", i); for(j=0; j<5; j++){ printf("%d", LIGHT[i][j]); } printf("\n"); }
printf("x:"); scanf("%d", &y);
printf("y:"); scanf("%d", &x);
if( (x < 0) || (4 < x) || (y < 0) || (4 < y)) {printf("wrong number!!\nreinput.\n\n");continue;}
if( (x - 1) >= 0) LIGHT[x-1][y] = LIGHT[x-1][y]?OFF:ON;
if( (x + 1) <= 4) LIGHT[x+1][y] = LIGHT[x+1][y]?OFF:ON;
if( (y - 1) >= 0) LIGHT[x][y-1] = LIGHT[x][y-1]?OFF:ON;
if( (y + 1) <= 4) LIGHT[x][y+1] = LIGHT[x][y+1]?OFF:ON;
LIGHT[x][y] = LIGHT[x][y]?OFF:ON;
flag = 0; for(i=0; i<5; i++) { for(j=0; j<5; j++) { if(LIGHT[i][j] == ON) { flag=1; break; } } } if (flag == 0) break; }
printf("complete!\n");
return 0;
}
多分動くと思う。線引き色付けは自分でやってね。
0308デフォルトの名無しさん
2006/01/29(日) 15:34:460310106
2006/01/29(日) 16:13:40ってかどうやら問題がだいぶ不親切で分かりにくいみたいですね・・・
ここの住人にも理解できないのに俺にできるワケねぇorz
0311デフォルトの名無しさん
2006/01/29(日) 16:21:47[2] 問題文(含コード&リンク):
次のプログラムは学生の成績データを管理するものである。クラスRecordは1人の学生の[番号(id),名前(name),点数(score)]
を記録するもので、出力用の関数(operator<<)が定義される。成績データはクラスSeisekiのdataにRecordのリストとして記録されている。
Seisekiはoperator<<と3つのメンバ関数insert,lookup,erase_worstを持つ。その働きは
�@insert(int id,const std::string& nm, int s):[番号(id),名前(name),点数(score)]というデータを追加
�Alookup(int id):番号がidのデータを検索し、std::coutに出力する。(なければnot foundと出力)。
�Berase_worst():点数の最も悪い学生のRecordを削除
というものである。空白を埋め、プログラムを完成させよ。
プログラム:http://sourcepost.sytes.net/sourcepost/sourceview.aspx?source_id=26928
[3] 環境
[3.1] OS: Windows
[3.2] コンパイラ名とバージョン: gcc 2.9
[3.3] 言語: C++
[4] 期限: 1月31日ですが、早めにしていただければありがたいです
よろしくお願いします。
0312デフォルトの名無しさん
2006/01/29(日) 16:57:09条件が不足している。insert()はどういう順番に追加するの?
0313デフォルトの名無しさん
2006/01/29(日) 17:01:03insert()を呼び出すごとに末尾に追加するようにしていただければ充分です。
0314デフォルトの名無しさん
2006/01/29(日) 17:05:16問題は自明なんだけど、書きかけ方が酷いんだよなあ。
もし書きかけた部分も訂正していいなら、もうちょいやってみるけど。
0315デフォルトの名無しさん
2006/01/29(日) 17:16:12ちょっと追ってみたが、、、
・Main部
char *FileName = "graph";
GetMatrix(FileName);
shortestpath();
とすると、、、
最初のElementSeparate( MatFile, NodeLabel)の中で
List[LabelNum] = atoi( IntString );
の部分でList[LabelNum]がList[2]=(*NodeLabel+2)をオーバーするんだけどw
それとノードが5個で3x3の行列容易されてもパス重み格納できなくない?
0316デフォルトの名無しさん
2006/01/29(日) 17:23:43idの番号順(昇順、小さい順)。挿入する場所を探してinsertする。
> // 点数が最も悪い学生を消去
しっかしこの辺り、背筋が寒くなる先生だなw
void Seiseki::insert(int id, const std::string& nm, int s)
{
std::list<Record>::iterator first = data.begin(), last = data.end();
while (first != last && first->id < id) ++first;
data.insert(first, Record(id, nm, s));
}
void Seiseki::lookup(int id) const
{
std::list<Record>::const_iterator first = data.begin(), last = data.end();
while (first != last && first->id != id) ++first;
if (first != last) std::cout << *first << std::endl;
}
void Seiseki::erase_worst()
{
std::list<Record>::iterator first = data.begin(), last = data.end(), i = first;
if (first != last)
for (++first; first != last; ++first)
if (first->score < i->score)
i = first;
if (i != last) data.erase(i);
}
0317310(106)
2006/01/29(日) 17:24:22もうそれでお願いしますorz
とりあえずちゃんと動作してくれればなんとかなるので。
0318デフォルトの名無しさん
2006/01/29(日) 17:28:54んじゃ、入力ファイルの形式ちょうだい。
なんかファイル読み込みのあたりから狂ってる気がする。
0320317
2006/01/29(日) 18:01:26え゛え゛え゛・・・先生しっかりしろよorz
入力ファイルの形式って・・・
0 1 2 3 4
0 2 0 2 0
2 0 2 1 3
0 2 0 5 4
2 1 5 0 2
0 3 4 2 0
コレだと思うですが。違うんですか(・ω・)?
0321デフォルトの名無しさん
2006/01/29(日) 18:03:23一応、shortsteppathの中は読み終わったよ。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1571.txt
動作確認していなので、間違っている可能性もあるけど。
たぶん、このスレでこれぐらいの課題は、できる人は多いけど、
やりたくない人も多いだけだと思うよ。
0322デフォルトの名無しさん
2006/01/29(日) 18:11:021行目が何なのか、二行目は何なのか、とかそういうのを聞いてる。
106 では1行目は接点番号って書いてあるけど、たとえば
8 7 6 5
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
みたいな入力も許されるの?
0324デフォルトの名無しさん
2006/01/29(日) 18:18:49if ( Store ) {
Store = OFF ;
IntString[j] = '\0' ;
List[LabelNum] = atoi( IntString ) ;
if(DEB) printf(" List[%d] %d", LabelNum, List[LabelNum] ) ;
LabelNum++ ;
}
俺の力量不足なんだろうが、読むのに時間のかかるプログラムだな・・・。
0325デフォルトの名無しさん
2006/01/29(日) 18:21:28配列の添え字と、接点番号が一致している必要は無いでしょ。
0326デフォルトの名無しさん
2006/01/29(日) 18:24:29とりあえず息抜きに全部書き直してみたプログラムおいときますね
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/1572.c
0327320
2006/01/29(日) 18:25:350 2 0 2 0
2 0 2 1 3
0 2 0 5 4
2 1 5 0 2
0 3 4 2 0
これを分かりやすく書くとこうなります
http://ccfa.info/cgi-bin/up/src/up23700.jpg
x接点とy接点との距離が数値なわけです
そして画像で表すとこうなります
http://ccfa.info/cgi-bin/up/src/up23699.jpg
0328デフォルトの名無しさん
2006/01/29(日) 18:27:22おう。それくらい、キレイキレイに書いてくださると明快だなぁ>326
0329デフォルトの名無しさん
2006/01/29(日) 18:29:40それは分かるんだけど、一例でしかないでしょ。
最初の行は必ず 0 から始まる連番なの?違う場合はありうるの?それ以外の入力は考えなくていいの?
0330デフォルトの名無しさん
2006/01/29(日) 18:32:36そうだね。読み込みの関数を見てなかったから気が付かなかったけど、
グローバルでノードの名前を格納する変数を作っているみたいだね。
だから、最初のノードの名前はとりあえず0の必要はなさそう。
早とちりスマソ
0331デフォルトの名無しさん
2006/01/29(日) 18:37:00でも最終結果を表示するところではその番号を参照してないんだよな。
■ このスレッドは過去ログ倉庫に格納されています