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
0153デフォルトの名無しさん
2006/01/28(土) 17:07:230154デフォルトの名無しさん
2006/01/28(土) 17:09:00そんなことすら分からないなら単位諦めろよ
0155デフォルトの名無しさん
2006/01/28(土) 17:23:24理解しようとするなら、本を読んだり、講義のメモを見返したりするべし。
だれか書いてたが、「やってみる」ことが大切。
0156デフォルトの名無しさん
2006/01/28(土) 17:27:060157デフォルトの名無しさん
2006/01/28(土) 17:29:160158デフォルトの名無しさん
2006/01/28(土) 17:31:350159デフォルトの名無しさん
2006/01/28(土) 17:36:410160デフォルトの名無しさん
2006/01/28(土) 17:38:49変数名で初期化をしたいのならmain関数の変数宣言のconstを外して
Point p1,p2,p3;
p1.x = 2; p1.y = 3;
...
みたいに書けば良い。(まぁ正確には代入だから初期化ではないが)
triangleを弄る必要はない。
あと、どんなに考えても自分で答えが出なかったら質問したほうが良いとは言ったが、
何も考えずに人に聞くのは勘弁してくれ
>>157
7bitに抑えるために127回にするのはどうだろう?
0161デフォルトの名無しさん
2006/01/28(土) 17:53:38>>133
ありがとうございます。
次はここで答えられるような立場になれるようがんばります。
0162デフォルトの名無しさん
2006/01/28(土) 17:56:570163デフォルトの名無しさん
2006/01/28(土) 18:02:18OK
0164デフォルトの名無しさん
2006/01/28(土) 18:23:51「double型の引数rをひとつだけとって実部にrの値を設定し、虚部には0を
設定するようなコンストラクタComplex(double)を作成し、main()にそれを
使うコードを追加しなさい」という課題です。お手数ですが、よろしくお願いいたします。
#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";
}
};
0165デフォルトの名無しさん
2006/01/28(土) 18:24:30int main(){
Complex a;
a.set_re(1.11);
a.set_im(2.22);
Complex b(3.33,4.44);
Complex c;
c = Complex(9.99,88.88);
a.print(std::cout); std::cout << std::endl;
b.print(std::cout); std::cout << std::endl;
c.print(std::cout); std::cout << std::endl;
c = a;
c.print(std::cout); std::cout << std::endl;
return 0;
}
0166デフォルトの名無しさん
2006/01/28(土) 18:25:04でもC++の人にはいい燃料だろう。
0167デフォルトの名無しさん
2006/01/28(土) 18:37:49こんな燃料で牛脂も溶かせん
0168デフォルトの名無しさん
2006/01/28(土) 18:38:31でいいんじゃない。
0169デフォルトの名無しさん
2006/01/28(土) 18:45:18「宿題片付けます」しか目に入らないんだよ、きっと。
>>167, 168
このスレはさすが仏の顔が7bitだけありますね。
0170デフォルトの名無しさん
2006/01/28(土) 18:46:510171デフォルトの名無しさん
2006/01/28(土) 18:47:19ありがとうございました。
0172デフォルトの名無しさん
2006/01/28(土) 19:10:09なんか気持ち悪いな。
operator使えばいいのに。
0173デフォルトの名無しさん
2006/01/28(土) 20:11:09あんなのじゃ食指が動かん
0174デフォルトの名無しさん
2006/01/28(土) 20:12:21print(std::ostream& os) const は特に間違ってない。
それ呼び出すoperatorを定義していないだけde。
0175デフォルトの名無しさん
2006/01/28(土) 20:24:46原因不明のバグはたいていそういうところに…
0176デフォルトの名無しさん
2006/01/28(土) 20:25:28operatorから呼び出すようにするなら
stringに格納して返すなり、ostream返すようにするなりして
cout << a.print() << "\n";
↑こういう感じで使えるようにした方がスマートだろ
0177デフォルトの名無しさん
2006/01/28(土) 20:31:00たぶんスマートだけを言うならこのほうがスマート
std::ostream&operator<<(std::ostream&o,const Complex&c){
c.print(o);
return o;
}
cout << a << "\n";
で済むからな。
0178デフォルトの名無しさん
2006/01/28(土) 20:31:47ネタ?
0179デフォルトの名無しさん
2006/01/28(土) 20:33:50今度はoperator関数を用いて複素数の乗算を行いたいのですが、
>>164のクラス部分のComplex(double r,double i){ real = r; imag = i; }の次の行に
Complex operator*(Complex a,Complex b)
{
double r = a.re()*b.re()-a.im()*b.im();
double i = a.im()*b.re()+a.re()*b.im();
return Complex(r,i);
}
を付け加えたのですが、下記のようなエラーが出てしまいます。
`Complex Complex::operator*(Complex, Complex)' must take either zero or one argument
たびたび済みませんが、どうすればよいかお教えいただけるでしょうか。
0180デフォルトの名無しさん
2006/01/28(土) 20:38:39お前が一回死ねばみんな教えてくれると思うよ^^
0181デフォルトの名無しさん
2006/01/28(土) 20:43:34引数を一つにする。
フレンドにする。
外部関数としてオーバーロード。
別のスレで聞く。
テンプレを守る。
の内のどれか。
0182デフォルトの名無しさん
2006/01/28(土) 20:44:31教科書にoperator *の書き方載ってるはずだから、それ読め。
0183デフォルトの名無しさん
2006/01/28(土) 20:57:11それをクラス定義の外で書けば良い。
細かいアドバイスも入れるなら
先にoperator*=を実装してそれを利用したほうが好ましい。
返り値はconst Complexにしたほうが事故を防げる
引数はconst Complex&にしたほうが効率的。
こんなところ、あと最後に教科書ちゃんと読んでから質問しろ。
0184デフォルトの名無しさん
2006/01/28(土) 20:59:47やさしさに便乗させてもらおう。
C++の解答者さんに質問。使用コンパイラを教えてください。
0185デフォルトの名無しさん
2006/01/28(土) 21:00:25まず、operatorは前置記法ということを知らないとダメ。
a == bは、
== (a, b)となる。
で、operator==の実装例
「外部で」定義するとこうなる。
bool operator == (const T& lhs, const T& rhs)
(lhsはleft hand side、rhsはright hand side)
ただし、メンバとして定義すると、lhsはそのメンバ自身になる。
なので、
bool operator == (const T& rhs)
operatorは戻り値や引数、一時変数などをちゃんと考えてあげなければならないので、
結構奥が深い。
0186デフォルトの名無しさん
2006/01/28(土) 21:09:39VS6のVC6。時どきBCC。
VS6は学生時代に7万で安〜とか言って買ったんだけどなぁ。
今のアカデミックパックの安さはなに?って感じ。
0187デフォルトの名無しさん
2006/01/28(土) 21:12:48ろくな入門書読んでないか、もしくはろくに読んでないだけだろ
そんな奴は勝手に単位落として留年でもしてりゃいい
0188デフォルトの名無しさん
2006/01/28(土) 21:13:46基本的にはg++
たまにVC++.NET2003やVC++2005
0189デフォルトの名無しさん
2006/01/28(土) 21:15:380190デフォルトの名無しさん
2006/01/28(土) 21:16:12フレンドにする事で解決しました。
なお、テンプレについては読んではいたのですが、
あくまで「推奨」という事だったので、あまり重要視していませんでした。
不快に思われた方にはお詫び申し上げます。
次回からはテンプレをしっかり書かせて頂きます。
0191デフォルトの名無しさん
2006/01/28(土) 21:17:060193デフォルトの名無しさん
2006/01/28(土) 21:23:44VisualC++ toolkit 2003 + platformSDK
VS2005.NETもあるけど、重いからなんとなくこっち使っている。
(最近VS2005.NETもコマンドラインから使えるようにしたけど、
昔の習慣でつい・・・)
windowsでC/C++やるなら結構お勧め。比較的速いコード吐く。
0194デフォルトの名無しさん
2006/01/28(土) 21:26:12[1] 授業単元:プログラミング実習
[2] 問題文(含コード&リンク):順列 (0, 1, 2) に対して (1, 2, 0) や (2, 0, 1) の様に,もとの順列と数字がすべて異なる位置にある
順列を撹乱順列(derangement)と呼ぶ.順列 (0, 1, 2, 3, 4) に対するすべての撹乱順列を求め表示し,その個数を表示するプログラムを作りなさい.
ヒント
順列を全て列挙し、列挙した要素が撹乱順列の条件を満たすかをチェックするとよい。 実現の方法は2通りある。
1. 要素の重複を許して順列を列挙する。(5*5*5*5*5 = 3125通りのチェック)
この場合、撹乱順列のチェックと、要素のダブりがないかのチェックを両方行う必要がある。
2. 要素の重複を許さずに順列を列挙する。(5*4*3*2*1 = 120通りのチェック)
この場合、撹乱順列のチェックだけでよい。
注意
実行例では結果を省略しているが、レポートには実行結果を省略せず載せること。
実行結果
(1, 0, 3, 4, 2)
(1, 0, 4, 2, 3)
(1, 2, 0, 4, 3)
(略)
(4, 3, 0, 2, 1)
(4, 3, 1, 0, 2)
(4, 3, 1, 2, 0)
number of derangement for 5 = 44
$
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C言語
[4] 期限: [2006年1月31日]
[5] その他の制限: include<stdio.h>のみで。
時間がないため助けてください。
0195デフォルトの名無しさん
2006/01/28(土) 21:28:45確か2005からは.NETが名称から外されたはず
0196デフォルトの名無しさん
2006/01/28(土) 21:31:46[2] 問題文(含コード&リンク): n次元正方行列A,Bの要素を読み込みその和Cを求める。
その後、同じくn次元正方行列X,Yの要素を読み込みその積を求める。そして最後に、和Cと
積Zを出力するプログラムを作成せよ。ただし、行列BとYは共用体op_2として宣言することで、
同じ記憶領域を使用すること。また、nは最大100まで対応でいればよく、要素はfloatとしてよい。
[3] 環境
[3.1] OS:unix
[3.2] gcc
[3.3] 言語: c
[4] 期限: 1月30日
[5] その他の制限: #includは<stdio.h>のみ。
よろしくお願いします。
0197デフォルトの名無しさん
2006/01/28(土) 21:35:52本当だ。指摘サンクス
0198デフォルトの名無しさん
2006/01/28(土) 21:39:11ここに出すときは
digital mars C++
動作確認用にgcc g++ VC express(のclだけ) 辺りも併用
本当はbcc32でも試したいんだけど環境構築してないから試していない。
0199デフォルトの名無しさん
2006/01/28(土) 21:42:15Digital Marsのコンパイラってよく名前を聞くがいいの?
0200デフォルトの名無しさん
2006/01/28(土) 22:02:07素敵なアルゴリズムが思いつかないw
良い週末を。
#include <stdio.h>
int main(){
int i,j,k,l,m,count=0;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(j!=i){
for(k=0;k<5;k++){
if((k!=i)&&(k!=j)){
for(l=0;l<5;l++){
if((l!=i)&&(l!=j)&&(l!=k)){
for(m=0;m<5;m++){
if((m!=i)&&(m!=j)&&(m!=k)&&(m!=l)){
if((i!=0)&&(j!=1)&&(k!=2)&&(l!=3)&&(m!=4)){
count++;
printf("(%d,%d,%d,%d,%d)\n",i,j,k,l,m);
}
}
}
}
}
}
}
}
}
}
printf("number of derangement for 5 = %d",count);
return 0;
}
0201198
2006/01/28(土) 22:11:46吐き出すコードは自分が適当に使う限り結構優秀(VCにはさすがに負ける)。
ただ、自分はD言語を主流にしてるから、D言語で面倒な処理(listとかalgorithm)をC++で実装するために、
同じ開発元のコンパイラを使ってるのが大きな理由なのであんまり品質は見ていない。
>>196
雑談ばかりだとあれなのでw
1レスに抑えるために改行圧縮してるから適当に展開して
#include<stdio.h>
union op_2{float B[100][100];float Y[100][100];}o;
float A[100][100],C[100][100],X[100][100],Z[100][100];
void input(float p[100][100],int n){int i,j;for(i=0;i<n;++i)for(j=0;j<n;++j)scanf("%f",&p[i][j]);}
void output(float p[100][100],int n){int i,j;for(i=0;i<n;puts(""),++i)for(j=0;j<n;++j)printf("%f ",p[i][j]);}
int main(void){
int n,i,j,k;
printf("次元数->");scanf("%d",&n);
printf("A=\n");input(A,n);printf("B=\n");input(o.B,n);
for(i=0;i<n;++i)for(j=0;j<n;++j)C[i][j]=A[i][j]+o.B[i][j];
printf("X=\n");input(X,n);printf("Y=\n");input(o.Y,n);
for(i=0;i<n;++i)for(j=0;j<n;++j)for(k=0;k<n;++k)Z[i][j]+=X[i][k]*o.Y[k][j];
printf("C=\n");output(C,n);printf("Z=\n");output(Z,n);
return 0;
}
0202デフォルトの名無しさん
2006/01/28(土) 22:12:51#include <stdio.h>
typedef struct Cell{ int val;struct Cell*prev; }Cell;static void
internal_each_perm(int*data,int length, Cell*cell,void proc(Cell
*max)){if(length==0){proc(cell);}else{Cell c;int i; c.prev=cell;
for(i=0;i<length;i++){c.val=data[i];data[i]=data[0];internal_each_perm(data+1
,length-1,&c,proc);data[0]=data[i];data[i]=c.val;}}} void each_perm(int*data,
int length,void proc(Cell*max)){internal_each_perm(data,length, NULL, proc);}
int data[]={0,1,2,3,4};int internal_print_derangement(Cell*max,int is_derangement,
int idx){if(max!=NULL){is_derangement=internal_print_derangement(max->prev,is_derangement
||max->val!=data[idx],idx-1);if(is_derangement){printf(" %d",max->val);}}return is_derangement
;}int count;void print_derangement(Cell*max){if(internal_print_derangement(max,0,sizeof(data)/
sizeof(data[0])-1)){++count;puts("");}}int main(void){each_perm(data,sizeof(data)/sizeof(data[
0]),print_derangement);printf("%d\n",count);return 0;}
0203デフォルトの名無しさん
2006/01/28(土) 22:19:24救われました!
0204デフォルトの名無しさん
2006/01/28(土) 22:21:13結果間違ってる
0205デフォルトの名無しさん
2006/01/28(土) 22:21:23D言語って趣味で?会社で?
使えるのあれ?
0206デフォルトの名無しさん
2006/01/28(土) 22:23:17[2] 問題文(含コード&リンク):下の文を参照して下さい
[3] 環境
[3.1] OS:WindowsXP
[3.2] コンパイラ名とバージョン:gcc 2.95
[3.3] 言語:C++
[4] 期限:1月30日(月曜日)
[5] その他の制限:特にありません
A〜Iとa〜iを使用した文字列を入力し、下のように変換した文字列を出力する
A→0が1個 B→0が2個 C→0が3個 ・・・ I→0が9個
a→1が1個 b→1が2個 c→1が3個 ・・・ i→1が9個
(例)
ICeF
00000000000011111000000
よろしくお願いします。
0207デフォルトの名無しさん
2006/01/28(土) 22:24:46遅くなっちゃったなあ.解析解がありそうな気がするけど,まあバックトラック.
#include <stdio.h>
#define N 5
int count;
void solve(int work[], int used[], int size, int pos) {
int i;
if (pos >= size) {
for (i = 0; i < size; ++i)
printf("%c%d", (i == 0 ? '(' : ','), work[i]);
printf(")\n");
++count;
}
for (i = 0; i < size; ++i)
if (!used[i] && pos != i)
work[pos] = i, used[i] = 1, solve(work, used, size, pos+1), used[i] = 0;
}
main() {
int work[N], used[N], i;
for (i = 0; i < N; ++i) used[i] = 0;
solve(work, used, N, 0);
printf("number of dearangement for %d = %d\n", N, count);
}
0208デフォルトの名無しさん
2006/01/28(土) 22:25:32即レス感謝です。
unionでは無く、structを使ったプログラムもご教授願えませんか・・・?
0209デフォルトの名無しさん
2006/01/28(土) 22:28:53自分で共用体って書いてるじゃん
0210デフォルトの名無しさん
2006/01/28(土) 22:30:21#include <string>
#include <utility>
using namespace std;
int main() {
for (string s; cin >> s; )
for (int i = 0; i < s.size(); ++i)
if (islower(s[i])) cout << string(s[i]-'a'+1, '1');
else cout << string(s[i]-'A'+1, '0');
}
0213208
2006/01/28(土) 22:35:550214デフォルトの名無しさん
2006/01/28(土) 22:46:54暇人大学生ですから趣味です。
D言語は適当にちょちょいと書くスクリプト言語と同じ程度には使えます。
と言っても一番大きいソースでも4~5000行しか書いてないから正確に評価はできませんけど。
たぶん、C++で蓄積されたライブラリ群を使うほうが最終的には実用的かなぁ。
0215デフォルトの名無しさん
2006/01/28(土) 22:49:13順列の列挙アルゴリズムがこんなんしか思いつかなんだ。
int* next(int* p, int size){ int flag=0, i, j, k;
for(i=0;i<size;++i){flag|=(1<<p[i]);if(p[i]) for(j=1<<(p[i]-1);j!=0;j>>=1) if(flag&j) --p[i];}
for(i=size-2;i>=0;--i){++p[i];if(p[i]<size-i) break;p[i]=0;}
if(i<0) return 0;
for(i=0,flag=0;i<size;++i){for(j=0,k=0;j<size;++j){if(!(flag&(1<<j))) ++k;else if(p[i]<k) break;}p[i]+=(j-k);flag|=(1<<p[i]);}
return p;}
int derangement(int* p, int size){ while(p[size-1]!=size-1&&size--); return size==-1;}
main(){ int a[5]={0,1,2,3,4}, c=0; while(next(a, 5)) if(derangement(a, 5)){printf("(%d,%d,%d,%d,%d)\n", a[0],a[1],a[2],a[3],a[4]); ++c;} printf("number of derangement for 5 = %d", c);}
0216デフォルトの名無しさん
2006/01/28(土) 22:50:40なんとか解析解出せた.……けど,問題は途中経過も全部出さないと駄目なんか…….
#include <stdio.h>
int fac(int n) { return n > 0 ? n * fac(n-1) : 1; }
int bin(int n, int r) { return fac(n)/fac(r)/fac(n-r); }
int f(int n, int r) {
int a, k;
if (r != 0) return bin(n,r) * f(n-r, 0);
else {
for (a = fac(n), k = 1; k <= n; ++k) a -= f(n,k);
return a;
}
}
int main() {
int n;
scanf("%d", &n);
printf("number of dearrangement for %d = %d\n", n, f(n,0));
}
0217デフォルトの名無しさん
2006/01/28(土) 22:53:03大学で5000行スゴスwww
俺も大学生ですがMAXでせいぜい2000行程度
0218デフォルトの名無しさん
2006/01/28(土) 22:55:010219デフォルトの名無しさん
2006/01/28(土) 22:56:18誰だよ俺と同じ大学のヤツw
0220デフォルトの名無しさん
2006/01/28(土) 22:57:250221デフォルトの名無しさん
2006/01/28(土) 22:59:09なんでそうなるのか分からんが、すげー
そういうのってやっぱアルゴリズム論とかでやるの?
0222デフォルトの名無しさん
2006/01/28(土) 23:01:51[2] 問題文(含コード&リンク):"+", "*", "(", ")" を用いた式を読み込み、その計算値を出力するプログラムを作りなさい。
簡単のために、数値は1桁の整数に限り、式の途中に空白文字などの他の文字は入力されないものとする。
ヒント
"+"と"*"は優先順位が異なることを考慮すると、以下の条件が成り立つ。
1. 式(expression)はいくつかの項が"+"で結ばれている
2. 項(term)はいくつかの因子が"*"で結ばれている
3. 因子(factor)は1つの数値か、"(", ")"で囲まれた式である
この、式、項、因子をそれぞれ一つの関数で表現するとよい。
実行結果
$ ./ex9
expression? 2*(3+(4+5)*6)
value = 114
$
[3] 環境
[3.1] OS: Linux
[3.2] コンパイラ名とバージョン: gcc
[3.3] 言語: C言語
[4] 期限:2006年2月2日
[5] その他の制限: include<stdio.h>でお願いします。
0223デフォルトの名無しさん
2006/01/28(土) 23:03:55関数プロトタイプとmain関数
int expression(char**);
int term(char**);
int factor(char**);
int main(void)
{
char buf[1024];
char *ptr;
printf("expression? ");
scanf("%s", buf);
ptr = buf;
printf("value = %d\n", expression(&ptr));
return 0;
}
0224デフォルトの名無しさん
2006/01/28(土) 23:09:21ちょっと前にDで記述したアプリかなんかがあって、
impressかなんかに載ってたよ
かなりうろ覚えで悪いけどw
0225216
2006/01/28(土) 23:11:26組合せ論の問題かな.言われると,なるほど,と思うはず:
n 個の数からなる列でちょうど r 個の要素が元と同じ場所にあるものの数を f(n,r) とする.
このとき 全順列の数 n! = f(n,0) + ... + f(n,n).求めたいのは f(n,0) なので,残りを計算してこれを求める.
f(n,r) は n-r 個の要素が撹乱され,残りの r 個の要素が固定される場合の数に等しいから,
固定される要素の種類が nCr 個あることを考慮して f(n,r) = nCr×f(n-r,0),これを代入して >>216 .
0226デフォルトの名無しさん
2006/01/28(土) 23:12:16漏れはElementSeparateを理解するのに1時間かかったorz
・・・いやぁ・・・読みづらい・・・
0228デフォルトの名無しさん
2006/01/28(土) 23:14:53コンビニでビール買った後にでも、紙と鉛筆を用意してトライしよう。
0229デフォルトの名無しさん
2006/01/28(土) 23:19:23把握した。確かにそれで数は出せるのか
わざわざ説明サンクス
ってか題意満たして無くね?w
>>226
Dijkstra法だっけか?
あれがどんなのかは理解してるが、他人の虫食いソースなんて
読む気がしないからパス
0230デフォルトの名無しさん
2006/01/28(土) 23:19:43こういうのを思いつくのを数学的センスっていうんだろうなぁ。
私には力技しか無理です(ちなみに私は215です)。
0231デフォルトの名無しさん
2006/01/28(土) 23:23:30int expression(char **p) {
int x = term(p);
if (**p == '+') ++(*p), x += expression(p);
return x;
}
int term(char **p) {
int x = factor(p);
if (**p == '*') ++(*p), x *= term(p);
return x;
}
int factor(char **p) {
int x;
if (**p == '(') ++(*p), x = expression(p), ++(*p);
else for (x = 0; isdigit(**p); ) x *= 10, x += **p - '0', ++(*p);
return x;
}
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していないから。
■ このスレッドは過去ログ倉庫に格納されています