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/
449 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 02:52:06 ] [1] 授業単元:C [2] 問題文 初期設定された任意の整数配列内のデータを,大きい順に並べ換えるプログラム をつくりなさい。ただし,並べ換える部分を関数にして,配列とデータ数を引数として 渡しなさい。例として,次の10 個の整数を格納した配列に適用してみなさい。 static int dd[10] = { 27, 89, 45, 18, 55, 64, 92, 73, 34, 88 }; 出力例: ソート後 = 92 89 88 73 64 55 45 34 27 18 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 2008年11月10日 24:00 [5] その他の制限:次のようなプロトタイプ宣言をもつ関数isort を定義しなさい。 void isort(int *, int); できましたら、C言語の基本的な関数のみでお願いします。
450 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:15:08 ] >>447 関数の名称その他の抽出って感じだろう 構造体を誤認識しないようにしつつ
451 名前:450 mailto:sage [2008/11/09(日) 03:16:42 ] ごめんたしかにかなり面倒ですね どのくらいまでやればいいんだろ
452 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 03:25:55 ] >>449 void isort(int * ary, int nelem) { int i; for ( i = 1; i < nelem; ++i ) { int j; int tmp = *(ary + i); for ( j = i - 1; j >= 0 && *(ary + j) < tmp; --j ) { *(ary + j + 1) = *(ary + j); } *(ary + j + 1) = tmp; } } 適当に作ってみた。
453 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 04:05:41 ] >>448 シンプレックス法だね。でもコードにするのめんどい・・・
454 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 04:06:41 ] >>440 途中までやってみた。 ・ 基本的に改行を取り除くため1つの char 配列に読み込む ・ // は行単位の処理が必要なので読み込み時に処理 ・ /* 〜 */ は未対処 ・ void, int, char, float, double のいずれかとマッチするところを探す → データ型を省略した関数定義は取りこぼす ・マッチしたらそれぞれの直後が ' ' か '\t' か '\n' の条件に絞る ・ '(' が来るまでに ',' か ';' か ')' か '{' か '}' が来たら関数ではない ・以上の条件に合致したら、型名と関数名を出力 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7978.txt
455 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 04:16:44 ] >>452 ありがとうございましt!
456 名前:454 mailto:sage [2008/11/09(日) 05:20:37 ] >>440 short が抜けてたので改良を加えてみた。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7980.txt 検索の順序の関係上お手本とは順番は異なるが、いちおう関数は拾えている
457 名前:354 ◆zeyvxEAaZQ mailto:sage [2008/11/09(日) 05:42:14 ] [1] 授業単元: C++ [2] 問題文(含コード&リンク): 敵が一周回ったら再び中央へ移動して、波を描きながら画面外へ消える。これをクラスを使わないで作って欲しいです。 中央へ移動までは、>>395 さんに作っていただきました。www.dotup.org/uploda/www.dotup.org20438.zip.html 最終的にこのような感じの動きです。www.dotup.org/uploda/www.dotup.org20441.bmp.html あと、敵の当たり判定もお願いします。これがサンプルです。www.dotup.org/uploda/www.dotup.org20440.zip.html [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: VC2005またはVC2008 [3.3] 言語: C++ [4] 期限: ([2008年11月9日22:00まで [5] その他の制限: クラスについてどのようなものかまだ習っていなかったのに、曖昧な返事をしてしまって申し訳ございません。 プログラムに関しては、自機の表示と弾を出すのはできましたが、それ以降ができません。どうかお願いします。
458 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 05:43:08 ] >>457 構造体はつかってもいいですか?
459 名前:デフォルトの名無しさん [2008/11/09(日) 06:16:06 ] [1] 授業単元: C++ [2] 問題文(含コード&リンク):数個のポイントを含むクラスポリゴンを定義しなさい。 (a) デストラクター・コピーコンストラクター・アサインメントオペレーターを作成し、クラスを定義しなさい。ディフォルトコンストラクターは空のポリゴンを作成すると仮定しなさい。 (b)Pointクラスがプライベートメンバー、また、(x,y)を返すコンストラクタPoint(int, int)を持つように変更しなさい。そうすることによってポリゴンクラスがコンパイルしなくなります。問題点を発見し、修正しなさい。 (一応骨組みは作ってみました。) class Point { public: float x; float y;} class Polygon { Point * points; //the points int size; //number of points public: Polygon() {...}; Polygon(const Point * pts, int n) {...}; Point getPoint(int n)const { //n番目のポイントを返す} void setPoint(const Point& p, int n) { //sets the nth point} int getSize()const { return size;}}; [3.1] OS: linux redhat [3.2] コンパイラ名とバージョン: VC2005またはVC2008 [3.3] 言語: C++ [4] 期限: ([2008年11月11日22:00まで [5] その他の制限:ポリゴンを作成するプログラムを作る課題を出されました。 日本の皆さまのお力をお借りしたく、投稿させて頂きます。 上の骨組みで作成することが、条件として出されました。 よろしくお願いいたします。
460 名前:デフォルトの名無しさん [2008/11/09(日) 07:49:14 ] [1] 授業単元:プログラミング [2] 問題文(含コード&リンク): void Wa(int a,int b); …2つの引数の和を計算し、結果を表示する(xとyの和) int abs_Sa(int a, int b); …2つの引数の差を計算し、その絶対値を返す(xとyの差の絶対値) double Heikin(int a,int b, int c, int d int e); …5つの引数の平均値を返す(num[5]の平均値) このような演算を行う関数をそれぞれ定義し、下記のプログラムに処理を追加せよ #include<stdio.h> void Wa(int a,int b); int abs_Sa(int a, int b); double Heikin(int a,int b, int c, int d int e); int main(void){ int k,x,y,num[5]={19,51,100,32,6}; double z; printf("xを入力してください:") scanf("%d",&x); printf("yを入力してください:") scanf("%d",&y); /* これ以降に処理を追加する */ [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: Visual stdio 2005 [3.3] 言語: C [4] 期限: 11/11 18:00 [5] その他の制限: 関数習いたてです。よろしくお願いします
461 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 08:35:36 ] >>460 main 残り printf("x + y = "); Wa(x, y); printf("\n"); k = abs_Sa(x, y); printf("|x - y| = %d\n", k); z = Heikin(num[0], num[1], num[2], num[3], num[4]); printf("average of %d, %d, %d, %d, and %d = %f\n", num[0], num[1], num[2], num[3], num[4], z); return 0; 関数 void Wa(int a, int b) { printf("%d", a + b); } int abs_Sa(int a, int b) { if (a >= b) return a - b; else return b - a; } double Heikin(int a, int b, int c, int d, int e) { return (a + b + c + d + e) / 5.0; }
462 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 09:35:58 ] [1] 授業単元: プログラミング [2] 問題文(含コード&リンク): 長くなったので↓にアップします。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7981.txt [3] 環境 [3.1] OS: Windows XP [3.2] コンパイラ名とバージョン: VC2005またはVC2008 [3.3] 言語: c++ [4] 期限: 11月12日 [5] その他の制限: for文、if文、配列等まで習いました。よろしく御願いします。
463 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 10:09:10 ] [1] 授業単元:演習 [2] 問題文: 数値が何(バラバラ)行2列でかかれた複数のファイルがあり それぞれのファイルを読み込み、表示させるプログラムを書きなさい。 何行かはファイルを開かないとわからないのでプログラムで行数をはかる。 [3] 環境 [3.1] OS:LINUX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語:C [4] 期限:2008年11月9日
464 名前:460 [2008/11/09(日) 10:10:41 ] >>461 ありがとうございます、助かりました
465 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 10:58:28 ] >>462 メインのループの部分だけ int pos = 0; for(i = 0; i < 20; i++) { x = rnd(); if (x < 0.3) { pos--; printf("左に進みました。"); } else { pos++; printf("右に進みました。"); } printf("現在位置 "); if(pos > 0) printf("右に %d ", pos); else if(pos < 0) printf("左に %d ", pos); else if(pos > 0) printf("原点"); printf("です。\n"); }
466 名前:465 mailto:sage [2008/11/09(日) 11:04:45 ] ちょっと読み違えてたので訂正 double x; int i, pos = 2; char *place[] = {"盗賊", "湖", "入り口", "森", "宝"}; srand((unsigned int)time(NULL)); for(i = 0; i < 20; i++) { x = rnd(); if (x < 0.3) { pos--; printf("左に進みました。"); } else { pos++; printf("右に進みました。"); } if(pos >= 4){ printf("宝を見つけました。"); pos = 2; } else if (pos <= 0){ printf("盗賊に会いました。"); pos = 2; } printf("現在位置 %s です。\n", place[pos]); }
467 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 12:53:26 ] >>466 ありがとうございました!
468 名前:デフォルトの名無しさん [2008/11/09(日) 13:16:10 ] [1] 授業単元:数値計算法1 [2] 問題文(含コード&リンク): gyoretu[n][n]に格納された、n次の行列の逆行列を求め、出力するプログラムを作成せよ。 対角要素に0や0に近い要素があっても、正しく答えが求められるように工夫せよ。 [3] 環境 [3.1] OS: Windows [3.2] コンパイラ名とバージョン: VC 6.0 [3.3] 言語: C [4] 期限:明日 [5] その他の制限: なし お願いいたします!!
469 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:18:27 ] >>463 ファイル読んでその場で表示するだけなら行数とか考える必要ないんだけど いったん全部読み込んだあとにまとめて表示するようにした方が良い? #include <stdio.h> #define MAX 256 int main(int argc, char **argv) { FILE *fp; double a, b; while(argc-- > 1){ fp = fopen(argv[argc], "r"); if(fp == NULL){ fprintf(stderr, "Cannot open %s\n", argv[argc]); continue; } while(fscanf(fp, "%lf %lf", &a, &b) != EOF) printf("%f %f\n", a, b); fclose(fp); } return 0; }
470 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 13:18:52 ] ライブラリ使ったほうが正確
471 名前:デフォルトの名無しさん [2008/11/09(日) 14:43:22 ] >>415 返信遅れてすいません。 cinとcoutはやりました。 でも授業が難しいのでなかなか理解できないんですよね。。。
472 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:00:33 ] [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] その他の制限: 標準ライブラリ可 よろしくお願いします。
473 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 15:13:53 ] >>458 構造体は使っても大丈夫です。
474 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:17:50 ] [1] 授業単元:C言語 [2] 問題文(含コード&リンク): 入力した値までの素数を列挙させるプログラムを作成せよ。 例)整数を入力:5 2は素数です 3は素数です 5は素数です [3] 環境 [3.1] OS: WindowsXP [3.2] コンパイラ名とバージョン: VisualStudio2005 [3.3] 言語:C/C++/どちらでも可 [4] 期限: 2008年11月12日まで [5] その他の制限:for文まで。できるだけ簡潔に。 よろしくお願いします。
475 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:32:24 ] >>474 なにも考えないDQNメソッドだけど #include <stdio.h> int main() { int i, j, n; printf("整数を入力:"); scanf("%d", &n); for(i = 2; i <= n; i++) { for(j = 2; j < i; j++){ if (i % j == 0) break; } if (j >= i) printf("%d は素数です\n", i); } return 0; }
476 名前:学生 [2008/11/09(日) 16:46:51 ] 1から1000までの正の整数において、13の倍数の個数を出力するプログラム よろしくお願いします
477 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:47:53 ] >>456 ありがとうございます! 面倒だったようで申しわけないです
478 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:48:32 ] >>476 #include <stdio.h> main(){ printf("%d\n", 1000/13); }
479 名前:学生 [2008/11/09(日) 16:48:35 ] 訂正 マイクロソフトビジュアルベーシックC++で作成
480 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 16:50:17 ] >>479 >>476 #include <stdio.h> int main(){ printf("%d\n", 1000/13); return 0; }
481 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 18:01:36 ] >>472 C++です。VS2008で確認。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7982.txt
482 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 18:51:28 ] [1] 授業単元: C言語 [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7983xt [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン: [3.3] C [4] 期限:11月10 [5] その他の制限:出来るだけ簡単に よろしくおねがいします!!!
483 名前:482 mailto:sage [2008/11/09(日) 18:52:44 ] URL訂正します kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7983.txt
484 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 19:11:25 ] >>483 #include <stdio.h> int main(int argc, char *argv[]) { unsigned int i, n; char str[21]; puts("符号なし32ビット整数を入力してください。"); scanf("%u", &n); printf("%u が格納されている先頭アドレスは 0x%p です。\n", n, &n); puts("20文字以内の文字列を入力してください。"); scanf("%s", str); printf("%s が格納されている先頭アドレスは 0x%p です。\n", str, str); for (i = 0; str[i] != '\0'; i++) { printf("%c が格納されているアドレスは 0x%p です。\n", str[i], &str[i]); } return 0; }
485 名前:457 ◆zeyvxEAaZQ mailto:sage [2008/11/09(日) 21:08:03 ] 期限を11月9日23:30までにするので>>457 をどうかお願いします。
486 名前:デフォルトの名無しさん [2008/11/09(日) 22:53:54 ] 1] 授業単元:プログラム [2] 問題文(含コード&リンク):遺伝的プログラムで木構造に新しいノードを追加しなさい。 [3] 環境 [3.1] OS:Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語:C [4] 期限:2008年11月11日まで [5] その他の制限: お願いします。
487 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 22:59:03 ] >>486 遺伝的プログラムってだけ言われても困るぞwwwwwwww 他になんか情報はないのか
488 名前:デフォルトの名無しさん [2008/11/09(日) 23:17:23 ] >>487 例えばどういう情報があればいいですか?
489 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 23:22:37 ] >>485 cで書けと?
490 名前:デフォルトの名無しさん mailto:sage [2008/11/09(日) 23:23:59 ] >>475 ありがとうございました。助かりました。
491 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 00:34:44 ] [1] 授業単元:C [2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7984.txt [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:bcc [3.3] 言語:C [4] 期限:11/11 [5] その他の制限:特になし よろしくお願いします
492 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 00:43:01 ] 宿題丸投げするつもりはないんだが質問させてくれないか bccコンパイラを使っているんだ。 プログラムの実行時間測定に #include <sys/time.h> を参照したいんだがtime.hがどうも入ってないみたいなんだ。 標準搭載されてる関数で少数点以下まで実行時間を計れるものってないかな?
493 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 00:52:26 ] #include <time.h> じゃねーの?
494 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 00:59:37 ] #include <sys/timeb.h> だと思うが、Linux使いなので詳しくはしらないが struct timeb now; int millisec; ftime(&now); millisec = now.millitm; /* これがミリ秒らしい */ こんな感じだと思う。 詳しくは、ググるかヘッダファイル読め。
495 名前:493 mailto:sage [2008/11/10(月) 01:01:04 ] 俺がいってたのは #include <time.h> のclock()ね
496 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 01:02:14 ] >>493 俺の探し方がアホなだけかもしれんが、#include <time.h>だと少数点以下まで測れる方法が見つからなかったんだorz >>494 ありがとう 参考にする
497 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 01:04:32 ] >>495 ΣΣclock!! 見落してた マジサンキュ やってみる
498 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 01:26:15 ] >>489 C++でお願いします。 10日の18:00まででいいのでどうかお願いします!
499 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 01:27:58 ] >>498 クラスを使うなと書いてあるが? そこだけ関数?
500 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 01:33:51 ] [1] 授業単元:C言語 [2] 問題文 初期設定された任意の文字列の順序を,逆に並べ換えるプログラムをつくりなさ い。ただし,並べ換える部分を関数にして,関数には文字列を引数として渡しなさい。 文字列の例としては, char str[] = "My name is Tarou Tanaka"; のように自分の名前を用いてみなさい。 [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限: 2008年11月12日 24:00 [5] その他の制限: ・次のようなプロトタイプ宣言をもつ関数reverse を定義すること。 void reverse(char *); ・引数で渡された文字列自身が逆順になること。 C言語の基本関数のみでよろしくお願いします。
501 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 01:37:34 ] >>499 構造体はつかっていいらしいかららクラスと差し替えちゃえばいいんじゃね
502 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 01:57:40 ] >>499 クラスは使わず、構造体でお願いします。
503 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:10:50 ] >>502 ほんとうにいいんだな 構造体にコンストラクタとデストラクタとメンバ関数つけられるぞ?
504 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:11:50 ] >>500 void reverse(char * s) { size_t len = strlen(s); /* 文字列の長さ */ size_t half_len = len / 2; /* 文字列の半分の長さ */ size_t i; for ( i = 0; i < half_len; ++i ) { char tmp = *((s + len - 1) - i); *((s + len - 1) - i) = *(s + i); *(s + i) = tmp; } } こんなのでいいかな。
505 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:21:28 ] [1] 授業単元:Cプログラミング [2] 問題文: #include <stdio.h> #define SIZE 10 int main(void) { FILE *infile; int i, data[SIZE]; infile = fopen("sample61a.txt", "r"); if(infile == NULL) { printf("入力ファイルを開くことができません\n"); return 0; } for(i = 0; i < SIZE; i ++ ) { fscanf(infile, "%d", &data[i]); } for(i = 0; i < SIZE; i ++ ) { printf(" %3d", data[i]); } printf("\n"); return 0; }
506 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:21:58 ] 505の続きです。 このプログラムを改造し、データの値を奇数と偶数に分けそれぞれ合計値・個数・平均値を出力せよ。 その際奇数データの数、偶数データの数がそれぞれゼロの場合は平均値を求めないようにせよ。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ:Microsoft Visual C++ 6.0 [3.3] 言語:C [4] 期限:11月11日 締め切りが急ですみません。 さっぱりわからなくなってしまったので、良ければよろしくお願いします。
507 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:39:50 ] >>504 ありがとう!
508 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:45:05 ] >>505 #include <stdio.h> #define SIZE 10 int main(void) { FILE *infile; int i, data[SIZE], sum[2]={0}, num[2]={0}; char *str[2] = {"奇数", "偶数"}; infile = fopen("sample61a.txt", "r"); if(infile == NULL) { printf("入力ファイルを開くことができません\n"); return 0; } for(i = 0; i < SIZE; i ++ ) { fscanf(infile, "%d", &data[i]); sum[data[i]%2] += data[i]; num[data[i]%2]++; } for(i = 0; i < SIZE; i ++ ) { printf(" %3d", data[i]); } printf("\n"); for(i=1; i>=0; i--){ printf("%s:合計値%d, 個数%d個", str[i], sum[i], num[i]); if(num[i] > 0) printf(", 平均値:%f", (float)sum[i] / (float)num[i]); printf("\n"); } return 0; }
509 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:46:41 ] あ、奇数と偶数の表示が逆
510 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:52:08 ] [1] 授業単元: OS [2] 問題文(含コード&リンク): ITIMER_REAL, ITIMER_VIRTUAL, ITIMER_PROF タイマーを用いて、プロセスのプロセッサ利用状況を測定するソフトウェアを実装する。 出力には、実行の経過時間、プロセッサ時間、ユーザ空間時間、カーネル空間時間が含むこと。 詳細 (1)すべての時間はミリ秒の分解精度を持つこと (2)1秒毎にsignalを発生させ、経過した秒数をカウントする (3)再帰を用いたFibbonacci数を計算するプログラムを子プロセスとした実行結果をしめすこと [3] 環境 [3.1] OS: Linux Kernel 2.6.x [3.2] コンパイラ名とバージョン: gcc4.x [3.3] 言語: C言語 [4] 期限: 2008年11月12日12:00 [5] その他の制限: sigactionやitimervalを用いて実装するのが今回の目的です。時間を計るものはできたのですが、ミリ秒単位の分解精度をどうやって出すのかがわかりません。よろしくお願いします。
511 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:54:37 ] 510です。 稚拙ながらもソースコードを示します。 #include <stdio.h> #include <stdlib.h> #include <errno.h> #include <signal.h> #include <unistd.h> #include <sys/time.h> #include <sys/types.h> #include <sys/wait.h> int realSec = 0; int profSec = 0; int virtualSec = 0; static void myHandler(int s) { int errSave; if (s == SIGALRM) realSec++; else if (s == SIGVTALRM) virtualSec++; else if (s == SIGPROF) profSec++; } static int setupInterrupt(void) { struct sigaction act; act.sa_handler = myHandler; act.sa_flags = 0; return (sigemptyset(&act.sa_mask) == sigaction(SIGALRM,&act, NULL) == sigaction(SIGVTALRM,&act, NULL) == sigaction(SIGPROF, &act, NULL) == 0) ? 1 : 0; } static int setupitimer(void) { struct itimerval value; value.it_interval.tv_sec = 1; value.it_interval.tv_usec = 0; value.it_value = value.it_interval; return (setitimer(ITIMER_PROF,&value, NULL) == setitimer(ITIMER_VIRTUAL,&value, NULL) == setitimer(ITIMER_REAL,&value, NULL) == 0)? 0: -1 ; }
512 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 02:56:23 ] 510です。続きです。 int main(int argc, char** argv) { pid_t child, retVal; struct itimerval real, virtual, profile; int status; if (setupInterrupt()) { perror("Failed to set up handler for SIGPROF"); return 1; } if (setupitimer() == -1) { perror("Failed to set up the ITIMER_PROF intervaltimer");return 1; } if (argc < 2){ fprintf (stderr, "Usage:%s command\n", argv[0]);return 1; } if ((child = fork()) == -1) { perror("Failed to fork"); return 1; } if (child == 0) { // child code execvp(argv[1], &argv[1]); perror("Child failed to execvp the command"); return 1; } else { // parent code while((retVal = waitpid(-1, &status, WNOHANG)) != child); getitimer(ITIMER_REAL, &real);getitimer(ITIMER_PROF, &profile);getitimer(ITIMER_VIRTUAL, &virtual); //ここも要修正 printf("real = %d.%ld", realSec, 1000000 - real.it_value.tv_usec); printf(" virtual = %d.%ld", virtualSec, 1000000 - virtual.it_value.tv_usec); printf(" profile = %d.%ld\n", profSec, 1000000 - profile.it_value.tv_usec); } } よろしくお願いします。
513 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 03:19:23 ] [1]授業単元:C言語 [2] 問題文:次のことを行うプログラムを,for文を用いて作成しなさい。 10個の要素をもつ整数配列dataを初期化して宣言する。 配列要素の中の最大値と最小値を出力しなさい。 なお,配列要素の値として,すべて負のものがあるデータも試してみること。 [3] 環境 [3.1] OS:Win [3.2] コンパイラ名とバージョン:VC++ 6.0 [3.3] 言語:C言語 [4]期限:なし 初歩的な問題で申し訳ないですが、よろしくお願いします。
514 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 03:30:10 ] >>513 #include <stdio.h> #define SIZE 10 int main() { //int data[SIZE] = {83,28,35,84,43,21,8,51,2,12}; int data[SIZE] = {-83,-28,-35,-84,-43,-21,-8,-51,-2,-12}; int min, max; int i; min = max = data[0]; for (i = 1; i < SIZE; i++) { if (data[i] > max) { max = data[i]; } else if (data[i] < min) { min = data[i]; } } printf("min = %d, max = %d\n", min, max); }
515 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 05:45:39 ] >>503 はい、お願いします。
516 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 05:47:28 ] 追記 >>503 クラス使わないで、構造体で作って動けば問題ないのでお願いします。
517 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 08:36:06 ] [1] 授業単元: プログラミング [2] 問題文(含コード&リンク): kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7985.txt [3] 環境: [3.1] WindowsVista [3.2] Borland C++Compiler [3.3] C言語 [4] 期限: 2008年11月10日23:59まで
518 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 09:02:31 ] >>514 ありがとうございます!
519 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 09:12:11 ] >>517 #include <stdio.h> void main(void){ int i,t;t=0; for(i=1; i<=100; i++){if(i %3 == 0){printf("%d \n" ,i);t++;}} printf("\n total %d\n",t);}
520 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 11:43:48 ] >>511 どうでもいいところかもしれんが return (sigemptyset(&act.sa_mask) == sigaction(SIGALRM,&act, NULL) == sigaction(SIGVTALRM,&act, NULL) == sigaction(SIGPROF, &act, NULL) == 0) ? 1 : 0; これ、意図したとおりに動くの? A == B は A と B が等しかったら 1 を返すよ 一つでも 0 以外のを返したら、とやりたいんだったら && とか使うべし
521 名前:デフォルトの名無しさん [2008/11/10(月) 13:44:10 ] [1] 授業単元:データ構造とアルゴリズム [2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7986.txt [3] 環境 [3.1] OS: UNIX [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 11月12日 [5] その他の制限: 特になし よろしくお願いします。
522 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 14:06:25 ] >>521 該当箇所だけ。push, pop はもうできてるんでしょ? while(!isempty()) { y = pop(); x = pop(); if (map[y][x] == ' ') { map[y][x] = '*'; /*ここを適切に埋める(3) */ // up push(x); push(y - 1); // down push(x); push(y + 1); // left push(x - 1); push(y); // right push(x + 1); push(y); /*塗るたびにマップを表示する */ for(y = 0; y < 7; y++) printf("%s\n", map[y]); printf("\n"); } }
523 名前:374 mailto:sage [2008/11/10(月) 14:22:12 ] すいません誰か>>374 をお願いします。もう締め切りも近いのでどうか頼みます
524 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 14:28:40 ] >>508 ありがとうございます!助かりました!
525 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 14:37:57 ] >>523 1年分ってのは、入力した年の1月から12月を表示すればよいのか 入力した月から翌年の同月-1 を表示すればよいのか 入力した月を含む前後6か月を表示すればよいのか
526 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 15:02:16 ] >>523 カレンダーは >> 525 の返答次第 フィボナッチその1 #include <stdio.h> int main() { int i, f0 = 0, f1 = 1, f2 = 1, num; printf("num:"); scanf("%d", &num); for(i = 0; i < num; i++){ printf("f[%d]:%d\n", i, f0); f2 = f1 + f0; f0 = f1; f1 = f2; } return 0; }
527 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 15:02:58 ] >>523 フィボナッチその2 #include <stdio.h> int main() { int i, f0 = 0, f1 = 1, f2 = 1, num; printf("num:"); scanf("%d", &num); i = 0; while(i < num){ printf("f[%d]:%d\n", i, f0); f2 = f1 + f0; f0 = f1; f1 = f2; i++; } return 0; }
528 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 15:03:33 ] >>523 フィボナッチその3 #include <stdio.h> int main() { int i, f0 = 0, f1 = 1, f2 = 1, num; printf("num:"); scanf("%d", &num); i = 0; do{ printf("f[%d]:%d\n", i, f0); f2 = f1 + f0; f0 = f1; f1 = f2; i++; } while(i < num); return 0; }
529 名前:初心者 [2008/11/10(月) 15:59:23 ] [1] 授業単元: [2] 問題文(含コード&リンク): ★下記の仕様を満たすプログラムをC言語で作成しなさい. 【仕様】日数計算プログラム ▼今日の日付と生年月日を入力すると,今日が生年月日から数えて何日目にあたるかを表示する.西暦・月・日をスペースで区切って入力する. ▼この場合,「うるう年」を考慮しなければならない.「うるう年」の条件は, @西暦が4で割り切れる. Aただし,西暦が100で割り切れる年は除く. Bただし,西暦が400で割り切れる年は含める. ▼「今日は、あなたが生まれた日から数えて〜日目です。」と表示する. ▼計算式は,(西暦1年1月1日から今日までの日数)−(西暦1年1月1日から生年月日までの日数)を使えばよい. ▼生年月日が今日の日付より後になっているときは,「生年月日が今日の日付より後になっています!」とエラーメッセージを表示する. ▼最低限,次の関数を使うこと. @main関数(これは当たり前ですが) A入力された値が計算に適切な値かをチェックする関数(4月31日などありえない日付を入れると,「年月日が正しい範囲にありません」と表示する) B日付を計算する関数 ▼日付の入力やメッセージの表示はmain関数で行うこと(ポインタに関する課題なので参照渡しを使うこと). [3] 環境 [3.1] OS: Windows xp [3.2] コンパイラ名とバージョン: 分からないです。 [3.3] 言語: C言語 [4] 期限: 今週中ぐらい [5] その他の制限: 繰り返し文、条件判断文、ポインタを使ってお願いします。 初心者なので、初心者にも分かるようなプログラムをお願いします。
530 名前:デフォルトの名無しさん [2008/11/10(月) 16:09:07 ] 課題が出たんですが、まったく手に負えません、、、、、 ぜひ、教えてください! 今、XPでvisualを使ってます。 『課題』 円周率πの値を近似式 π≒4Σ(←n=0から100で)(ー1)^n×(2n+1)^(−1)×{(0.5)^(2n+1)+(3)^(ー2nー1)} を用いて、小数第8位まで正しい値(3.14159265)を出力し、 そのπの値を用いて入力された数値εに大して、次の不等式を満たす最小の自然数Nを求めるプログラムを作れ。 |(π^2/6)-Σ(←k=1からN)k^(-2)|<ε
531 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 16:32:39 ] viの正式名称なんて久しぶりに見たな
532 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 16:45:16 ] >>530 こんなんでいい? #include <stdio.h> #include <math.h> int main (void) { int i; double pi, sum, eps; sum = 0.0; for(i=0; i<=100; i++){ pi = 4.0 * (sum += pow(-1, i) / (2*i + 1) * (pow(0.5, 2*i+1) + pow(3, -2*i-1))); } printf("π≒%.8f\n", pi); printf("ε:"); scanf("%lf", &eps); i = 1; sum = 0.0; while(fabs(pi*pi/6 - (sum += pow(i, -2))) >= eps) i++; printf("N = %d\n", i); return(0); }
533 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 17:06:14 ] 誰か>>457 をお願いします。 期限は今日中で良いのでお願いします!
534 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 17:48:20 ] printf("ε:"); かわいいな
535 名前: ◆25LbU5YSxg mailto:sage [2008/11/10(月) 18:09:49 ] [1] 授業単元:プログラミング演習 [2] 問題文: プログラム1を改良し、データをファイルから読み込みつつ小さい順にソートして格納するプログラムを作成せよ、。 手順を以下に示す。 1.cell構造体へのポインタとして、struct cell *new、*start、*p1、*p2;の4つを準備し、それぞれNULLで初期化する。 2.データファイルからデータ数を読み込む。 3.データを1つ読み込み、cell構造体を作成してnewにセットした後、その構造体に格納。 ・はじめてのデータであれば、ポインタstartとp1をnewにセット。 ・2つ目のデータであれば、p2をnewにセットし、p1が示すリスト要素(構造体)の次に追加接続する。 ただし、2つ目のデータが1つ目のデータよりも小さい場合には、p1とp2の指す構造体内のデータを入れ替える。 もしくはリスト要素(構造体)自体の位置を入れ替えポインタをセットし直す必要があることに注意。 ・3つ目以降のデータであればリスト先頭から順に走査を行う。この際、p1、及びp2をそれぞれ1つずつリスト内の次の要素に進めてゆく。 。読み込まれたデータが、リスト先頭要素(構造体)の持つ値より小さい場合には、新規作成された構造体newをリスト先頭に追加し、ポインタstartをnewにセットする。 。リスト途中で、p1には読み込まれたデータより小さい値、p2には読み込まれたデータより大きい値となる場所が見つかれば、この間に新規作成された構造体newを挿入する。 。リスト最後尾まで読み込まれたデータより大きい値が見つからなければ、新規作成された構造体newを最後尾に追加する。 4.3をデータ入力数だけ繰り返す。 5.全てのデータを読み込み終えたら、リスト先頭から順にデータを出力する。 num-data.txt 5 23 43 67 14 9
536 名前: ◆25LbU5YSxg mailto:sage [2008/11/10(月) 18:15:43 ] プログラム1 #include<stdio.h> struct cell{ int data; struct cell *next; }; int main(void){ int num; struct cell *new, *start, *ptr; new = NULL; start = NULL; ptr = NULL; while(1){ scanf("%d",&num); if(num == -1){ break; } new= (struct cell *)malloc(sizeof(start)); if(new == NULL){ fprintf(stderr,"Error!:malloc short(struct cell).\n"); } new->data = num; new->next = NULL; if(ptr == NULL){ start = new; ptr = new; }else{ ptr->next=new; ptr = new; } } ptr = start; while(ptr != NULL){ printf("%d\n",ptr->data); ptr=ptr->next; } return 0;} [3] 環境 [3.1] OS: Linux[3.2] コンパイラ名とバージョン:gcc [3.3] 言語: C [4] 期限:2008年11月21日17:00まで
537 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 18:18:32 ] >>529 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7988.txt 参照渡しをする合理的理由がみあたらないので抜きで作った。 どっか適当に変えてくれ
538 名前:374 mailto:sage [2008/11/10(月) 19:36:44 ] >>525 >>526 カレンダーは入力した年の1月から12月を表示するものでよかったです。 >>526-528 助かります。本当にありがとうございます
539 名前:525 mailto:sage [2008/11/10(月) 20:03:17 ] >>538 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7989.txt
540 名前:374 mailto:sage [2008/11/10(月) 20:27:03 ] >>539 もうなんとお礼を言えばよいのかわかりません。本当にありがとうございました。
541 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 21:12:16 ] >>535 #include<stdio.h> #include<stdlib.h> struct cell { int data; struct cell *next; }; int main(void){ int num; struct cell *new, *start, *p1, *p2; new = start = p1 = p2 = NULL; while (1) { scanf("%d", &num); if (num == -1) break; new = (struct cell *) malloc(sizeof(start)); if (new == NULL) { return 1; } new->data = num; new->next = NULL; for(p1=start,p2=NULL; (p1) && new->data > p1->data; p2=p1, p1=p1->next); if(p2){ p2->next = new; new->next = p1; }else{ new->next = start; start = new; } } for (p1=start; (p1); p1=p1->next) { printf("%d\n", p1->data); } return 0; }
542 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 22:01:28 ] [1] 授業単元:プログラミングC演習 [2] 問題文(含コード&リンク):kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7991.txt [3] 環境 [3.1] OS: Unix [3.2] コンパイラ名とバージョン: gcc(versionは不明 [3.3] 言語: C [4] 期限: 2008年11月13日(木曜日)12:00まで [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) ・ポインタをメインに使用してください よろしくお願いします
543 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:11:51 ] [1] 授業単元:プログラミング [2] 問題文(含コード&リンク) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7992.txt [3] 環境 [3.1] OS: Linux [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C [4] 期限: 2008年11月12日 [5] その他の制限: よろしくお願いいたします。
544 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:14:37 ] >>542 malloc は ok なの? 最大長とか単語数は別プログラムで調べるんだったらいいけど、 一度にやるんだったら必ず必要だよ
545 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:22:34 ] >>543 printf("学籍番号:%d 氏名:%s\n", p->id, p->name); ○○○ //pに次の構造体のポインタを代入 ↑↑↑ ここを p = p->next とやるだけでとりあえず動くものはできるけど・・・ List3 は点数を取り込んでないよね。点数を取り込むようにしたいの? 読み込むデータのサンプルはないの?
546 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:25:53 ] >>542 ツッコミどころが多すぎるんだが・・・ とりあえず - char *dict[999], *input[50] + char dict[999][100], input[50][100] として、適当に文字列を格納する領域を確保しておくこと。 勘違いだと思うけど - for(i = 0; scanf("%s",input[i]) != '\n'; i++); + for(i = 0; scanf("%s",input[i]) == 1; i++); 添字が逆 - judge = compare( dict[j], input[k]); + judge = compare( dict[k], input[j]); それから、そもそも input[j] に入っているのは標準入力から得た一行だから、単語ごとに分割する処理が必要
547 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:36:49 ] [1] 授業単元:Cプログラミング [2] 問題文(含コード&リンク): 10 個の要素をもつ整数配列data を初期化して宣言する。 配列の隣り合った添え字のデータ同士の差(data[i] – data[i-1])を調べる。 その値が,最も大きなものを探し,データの差がい くつなのか,添え字の何番と何番との間の差なのか出力しなさい。 最大のものが複数あったときには,添え字の最も大きなものを出力すること。 例えば,data[10]={-6,4,7,-3,-1,9,5,-5,4,6} で初期化したときには,4 と5 の間の10 が最大となる。 [3] 環境 [3.1] OS:Windows [3.2] コンパイラ名とバージョン:VC++ 6.0 [3.3] 言語:C言語 [4] 期限:11/14 [5] その他の制限:特になし よろしくお願い致します。
548 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:45:02 ] >>547 6,7番目の間の10が最大値になる?
549 名前:デフォルトの名無しさん mailto:sage [2008/11/10(月) 23:46:40 ] >>547 素直に書いてみた 差の絶対値じゃなくて差の比較だけでいいんだよね? #include<stdio.h> #define N 10 int main(){ int data[N]={-6,4,7,-3,-1,9,5,-5,4,6}; int*max_diff = data; int*it; for(it=data+1;it!=data+N-1;++it) if(1[max_diff]-0[max_diff] <= 1[it]-0[it]) max_diff = it; printf("%dと%dの間の差%dが最大\n", max_diff-data,max_diff-data+1,1[max_diff]-0[max_diff]); return 0; }