トップページ⇒tech
1001コメント437KB

C/C++の宿題を片付けます 59代目

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/01/27(金) 09:08:40
あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。
【質問者へ】
回答者の便宜のため、質問の際は以下を行うことを推奨します。
・質問は【質問テンプレ】を利用してください。
・問題文は、出題されたまま全文を書いてください。
・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。
・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。
・後から問題に付け足しするのはやめましょう。付け足しは作業を無駄にしがちです。
・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して
 投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。
【質問テンプレ】
[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:23
聞く前に入門書でも読めや
0154デフォルトの名無しさん2006/01/28(土) 17:09:00
>>152
そんなことすら分からないなら単位諦めろよ
0155デフォルトの名無しさん2006/01/28(土) 17:23:24
作ってもらったものを提出でいいと思うぞ。
理解しようとするなら、本を読んだり、講義のメモを見返したりするべし。
だれか書いてたが、「やってみる」ことが大切。
0156デフォルトの名無しさん2006/01/28(土) 17:27:06
ここの人間は、仏の顔が何度もあるんですね。
0157デフォルトの名無しさん2006/01/28(土) 17:29:16
仏の顔も128度まで
0158デフォルトの名無しさん2006/01/28(土) 17:31:35
いじってあそんでるだけだってば。
0159デフォルトの名無しさん2006/01/28(土) 17:36:41
あたしのマンコを弄ばないで><!!
0160デフォルトの名無しさん2006/01/28(土) 17:38:49
>>152
変数名で初期化をしたいのならmain関数の変数宣言のconstを外して
Point p1,p2,p3;
p1.x = 2; p1.y = 3;
...
みたいに書けば良い。(まぁ正確には代入だから初期化ではないが)
triangleを弄る必要はない。

あと、どんなに考えても自分で答えが出なかったら質問したほうが良いとは言ったが、
何も考えずに人に聞くのは勘弁してくれ

>>157
7bitに抑えるために127回にするのはどうだろう?
0161デフォルトの名無しさん2006/01/28(土) 17:53:38
>>131
>>133
ありがとうございます。
次はここで答えられるような立場になれるようがんばります。
0162デフォルトの名無しさん2006/01/28(土) 17:56:57
131はC99。133はネタ(一応動くみたいだが)なので注意。
0163デフォルトの名無しさん2006/01/28(土) 18:02:18
>>160
OK
0164デフォルトの名無しさん2006/01/28(土) 18:23:51
以下のC++プログラムは複素数を計算するものです。
「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:30
>>164の追加です。main()はこちらです。
int 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
Complex(double r,double i=0)

こんな燃料で牛脂も溶かせん
0168デフォルトの名無しさん2006/01/28(土) 18:38:31
Complex(double r){ real = r; imag = 0; }

でいいんじゃない。
0169デフォルトの名無しさん2006/01/28(土) 18:45:18
>>166
「宿題片付けます」しか目に入らないんだよ、きっと。
>>167, 168
このスレはさすが仏の顔が7bitだけありますね。
0170デフォルトの名無しさん2006/01/28(土) 18:46:51
仏の顔もlong long int
0171デフォルトの名無しさん2006/01/28(土) 18:47:19
>>168
ありがとうございました。
0172デフォルトの名無しさん2006/01/28(土) 19:10:09
print(std::ostream& os) const
なんか気持ち悪いな。
operator使えばいいのに。
0173デフォルトの名無しさん2006/01/28(土) 20:11:09
>>166
あんなのじゃ食指が動かん
0174デフォルトの名無しさん2006/01/28(土) 20:12:21
>>172
print(std::ostream& os) const は特に間違ってない。
それ呼び出すoperatorを定義していないだけde。
0175デフォルトの名無しさん2006/01/28(土) 20:24:46
「なんか気持ち悪い」ってのは大事だと思う。
原因不明のバグはたいていそういうところに…
0176デフォルトの名無しさん2006/01/28(土) 20:25:28
>>174
operatorから呼び出すようにするなら
stringに格納して返すなり、ostream返すようにするなりして
cout << a.print() << "\n";
↑こういう感じで使えるようにした方がスマートだろ
0177デフォルトの名無しさん2006/01/28(土) 20:31:00
>>176
たぶんスマートだけを言うならこのほうがスマート

std::ostream&operator<<(std::ostream&o,const Complex&c){
    c.print(o);
    return o;
}
cout << a << "\n";
で済むからな。
0178デフォルトの名無しさん2006/01/28(土) 20:31:47
>>176
ネタ?
0179デフォルトの名無しさん2006/01/28(土) 20:33:50
>>164で質問させていただいた者です。
今度は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
>>179
お前が一回死ねばみんな教えてくれると思うよ^^
0181デフォルトの名無しさん2006/01/28(土) 20:43:34
>>179
引数を一つにする。
フレンドにする。
外部関数としてオーバーロード。
別のスレで聞く。
テンプレを守る。

の内のどれか。
0182デフォルトの名無しさん2006/01/28(土) 20:44:31
テンプレ(>>1)読め。
教科書にoperator *の書き方載ってるはずだから、それ読め。
0183デフォルトの名無しさん2006/01/28(土) 20:57:11
>>179
それをクラス定義の外で書けば良い。

細かいアドバイスも入れるなら
先にoperator*=を実装してそれを利用したほうが好ましい。
返り値はconst Complexにしたほうが事故を防げる
引数はconst Complex&にしたほうが効率的。

こんなところ、あと最後に教科書ちゃんと読んでから質問しろ。
0184デフォルトの名無しさん2006/01/28(土) 20:59:47
やさしいなぁ・・・ほんと。

やさしさに便乗させてもらおう。
C++の解答者さんに質問。使用コンパイラを教えてください。
0185デフォルトの名無しさん2006/01/28(土) 21:00:25
operatorはわかりにくいからな。
まず、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:39
>>184
VS6のVC6。時どきBCC。
VS6は学生時代に7万で安〜とか言って買ったんだけどなぁ。
今のアカデミックパックの安さはなに?って感じ。
0187デフォルトの名無しさん2006/01/28(土) 21:12:48
とゆうかoperatorのオーバーロードが分からんって奴は
ろくな入門書読んでないか、もしくはろくに読んでないだけだろ

そんな奴は勝手に単位落として留年でもしてりゃいい
0188デフォルトの名無しさん2006/01/28(土) 21:13:46
>>184
基本的にはg++
たまにVC++.NET2003やVC++2005
0189デフォルトの名無しさん2006/01/28(土) 21:15:38
今更の感もあるかもしれんが、C++やるならEffective C++とMoreの内容くらいは把握しとくのが筋。
0190デフォルトの名無しさん2006/01/28(土) 21:16:12
>>181さん、ありがとうございました。
フレンドにする事で解決しました。
なお、テンプレについては読んではいたのですが、
あくまで「推奨」という事だったので、あまり重要視していませんでした。
不快に思われた方にはお詫び申し上げます。
次回からはテンプレをしっかり書かせて頂きます。
0191デフォルトの名無しさん2006/01/28(土) 21:17:06
アカデミックって商用利用ダメだっけ?
0192デフォルトの名無しさん2006/01/28(土) 21:19:14
>>183さんと>>185さんもご丁寧な回答ありがとうございます。
0193デフォルトの名無しさん2006/01/28(土) 21:23:44
>>184
VisualC++ 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
>>193
確か2005からは.NETが名称から外されたはず
0196デフォルトの名無しさん2006/01/28(土) 21:31:46
[1] 授業単元: c言語演習
[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
>>195
本当だ。指摘サンクス
0198デフォルトの名無しさん2006/01/28(土) 21:39:11
>>184
ここに出すときは
digital mars C++
動作確認用にgcc g++ VC express(のclだけ) 辺りも併用
本当はbcc32でも試したいんだけど環境構築してないから試していない。
0199デフォルトの名無しさん2006/01/28(土) 21:42:15
>>198
Digital Marsのコンパイラってよく名前を聞くがいいの?
0200デフォルトの名無しさん2006/01/28(土) 22:02:07
>>194
素敵なアルゴリズムが思いつかない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;
}
02011982006/01/28(土) 22:11:46
>>199
吐き出すコードは自分が適当に使う限り結構優秀(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
>>194
#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
>>200
救われました!
0204デフォルトの名無しさん2006/01/28(土) 22:21:13
>>202
結果間違ってる
0205デフォルトの名無しさん2006/01/28(土) 22:21:23
>>201
D言語って趣味で?会社で?
使えるのあれ?
0206デフォルトの名無しさん2006/01/28(土) 22:23:17
[1] 授業単元:情報処理
[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
>>194
遅くなっちゃったなあ.解析解がありそうな気がするけど,まあバックトラック.

#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
>>201
即レス感謝です。
unionでは無く、structを使ったプログラムもご教授願えませんか・・・?
0209デフォルトの名無しさん2006/01/28(土) 22:28:53
>>208
自分で共用体って書いてるじゃん
0210デフォルトの名無しさん2006/01/28(土) 22:30:21
#include <iostream>
#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');
}
02112102006/01/28(土) 22:31:31
>>210 は >>206.プログラムの終了は EOF.
02121942006/01/28(土) 22:32:08
>>202、>>207さん
ありがとうございました!
02132082006/01/28(土) 22:35:55
意味不明な質問をして申し訳なかったです・・・orz
0214デフォルトの名無しさん2006/01/28(土) 22:46:54
>>205
暇人大学生ですから趣味です。
D言語は適当にちょちょいと書くスクリプト言語と同じ程度には使えます。
と言っても一番大きいソースでも4~5000行しか書いてないから正確に評価はできませんけど。

たぶん、C++で蓄積されたライブラリ群を使うほうが最終的には実用的かなぁ。
0215デフォルトの名無しさん2006/01/28(土) 22:49:13
>>194
順列の列挙アルゴリズムがこんなんしか思いつかなんだ。

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
>>194
なんとか解析解出せた.……けど,問題は途中経過も全部出さないと駄目なんか…….

#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
>>214
大学で5000行スゴスwww
俺も大学生ですがMAXでせいぜい2000行程度
0218デフォルトの名無しさん2006/01/28(土) 22:55:01
漏れもDやってたがDじゃメシ食えんことに気づいてやめた
0219デフォルトの名無しさん2006/01/28(土) 22:56:18
>>194
誰だよ俺と同じ大学のヤツw
0220デフォルトの名無しさん2006/01/28(土) 22:57:25
てかD使ってる企業あるの?
0221デフォルトの名無しさん2006/01/28(土) 22:59:09
>>216
なんでそうなるのか分からんが、すげー
そういうのってやっぱアルゴリズム論とかでやるの?
0222デフォルトの名無しさん2006/01/28(土) 23:01:51
[1] 授業単元:プログラミング実習
[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
>>222のつづき
関数プロトタイプと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
>>220
ちょっと前にDで記述したアプリかなんかがあって、
impressかなんかに載ってたよ
かなりうろ覚えで悪いけどw
02252162006/01/28(土) 23:11:26
>>221
組合せ論の問題かな.言われると,なるほど,と思うはず:

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
106はなんで、手をつけるひとがいないのかな・・・?
漏れはElementSeparateを理解するのに1時間かかったorz
・・・いやぁ・・・読みづらい・・・
0227デフォルトの名無しさん2006/01/28(土) 23:14:04
>>224
あんのかw

>>226
なんでって一番したのHPまともに読む気ないから
0228デフォルトの名無しさん2006/01/28(土) 23:14:53
うーむ。一通り読んだだけでは、理解できん>組み合わせ論
コンビニでビール買った後にでも、紙と鉛筆を用意してトライしよう。
0229デフォルトの名無しさん2006/01/28(土) 23:19:23
>>225
把握した。確かにそれで数は出せるのか
わざわざ説明サンクス

ってか題意満たして無くね?w


>>226
Dijkstra法だっけか?
あれがどんなのかは理解してるが、他人の虫食いソースなんて
読む気がしないからパス
0230デフォルトの名無しさん2006/01/28(土) 23:19:43
>>225
こういうのを思いつくのを数学的センスっていうんだろうなぁ。
私には力技しか無理です(ちなみに私は215です)。
0231デフォルトの名無しさん2006/01/28(土) 23:23:30
>>223 プロトタイプと main は省略.不正な式にも対応しない.
int 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:10
>>211
EOFって何ですか?
0233デフォルトの名無しさん2006/01/28(土) 23:31:55
>>232
End Of File
0234デフォルトの名無しさん2006/01/28(土) 23:32:04
>>232
ファイルの終端。コンソールから入力するときは CTRL+Z や CTRL+D など。つーかググれ。
0235デフォルトの名無しさん2006/01/28(土) 23:32:06
>>232
あなたはまずgoogleの使い方を知るべきです。
0236デフォルトの名無しさん2006/01/28(土) 23:34:37
>>226
読もうと努力したけど、アルゴリズムのところ、値を負にしてマークしたりしてて、理解が追いつかなかった。
0237デフォルトの名無しさん2006/01/28(土) 23:36:02
>>233-235
すみません。ありがとうございます!
後>>210をコンパイルしてもエラーが出るんですがどうしてでしょうか?
0238デフォルトの名無しさん2006/01/28(土) 23:38:03
>>237 エラーメッセージは?
0239デフォルトの名無しさん2006/01/28(土) 23:40:45
cl /GX だっけ。
0240デフォルトの名無しさん2006/01/28(土) 23:45:36
#include<iostream>
#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
>>238
エラーメッセージが長くて貼れませんでした。なので一応途中まで。
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
>>240
[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:14
>>241
gcc は C のコンパイラ。 C++ をコンパイルするときは g++ を使う。
0244デフォルトの名無しさん2006/01/28(土) 23:48:46
>>226
自分で実装したけど、コードの穴埋めをする気にはなれない。
たぶん途中の値を負にしたりするのは、そのノードが確定かどうかの
フラグに使っていると思うんだが、読むのはストレスが溜まる。
穴埋め以外不許可なら、変数表つけるとか出題者はもっと考えるべきだな。
0245240 ◆OtZ3csKgUQ 2006/01/28(土) 23:50:10
>>242のテンプレは>>240のプログラムについてです。
0246デフォルトの名無しさん2006/01/28(土) 23:52:21
>>243
わかりました。やってみます。
0247デフォルトの名無しさん2006/01/28(土) 23:53:01
>>240
どうを実行して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
>>194
遅レスだけど。内容はヒントの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
>>247さん。ありがとうございます。
すみません。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
>>243
できました!ありがとうございます!
>>210の方もありがとうございました!
0251デフォルトの名無しさん2006/01/29(日) 00:14:14
前スレの767ですがスルーされてるのでよろしくお願いします。

[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:16
>>249
equal関数でs1.sp!=s2.spの時に関数の最後でreturnしていないから。
■ このスレッドは過去ログ倉庫に格納されています