課題6
課題6から8までは、存在しないファイル"file100.txt"をオープンさせようとし た際の、エラーの表示の違いを調べる課題である。 下記のプログラムをfile6.cとして書き、実行方法の通りリダイレクトで結果を 出力し、出力結果を確認せよ。
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; printf("実行中\n"); if((fin=fopen("file100.txt", "r")) == NULL){ printf("入力ファイルをオープンできません。\n"); exit(1); } fclose(fin); exit(0); }
(実行方法) hp3225[susaki]502:~/program% ./a.out > file6.txt (実行結果の確認) hp3225[susaki]503:~/program% cat file6.txt
(注意) "file6.rst"が存在する状態で上記のコマンドを実行すると
というメッセージが表示されて、実行は失敗に終わる。その場合には、
上書きする方法1:
として実行すること。この場合は、"file6.rst"は上書きされることになる。 そもそも上書き禁止の設定は、ホームディレクトリの.cshrcファイルに
と記述されているためである。したがって、
上書きする方法2:
として実行しても、"file6.txt"は上書きされることになる。 この注意は課題7, 8においても共通である。
課題7
下記のプログラムをfile7.cとして書き、実行方法の通りリダイレクトで結果を 出力し、出力結果を確認せよ。
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; printf("実行中\n"); if((fin=fopen("file100.txt", "r")) == NULL){ fprintf(stdout, "入力ファイルをオープンできません。\n"); exit(1); } fclose(fin); exit(0); }
(実行方法) hp3225[susaki]504:~/program% ./a.out > file7.txt (実行結果の確認) hp3225[susaki]505:~/program% cat file7.txt
課題8
下記のプログラムをfile8.cとして書き、実行方法の通りリダイレクトで結果を 出力し、出力結果を確認せよ。
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; printf("実行中\n"); if((fin=fopen("file100.txt", "r")) == NULL){ fprintf(stderr, "入力ファイルをオープンできません。\n"); exit(1); } fclose(fin); exit(0); }
(実行方法) hp3225[susaki]506:~/program% a.out > file8.txt (実行結果の確認) hp3225[susaki]507:~/program% cat file8.txt
課題9
これまで3回のソフトウェア基礎aの試験結果を数人分入力して、それをファイル file9.txtに出力したい。下記のプログラムを file9.cとして書き、 実行結果例のように実行されるか確認せよ。
#include <stdio.h> #include <stdlib.h> int main(void) { FILE *fout; int dat[3], n=1; if((fout=fopen("file9.txt", "w")) == NULL){ printf("出力ファイルをオープンできません。\n"); exit(1); } printf("これまで3回のソフトウェア基礎aの試験結果を入力してください。\n"); printf("入力例)\n"); printf("1人目: 50 62 82\n"); printf("2人目: 78 65 54\n"); printf("3人目: \n"); printf("入力の終了時には Ctl+d を入力してください。\n"); while (1) { printf("%d人目: ", n); if (scanf("%d%d%d", &dat[0], &dat[1], &dat[2]) == EOF) { break; } fprintf(fout,"%d %d %d\n",dat[0], dat[1], dat[2]); n++; } fclose(fout); exit(0); }
(実行結果例) hp3221[susaki]501:~/program% ./a.out これまで3回のソフトウェア基礎aの試験結果を入力してください。 入力例) 1人目: 50 62 82 2人目: 78 65 54 3人目: 入力の終了時には Ctl+d を入力してください。 1人目: 78 82 85 2人目: 65 45 70 3人目: 60 56 89 4人目: hp3221[susaki]502:~/program% hp3221[susaki]502:~/program% hp3221[susaki]502:~/program% cat file9.txt 78 82 85 65 45 70 60 56 89 hp3221[susaki]503:~/program%
課題10
課題9で作成したファイルfile9.txtからデータを読み込んで、実行結果の ように、3回の試験の平均点と成績を標準出力に表示させたい。成績の付け方は 構造体1の課題4と 同じである。要求を満たす プログラムをfile10.cとして書き、実行結果例のように実行されるか確認せよ。
(実行結果) hp3221[susaki]503:~/program% a.out これまで3回のソフトウェア基礎aの試験結果: 1人目: 78 82 85: 平均点= 81.7 成績=A 2人目: 65 45 70: 平均点= 60.0 成績=C 3人目: 60 56 89: 平均点= 68.3 成績=C hp3221[susaki]504:~/program%
課題11
課題10で作成したプログラムfile10.cを、スクリプト言語であるperlを 用いて書き直すと下記の通りとなる。下記のスクリプトを file11.plとし て書き、実行結果のように動作することを確認せよ。C言語による記述との違いを理解 するために、スクリプトをコピーせず、自分で書いて完成させるように。
(スクリプト) #!/usr/bin/perl $n = 1; open (IN, 'file9.txt') or die "$!"; print "これまで3回のソフトウェア基礎aの試験結果:\n"; while(<IN>){ chomp($_); @dat = split / /, $_; $ave = ($dat[0]+$dat[1]+$dat[2])/3; if($ave >= 90.0){ $score = 'S'; } elsif($ave >= 80.0){ $score = 'A'; } elsif($ave >= 70.0){ $score = 'B'; } elsif($ave >= 60.0){ $score = 'C'; } else{ $score = 'D'; } printf STDOUT "$n人目: %3d %3d %3d: 平均点=%5.1f 成績=$score\n", $dat[0], $dat[1], $dat[2], $ave; $n++; } close IN; exit;
(注意) 実行させる前に、
として、実行可能な状態に設定しておくように。
(実行結果) hp3221[susaki]505:~/program% ./file11.pl これまで3回のソフトウェア基礎aの試験結果: 1人目: 78 82 85: 平均点= 81.7 成績=A 2人目: 65 45 70: 平均点= 60.0 成績=C 3人目: 60 56 89: 平均点= 68.3 成績=C hp3221[susaki]506:~/program%