1 名前:デフォルトの名無しさん [2008/10/01(水) 07:28:51 BE:151474728-PLT(18888)] あなたが解けない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++の宿題を片付けます 115代目 pc11.2ch.net/test/read.cgi/tech/1217741118/
186 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 00:32:14 ] >>185 つ数学板 Cの課題とは言えない
187 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 00:33:31 ] >>185 せめてnはいくつから始めるのかだけでも言え それがないと漸化式が解けん
188 名前:デフォルトの名無しさん [2008/10/10(金) 00:36:49 ] >>186 数学板行ったらCにいけゆわれました; >>187 すみません、nは0からです;
189 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 00:44:22 ] >>184 #include <iostream> using namespace std; int main() { for (;;) { string name; int credit_standing, amount_owed, minimum_payment; cin >> name >> credit_standing >> amount_owed; if (cin.eof()) break; if (credit_standing > 6) minimum_payment = (amount_owed <= 20) ? amount_owed : (amount_owed <= 100) ? 10 : 0.1 * amount_owed; else minimum_payment = amount_owed; cout << name << " with credit standing " << credit_standing << " must pay " << minimum_payment << endl; } return 0; }
190 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 00:58:56 ] >>185 a(0)とb(0)の初期値は?
191 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 00:59:43 ] >>184 なんだCだったか #include <stdio.h> int main() { char name[32]; int credit_standing, amount_owed, minimum_payment; while (scanf("%31s %d %d", name, &credit_standing, &amount_owed) == 3) { if (credit_standing > 6) minimum_payment = (amount_owed <= 20) ? amount_owed : (amount_owed <= 100) ? 10 : 0.1 * amount_owed; else minimum_payment = amount_owed; printf("%s with credit standing %d must pay %d\n", name, credit_standing, minimum_payment); } return 0; }
192 名前:デフォルトの名無しさん [2008/10/10(金) 01:06:07 ] >>190 a(0)=7 b(0)=5 です。
193 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 01:11:24 ] >>192 #include <stdio.h> double fa(double a_n, double b_n) { return 3 * a_n + 4 * b_n; } double fb(double a_n, double b_n) { return 2 * a_n + 3 * b_n; } int main() { double an = 7, bn = 5; double tmp; int i; for (i = 0; i < 10; ++i) { tmp = fa(an, bn); bn = fb(an, bn); an = tmp; } printf("%.10f\n", an / bn); return 0; }
194 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 01:21:24 ] >>193 ありがとうございます!!助かりました!!
195 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 01:21:40 ] >>185 素直に再帰したいけどこれじゃダメなのかな #include <stdio.h> int a(int); int b(int); int a(int n) { if (n == 0) return 7; else return 3 * a(n-1) + 4 * b(n-1); } int b(int n) { if (n == 0) return 5; else return 2 * a(n-1) + 3 * b(n-1); } int main() { printf("%.10lf\n", (double)a(10) / b(10)); return 0; }
196 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 01:36:07 ] >>195 いえいえ全然ダメじゃないです!本当にありがとうございます!
197 名前:デフォルトの名無しさん [2008/10/10(金) 01:39:40 ] >>189 ありがとうございました。 ちなみに各customerのコードはどのように入力すればいいのですか? 初心者ですいません。 >>191 すみません、言語はC++でした。 書き間違えてしまいました。 お手数おかけしました。
198 名前:181 mailto:sage [2008/10/10(金) 01:52:36 ] >>183 すいません言葉足らずでした 改めて貼り直します [1] 授業単元: C言語 [2] 問題文: kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7765.txt TCPサーバー kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7766.txt TCPクライアント kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7767.txt [3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン:Visual stdio2005 [3.3] 言語:C [4] 期限:10月10日(金)13:00まで [5] その他の制限:問題文に記述 引き続きよろしくお願いいたします
199 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 06:56:37 ] >>198 TCPサーバー:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7769.txt TCPクライアント:kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7770.txt
200 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 12:03:51 ] >>199 ありがとうございました
201 名前:デフォルトの名無しさん [2008/10/10(金) 12:16:32 ] なぜうp先は関西2ちゃんねらーなんですか
202 名前:デフォルトの名無しさん [2008/10/10(金) 15:52:19 ] [1] 授業単元: c言語 [2] 問題文(含コード&リンク): ペイントソフトを作る [3] 環境 [3.1] OS: windowsXP [3.2] コンパイラ名とバージョン: Visual studio .NET 2003 [3.3] 言語: c,c++ [4] 期限: 2週間後の火曜まで [5] その他の制限: MFCを使用しない 線の描画などはできましたが、ペンの太さや色の変更、 操作のやり直しなどが分かりません どなたかよろしくお願いします
203 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 16:39:02 ] >>202 単線だけでいいんじゃないの 機能つけるときりがないよ アンドゥとか特に無理
204 名前:デフォルトの名無しさん [2008/10/10(金) 17:14:13 ] >>203 返事ありがとうございます やはり、アンドゥ機能などは難しいのですかね? 今までc言語はやった事があったのですが それに比べるとVC++は色々ややこし過ぎて困っています。 画面を左右に分けて、描画とパレットのように分けて作ろうと思っているのですが 雛形みたいなのはあるのでしょうか?
205 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 19:34:20 ] 1] 授業単元:C++ [2] 問題文:ファイルから波形を読み込み、FFTした結果をテキスト出力する プログラムを作成せよ。 波形のデータは以下のようなものです。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7771.txt [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名とバージョン:Visual Studio 2005 [3.3] 言語:C++ [4] 期限: [無制限] [5] その他の制限:まだCの勉強が浅く、色々と検索してみましたがどうもバタフライ演算の やり方が難しく分かりません。。何か説明不足があれば聞いてください。 FFTで詰まってしまい困っています。どうか、よろしくお願いしますm(_ _)m
206 名前:デフォルトの名無しさん mailto:sage [2008/10/10(金) 19:35:12 ] >>204 宿題できてんじゃん。 色・ふとさ固定、undoできないなどの機能制限がたくさんあるが、それは立派なペイントソフトだよ。 さらに機能追加をしたいのであれば必要に応じてデバイスコンテキストに関する質問その他を やってけば?宿題スレじゃなく。
207 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 01:02:05 ] どなたか>>100 お願いできませんか
208 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 02:44:59 ] >>207 鬱になったので、途中から手を抜いてしまった。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7772.zip PerlでもRubyでも好きなの使った方がラクダと思うけどキリンか。
209 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 02:57:37 ] >>204 汚いけど、これじゃだめ?? kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7773.zip
210 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 02:59:33 ] >>204 じゃなくて>>207 でした(´・ω・`)
211 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 08:13:31 ] >>202 線じゃなくて、点を打つようにすると太さ変えるのも楽になる お絵かきチャットでは、線と線を結んでる場合が多いけど ローカルで使えるペイントソフトはたいてい点を打って点を繋いでると思われる 点をつなげるのは、結構めんどい アンドゥは、やり方がいくつかある 画像として管理するか 数値データとして管理するか、かな。 突貫でいいなら画像として管理するのを作ったほうが楽かもしれない どちらが得意かによる
212 名前: ◆ZnBI2EKkq. mailto:sage [2008/10/11(土) 12:00:32 ] [1] 授業単元:情報処理A [2] 問題文(含コード&リンク): ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7774.txt [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:Cygwin gcc 3.4.4 [3.3] 言語:C [4] 期限:2008年10月17日 16:00まで [5] その他の制限:scanf関数は禁止、再帰呼び出しを用いること、エラー処理を入れること 今もやっているのですが、とても期限までに終わる気がしません。。。 誰か助けてください。
213 名前:デフォルトの名無しさん [2008/10/11(土) 15:35:33 ] [1] 授業単元:c++ builder [2] 加算平均を求めよ [3] 環境 [3.1] OS:windows xp [3.2] コンパイラ名とバージョン: c++ builder5 [3.3] 言語: どちらでも可 [4] 期限:2008年10月13日まで テキスト1には テキスト2には テキスト3には 8 3 4 5 4 7 7 9 9 8 8 5 9 3 4 9 8 9 という形で与えられており、これをOpendialogで読み込んで加算平均しMemo1に 5 5.33333 8.33333 7 5.33333 8.66666 のように計算したものを出したいのですがどのようにすればよいでしょうか? 全然わからなくて何度か自分なりにつくっているのですが、うまくいきません。 どなたか助けてもらえませんか 読み込みはなんとかできそうですが加算平均の配列の計算のプログラムの作り方が どうしてもわかりません。 よろしくお願いします。
214 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 16:00:03 ] >>213 Opendialog っていうのが分からなかった #include<stdio.h> #include<stdlib.h> #include<math.h> #define NUMBER_OF_FILES 3 int main(void){ FILE *fp_in[NUMBER_OF_FILES], *fp_out; char *filename_in[NUMBER_OF_FILES]={"テキスト1", "テキスト2", "テキスト3"}, *filename_out="Memo1"; double value[NUMBER_OF_FILES], sum; int i; for(i=0;i<NUMBER_OF_FILES;i++){ if((fp_in[i]=fopen(filename_in[i], "r"))==NULL){ fprintf(stderr, "\nError: %s cannot open.\n", filename_in[i]); exit(1); } } if((fp_out=fopen(filename_out, "w"))==NULL){ fprintf(stderr, "\nError: %s cannot open.\n", filename_out); exit(2); } while(1){ for(i=0,sum=0.0;i<NUMBER_OF_FILES;i++){ if(fscanf(fp_in[i], "%lf", &value[i])!=1) break; sum+=value[i]; } if(i<NUMBER_OF_FILES) break; fprintf(fp_out, "%g\n", floor(sum/NUMBER_OF_FILES*100000)/100000); } for(i=0;i<NUMBER_OF_FILES;i++) fclose(fp_in[i]); fclose(fp_out); return 0; }
215 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 16:01:28 ] >>212 マージャン知らないと不利な課題だな。
216 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 16:07:36 ] >>212 www5f.biglobe.ne.jp/~kenmo/program/majang/yaku/yaku.html 参考になるかも?
217 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 16:49:40 ] >>207 >>100 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7776.zip 一応動くようにしてみた。コマンドライン引数は、すべて実装しているわけではない。 後は好きなようにしてくれ。
218 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 17:14:43 ] >>207 >>100 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7777.zip >>217 の細かい修正とエラー処理追加しておいた。荒れそうなので、これくらいにしておく(鬱)。
219 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 20:58:59 ] >>218 ありがとうございます。 >>209 ファイル入力、標準出力はうまくいきました。 標準入出力、ファイル入出力を成功させるにはどうしたらいいでしょうか。
220 名前:デフォルトの名無しさん [2008/10/11(土) 21:08:15 ] [1] 授業単元: 測量学 [2] 問題文:"度"形式から"度分秒"形式への変換 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: コマンドプロンプト バージョンはすいません分からないです。 [3.3] 言語: C言語 [4] 期限: 10月13日(月)まで [5] その他の制限: 簡単な関数のみでお願いします。 (例) 35.2361 → 35°14′9.96″ 変換式は、まず 35.2361の小数点部分の0.2361×60=14.166 この結果の整数部分の14が分になります。 そして、14.166の小数点部分の0.166×60=9.96 この結果の9.96が秒になります。 初期値35.2361も出力値35°14′9.96″も文字列です。 初期値が35.2361ではなく、何が初期値でも通用するようにしてください。 また、初期値の小数点以下が2361と4桁と決まっているわけでもありません。
221 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 21:46:26 ] >>220 pc11.2ch.net/test/read.cgi/tech/1221144557/312-315
222 名前:デフォルトの名無しさん mailto:sage [2008/10/11(土) 22:01:49 ] >>220 #include<stdio.h> #include<math.h> void convert(char *dms, const char *deg) { double x, d, m; sscanf(deg, "%lf", &x); x = fabs(modf(x, &d) * 60); x = modf(x, &m) * 60; sprintf(dms, "%g°%g′%g″", d, m, x); } int main() { static const char deg[] = "-35.2361"; char dms[100]; convert(dms, deg); printf("%s\n", dms); return 0; }
223 名前:213 [2008/10/11(土) 22:03:42 ] >>214 即レスありがとうございます。大変感謝しています;; Opendialogはc++builder5のダイアログでファイルを開くというコマンドを示しています わざわざプログラムを書いていただいたのですが、これをc++builderに 置き換えていくことができませんでした。すいません;; 自分でも今まで書いていたのですが、Memo1には-2と一行書き出されるだけでした; 多分読み込んだ配列の計算としての基本的な計算とプログラムが間違っていると思うのですが、 自分ではどこが間違っているのかわかりませんでした。。 どなたかよければ教えていただけないでしょうか。よろしくお願いします><
224 名前:213 [2008/10/11(土) 22:08:40 ] void __fastcall TForm1::Button1Click(TObject *Sender) ファイルを開いてテキスト1を読み込む { OpenDialog1->Execute(); Fname1 = OpenDialog1->FileName; Edit1->Text = Fname1; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) テキスト2を読み込む { OpenDialog1->Execute(); Fname2 = OpenDialog1->FileName; Edit2->Text = Fname2; }
225 名前:213 [2008/10/11(土) 22:09:10 ] void __fastcall TForm1::Button3Click(TObject *Sender) テキスト3を読み込む { OpenDialog1->Execute(); Fname3 = OpenDialog1->FileName; Edit3->Text = Fname3; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) 3つのテキストを加算平均してMemo1に書き出す { AnsiString kasan; char Fname1[5],Fname2[5],Fname3[5]; for(m=0;m<=5;m++); { kasan = (Fname1[m] + Fname2[m] + Fname3[m])/3; } Memo1->Lines->Add(kasan);
226 名前:213 mailto:sage [2008/10/11(土) 22:10:31 ] 長文失礼しました。。 こんな感じです。
227 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 03:30:31 ] #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Dialogs.hpp> #include <fstream> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE 管理のコンポーネント TEdit *Edit1; TEdit *Edit2; TEdit *Edit3; TButton *Button1; TButton *Button2; TButton *Button3; TButton *Button4; TOpenDialog *OpenDialog1; TMemo *Memo1; void __fastcall Button1Click(TObject *Sender); void __fastcall Button2Click(TObject *Sender); void __fastcall Button3Click(TObject *Sender); void __fastcall Button4Click(TObject *Sender); private: // ユーザー宣言 AnsiString Fname1; AnsiString Fname2; AnsiString Fname3;
228 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 03:31:35 ] public: // ユーザー宣言 __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif これがUnit1.hね それからUnit1.cpp #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { OpenDialog1->Execute(); Fname1 = OpenDialog1->FileName; Edit1->Text = Fname1; }
229 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 03:32:24 ] //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { OpenDialog1->Execute(); Fname2 = OpenDialog1->FileName; Edit2->Text = Fname2; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { OpenDialog1->Execute(); Fname3 = OpenDialog1->FileName; Edit3->Text = Fname3; } //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { std::ifstream ifs[3]; ifs[0].open(Fname1.c_str()); ifs[1].open(Fname2.c_str()); ifs[2].open(Fname3.c_str()); for (int i = 0; i < 6; i++) { double sum, t1, t2, t3; ifs[0] >> t1; ifs[1] >> t2; ifs[2] >> t3; sum = (t1 + t2 + t3) / 3; Memo1->Lines->Add(AnsiString(sum)); } }
230 名前:213 mailto:sage [2008/10/12(日) 03:59:24 ] >>227 >>228 >>229 ありがとうございました! おかげで正しく算出することができました><
231 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 04:15:13 ] [1] 授業単元:アルゴリズム [2] 引数nに対して、1/nの小数表示を逆配列と動的配列を用いた形でプログラムせよ kk.kake.info.waseda.ac.jp/ads08/Cbasics/one-n-th.html [3] 環境 [3.1] OS: Windows [3.2] cygwin gcc 3.4 [3.3] 言語: C [4] 期限: [2008年10月12日00:00まで] [5] 特になし 全然わかりません……どなたか助けて頂けると幸いです……
232 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 13:29:10 ] >>231 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7778.c
233 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 14:05:25 ] >>232 動きました! あぁ…なんといっていいやら……ありがとうございます!! これからプログラムの挙動について考えてみたいと思います
234 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 20:21:40 ] てs
235 名前:デフォルトの名無しさん [2008/10/12(日) 21:59:38 ] [1] 授業単元:アルゴリズムとデータ構造 [2] 問題文(含コード&リンク):任意の長さの文字列(英字のみ)データをファイルから読み込み(ファイル名をキーボードから入力して読み込ませる)、辞書順に並べ替えて最終結果のみを表示するプログラムを作成せよ。 ただし、データは改行で区切られており、文字列の最大長を64文字、データの最大個数を1000個(1000行)とする。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン: gcc (バージョン不明です) [3.3] 言語: C言語 [4] 期限: 2008年10月14日23:59まで [5] その他の制限: バブルソートの基本らしいのですが…str〜、getsなど使用する関数や、とりあえず、配列とポインタを使わないといけないんだろう、など断片的なものにしか自信が、持てずプログラムを組んでみたものの実行できません…orz 助けてください…。
236 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 22:05:11 ] >>235 問題文には含んでないけど 結局バブルソートは自分で書かなきゃだめなのか? 平たくいえばqsortとstrcmp使っていいか?
237 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 22:15:10 ] >>236 qsortという関数はまだ習っていないのでなるべく控えたいのですが、strcmpは自分がプログラムを組んでみた時にも使用しましたので使っていただいて大丈夫です。 早速ありがとうございます。
238 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 22:31:36 ] >>235 #include<stdio.h> #include<string.h> #define WORD_NUM_MAX 1000 #define WORD_LEN_MAX 64 int main(void){ char word[WORD_NUM_MAX][WORD_LEN_MAX+1+1], tmp[WORD_LEN_MAX+1], *p; char filename[256]; int i, j, word_num; FILE *fp; printf("Input filename : "); scanf("%255[^\n]", filename); if((fp=fopen(filename, "r"))==NULL) return 1; for(word_num=0;word_num<WORD_NUM_MAX;word_num++){ if(fgets(word[word_num], sizeof(word[0]), fp)==NULL) break; if((p=strchr(word[word_num], '\n'))!=NULL) *p='\0'; } fclose(fp); for(i=0;i<word_num;i++){ for(j=0;j+1<word_num-i;j++){ if(strcmp(word[j], word[j+1])>0){ strcpy(tmp, word[j]); strcpy(word[j], word[j+1]); strcpy(word[j+1], tmp); } } } for(i=0;i<word_num;i++) puts(word[i]); return 0; }
239 名前:デフォルトの名無しさん [2008/10/12(日) 23:21:54 ] [1] 授業単元:c++ builder [2] 3科目4人分の得点と科目ごと、個人ごとの平均点を配列を使って作れって [3] 環境 [3.1] OS:windows xp [3.2] コンパイラ名とバージョン: c++ builder5 [3.3] 言語: どちらでも可 [4] 期限:2008年10月13日まで
240 名前:デフォルトの名無しさん mailto:sage [2008/10/12(日) 23:57:56 ] >>239 とりあえずgccでは動いた。 #include <stdio.h> int main(int argc, char *argv[]) { int score[4][3] = {{90,73,82},{60,50,55},{71,59,80},{95,88,80}}; int i,j; double personAvg[4]; double classAvg[3]; printf("人別平均\n"); for(i=0; i<4; i++) { for(j=0; j<3; j++) { personAvg[i] += score[i][j]; } personAvg[i] /= 3; printf("%f\n", personAvg[i]); } printf("科目別平均\n"); for(j=0; j<3; j++) { for(i=0; i<4; i++) { classAvg[j] += score[i][j]; } classAvg[j] /= 4; printf("%f\n", classAvg[j]); } }
241 名前:デフォルトの名無しさん [2008/10/13(月) 00:07:50 ] >240 ありがとうございました・・・ 世の中すてたもんじゃないっておもいました・・ 本当に困ってたので・・・
242 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:17:33 ] >>241 妙な授業単元に問題文 ついでに抜けてる部分を修正できると思えない人間 言葉からにじみ出てくる、「俺は悪くないよ」オーラ 世の中ろくなもんじゃないよ
243 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:28:25 ] それは本当の優しさなのだろうか。
244 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 00:53:39 ] 下記の問題をやっていただける方いませんか?よろしくお願いします [1] 情報処理 [2] ある自然数nがある。 このnを和に分解するすべての場合を列挙しなさい。 なお、以下の例のように順列でも組み合わせでもかまわない。 例 n = 4 1 1 1 1 1 1 2 1 2 1 1 3 2 1 1 2 2 3 1 n = 4 1 1 1 1 1 1 2 1 3 2 2 3 1 [3] [3.1] Linux [3.2] gcc4.0 [3.3] C言語 [4] 10月15日23:59 [5] 再帰について習いました
245 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 01:18:06 ] >>244 #include<stdio.h> #define N_MAX 100 int g_result[N_MAX]; void bar(int result_num, int n){ int i; if(n<=0){ for(i=0;i<result_num;i++) printf(" %d", g_result[i]); printf("\n"); return; } for(i=1;i<=n;i++){ g_result[result_num]=i; bar(result_num+1, n-i); } } void foo(int n){ int i; if(n>N_MAX) return; for(i=1;i<=n-1;i++){ g_result[0]=i; bar(1, n-i); } } int main(void){ int n=4; printf("n = %d\n", n); foo(n); return 0; }
246 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 02:55:57 ] じゃあ僕は組み合わせで。 #include<stdio.h> #include<string.h> int partition(int n,int m,char *exp); int main(void){ int i,n,c; do{ printf("nを入力してください。 n="); scanf("%d",&n); c=0; for(i=n;i>0;i--) c += partition(n,i,""); printf("Total:%d\n",c); }while(n != 0); return 0; } int partition(int n,int m,char *exp){ int i,c=0; char ex[100]=""; if(n==m){ printf("%s%d\n",exp,m); return 1; } if(m==0) return 0; if(n>m){ sprintf(ex,"%s%d+",exp,m); for(i=m;i>0;i--) c += partition(n-m,i,ex); return c; } return 0; }
247 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 02:57:17 ] >>245 どうもありがとうございました。
248 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 02:58:05 ] >>246 こちらもどうもありがとうございました。 >>245 ,246 ソースを理解していきたいです。
249 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 11:00:03 ] どなたか >>205 お願いできませんでしょうか・・
250 名前:デフォルトの名無しさん [2008/10/13(月) 12:54:17 ] [1] 授業単元: C [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7781.txt [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン:VB2008 [3.3] 言語: C++ [4] 期限: 10/14まで [5] その他の制限: 特になし。 どなたか、お願いします。
251 名前:デフォルトの名無しさん [2008/10/13(月) 14:09:18 ] >>249 ネットでぱくれ
252 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:34:26 ] 2次方程式ax^2+bx+cの根を計算するプログラムをかきなさい。 という問題です。 //二次方程式の根を計算するプログラム #include <stdio.h> void main () { double a, b, c, d; printf("3つの数字を入力してください"); scanf("%d %d %d", &a ,&b ,&c); d = b*b-4*a*c; printf("二次方程式の根は%d\n",d); } のように書いたのですがすべて答えが同じになってしまいます お願いします。
253 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:36:35 ] %d →%f
254 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 14:38:04 ] >>252 > 2次方程式ax^2+bx+cの根を計算するプログラムをかきなさい。 > > という問題です。 > //二次方程式の根を計算するプログラム > #include <stdio.h> > void main () { > double a, b, c, d; > printf("3つの数字を入力してください"); > scanf("%d %d %d", &a ,&b ,&c); > d = b*b-4*a*c; > printf("二次方程式の根は%d\n",d); > } > > のように書いたのですがすべて答えが同じになってしまいます > お願いします。 > scanf("%d %d %d", &a ,&b ,&c); scanf("%lf %lf %lf", &a ,&b ,&c); > printf("二次方程式の根は%d\n",d); printf("二次方程式の根は%f\n",d);
255 名前:235 [2008/10/13(月) 16:30:13 ] >>238 お礼が遅れてすいません、ありがとうございます。 …しかしながら…自分の説明不足のせいで大変申し訳ないのですが、 問題文中の「辞書順」=「大文字小文字も区別する」ということなのです…。 つまり、 A<a<B<b<C<c<D<d<・・・・・・・・・・・・・<X<x<Y<y<Z<z このように並べ替えたいのです。 >>238 さんのプログラムを参考に自分でももう少し考えてみますが、あまり自信がないので手助けしていただけたら幸いです…。 大変申し訳ないです。
256 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:26:45 ] >>253 >>254 ありがとうございます。 どうやら自分が勘違いしてたようで根は二次方程式の解そのものみたいです。 少し自分でも書きなおしてみましたが教科書には a=0の場合は1次方程式,b=0かどうかをチェックする必要がある。 二次方程式は判別式の符号をチェックする必要があるとかいてありそれがよくわかりません。 よろしくおねがいします。 #include <stdio.h> #include <math.h> void main () { double a, b, c, d; printf("3つの数字を入力してください"); scanf("%lf %lf %lf", &a ,&b ,&c); d = sqrt(b*b-4*a*c); printf("二次方程式の根は%lf,%lf\n",-b+d/2*a,-b+d/2*a); }
257 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:38:24 ] >>256 判別式が負だったらどうすればいいの 解なしと表示するのか虚数まで表示するのか
258 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 17:59:25 ] >>257 虚数表示でいいと思います。
259 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:37:42 ] >>235 >>255 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7782.c main()はあまりいじってない。もっとクールな比較関数を誰か頼む。
260 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:49:40 ] それなんてstrcasecmp
261 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 19:51:29 ] こうするだけでよくね? #include<stdio.h> #include<string.h> #define WORD_NUM_MAX 1000 #define WORD_LEN_MAX 64 int main(void){ char word[WORD_NUM_MAX][WORD_LEN_MAX+1+1], tmp[WORD_LEN_MAX+1], *p; char filename[256]; int i, j, word_num; int icmp; FILE *fp; printf("Input filename : "); scanf("%255[^\n]", filename); if((fp=fopen(filename, "r"))==NULL) return 1; for(word_num=0;word_num<WORD_NUM_MAX;word_num++){ if(fgets(word[word_num], sizeof(word[0]), fp)==NULL) break; if((p=strchr(word[word_num], '\n'))!=NULL) *p='\0'; } fclose(fp); for(i=0;i<word_num;i++){ for(j=0;j+1<word_num-i;j++){ if((icmp = stricmp(word[j], word[j+1])) == 0 && strcmp(word[j], word[j+1])>0 || icmp >0){ strcpy(tmp, word[j]); strcpy(word[j], word[j+1]); strcpy(word[j+1], tmp); } } } for(i=0;i<word_num;i++) puts(word[i]); return 0; }
262 名前:259 mailto:sage [2008/10/13(月) 20:19:53 ] >>260 >>261 strcasecmp()もstricmp()も A<a<B<b<C<c<D<d<・・・・・・・・・・・・・<X<x<Y<y<Z<zの順にならないと思うのだが。 strcasecmp()は、実際にthe The The the the みたいになってうまくいかなかった。 stricmp()も、比較前に文字列を小文字にするから、同じだろう。
263 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 20:40:25 ] 小文字で比較して一緒だったら、大文字も考慮して比較すればいいと思ったけど、だめなのかなぁ。
264 名前:259 mailto:sage [2008/10/13(月) 21:07:41 ] if ( ((icmp = stricmp(word[j], word[j+1])) == 0 && strcmp(word[j], word[j+1])>0) || icmp >0 ) たしかに、論理的にもこれでいけますね。 stricmp()なかったので、作ってやってみました。
265 名前:デフォルトの名無しさん [2008/10/13(月) 21:56:11 ] >>250 の、すごろくをどなたかお願いします。
266 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 21:57:22 ] >>261 The book // 1番目 the apple // 3番目 tHe earth // 2番目 これを並べ替えると the apple // 3番目 The book // 1番目 tHe earth // 2番目 こうなったよ
267 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:17:21 ] >>258 #include <stdio.h> #include <math.h> int main() { double a, b, c, d, x; printf("a^2 * x + b * x + c = 0となるa, b, cを入力してください\n"); scanf("%lf %lf %lf", &a ,&b, &c); if (a == 0) { puts("2次方程式ではありません"); return 1; } b /= a; if (c == 0) { printf("x = %g, 0\n", -b); } else { c /= a; b /= 2; /* x^2 + 2b'x + c = 0の形へ */ d = b * b - c; /* 判別式 */ if (d > 0) { if (b > 0) { x = -b - sqrt(d); } else { x = -b + sqrt(d); } printf("x = %g, %g\n", x, c / x); } else if (d < 0) { printf("x = %g ± %gi\n", -b, sqrt(-d)); } else { printf("x = %g\n", -b); } } return 0; }
268 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 22:18:01 ] C言語による最新アルゴリズム事典には、解の公式をそのまま使うと、 |b| ≒ √(b^2 - 4ac)のとき桁落ちを起こすから、桁落ちしないほうだけ公式で求めて、 残りは解と係数の関係(解α, βとしてαβ = c / a)で求めろって書いてあるからそうした。
269 名前:259 mailto:sage [2008/10/13(月) 22:56:37 ] >>266 のおっしゃる通りでした。 一瞬、そのテストケースもあったのか、と思ったが、 >>[2] 問題文(含コード&リンク):任意の長さの文字列(英字のみ)データ(>>235 ) だから、スペースが入る文字列はテストケースとしては、条件外になる。 しかし、指摘通り今回の問題では、>>261 では、スペースをのぞいてひとつの文字列に見せかけて食わせたとき、大文字優先の原則に従っていなくなりますね。 私は、単語だけと思っていたけど、英字だけの文字列だったのね。 これ以上出ると荒れそうなので、私が出るのは止めておくが、誰か>>259 よりクールな比較関数頼む。
270 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 23:12:12 ] >>250 >>265 ほい、 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7783.txt でも、VB2008じゃないんで… VC6なんて、iostreamとかの .h とかは自分の環境に合わせてくれ それと、ゴール出来ない双六が出来る可能性もあると言えばある
271 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 23:44:10 ] てか、strcmpだけで正しく辞書順になるんじゃね?頭こんがらがってきた\(^o^)/
272 名前:デフォルトの名無しさん mailto:sage [2008/10/13(月) 23:55:22 ] >>271 いやasciiコードだとして英字が A-Zがならんでその次にa-zになるじゃん
273 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 00:22:14 ] でも、strcmpの戻り値は辞書式で比較した値でしょ?? msdn.microsoft.com/ja-jp/library/e0z9k731 (VS.80).aspx 難しく考えなくていいんじゃない??
274 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 00:47:53 ] Order by case insensitive dictionary order,dictionary order. Are you OK?
275 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 00:58:30 ] >>235 >>238 にこれを追加して strcmp を mystrcmp に変更すれば希望通りになる筈 int mystrcmp(const unsigned char *a, const unsigned char *b){ static int table[256], is_table_initialized=0; int i; if(!is_table_initialized){ for(i=0;i<256;i++) table[i]=i*2; for(i=0;i<26;i++) table['a'+i]=table['A'+i]+1; is_table_initialized=1; } for(;*a!='\0';a++,b++) if(*a!=*b) break; return table[*a]-table[*b]; }
276 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 02:04:40 ] >>273 「辞書式順序」 (dictionary order)というのは英和辞典なんかの並び順のことじゃないぞ。 きちんとした定義を持った数学用語。 ja.wikipedia.org/wiki/%E8%BE%9E%E6%9B%B8%E5%BC%8F%E9%A0%86%E5%BA%8F 1文字目が同じなら2文字目の大小で比較し、 2文字目も同じなら3文字目の大小で比較し、……という順序付けのこと。 >>275 なんかももちろん辞書式順序。 strcmpは各文字の大小比較を単純に文字コードの値で比較しており、 それだと>>273 の言うとおりなので、>>255 の要求には沿わないわけ。
277 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 13:19:06 ] どなたか>>162 の問題をお願いできないでしょうか?
278 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 13:23:04 ] >>277 このスレを「すごろく」で検索
279 名前:デフォルトの名無しさん [2008/10/14(火) 15:00:10 ] [1] 授業単元:プログラミング言語 [2] 問題文:直角三角形の直行する2辺の長さ、a、bともに正の整数(n≧0)が与えられた時、斜辺の長さcをプリントするプログラムを書き、数例に対して実行せよ。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C言語 [4] 期限:2008年10月15日まで [5] その他の制限:floatを使えと指示されました。 習い始めたばかりでまったくと言っていいほどわかりません。呆れるほど簡単な問題かもしれませんが、よろしくお願いします!
280 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 15:08:38 ] >>279 俺にも出来そうな問題がきた #include <stdio.h> #include <math.h> int main(void) { int a, b; float c; printf("a = "); scanf("%d", &a); printf("b = "); scanf("%d", &b); c = (float)sqrt(a * a + b * b); printf("\n答え %f\n", c); return 0; } >数例に対して実行せよ。 の意味がわからないので入力値で計算させた
281 名前:デフォルトの名無しさん [2008/10/14(火) 15:22:09 ] >>280 ありがとうございます! もう一つお聞きしてもよろしいですか? 書いていただいたプログラムをこのままコピーしてコンパイルして実行したら未定義のシンボルsqrtとか重大なエラーとか出てきてしまったんですが、 この場合はどうすればよろしいのでしょうか?
282 名前:デフォルトの名無しさん mailto:sage [2008/10/14(火) 15:23:58 ] >>281 gcc -lm hoge.c かな
283 名前:デフォルトの名無しさん [2008/10/14(火) 15:29:34 ] >>282 できました!!本当にありがとうございます!!! こんな見ず知らずの勉強不足クソ野郎にもかかわらず、ご親切に教えていただきまして大変感謝しております。 ありがとうございました!
284 名前:デフォルトの名無しさん [2008/10/14(火) 15:39:34 ] sqrtくらい実装した方がいい
285 名前:デフォルトの名無しさん [2008/10/14(火) 15:47:42 ] たとえばroot(n,c) cのn乗根の作り方 x=n√cとおくとx^n=cとなる。f(x)=x^n-cという関数の根を求めればいい 一般に、f(x)の根はニュートン法で計算できる。 点aでfに接する直線の方程式は、y = f'(a)(x-a) + f(a) これがy=0としてxについてとくと、x = a + f(a)/f'(a) この値を新たにaとしておいて、同様の操作をすると収束すれば解が求まる。
286 名前:デフォルトの名無しさん [2008/10/14(火) 15:56:34 ] コンパイルは通してないがおおかたこんな通りだろう float pow(int n, float c){ int k; float a=1; for( k=0; k<n; k++)a*=c; return a; } float root(int n, float c){ int k; float a=c; for( k=0; k<50; k++) a += (pow(n,a)-c)/(n*pow(n-1,a)); return a; }