課題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%