1 名前:デフォルトの名無しさん [2009/06/24(水) 23:28:21 BE:454421568-DIA(282072)] あなたが解けないC言語/C++言語の宿題を片付けもらうスレッドです。気に入らない質問やその他や発言はスルーの方向で。 【質問者へ】 回答者の便宜のため、質問の際は以下を行うことを推奨します。 ・質問は【質問テンプレ】を利用してください。 ・問題文は、出題されたまま全文を書いてください。 ・問題文やコードをリンクするときは、一言内容にについて説明をつけましょう。 ・計算問題は数式をあげ、どのような計算をするのか詳しく説明してください。 ・エラーは、その詳細と発生した行を書きましょう。エラーメッセージはコピペしてください。 ・後から問題に付け足しするのはコラー!!です。付け足しは作業を無駄にしがちです。 ・なりすましを防ぐため、トリップを使ってください。名前欄に、「#」に続けて任意の文字列を入力して投稿すると、その文字列を知らない他人に騙られることを防ぐことができます。 【質問テンプレ】 [1] 授業単元: [2] 問題文(含コード&リンク): [3] 環境 [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) [3.3] 言語: (C/C++/どちらでも可 のいずれか) [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 【アップローダー==ラウンジ】(質問が長い時はココ使うと便利 回答者もコードが長ければここに) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm 【C 関数検索 man on WWW】 www.linux.or.jp/JM/index.html 【過去ログ検索】 chomework.sakura.ne.jp/ 【wiki】 www23.atwiki.jp/homework/ 前スレ C/C++の宿題片付けます 127代目 pc12.2ch.net/test/read.cgi/tech/1244449887/
652 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 17:53:09 ] >>651 既に期限過ぎてるんだが
653 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 17:53:15 ] あとsizeof(char)は常に1だから冗長とかいう奴もよくいるねw おれは冗長でも書くべきと思う派
654 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 17:54:36 ] >>650 どういう意味なら気持ち悪くないの?
655 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 17:57:09 ] >>648 読みにくいし i <= sizeof〜 だと境界越えてるじゃん >>642 とどっちが読みやすいよ
656 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 18:00:36 ] うわあほんとだ。。。 sizeof記述の気持ち悪さに気を取られすぎた俺バカ
657 名前:デフォルトの名無しさん [2009/07/05(日) 18:18:03 ] <<651 私の計算ミスでした。すいません
658 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 18:55:03 ] >>651 >>162 問題 >>174 >>177 >>183 解答 何の計算ミス?
659 名前:デフォルトの名無しさん [2009/07/05(日) 19:38:56 ] >>623 返信遅れてすみません。 追加、削除された1つのリストで大丈夫です。
660 名前:デフォルトの名無しさん [2009/07/05(日) 20:49:18 ] [1] 授業単元:情報 [2] 問題文(含コード&リンク): パソコン甲子園 2008 予選問題 問7 ふしぎな虫 www.pref.fukushima.jp/pc-concours/2009/03/pdf/2008yosen.pdf [3] 環境 [3.1] OS: Windows xp [3.2] コンパイラ名とバージョン:Visual Studio 2008 [3.3] 言語: C [4] 期限: 7月6日 よろしくお願いします。
661 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 21:34:32 ] >>645 ありがとうございます。 凄い。誤差ってなかなか安定しないんですね ですが中身が問題分からなかった低能では いささか理解が追いつきません このまま出したら本当に英雄になっちゃいそうです
662 名前: ◆/91kCCQXBo mailto:sage [2009/07/05(日) 21:47:10 ] >>644 差の絶対値をグラフにした。 #include <stdio.h> #include <stdlib.h> #define PI 3.1415926 int main() { int i, j, imax = 1000; /* 乱数の発生回数 1000 */ int n, inter = imax/20; /* グラフの表示インターバル 50 */ float x,y,pi=PI,eps,mul; for(n=0, i=1; i<=imax; i++) { /* 0以上1未満の乱数を生成する */ x = rand()/((float)RAND_MAX+1); y = rand()/((float)RAND_MAX+1); /* 0<=x,y<=1の範囲にある中心原点半径1の扇形の中に乱数による点が入ったらカウントする */ if( x*x + y*y < 1) n++; if( i%inter ) ; else { /* 円周率の計算とグラフの表示 */ pi = (float)n/i*4; /* 半径1の円の面積すなわち円周率 */ eps = PI-pi; eps = (eps<0)? -eps : eps; if(i==inter) mul = 70/eps; /* 1回目はグラフの倍率を決める */ printf("%5.3f ", pi); for(j=eps*mul; j>=1; j--) putchar(' '); printf("*\n"); } } printf("PI=%f\n", pi); }
663 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 22:30:36 ] >>662 ありがとうございます コメントまで… 何度実行しても値が変わらない気がするのはそういう物ですか?
664 名前: ◆/91kCCQXBo mailto:sage [2009/07/05(日) 22:37:17 ] srand(time(NULL)); を、最初に呼べば毎回変わるはず、>>645 のように。
665 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 22:41:51 ] >>664 出来ました。が、ときたまグラフが崩れるので封印しときます 勉強になりました
666 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 23:08:32 ] >>234 で、>>251 さんに kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9608.txt というプログラムを書いて頂いたのですが、RAND_MAXがrand関数の利用に当たるとして 再提出になってしまいました。 rand_maxはrandのとる最大値とのことですが、これを使わないで同様の趣旨を実現するにはどうしたらよいのでしょうか?
667 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 23:14:25 ] RAND_MAXをINT_MAXに変える
668 名前:デフォルトの名無しさん [2009/07/05(日) 23:53:23 ] 2つの整数をキーボードから入力して、最初の数の方が小さい場合には、『最初の数の方が小さいか等しいです』と表示させて、大きい場合には、『後の数の方が小さいです』と表示させるプログラムを作成せよ #include<iostream> using namespace std; int main(){ return 0; } の中に入る文を作るんですが、どうすればいいですか。使うのはifとcoutとelseくらいだと思うんですが
669 名前:デフォルトの名無しさん mailto:sage [2009/07/05(日) 23:54:46 ] >RAND_MAXがrand関数の利用に当たるとして 何ソレ ただの定数マクロでしょ?
670 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 00:24:57 ] >>666 関数の利用に当たる・・・だと・・・ 数学科で出された問題? だったらそのトンチンカンな主張も納得できるけど工学科だったら・・・
671 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 00:28:29 ] >>668 例はいらない。 // ↑C++テンプレート int a1, a2; cout << "2つの数を入力してください:"; cin >> a1 >> a2; if(a1<=a2) cout << "最初の数の方が小さいか等しいです\n"; else cout << "後の数の方が小さいです\n"; // ↓C++テンプレート
672 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 00:49:54 ] >>671 // ↑C++テンプレート // ↓C++テンプレート なんだよ、このコメントは。w まぁ、>>671 の予想通り、minを使うのが速いよってことですね。
673 名前: ◆jmI6IAV7WI [2009/07/06(月) 05:28:45 ] [1] 授業単元: 構造体 [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9688.txt [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 7月10日 [5] その他の制限: よろしくお願いします
674 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 06:48:27 ] 書くとこ入力部だけじゃねーかw
675 名前: ◆jmI6IAV7WI [2009/07/06(月) 07:43:14 ] >>674 入力部だけでもお願いできないでしょうか 難しくて何がなんだかさっぱりわからないので すみません
676 名前: ◆/91kCCQXBo mailto:sage [2009/07/06(月) 14:11:15 ] >>673 1. printf("1番目のX Y座標をスペースを開けて入力して下さい:"); scanf("%lf%lf", &my_line.p1.x, &my_line.p1.y); printf("2番目のX Y座標をスペースを開けて入力して下さい:"); scanf("%lf%lf", &my_line.p2.x, &my_line.p2.y); printf("2点間の直線距離は:"); 2. 三角形の面積 area = fabs(t.p2.x * t.p3.y - t.p3.x * t.p2.y)/2; printf("1番目のX Y座標をスペースを開けて入力して下さい:"); scanf("%lf%lf", &my_triangle.p1.x, &my_triangle.p1.y); printf("2番目のX Y座標をスペースを開けて入力して下さい:"); scanf("%lf%lf", &my_triangle.p2.x, &my_triangle.p2.y); printf("3番目のX Y座標をスペースを開けて入力して下さい:"); scanf("%lf%lf", &my_triangle.p3.x, &my_triangle.p3.y); printf("3点で囲まれた三角形の面積は:");
677 名前: ◆/91kCCQXBo mailto:sage [2009/07/06(月) 14:25:27 ] >>624 ガウス・ザイデル法の計算方法 山本昌志 2005年12月16日 akita-nct.jp/yamamoto/lecture/2005/5E/Linear_eauations/ex_GaussSeidel_html/node2.html 必要なら以下にコメントも付けとく。仮にエクセルのPADでもいい? #if 0 for( j=1; j<=N; j++ ){ temp += a[i][j] * x[j]; } /* a[i][i] * newx + (temp - a[i][i] * x[i]) = b[i]; */ /* a[i][i] * newx = b[i] - (temp - a[i][i] * x[i]); */ newx = 1.0 / a[i][i] * (b[i] - (temp - a[i][i] * x[i])); #else for( j=1; j<=N; j++ ){ if( i==j ) continue; temp += a[i][j] * x[j]; } /* Xi(k+1) = 1/Aii * ( Bi - (Ai,1*X1(k) + Ai,2*X2(k) + ... + Ai,i-1*Xi-1(k) + Ai,i+1*Xi+1 + ... + Ai,n*Xn )) */ newx = (b[i] - temp)/a[i][i]; #endif
678 名前:デフォルトの名無しさん [2009/07/06(月) 17:30:17 ] [1] 授業単元: 情報処理 [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9689.txt [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc 3.4 [3.3] 言語: C/C++ [4] 期限: [2009年7月7日10:00まで] [5] その他の制限: 特にありません。 よろしくおねがいします。
679 名前:デフォルトの名無しさん [2009/07/06(月) 18:07:23 ] [1] 授業単元: オペレーティングシステム [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9690.zip [3] 環境 [3.1] OS: VineLinux4.2 [3.2] コンパイラ名とバージョン: GCC 4.3 [3.3] 言語: C/C++ [4] 期限: [2009年7月8日10:00まで] [5] その他の制限: 特にありません。 C言語なら俺に聞け(入門篇) Part 50 pc12.2ch.net/test/read.cgi/tech/1246342847/ の>>221 で質問しましたが結局分からなかったので ここに投げさせて頂きました。よろしくお願いします。 よろしくおねがいします。
680 名前:デフォルトの名無しさん [2009/07/06(月) 18:25:28 ] >>493 で質問し、一題目を当スレで解答していただいたものです。 その際二題目は問題の意味が解らないということで保留にしていたんですが、 二題目もしなければ駄目ということで再度質問願います。 [1] 授業単元:Cプログラミング入門編 [2] 問題文(含コード&リンク):www-it.sci.waseda.ac.jp/CPR1/class08/kadai2.htm [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ: gcc [3.3] 言語: C 二題目の問題の意味ですが、outputでV1〜Vnが表示される度にそれぞれの行列の要素の中で 『V1二乗+V2二乗−V3二乗』を画面Printするという意味と思います。 教授曰くピタゴラスのなにやらと言うらしいのですが、、、。 よろしくお願いします。
681 名前: ◆jvdNOCQgZU mailto:sage [2009/07/06(月) 18:31:14 ] [1] 授業単元:windows開発 [2] 問題文(含コード&リンク): down11.ddo.jp/uploader/download/1246872574.zip/attatch [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:Visual Studio 2008 [3.3] 言語:C++ [4] 期限: [2009年7月9日まで] [5] その他の制限:DirectX SDK N2008を使用します。 ファイルが大きかったので別のロダ借りました。パス「111」
682 名前:デフォルトの名無しさん [2009/07/06(月) 18:49:24 ] >>680 最初に解答いただいたプログラムです codepad.org/xBj760YT よろしくお願いします。
683 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 19:01:54 ] >>679 問題 >>前930(9532)>>093 (9559)>>172 (9532) このプログラムに、リダイレクション、パイプ機能を実装してください。 >>265 (9607)
684 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 19:23:17 ] >>679 もう上で答えられてるけど作っちゃったので俺も kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9691.c
685 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 19:35:09 ] >>680 #include <stdio.h> #include <stdlib.h> void multiply(int *mat, int *vec, int *out, int N) { int i, j; for (i = 0; i < N; i++) { out[i] = 0; for (j = 0; j < N; j++) { out[i] += mat[i*N+j] * vec[j]; } } } int main(void) { int i, k, N = 3, n = 10; int *v = (int *)malloc(N * sizeof(int)); int *t = (int *)malloc(N * sizeof(int)); int *P = (int *)malloc(N * N * sizeof(int)); v[0] = 3; v[1] = 4; v[2] = 5; P[0] = 1; P[1] = -2; P[2] = 2; P[3] = 2; P[4] = -1; P[5] = 2; P[6] = 2; P[7] = -2; P[8] = 3; for (k = 1; k <= n; k++) { multiply(P, v, t, N); for (i = 0; i < N; i++) { v[i] = t[i]; } printf("v_%d = (%d, %d, %d), ", k, v[0], v[1], v[2]); printf("v1^2 + v2^2 - v3^2 = %d\n", v[0]*v[0]+v[1]*v[1]-v[2]*v[2]); } free(v); free(t); free(P); return 0; }
686 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 20:04:06 ] >>678 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9692.txt
687 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:00:23 ] >>685 ありがとうございます。 本当に助かります。 こんなにサッと出来るなんて尊敬します。
688 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:30:15 ] [1] 授業単元:プログラミング [2] 問題文(含コード&リンク): 多数のファイルをクローズせずに何個もオープンするとどうなるか実験せよ. 実験用プログラム fopen.c のソースと実験結果と考察をレポートすること. % ./fopen 入力ファイル:fopen.c オープン 1 回目 オープン 2 回目 オープン 3 回目 ... オープン ??? 回目 これ以上オープンできません! 注意:「○○回までオープンできた」とかでは,現象・結果の説明にすぎず,考察とは言えない. その結果から何が理解できるのか?推理せよ. 換言:実験結果(具体例)から一般規則を導き出せ. [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限:09/07/08 [5] その他の制限: 特になし
689 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:36:20 ] >>688 追記 その他の制限:ファイル名は決め打ち(ソースファイルなど)でよい. 自分なりに作ったソースは kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9693.c 考察がわかりません. セグメンテーションエラーが出るのはわかるのですが…
690 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:47:23 ] >>689 セゲメンテーションフォルトは fclose(NULL) が悪いだけで考察とは関係ないよ
691 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:55:34 ] >>690 fclose(NULL)がエラーになる理由を考察に書けばいいと思うんですが、具体的にどう書けばいいのでしょうか
692 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 21:55:34 ] >>680 ピタゴラスのなにやらって、三平方の定理じゃねーかw
693 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 22:11:23 ] >>691 ストリームをクローズします。 fclose は,引数 stream で指定されたストリームをクローズします。 そのストリームに対応付けられているすべてのバッファは,クローズする前に フラッシュされます。システムが割り当てたバッファは,クローズすると解放されます。 setbuf または setvbuf を使って割り当てられたバッファは,自動的に解放される わけではありません(ただし,setvbuf にバッファポインタとして NULL が渡されると, クローズするときに解放されます)。 とあるから、NULLを無理矢理クローズしようとしてエラーが生じるんじゃない? 規格票には何か書いてあるかな
694 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 22:16:47 ] >>691 perror()かなにかでエラー原因表示させてみ [略) perror("fopen"); ←ここらへんでperrorを呼んでみる printf("これ以上オープンできません. \n"); [略)
695 名前:デフォルトの名無しさん [2009/07/06(月) 22:23:45 ] [1] 授業単元:プログラミング入門 [2] 問題文(含コード&リンク): リスト構造で接続された構造体に含まれる名前を比較し、辞書順にリスト構造の接続を再構成せよ。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2009年07月7日8:00まで [5] その他:自分で書いたのですが、セグメントエラーになってしまいます。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9694.c なお、これは一番若い名前を見つけたら一旦保持して、最後まで探し終えたら、先頭と保持したものを入れ替えるという動作を 最後までループさせるつもりで書きました。
696 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 22:36:25 ] >>693 ご教示ありがとうございます. ファイルをオープンできなかった場合に,そのファイルをクローズしようとするとどうなるかと言う課題もあるのですが, これも同じ原因でエラーが発生するのでしょうか. ソースは kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9695.c です. >>694 1回オープンしました. … 46回オープンしました. 47回オープンしました. fopen: Error 0 これ以上オープンできません. となりました
697 名前:デフォルトの名無しさん [2009/07/06(月) 23:01:33 ] >>684 >>685 ありがとうございます。 ちゃんと動作しました。
698 名前:デフォルトの名無しさん [2009/07/06(月) 23:06:42 ] 整数2つをキーボードから入力し、(最初にキーボードから入力させる数値を 入れる変数をa、2番目にキーボードから入力させる数値を入れる変数をbとする。)、 最初の数の方が大きい場合には、『最初の数の方が大きいです』、等しい場合には、『両方は等しいです』、2番目の数の方が大きい場合には、『2番目の数の方が大きいです』と表示するプログラムを作成せよ ある整数変数をキーボードから入力し、その数値が9以下なら『入力した値は1桁です』と表示させて、10以上、99以下の場合は、『入力した値は2桁です』と表示させ、 100以上なら『入力した値は3桁以上です』と表示するプログラムを作成せよ #include<iostream> using namespace std; int main(){ return 0; } の中に入る文を作るんです。else とか else if とか ifとか使うはずなんですが誰か教えてくれませんか
699 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 23:12:55 ] >>695 ちょっと見ただけだが、 ↓これはまずくない? >struct data* str,str1,str2,tmp,target; >struct data *str,*str1,*str2,*tmp,*target; 後、動作可能な形で全体をさらす方がアドバイスを受けやすいと思うよ。
700 名前:デフォルトの名無しさん [2009/07/06(月) 23:15:40 ] int first,second; printf("first: "); scanf("%d",&first); if(first>=100) printf("入力した値は3桁以上\n"); else if(first>=10) printf("入力した値は2桁以上\n"); else if(first<=9) printf("入力した値は1桁\n"); printf("second: "); scanf("%d",&second); if(second>=100) printf("入力した値は3桁以上\n"); else if(second>=10) printf("入力した値は2桁以上\n"); else if(second<=9) printf("入力した値は1桁\n"); if(first>second) printf("firstが大きい\n"); else if(first==second) printf("同じ\n"); else printf("secondが大きい\n");
701 名前:デフォルトの名無しさん [2009/07/06(月) 23:28:11 ] >>700 あれ?C++なんですけど coutとかなのですが
702 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 23:30:28 ] >>701 C++もCコードかけるからねえ 最初にそういうのは注文で出しておいた方がいいかも
703 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 23:32:19 ] using〜を見落としてたわ もう寝るから別の人やって ところで、テンプレ使えと逆ギレOK?
704 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 23:45:35 ] だから、今まで何度もC言語とC++は別言語だからスレッドを分けてくれと言ってきたじゃないか
705 名前:デフォルトの名無しさん mailto:sage [2009/07/06(月) 23:54:07 ] 初耳だ
706 名前:デフォルトの名無しさん [2009/07/07(火) 00:09:40 ] [1] 授業単元:C言語 [2] 問題文(含コード&リンク): www.dotup.org/uploda/www.dotup.org209303.txt [3] 環境 [3.1] OS:linux [3.2] コンパイラ名とバージョン:gcc 3.4 [3.3] 言語:c [4] 期限: 7月7日23:59 [5] 特になし よろしくお願いします
707 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 00:54:21 ] >>701 なにがcoutなのですか? printfはC++じゃないとおっしゃる?
708 名前: ◆/91kCCQXBo mailto:sage [2009/07/07(火) 00:56:04 ] >>698 // ここまではC++テンプレート cout<<"1番目の整数: "; cin>>first; cout<<"2番目の整数: "; cin>>second; if(first>second) cout<<"最初の数のほうが大きいです"<<endl; else if(first<second) cout<<"2番目の数のほうが大きいです"<<endl; else cout<<"両者は等しいです"<<endl; cout<<"3番目の整数: "; cin>>first; if(first>=100 || first<=-100) cout<<"入力した値は3桁以上です"<<endl; else if(first>=10 || first<=-10) cout<<"入力した値は2桁です"<<endl; else cout<<"入力した値は1桁です"<<endl; // ここからはC++テンプレート
709 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:02:07 ] >>689 多数のファイルをだからこんな感じじゃないの うちの環境だとエラーすら出ずに29ファイル目で終わった コンパイラはbcc,OSはXP SP3 原因はリソース不足? #include <stdio.h> #define N 1000 int main(){ int i; char fname[256]; FILE* in[N]; FILE* out; for(i = 0;i < N;i++){ sprintf(fname,"hoge%u",i); out = fopen(fname,"w"); fclose(out); if((in[i] = fopen(fname,"r")) == NULL){ perror("error"); for(i--;i >= 0;i--){ fclose(in[i]); } exit -1; } } for(i = 0;i < N;i++){ fclose(in[i]); } return 0; }
710 名前:512 mailto:sage [2009/07/07(火) 01:07:49 ] >>680 >>685 で解答済みみたいだけど、一応>>512 のコードで求めてみた codepad.org/4TnvGRE5 「ElementOf(mat,row,clm)」と「PrintPythagoreanTheorem(int v1, int v2, int v3)」を追加して main関数に1行追加しただけ #こっそりMltMatrixをMulMatrixに修正してたりw
711 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:09:23 ] >>709 1020ファイル作ってsegmentation faultだった。 CentOS5.3(仮想マシン) gcc4.1.2
712 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:11:50 ] >>711 丁度 out==NULL になったんじゃないかな
713 名前:711 mailto:sage [2009/07/07(火) 01:12:41 ] 流れをなんにも見てなくてとりあえず動かしただけだったすまん。 >>691 ええと、fclose(NULL)がなぜダメなのかを考察するのはちょっとズレてる その前にfopenがNULLを返したことに対して考察をすべきよー
714 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:14:45 ] >>712 大抵out==NULLになって終わるんじゃないかな
715 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:15:34 ] >>714 in[i]==NULL になることもあるさ
716 名前:711 mailto:sage [2009/07/07(火) 01:22:12 ] #include <stdio.h> #include <stdlib.h> #define N 10000 int main(){ int i; char fname[256]; FILE* in[N]; FILE* out; for(i = 0;i < N;i++){ sprintf(fname,"file/hoge%04u",i); out = fopen(fname,"w"); if(out == NULL){ perror("error[out]"); for(i--;i >= 0;i--){ fclose(in[i]); } exit(-1); } fclose(out); if((in[i] = fopen(fname,"r")) == NULL){ perror("error[in]"); for(i--;i >= 0;i--){ fclose(in[i]); } exit(-1); } } for(i = 0;i < N;i++){ fclose(in[i]); } return 0; } とりあえずちょっと変えてみた。 まあ、他の要因で落ちることを考慮すればin[i]==NULLになることもあるのだろうけれど、 ファイルの開きすぎで落ちるという観点で行けばoutのみじゃない?
717 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:35:43 ] >>695 いろいろ間違ってる。 nextを使うべきでないところで使っている(このためstr->next・str2->nextでstrやstr2がNULLになることがある)。 最小値がstr1でない場合に、次のループではstr1を跳ばしている(このためstr1がNULLになることがある)。 どうしてもtop入れ換えでやりたいなら、図でも書いて落ち着いて考えること。 top入れ換えではなく、最小値を1個ずつ抜いて別のツリーをつくる方がややこしくなくてお勧め。 struct data *sort(struct data *top){ struct data work, *d, *target = top, *current = &work; for(target = top; target != NULL; target = top){ //元のツリーがなくなるまで for(d = target->next; d != NULL; d = d->next){ //最小値探索 if(strcmp(target->name, d->name) > 0) target = d; } if(top == target){ top = target->next; //最小値がtopならtopにnextを保持 }else{ for(d = top; d->next != target; d = d->next) ; // 最小値がtop以外なら最小値の親と最小値の子をつなげる d->next = target->next; } current->next = target; // 新しいツリーの末尾に最小値を追加 current = target; current->next = NULL; } return work.next; }
718 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:42:03 ] 1] 授業単元:C言語 [2] 問題文(含コード&リンク):n個の整数データを入力し,最後に平均を出力,nは最初に入力する(nは自然数),平均は小数部まで求める実行例として [3] 環境 [3.1] OS:Windows [3.2] gcc 3.4 [3.3] 言語:C [4] 期限:7/7 18時まで #include<stdio.h> void main(void) { int x,y,z,sum; double ave; y=1; sum=0; printf("入力するデータ数は? "); scanf(" %d", &x); if(x>1){ for(y=1; y=x; y++){ printf("No .%d",y); y++; scanf("%d", &z); sum=sum+z; } ave=sum/x; printf("以上%d個の平均は:%.6f",x,ave); } } とりあえず自分でここまでやってみましたけどわかりません><
719 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:52:24 ] >>716 横レスだけどファイルを開きすぎて落ちるってどういうこと? outはきちんとfcloseしてるから再利用してよさそうなんだけどやっちゃダメなの? 後学のためにご教示願います。
720 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 01:57:27 ] outはちゃんと閉じてるけどinは増える一方でしょ 0 1 out open 0 out close 1 in open 2 out open 1 out close 2 in open というながれで、ファイルカウントが最初に最大になるのはoutをopenしたときでしょ
721 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 02:06:14 ] なるほどそういうことか。サンクス。
722 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 02:26:49 ] >>718 #include<stdio.h> void main(void) { int x,y,z,sum; double ave; sum = 0; printf("入力するデータ数は? "); scanf("%d", &x); if(x>=1){ for(y=1; y <= x; y++){ printf("No.%d ",y); scanf("%d", &z); sum=sum+z; } ave=(double)sum/x; printf("以上%d個の平均は:%.6f",x,ave); } }
723 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 02:48:35 ] >>722 ありがとうございます
724 名前: ◆jmI6IAV7WI [2009/07/07(火) 05:34:13 ] >>676 ありがとうございました 助かりました
725 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 12:44:06 ] [1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 整数 nissu をキー入力して、1 月1 日から数えて nissu 日目が何月何日かを表示 したい。 main() 関数を以下のように作った。ここで呼ばれている関数 tuki_hi () を作成せよ。 #include <stdio.h> int main(){ int nissu, tuki, hi; void tuki_hi(int, int *, int *); printf("日数を月日に変換\n"); printf("日数は? "); scanf("%d", &nissu); tuki_hi(nissu, &tuki, &hi); printf("%d 日目は%d 月%d 日です", nissu, tuki, hi); return 0; } [3] 環境 [3.1] OS: Windows/vista [3.2] コンパイラ名とバージョン: borland c++ [3.3] 言語:C [4] 期限: ([2009年07月7日2:30まで] [5] よろしくお願いします
726 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 12:55:20 ] >>725 void tuki_hi(int nissu, int *tuki, int *hi) { int days[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; /* days[0]は使わない */ int i; for (i=1; i<=12 && nissu>days[i]; ++i) { nissu -= days[i]; } *tuki = i; *hi = nissu; }
727 名前:デフォルトの名無しさん [2009/07/07(火) 14:09:24 ] >>686 ありがとうございました。 ただ、それぞれの問題につき1つのプログラムという形にしていただけないでしょうか? 自分なりにやってみたんですが、どうも上手くいきませんでした。 お手数ですが、よろしくお願いしますm(_ _)m
728 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:48:07 ] >>726 ありがとうございましたm(__)m
729 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 14:56:29 ] >>727 何も理解できてないな >>686 動かしてみた?
730 名前:デフォルトの名無しさん [2009/07/07(火) 16:35:47 ] >729 すみません… 本当に何も理解しておりません。 >実行結果です。 t23.c: In function `insert_node': t23.c:130: error: `new' undeclared (first use in this function) t23.c:130: error: (Each undeclared identifier is reported only once t23.c:130: error: for each function it appears in.) t23.c:130: error: parse error before "node_t" t23.c: In function `remove_node': t23.c:139: error: `delete' undeclared (first use in this function) t23.c:139: error: parse error before "del" t23.c: In function `random_list': t23.c:149: error: 'for' loop initial declaration used outside C99 mode t23.c: In function `get_node': t23.c:155: error: 'for' loop initial declaration used outside C99 mode
731 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 16:53:30 ] それ実行じゃなくてビルド時のエラーだろう。 とりあえず C++ でやってみては。
732 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 17:03:29 ] [1] 授業単元: プログラミングC [2] 問題文(含コード&リンク): キーボードから半角英数で文字列を入力し、英字については大文字を小文字に、小文字を大文字にするプログラムを作成せよ。 実行例 文字列入力 :AbCdEfG123 変換文字列 :aBcDeFg123 [3] 環境 windows [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C [4] 期限: 2009/7/9 [5] その他の制限:全くの初心者なのでよろしくお願いします。
733 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 17:32:46 ] すいません>>732 のものなんですがもう一問あったのでこちらもよろしくお願いします [1] 授業単元: プログラミングC [2] 問題文(含コード&リンク): キーボードから半角英数で文字列を入力し、これを数字(0→9)、大文字(A→Z)、 小文字(a→z)の順に並べ替えるプログラムを作成せよ。 ヒント:並べ替えアルゴリズムは、バブルソート(隣接交換法)を使うと簡単だろう。 文字列長はstrlen命令を使うとよい。みたいです。 [3] 環境 windows [3.1] OS: (Windows/Linux/等々) [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C [4] 期限: 2009/7/9 [5] その他の制限:
734 名前:デフォルトの名無しさん [2009/07/07(火) 17:36:08 ] >>731 提出先のコンパイラーでg++がインストールされてないようです… cに書き換えるにはどうしたら良いでしょうか?
735 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 17:37:38 ] >>730 コンパイルすらできていないのに>>727 のコメントが出てくるのがおかしいんだよ。 自分なりに何をやったんだ?って思うんだよなぁ。 てっきりmainがありませんぐらいまではたどり着いてるものだと思っていたが。。
736 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 17:40:05 ] >>734 new deleteをmalloc/calloc freeにする 変数の宣言をブロックの先頭で行うようにする
737 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 17:57:20 ] Cに書き換えるのも書こうかと思ったんだけど 元々の条件にC/C++って書いてあったからなー
738 名前:デフォルトの名無しさん [2009/07/07(火) 18:00:05 ] >>736 ありがとうございます。
739 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 18:02:11 ] >>732 #include <stdio.h> #include <ctype.h> int main(void) { char str[128]; int i; scanf("%s", str); for (i = 0; str[i]; ++i) if (isupper(str[i])) str[i] = tolower(str[i]); else if (islower(str[i])) str[i] = toupper(str[i]); puts(str); return 0; }
740 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 18:31:32 ] >>733 #include <stdio.h> #include <string.h> #include <ctype.h> int compare(char x, char y) { if (isdigit(x)) return isdigit(y)? y - x: 1; if (isupper(x)) return isdigit(y)? -1: isupper(y)? y - x: 1; if (islower(x)) return isdigit(y) || isupper(y)? -1: islower(y)? y - x: 1; return 0; } void bsort(char *str) { int i, j; for (i = 0; i < strlen(str) - 1; ++i) { for (j = 1; j < strlen(str) - i; ++j) { if (compare(str[j], str[j - 1]) > 0) { char t; t = str[j]; str[j] = str[j - 1]; str[j - 1] = t; } } } } int main(void) { char str[128]; scanf("%s", str); bsort(str); puts(str); return 0; }
741 名前:デフォルトの名無しさん [2009/07/07(火) 18:57:59 ] >>737 そうですね、迂濶でした。 今度こそ自分なりにやってみますが、ダメだったときはお願いしてもよろしいでしょうか…
742 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 19:02:25 ] >>734 > 提出先のコンパイラーでg++がインストールされてないようです… 何のエラーメッセージでそう思った? とりあえず int main(void){return 0;} の一行を追加して、g++でコンパイルみてはどうだろう。
743 名前:デフォルトの名無しさん [2009/07/07(火) 19:52:53 ] >>742 g++: p11.cpp: No such file or directory >g++: no input files です。 >
744 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 19:56:43 ] >>743 ばっちりインストールされてるじゃねーかw
745 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 19:57:03 ] >>743 which g++ とでもしてろよwwwww
746 名前:デフォルトの名無しさん [2009/07/07(火) 19:57:41 ] ↑間違えました。
747 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 20:01:47 ] [1] 授業単元: コンパイラの構成 [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9696.txt [3] 環境 [3.1] OS: (Windows/Linux/等々) Windows [3.2] コンパイラ名とバージョン: (gcc 3.4 VC 6.0等) gcc [3.3] 言語: (C/C++/どちらでも可 のいずれか) C(yacc、lex) [4] 期限: ([yyyy年mm月dd日hh:mmまで] または [無期限] のいずれか) 7月14日 [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) 前回も>>204 で助けていただいたのですが、yaccとlexの問題です。 スレ違いかもしれませんがどなたかよろしくお願いします。
748 名前:デフォルトの名無しさん [2009/07/07(火) 20:13:40 ] >>744 >>745 そうなんですか?W とりあえず>>686 を参考にどうにかしてみます。 どうにもならなかったらまた来させて下さい… 長々とお付き合いありがとうございました!
749 名前:デフォルトの名無しさん [2009/07/07(火) 21:07:31 ] [1] 授業単元:C言語 [2] 問題文:配列を用いた計算機のプログラムを作成してください。 計算は前から順に行われていく。 入力される数値の個数は最大でも20個としてください。 [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン: Visual Studio 2008 [3.3] 言語:C言語 [4] 期限:2009年7月12日 [5] その他:特になし よろしくおねがいします
750 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 21:09:52 ] >>706 /*Q1*/ #include <stdio.h> int main() { FILE *fp_in, *fp_out; char fname[256], key, buf; printf("ファイルを暗号化します!\n\n"); printf("入力ファイル名は:"); scanf("%s", fname); fflush(stdin); if ((fp_in = fopen(fname, "rb")) == NULL) return 1; printf("出力ファイル名は:"); scanf("%s", fname); fflush(stdin); if ((fp_out = fopen(fname, "wb")) == NULL) return 1; printf("暗号化のキー文字は:"); key = fgetc(stdin); while (fread(&buf, sizeof(char), 1, fp_in) == 1) { buf = buf ^ key; fwrite(&buf, sizeof(char), 1, fp_out); } printf("暗号化が完了しました!\n"); fclose(fp_in); fclose(fp_out); return 0; } /*Q2*/ #include <stdio.h> void rotate(unsigned char *a) {*a = (*a) << 1 | (*a) >> 7;} int main() { int i, k, x; unsigned char a; printf("1〜255の整数を入力 : "); scanf("%d", &x); a = x; for (i = 1; i <= 16; i++) { rotate(&a); printf("%2d-th shift: %3d ", i, a); for (k = 7; k >= 0; k--) {printf("%d", (a & (1<<k)) >> k);} printf("\n"); } return 0; }
751 名前:デフォルトの名無しさん mailto:sage [2009/07/07(火) 21:15:24 ] >>706 /*Q3*/ #include <stdio.h> #include <stdlib.h> void itoa_r(int n, char *str); enum {MAX = 100}; main() { int n; char str[MAX]; while (1) { int i; for (i = 0; i < MAX; i++) str[i] = '\0'; // 追加 printf("\n整数を入力して下さい(終了 = 0):"); scanf("%d", &n); if (n == 0) break; itoa_r(n, str); printf("文字列に変換すると %s です\n", str); } } void itoa_r(int n, char *str) { if (n < 0) { *str = '-'; itoa_r(-n, str + 1); } else if (n != 0) { int m = n, d = 1; while (m /= 10) d++; *(str + d - 1) = '0' + (n % 10); itoa_r(n / 10, str); } }
752 名前:デフォルトの名無しさん [2009/07/07(火) 21:58:55 ] [1] 授業単元:プログラミングC [2] 問題文(含コード&リンク): C++言語を使ってスタックを実現するクラスを定義して,その実行を確認するプログラム(main関数)を書く。 クラス名はstackとする。 要素のデータの型はintとする。 格納できる要素の最大数は10とする。 公開されているインターフェースは下記のものとする。 void push(int data); int pop(); 初期設定は,以下のいずれかによって行う。 (1) クラスのコンストラクタ(constructor)の機能を用いる。 (2) 初期設定用のインターフェース(init)を定義し,スタックを使用する前に,initを呼び出す。 機能確認のためのインターフェース(たとえばスタック内のデータを表示させる)を追加してもよい。 上記の仕様を満たさない(インターフェース名が上記と一致しない等)プログラムは評価の対象としない。 #入出力はprintfを用いること。 [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: Visual Studio 2008 [3.3] 言語: C++ [4] 期限: 2009年7月10日まで よろしくおねがいします