- 締切済み
プログラミング 難問
問3:下記のように名前と3 科目の成績が記載されているファイル(seiseki.txt)からデータを 読み出し、各人の平均点および科目毎の平均点を表示するプログラム(prog17.c)を作 成しなさい。 (seiseki.txt というファイルはエディタ(emacs)などで事前に作っておくこと) seiseki.txt の内容 (名前は左づめで最大5 文字まで、点数は右づめ) John 100 90 70 Mary 80 55 60 James 40 70 64 解いて下さいませんか!難関大の一年の課題です!
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- hanabutako
- ベストアンサー率54% (492/895)
問5の回答です。 #include <err.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define DATE_FORMAT "%Y/%m/%d" int main(void) { struct tm tm = {}; char buf[1024]; time_t t; int z; printf("Base date (e.g. 2000/01/31):"); if (fgets(buf, sizeof(buf), stdin) == NULL || strptime(buf, DATE_FORMAT, &tm) == NULL) errx(-1, "cannot parse the given date"); printf("How many day(s) later?:"); scanf("%d", &z); t = timegm(&tm); t += 60 * 60 * 24 * z; gmtime_r(&t, &tm); strftime(buf, sizeof(buf), DATE_FORMAT, &tm); printf("%s\n", buf); return EXIT_SUCCESS; } 出力結果 Base date (e.g. 2000/01/31):2011/11/03 How many day(s) later?:16777216 47946/04/19 ...学生がこれを提出してきたときに0点にするのか100点にするのかはTAのレベル次第ですが、自分がかつてTAしていたころはそういう学生は好きでしたよ。あと、課題の問題文で検索するのもTAの仕事だと思ってました。
- Tacosan
- ベストアンサー率23% (3656/15482)
む, 「問3」が 2つあるのか. #5 に挙げたのは補足された方の「問3」. ちなみに「しっかりと書いて引用します。」というのは「何を」書くといっている?
- Tacosan
- ベストアンサー率23% (3656/15482)
冷静に考えると, ここで回答が得られたとしてもそれを「課題の答え」として出すには多大な困難を伴うんじゃないかなぁ. 回答そのものが「著作物」と解釈されるからそれをそのまま出すわけにはいかない (著作権法って知ってる?) し, 「引用する」ためには「どこから引用したのか」を書かなきゃならないけどまさかこの質問の URL を書くわけにはいかない (書いたら「自分で作ったものではない」ことが一瞬で分かる) でしょ? つまり, 「ありそうなプログラムを書く」ことで質問者を窮地に追い詰めることもできたりする (笑) と質問者の良心をとがめたところで問3 だけ: #include <stdio.h> #include <stdlib.h> int main() { char bin[8+1] = {0}; for (int i = 0; i < sizeof bin-1; ++i) { scanf("%c", bin+i); } printf("%ld\n", strtol(bin, NULL, 2)); return EXIT_SUCCESS; } 「問題に書いてある条件」はすべて満たしているはず.
- D-Matsu
- ベストアンサー率45% (1080/2394)
ヒントだけ。 問3: 基数変換(8進⇒10進)はどこかで習っているはず。でなきゃこんな問題は出されない。 問4: 各月の日数を配列に格納しておいてあとは計算。 「手計算ならどうするか」を考えてそれをプログラム化するのみ。 閏年考慮を入れるかどうかは出題者次第。 あなたの代わりに単位を取ってあげる義理は全くないので丸投げのうちはこれ以上回答するつもりはありません。
- nda23
- ベストアンサー率54% (777/1415)
「難問」というほどでもないですけどね。 先ず、何が分からないかを整理しましょう。 (1)ファイルを読み出し用に開く。 (2)ファイルからデータを読み込む。 (3)ファイルの最後に達したかを知る。 (4)読み込んだデータを空白?で分割する。 (5)点数(文字列)から数値にする。 (6)平均点を求める。 (7)結果を表示する。 ざっと、これだけあります。 分かるところもあるでしょうから、不明な 点を質問してください。勉強なんでしょ? 丸投げで回答して、ツッコまれたら困る と思いますよ。
- nora1962
- ベストアンサー率60% (431/717)
#include <stdio.h> #include <stdlib.h> int main(void){ FILE *fp; char name[6]; int i_kamoku[3]; int kamoku[3]; int i; if ( (fp=fopen("seiseki.txt","r"))==NULL ){ printf("seiseki.txt open error\n"); exit(1); } i = 0; kamoku[0] = kamoku[1] = kamoku[2] = 0; while( fscanf(fp, "%s %d %d %d", name, &i_kamoku[0], &i_kamoku[1], &i_kamoku[2]) != EOF ){ i++; kamoku[0] += i_kamoku[0]; kamoku[1] += i_kamoku[1]; kamoku[2] += i_kamoku[2]; } if ( i != 0 ){ printf( "%2.2f %2.2f %2.2f\n", (double)name[0]/i,(double)name[1]/i,(double)name[2]/i); return 0; } return 1; }
お礼
ありがとうございます 実行結果もお願いできますか もしよろしければこの課題もお願いいたします 問3:8桁の2進数の数字を入力すると、10進数に変換して表示するプログラム(prog11.c) を作成しなさい。(配列の練習問題なので、数字を8 個格納できる1 次元配列を 用意し、2 進数の各桁の数字(0 または1)を8 回キーボードから入力して、そ れぞれを配列に格納してから10 進数に変換するプログラムを作ってください) 問4:X 月Y 日からZ 日後の日付を求めるプログラム(prog12.c)を作成しなさい。
- segment800
- ベストアンサー率21% (17/80)
いや、これって貴方の課題じゃないの? 難しいからヒントって言うなら答えるけど、貴方は大丈夫なの? ちゃんと勉強してれば、とっても簡単な課題だよ? 貴方の事を考えると、どこかのバカがソースを丸ごと貼り付けない事を願います。
お礼
ありがとうございます。 できればお願いいたします。 もしよろしければ、この問題より、 以下の問題を解いていただきたいです。 問3:8桁の2進数の数字を入力すると、10進数に変換して表示するプログラム(prog11.c) を作成しなさい。(配列の練習問題なので、数字を8 個格納できる1 次元配列を 用意し、2 進数の各桁の数字(0 または1)を8 回キーボードから入力して、そ れぞれを配列に格納してから10 進数に変換するプログラムを作ってください) 問4:X 月Y 日からZ 日後の日付を求めるプログラム(prog12.c)を作成しなさい。 これは自分の課題です。
お礼
キーボードの方の答えありがとうございます 難問 と記したものの僕の答えはどうでしょうか? ちなみに、このプログラム以外に実行結果が同じになるものってどんなものがあります?
補足
しっかりと書いて引用します。 僕なりの答えは 1 #include <stdio.h> 2 3 int main() 4 { 5 FILE *fp; 6 char name[6]; 7 int n; 8 int score1, score2, score3; 9 int sum1, sum2, sum3; 10 float average; 11 12 fp = fopen("seiseki.txt", "r"); 13 n = sum1 = sum2 = sum3 = 0; 14 while (fscanf(fp, "%s %d %d %d", 15 name, &score1, &score2, &score3) != EOF) { 16 n++; 17 sum1 += score1; 18 sum2 += score2; 19 sum3 += score3; 20 average = (float)(score1 + score2 + score3)/3.0; 21 printf("%s¥t %3d %3d %3d %5.1f¥n", 22 name, score1, score2, score3, average); 23 } 24 printf("¥t%5.1f %5.1f %5.1f¥n", 25 (float)sum1/n, (float)sum2/n, (float)sum3/n); 26 fclose(fp); 27 return 0; 28 } 2)実行例 $ cat seiseki.txt John 100 90 70 Mary 80 55 60 James 40 70 64 $ ./a.exe John 100 90 70 86.7 Mary 80 55 60 65.0 James 40 70 64 58.0 73.3 71.7 64.7 です そのぷろぐらむだと実行結果どうなります?