1 名前:デフォルトの名無しさん [2008/10/30(木) 07:49:39 BE:113605834-PLT(24065)] あなたが解けない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++の宿題を片付けます 116代目 pc11.2ch.net/test/read.cgi/tech/1222813731/
321 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 10:22:38 ] >>319 そうですね。 strltolは使わないでお願いします。
322 名前:デフォルトの名無しさん [2008/11/06(木) 10:46:05 ] >>318 #include <stdio.h> int main(void) { int i, n; printf("10進⇒16進なら1, 16進⇒10進なら2を入力してください: "); scanf("%d", &i); switch(i) { case 1: printf("10進数を入力してください: "); scanf("%d", &n); printf("入力した数は16進数で %x です\n", n); break; case 2: printf("16進数を入力してください: "); scanf("%x", &n); printf("入力した数は10進数で %d です\n", n); break; } return 0; }
323 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 11:47:27 ] [1] 授業単元:プログラミング [2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7953.txt [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:bcc [3.3] 言語:c [4] 期限:11/10 [5] その他の制限:とくになし よろしくおねがいします
324 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 12:07:30 ] >>323 int kaibun(char str[]){ { int i, n; /* 終端文字 \0 または \n までの文字数を数える */ for(n = 0; str[n] != '\0' && str[n] != '\n'; n++); /* 先頭からの文字と末尾からの文字でひとたび違ったら即 0 を return */ for(i = 0; i < n; i++) if(str[i] != str[n - i - 1]) return 0; /* 最後まで return 0 されなかったら 1 を return */ return 1; }
325 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 12:11:06 ] for(i = 0; i < n; i++) は for(i = 0; i < n/2; i++) で十分だったな
326 名前:738 [2008/11/06(木) 12:23:09 ] [1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 入力した文字の先頭と最後の文字を出力する。 ”終わり”と入力すればプログラム終了。 [3] [3.1] OS:linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C言語 [4] 期限: 2008年11月8日までお願いします。 [5] その他の制限: scanfを使うのではなくgetcharを使用
327 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 13:23:19 ] >>326 マルチバイト文字の処理を要求しているのか
328 名前:324 mailto:sage [2008/11/06(木) 13:28:33 ] >>323 例文よく見てなかった。大文字小文字は区別しないのな 制限なしってことだから、ctype.h の tolower 使って書き換える if(str[i] != str[n - i - 1]) ↓ if(tolower(str[i]) != tolower(str[n - i - 1]))
329 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 13:33:00 ] >>252 ありがとうございました!
330 名前:324 mailto:sage [2008/11/06(木) 14:35:12 ] 何度もすまん。空白も無視しないとダメなんだな int kaibun(char str[]) { int i, n; char buf[MAX_SIZE]; /* 終端文字 \0 または \n までの文字数を数えて空白を除いて buf にコピー */ for(i = 0, n = 0; str[i] != '\0' && str[i] != '\n'; i++) if(str[i] != ' ') buf[n++] = str[i]; /* 先頭からの文字と末尾からの文字でひとたび違ったら即 0 を return */ for(i = 0; i < n; i++) if (tolower(buf[i]) != tolower(buf[n - i - 1])) return 0; /* 最後まで return 0 されなかったら 1 を return */ return 1; }
331 名前:123 mailto:sage [2008/11/06(木) 16:34:15 ] >>123 をお願いできないでしょうか?
332 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:49:14 ] >>324 なんども申し訳ありません ありがとうございます!
333 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 18:58:02 ] >>322 本当に有難う御座いました。 大変助かりました。
334 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:40:49 ] お願いします [1] 配列 [2] 下に示す行列の積を求めて表示するプログラムを作りなさい。 int x[2][3]={{1,2,3},{4,5,6}} int y[3][2]={{1,5},{5,3},{8,1}} 実行結果 35 14 77 41 問 [3] 環境 [3.1] XP [3.2] VC 6.0 [3.3] 言語:C [4] 期限:明日まで
335 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 19:59:36 ] >>331 #include <string> #include <iostream> class Fish {}; class Wakana : public Fish{ protected: std::string name; public: Wakana() : name("ワカナ") { }; void show() { std::cout << name << std::endl; }}; class Tsubasu : public Wakana { protected: std::string name; public: Tsubasu() : name("ツバス") { } void show() { std::cout << Wakana::name << "→" << name << std::endl; }}; class Inada : public Tsubasu { protected: std::string name; public: Inada() : name("イナダ") { } void show() { std::cout << Wakana::name << "→" << Tsubasu::name << "→" <<name << std::endl; };}; class Hamachi : public Inada { protected: std::string name; public: Hamachi() : name("ハマチ") { }; void show() { std::cout << Wakana::name << "→" << Tsubasu::name << "→" << Inada::name << "→" << name << std::endl;}}; class Buri : public Hamachi { protected: std::string name; public: Buri() : name("ブリ") { }; void show() {std::cout << Wakana::name << "→" << Tsubasu::name << "→" << Inada::name << "→" << Hamachi::name << "→" << name << std::endl;}}; int main(){Buri().show(); return 0;}
336 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 20:08:41 ] 入出力関数は?
337 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:02:39 ] 題意がいまいち分からないので継承元の文字列を継ぎ足していく感じに kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7954.cpp クラス名がinabaになっちゃった.
338 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:05:41 ] >>334 上の方に行列の課題なかったか? int ans[2][2] = {0}; int i, j, k; for(i = 0; i < 2; i++) for(j = 0; j < 2; j++) for(k = 0; k < 3; k++) ans[i][j] += x[i][k]*y[k][j]; for(i = 0; i < 2; i++){ for(j = 0; j < 2; j++) printf("%d ", ans[i][j]); printf("\n"); }
339 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 21:12:34 ] [1] 授業単元: 配列を用いた計算 [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7955.txt [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限:11月10日12:00まで [5] その他の制限: 構造体を利用することになっています。 構造体のメンバーは 行のサイズ unsigned int 列のサイズ unsigned int 行列のデータへのポインタ double ** で構成するものとする。 と指定されています。 よろしくお願いします。
340 名前:334 mailto:sage [2008/11/06(木) 21:31:54 ] >>338 ありがとうございます
341 名前:デフォルトの名無しさん mailto:sage [2008/11/06(木) 23:13:24 ] >>316 , 317 ありがとうございます。 >>315 Maxはある程度大きく、それ程厳密な確率を求めているわけではないですので、 316さんの実装で十分です。
342 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:17:42 ] [1] 授業単元: ポインタ配列 [2] 問題文(含コード&リンク): #include <stdio.h> int main(void) { char ??? = { "1.振り込み", "2.預け入れ", "3.残高照会", "4.通帳記録", "5.終了", ??? }; char ???p; p = menu; while(*p){ printf("???\n",???); } 上記の???の場所を適切に埋め、動作を確認する。 [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: VC6.0 [3.3] 言語: C++ [4] 期限: [2008年11月07日10:00まで] [5] その他の制限: よろしくお願いします。
343 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:34:56 ] #include <stdio.h> int main(void) { char *menu[] = { "1.振り込み", "2.預け入れ", "3.残高照会", "4.通帳記録", "5.終了", NULL, }; char **p; p = menu; while(*p){ printf("%s\n", *(p++)); } return 0; }
344 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 00:37:17 ] >>343 動作確認しました。 ありがとうございます! 助かりました。
345 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:05:48 ] [1] 授業単元: C [2] 問題文: (1)自然数nの正の約数が6個あり(1及びn自身を含めて) それらの総数の和が532である時のnの値を求めるプログラム。 (2) nを2桁の偶数としn^2の下2桁がnと同じ時、nの値を求めるプログラム。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: [11月7日8:00まで] [5] その他の制限: 特になし (2)については答えが76と分かっているのですが (1)についてはさっぱりなんです…
346 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:55:20 ] >>345 (1) #include<stdio.h> int main() { int n, c, a, s; for (n = 1; ; n ++) { c = s = 0; for (a = 1; a <= n; a ++) { if (n % a == 0) { c ++; s += a; } } if (c == 6 && s == 532) { printf("%d\n", n); break; } } return 0; }
347 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 01:55:57 ] >>345 すごい力まかせ、最適化の余地あり void main(){ int count ; int buff[6] ; for ( int i = 1 ; i < 532 ; i++ ){ count = 0 ; for ( int j= 1 ; j <= i ; j++ ){ if(i%j==0){ buff[count] = j ; count++ ; if ( count >= 6 ){ break ; } } } if ( count == 6 && buff[5]==i){ if( buff[0] + buff[1] + buff[2] + buff[3] + buff[4] + buff[5] == 532 ){ printf ( "%d\n", i ) ; break ; } } } }
348 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 02:07:12 ] (2) #include <stdio.h> int main(void) { int n, tmp; for(n=10; n<100; n+=2){ if(n == n*n%100) break; } printf("%d\n", n); return 0; }
349 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 04:36:24 ] >>339 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7956.c 動作確認はあまりしてない。とりあえず動く程度。分割コンパイルは適当に。
350 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 04:51:50 ] >>339 同じ学校だね。
351 名前:デフォルトの名無しさん [2008/11/07(金) 06:11:38 ] 突然すみません。getsで何も入力しなかった場合に特定の処理をしたいのですが、 下のif(a==NULL)が動作しないです。どう書けばいいか教えて下さい。 int main(){ char a[256]; gets(a); if(a==NULL){ printf("何か入力して下さい"); } puts(a); } 宜しくお願いします。
352 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 06:41:13 ] a[0]=='\0'
353 名前:351 [2008/11/07(金) 06:57:08 ] >>352 ありがとうございました。
354 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 07:17:14 ] [1] 授業単元: C++ [2] 問題文(含コード&リンク): 上下の画面外から敵を2つ出現させて、中央へ移動。左斜め上、右斜め下へそれぞれ移動し、矢印の方向へ一周回る。 一周回ったら再び、中央へ移動する。こんな感じの動きですwww.dotup.org/uploda/www.dotup.org18140.bmp.html 敵を表示させるところまでいったのですが、どうかお願いします。www.dotup.org/uploda/www.dotup.org18139.zip.html [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: VC2005又はVC2008 [3.3] 言語: C++ [4] 期限: 2008年11月8日18:00まで [5] その他の制限: 構造体でお願いします。説明不足な点など、何かあれば言って下さい。
355 名前:241 mailto:sage [2008/11/07(金) 08:35:49 ] どなたか>>241 を御願いできないでしょうか?
356 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:21:50 ] >>354 クラスは使っていいの?
357 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 10:55:20 ] >>356 使っても大丈夫です。
358 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:02:23 ] >>241 問題文とか一部だけ見せられてもね・・・・
359 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 12:47:47 ] 自分の才能の無さに絶望した。 >>354 恥ずかしすぎるので実行ファイルのみ(DXライブラリ) ttp://www.dotup.org/uploda/www.dotup.org18202.zip.html
360 名前:デフォルトの名無しさん [2008/11/07(金) 12:59:19 ] [1] 授業単元: プログラミング [2] 問題文 神経衰弱の作成 [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン: Visual Studio [3.3] 言語: C [5] その他の制限:行と列を入力し表にする、
361 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 14:08:15 ] >>349 動作確認できました。 ありがとうございます<(_ _)>
362 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 14:09:35 ] 例えば一回出した乱数をaに入れて固定するのはどうしたらいい? 言語はc++です
363 名前:デフォルトの名無しさん [2008/11/07(金) 14:17:19 ] [1] 授業単元: プログラミング [2] 問題文 # 下記のように,二つのベクトルを生成し,それらの内積を計算するプログラムを作成しなさい.ただし,ベクトルの各成分は0〜9の整数型の乱数で,ベクトルの長さは10とする.なお,乱数の生成にはrandを用いよ. kawasaki@orange ~/lectures/2008/C/5$ ./a.exe a = (8, 1, 4, 1, 7, 4, 9, 1, 2, 0) b = (4, 0, 5, 4, 6, 0, 8, 6, 3, 6) The value of the inner product of the two vectors = 182 kawasaki@orange ~/lectures/2008/C/5$ ./a.exe a = (4, 8, 4, 6, 8, 1, 0, 3, 5, 8) b = (8, 6, 4, 1, 6, 0, 4, 6, 1, 0) The value of the inner product of the two vectors = 173 kawasaki@orange ~/lectures/2008/C/5$ ./a.exe a = (8, 7, 3, 8, 8, 3, 8, 8, 3, 1) b = (8, 9, 6, 3, 6, 3, 6, 3, 5, 8) The value of the inner product of the two vectors = 321 kawasaki@orange ~/lectures/2008/C/5$ # 上と同じ計算をするプログラムを,乱数の生成にMersenne Twisterを用いて書け.ヒント:genrand_real2()に適切な値の整数をかけたものを整数型にキャストして,0〜9の整数乱数をつくる. [3] 環境 [3.1] OS: linux [3.2] コンパイラ名とバージョン: [3.3] 言語: C [5] お願いします・・・できれば1時間以内に・・・
364 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 14:24:44 ] >>362 変数に代入すれば?
365 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 14:30:18 ] >>363 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int a[10], b[10], i, sum = 0; srand((unsigned int)time(NULL)); for (i = 0; i < 10; ++i) { a[i]= 0 + (int)(rand() * (9 - 0 + 1.0) / (1.0 + RAND_MAX)); b[i]= 0 + (int)(rand() * (9 - 0 + 1.0) / (1.0 + RAND_MAX)); } printf("a = ("); for (i = 0; i < 9; ++i) { printf("%d, ", a[i]); } printf("%d)\n", a[i]); printf("b = ("); for (i = 0; i < 9; ++i) { printf("%d, ", b[i]); sum += a[i] * b[i]; } printf("%d)\n", b[i]); sum += a[i] * b[i]; printf("The value of the inner product of the two vectors = %d", sum); return 0; }
366 名前:デフォルトの名無しさん [2008/11/07(金) 14:33:59 ] [1] 授業単元: プログラミング [2] 問題文 神経衰弱の作成 [3] 環境 [3.1] OS: XP [3.2] コンパイラ名とバージョン: Visual Studio [3.3] 言語: C [5] その他の制限:行と列を入力し表にする、 できれば夕方あたりまでにおねがいします><
367 名前:デフォルトの名無しさん [2008/11/07(金) 14:39:12 ] >>365 ありがとうございます!
368 名前:デフォルトの名無しさん [2008/11/07(金) 14:57:06 ] >>365 のはarrayを使うとどういった形になりますか?
369 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 16:08:25 ] [1] 授業単元: C,C++、データ圧縮LZ78符合 [2] 問題文:以下に与えたデータ列をLZ78符合で圧縮し、画面に表示するプログラムを作成せよ。 データ列:ABCBCBCDEBCDABCD コンソールアプリケーションで作成すること。 画面には最低限以下のものを出力すること。 【1】与えたデータ列 【2】作成した辞書の一覧 【3】符号化したデータ列 [3] 環境 [3.1] OS: WindousXP [3.2] コンパイラ名とバージョン: VisualStudio2005 [3.3] 言語: C,C++どちらでも可 [4] 期限:2008年11月13日まで [5] その他の制限: 標準ライブラリ可
370 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 16:56:14 ] >>354 struct 座標 { int x, y; }; struct 移動 { 座標 end; // 移動先。この座標まで移動したら、次の方向(next)へ向かって移動する 移動 *next; // 次の移動先へのポインタ }; こんな感じで、画面中央と画面の端の点を結んで、ループごとにちょっとずつ点に移動するのはダメ? 見当違いな事言っていたらごめんね。
371 名前:241 mailto:sage [2008/11/07(金) 17:47:36 ] >>358 すいません、241の問題が課題3でして、この前の課題1,2とそれの解答を下に。 課題1 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7957.zip 課題2 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7958.zip 課題1が1/2の確立で+-1となる記憶パターンを生成するプログラムで、 課題2がシナプスの結合の重みを決定するものです。 説明と資料の不足どうもすみませんでした…。 他にも情報、説明が足りない所があればお伝え下さい。 あと追記ですが、提出期限が11月9日→11月10日に変更になりました。
372 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:04:34 ] >>371 これって正解?それとも自力で解いたやつ? >weight[j][i]=pattern1[i]*pattern1[j];/* 結合の重みの計算*/ >weight[j][i]=weight[i][j]; 課題2回答.txtのこの部分、おかしい気がするんだけど。
373 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:18:00 ] >>371 課題2からしてコンパイルどころかインデントのチェックすら通らんな 例題も、定義によれば重みの対角成分は必ず+1じゃないとおかしいのに、 全部白(-1)になってる。問題に関する資料は全部晒したほうが良いと思われ
374 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:37:50 ] [1] 授業単元:プログラミング [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7959.c ↑のカレンダープログラム(西暦と月を入力するとその月のカレンダーが表示されるもの)を 次のように改造せよ。 ・月のカレンダーではなく一年分のカレンダーを表示させる。 ・daysinyear()とdaysinmonth()でif文ではなくswitch文を使う。 というのと、 フィボナッチ数列を、指定された個数まで求めて表示するプログラムを書け。 ループにfor文を使ったもの、whileを使ったもの、doを使ったものをそれぞれ作ることで プログラムを三つ書く。 [3] 環境 [3.1] OS:WindowsXP [3.2] コンパイラ名: gcc [3.3] 言語: C [4] 期限: 2008年11月10日まで [5] その他:上にあるカレンダープログラムは講師が生徒のレベルに合わせて 作成したものです。 2つになってしまいましたがどうかよろしくお願いします。
375 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:48:53 ] >>366 一応クリアはできた ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7960.c
376 名前:241 mailto:sage [2008/11/07(金) 18:51:32 ] >>372 >>373 もうほんと色々すいません…。講義で使うPDFが重くてラウンジにupできなかったんですが、 違う所にここまでの講義内容のpdf全部上げときます。(第2回〜第5回迄) www1.axfc.net/uploader/He/so/155985.zip DLパスは「123」です。馬鹿学校ですいません…。
377 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 18:57:20 ] >>376 上げてもらった資料まだ目を通してないけど とりあえず対角成分だけ別に設定できるようにしてやってみた 例題と同じ値を入れてみても経過が一致しないww kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7961.txt
378 名前:377 mailto:sage [2008/11/07(金) 18:58:37 ] 例題と同じ値で試してみたい場合は最初のforループ(乱数でpattern生成するところ)を ざっくりコメントアウトすればいい
379 名前:デフォルトの名無しさん [2008/11/07(金) 19:11:46 ] [1] 授業単元:数値計算 [2] 問題文(含コード&リンク): data[n][n]に格納された、n次正方行列の逆行列を求めるプログラムを作成せよ。 対角要素に0に近い要素があっても、正しく求められるように工夫せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C [4] 期限: 今日中 [5] その他の制限: なし お願いします!
380 名前:372 mailto:sage [2008/11/07(金) 20:23:47 ] >>377 俺はお手上げだ。 それ、初期化忘れと、対角成分ってところに代入するのは0じゃね? ってことでこれ。変更箇所に目印を付けてみた。 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7962.txt
381 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 20:37:04 ] >>380 対角成分はテキスト読んだかぎり+1にならない理由が見当たらないが、例題では0を入れているな。 weight は全要素に値が入るんだから初期化不要では? あと、pattern2 の初期値だが、ランダムに「反転する」ならば if(randv > 0.75) pattern2[i] = -pattern1[i]; else pattern2[i] = pattern1[i] みたいな感じにすれば、この場合 25% の確率で反転する。
382 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:24:20 ] [1] 授業単元: プログラミング実習2 [2] 問題文(含コード&リンク): 円柱の半径と高さを実数で入力し,その体積を求めるプログラムを作りなさい -変数はすべてdouble型を用いること -円周率p=3.14159265358979として計算 [3] 環境 Visual C++ [3.1] OS:Windows [3.2] コンパイラ名とバージョン: C++コンパイラ,リンカ [3.3] 言語: C言語 [4] 期限: 2008年11月10日(月)までお願いします。 [5] その他の制限: main関数,文末記号,エスケープシーケンス,printf関数 逐次処理(順次処理)、条件分岐(選択処理)if,if-else,switch、 繰り返し(反復処理)while,do-while,for、演算子の複合演算子(+=,-=,*=,/=,%=) インクリメント(++)デクリメント(--)、scanf関数、アドレス演算子(&)は習いました。 お願いします。
383 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:38:25 ] >>382 ほんとに問題それであってる? #include <stdio.h> main() { double p = 3.14159265358979, r, h; printf("半径: "); scanf("%lf", &r); printf("高さ: "); scanf("%lf", &h); printf("体積: %f\n", p*r*r*h); }
384 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:46:30 ] >>383 問題文はこれだけなので合っているのですが、どうかされましたか?
385 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:49:00 ] 公式と最低限の入出力関数さえ知ってれば何の苦労もなさそうだから 宿題とする価値がないというか何と言うか…
386 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 22:54:53 ] >>385 そうなんですか。 一応、この問題はC言語のテキストの発展問題なんですがそんなに簡単だったんですね。 そんな問題が解らないって本当に自分やばいですね。 何はともあれ、宿題をやって下さって有難う御座いました。 本当に助かりました。
387 名前:デフォルトの名無しさん [2008/11/07(金) 23:06:11 ] [1] 授業単元:Linuxプログラミング [2] 問題文(含コード&リンク): 途中までつくって、コンパイルも出来るようになったのですが、動作が中途半端です。fork(), execvp, waitあたりが理解出来ていないからどこか がおかしいと思うのですが、見て下さい。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7966.c kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7964.txt kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7965.txt [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc 4.1.2 [3.3] 言語: C [4] 期限: 今日中 [5] その他の制限: やろうとしていること: 実行すると、testプロンプトが表示されるので、好きなコマンドを実行すると、結果を表示する。->例えば、test> ls -l -a /tmp/temp.txt exitを入力するまで繰り返し何度でもコマンドを実行出来る。 質問(1)なぜか最初の一回目はexecvpによるコマンド実行結果が表示されません。二回目からは正常に動作するのですが。。 質問(2)exitを入力するまでループにしているのですが、一回入力させれば終了したいのに、複数回コマンドを実行した場合は、exitも複数回入力しなければ 抜けられなくなってしまいました。 質問(3)二回目のコマンド実行時、一回目よりも短いオプションで実行するとなぜか「ls: p/temp.txt: ファイルかディレクトリが見つかりません」とエラーになります。 argv[i]に格納した文字列が途中で切れてしまっているように思われます。 質問(4)存在しないコマンドを入力するとエラーメッセージを出したいのですが、どうすればよいでしょうか。 質問(5)ソース中にシグナルキャッチャーの箇所がありますが、どのように使えばいいのかわかりません。不明確な質問ですが、この文脈で使い方がわかる 場合は教えて下さい。以上、長くなりましたが宜しくお願いします。
388 名前:デフォルトの名無しさん mailto:sage [2008/11/07(金) 23:16:10 ] >>386 悪いが383≠385だ。
389 名前:372 mailto:sage [2008/11/07(金) 23:18:14 ] >>381 すまん、恥ずかしさを胸に吊ってくる
390 名前:377 mailto:sage [2008/11/07(金) 23:30:28 ] >>376 資料に目を通した。 >>389 よくみると重み付き総和の計算で j≠i と小さくw書かれてたから w[i][i] = 0 が正解だわ あと資料にいろいろ小出しにされたヒントを全部反映させといた。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7967.c >>377 は毎回全部のニューロンをもれなく更新してたたために2ステップで ほとんど収束してたけど、ランダムに更新するニューロンを選択する部分作ったら 収束がほどよい感じになった。 NUM_OF_NEURON がニューロン数 NUM_OF_ERRORS を増やすと初期値の乱れ具合が増す。 ほどほどにしないと収束しなくなるw 結構おもしろかったわ
391 名前:377 mailto:sage [2008/11/07(金) 23:41:34 ] 何度もすまね、1か所間違いみっけた if (tmp[i] > 0) printf("■"); else printf("□"); /* neuron_state を tmp にコピーしてから使う */ tmp[i] = neuron_state[i]; これは、printf する前に、for のすぐあとに書かないと表示が狂う for(i = 0; i < NUM_OF_NEURON; i++) { /* neuron_state を tmp にコピーしてから使う */ tmp[i] = neuron_state[i]; if (tmp[i] > 0) printf("■"); else printf("□");
392 名前:383 mailto:sage [2008/11/07(金) 23:56:36 ] >>386 むかし専門学校で講師やってたんだが、scanf 教えたその日に出して 授業中に作らせた課題で、宿題にすらなってなかったんで確認してみた
393 名前:241 mailto:sage [2008/11/08(土) 00:09:19 ] >>390 動作確認しました!ありがとうございました! 絶望してた課題だったので凄いうれしいです;; 多レスでご迷惑お掛けしてすいませんでした><
394 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 01:52:00 ] >>387 初回の fork の前後で cmd->args[0] の内容が違って見えるね cmd->args[i] の領域って、自分で malloc してないで、strtok() に任せてるでしょ 自分で malloc した領域をつかって strtok_r 使ってみたら?
395 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 02:14:04 ] >>354 とりあえず、出題の動きをするものを作った どことなく危険な香りのするプログラムになった www.dotup.org/uploda/www.dotup.org18927.zip.html 出題者の意図がまったくわからないので かなりの手抜きプログラムになっている おそらく出題者の意図とはかけ離れたものであろう気がする というか、何のシステムのないところにいきなりこれをやれって無理があるような 最初にめんどくさい思いをさせて「こうすると楽だよ」的な流れなのか 何か前説があってそれを踏まえた上でやるべき課題なのか・・・・
396 名前:394 mailto:sage [2008/11/08(土) 02:25:45 ] >>387 あー、違うところかもしれん 原因はそこじゃなくて、gets() やってるところだと思う simple_accept_input() のローカル変数 str[] に取り込んでるでしょ strtok(str, " ") とやっているわけだから strtok によって得られるポインタは、 このローカル変数 str[] を参照する。 ローカル変数の寿命はその関数を抜けるまで。 実際 str[] はスタック領域に作られるわけだから、後に関数が実行されたときに 破壊される可能性大。 今回はそれがたまたま fork() 実行時に重なっただけで、fork() 自体によって データロストしてたわけではなさそう(そもそも fork は全データコピーだしね) 普通、ポインタでいろんなとこから参照されるデータを、特定の関数のローカル変数にしまってはいけない。 gets したデータは、main のローカル変数なりグローバル変数なり malloc するなりして不揮発にしておかないと
397 名前:394 mailto:sage [2008/11/08(土) 02:41:38 ] >>387 てなわけで、simple_accept_input() の char str[256] をグローバルにしただけで動くようになった。 (1) str[] をグローバルにすれば解決 (2) 同上 (3) 同上 (4) execvp() の直後に exit(-1); とかやって子プロセスを終了させないと fork_cmd() から返って gets(str) はじめてループになるぞ (5) シグナルで何やりたいかわからんが、signal システムコールでこの関数と シグナル関連付ければ、シグナル発生したときにこの関数に飛んでくる
398 名前:387 mailto:sage [2008/11/08(土) 03:11:24 ] >>397 ありがとうございました。char str[256]とchar *strpをmain関数の前で宣言するようにしました。 初回からきちんと動作するようになりました。それから、子プロセス側ではexecvp後にexit(-1)を 入れるようにしました。(1)、(2)が解決しました。 しかし、これで(3)と(4)も直るはずでしょうか?私の環境ではまだ直りません。。具体的な症状は以下の通りです。 (3)引数の数が前回より減った場合におかしくなる (一回目)test> ls -l -a -s /tmp/temp.txt ---OK (二回目)test> ls -l -a /tmp/temp.txt ---NG ls: p/temp.txt: ファイルかディレクトリが存在しません ※ちなみに引数の数が前回より増える場合は問題ないです。 (一回目)test> ls -l -a /tmp/temp.txt ---OK (二回目)test> ls -l -a -s /tmp/temp.txt ---OK まだどこか修正する箇所がありますでしょうか? (4)存在しないコマンド実行時、コンソールから実行したのと同じようにエラーを表示することは出来ないでしょうか? 例)test> jfodajfoeifji -l -a -l /tmp/temp.txt -bash: jfodajfoeifji: コマンドが見つかりません (5)そうですよね、これだけじゃ何がしたいか不明ですよね。。こちらは、無視して頂いて結構です。
399 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 03:36:41 ] >>398 (3) 原因は、cmd->args[i] の最後の要素に NULL が入っていないこと 。 simple_accept_cmd() 内で if(strp != NULL){ cmd_a->args[i] = strp; cmd_a->num_args++; } とやって cmd_a->args[i] には NULL が入らないようになってるけど、 cmd_a->args[i] = strp; if(strp != NULL){ cmd_a->num_args++; } と順序変えてやればおk (5) コマンドの status を見てやればエラー処理できるでしょ エラーの詳細知りたかったら、子プロセスでないとわからないから execvp(cmd->args[0], cmd->args); printf("Command error:%s\n", strerror(errno)); とでもすれば、strerror で得られる原因が表示される。ファイルが見つからない場合だけ 対処したいんだったら、execvp 直後の errno の値で場合分けを行う。
400 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 03:45:19 ] >>395 業務系じゃありえない魔術過ぎてワロタ これがゲームプログラムって奴なのか いくらなんでもお行儀が悪すぎだろう
401 名前:387 mailto:sage [2008/11/08(土) 03:52:59 ] >>399 解決しました!ありがとうございました。
402 名前:デフォルトの名無しさん [2008/11/08(土) 04:09:43 ] [1] 授業単元:ポインタ [2] 問題文(含コード&リンク): 検索対象文字列と検索文字列を入力して、発見位置と個数を出力する。 ※検索対象文字列は50文字を超えないものとする ※標準ライブラリのstrstr関数を利用すること ※実行例のような出力が得られるようにすること <実行例> 検索対象文字列→AAAAAAAAAAA 検索文字列→AAA 検索結果 AAAAAAAAAAA ********* 9個発見しました [3] 環境 [3.1] OS:Windows [3.2] コンパイラ:Borland C++ Compiler 5.5 [3.3] C [4] 期限:明日 [5] その他の制限:なし ポインタ難しいです・・・この時間までやってましたができませんでした。 どなたかよろしくおねがいします!!
403 名前:デフォルトの名無しさん [2008/11/08(土) 04:13:21 ] 質問なのですが、ここでは問題文が英語の宿題もやって頂けますか?
404 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 04:23:06 ] >>403 何度かそういうのあったよ。
405 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 04:29:47 ] >>402 #include <stdio.h> #include <string.h> int main() { char str[100], needle[50], *p; int i = 0; printf("検索対象文字列を入力:"); scanf("%s", str); printf("検索文字列を入力:"); scanf("%s", needle); printf("検索対象文字列→%s\n", str); printf("検索文字列→%s\n", needle); printf("検索結果\n%s\n", str); p = str; while(strstr(p, needle) != NULL){ if(p == strstr(p, needle)){ i++; printf("*"); } else printf(" "); p++; } printf("\n%d個発見しました\n", i); return 0; }
406 名前:デフォルトの名無しさん [2008/11/08(土) 04:30:45 ] >>403 そうなんですか。それでは英語の問題文のまま載せても大丈夫ですか? それとも和訳したほうが良いですか? あまり自分の英語力に自信ないんで変な和訳になってしまったらと思ってるのですが。
407 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 04:42:37 ] 構わん、載せろ。 多分俺はできないが。
408 名前:デフォルトの名無しさん [2008/11/08(土) 05:24:42 ] >>407 ありがとうございます。それでは載せさせて頂きます。 [1] 授業単元:C++ [2] 問題文: ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7970.txt [3] 環境 [3.1] OS:XP [3.2] コンパイラ名とバージョン: Visualstudio 2005 [3.3] 言語:C++ [4] 期限:2008年11月10日 [5] xtxの中の図は自分が作って物です。図を載せようとしたのですが載せれなかったので。 わかりにくくてすいません。 英語の問題文ですがよろしくお願いします。
409 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 05:39:34 ] >>408 単なる C のプログラムになっちまったが kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7971.txt
410 名前:409 mailto:sage [2008/11/08(土) 05:41:20 ] ぐは 偶数奇数判定逆だった if(*in_val % 2 == 0) ↓ if(*in_val % 2 != 0)
411 名前:デフォルトの名無しさん [2008/11/08(土) 05:57:20 ] >>408 本当に助かりました。ありがとうございました。
412 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 06:00:05 ] うまいこと図を書くなあ。 ただのCだから今までの授業で習ったものと毛色が随分と異なる場合はばれちゃうね。
413 名前:デフォルトの名無しさん [2008/11/08(土) 07:18:54 ] >>412 図が文字化けしてましたね。すいません。 やはりCとC++とではだいぶ異なるんですか? 最近授業でプログラミング始めたばかりなんでわからないことだらけで。
414 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 07:41:14 ] すみません。ポインタが苦手なC初心者です。教えて下さい。パイプ相当の機能を つくろうとしているのですが、まずは前段として以下のようなものをつくりたいです。 例えば「./a.out "cat -n test.c" "grep a"」 と引数を与えてプログラムを実行すると、 str1[0]=cat, str1[1]=-n, str1[2]=test.c, str1[3]=NULL, str2[0]=grep, str2[1]=a, str2[2]=NULL, のように格納させたいです。つまり、argv[1]の内容とargv[2]の内容をそれぞれstrtokで空白で 区切って格納させていき、最後にNULLを入れる。思うように出来ません。宜しくお願いします。
415 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 07:54:07 ] >>413 図はエンコード指定すればだいじょうぶ。 今までの授業で教えてもらったソースコードと雰囲気が似てるならいいよ。 授業でcinとかcoutとか使わなかった?
416 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 07:55:18 ] >>414 pipe や popen 使わずにどうやってパイプ相当の機能を作るのかわからないけど kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7972.txt
417 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 08:11:34 ] シェル使えば標準入力に入ってくるからいいんじゃないの
418 名前:414 mailto:sage [2008/11/08(土) 08:11:58 ] >>416 有り難うございます。popenはわからないのですがpipeを使ってやってみようと思います。 ひょっとして全然とんちんかんなことやっているのかも知れませんがもう少しやってみて 駄目だったらまたご質問させて頂きます。
419 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 08:12:49 ] ってパイプ自体を作ろうとしてるんじゃないよね。 foo | ./a.out ってやりたいだけだよね
420 名前:デフォルトの名無しさん mailto:sage [2008/11/08(土) 08:17:00 ] 作ってみた。でおじゃる、とは言わない(というと出てくるかしら) #include <stdio.h> #include <string.h> int main(int argc, char **argv) { char *str1[10]; char *str2[10]; char **p; p = str1; *(p++) = strtok(argv[1], " "); while ((*(p++) = strtok(NULL, " ")) != NULL); for (p=str1; *p!=NULL; p++) { printf("%s\n", *p); } return 0; } インデント確認用アンカー >>420
421 名前:414 mailto:sage [2008/11/08(土) 08:19:53 ] >>417 >>419 パイプ自体を作ろうとしています。シェルだとcat -n test.c | more と打つところを、./a.out "cat -n test.c" "more"と打たせることで、 forkした親子プロセスでファイルディスクリプタなんちゃらというのを 使って(すみません勉強したてです)処理を渡すようなCプログラムを作ろうとしています。 自分の限界は恐らく1時間前後で見えてくると思いますのでしばしお待ち下さい。