別人の解答がほぼ同一(たった一文字違い!)というケースがあった。 レポートの丸写しは、明確な不正行為であり、 学則による処罰(半期分の単位取消と停学)の対象にもなり得る。 今後、二度とこのようなことはあってはいけない。 (見せた側も同罪である。)
以下のプログラムは動作はするがインデンテーションが滅茶苦茶である。 プログラミングIIのインデンテーションの約束事に厳密に従って(特に 5番目のルールに注意)、インデントしなおせ。 もちろん動作は変えないこと。
#include <stdio.h> int main(void) { int i, j; for (i = 1; i <= 7; i++) { for (j = 1; j <= 11; j++) printf("%d", (i+j-1)%10); printf("\n"); } return 0; }
printf("printfは\"も\\も%%も出力できます。\n");
printf("printfは\"も\\も\%も出力できます。\n");
や
printf("printfは\"も\\も%も出力できます。\n");
などである。
このような、\%
や
%も
といったエスケープシーケンスや変換指定は、
未定義であり、その結果は処理形依存とされている。
特定のプラットフォーム・コンパイラで、
動作したからといって、他のプラットフォーム・コンパイラで、
同じように動作するとは限らない。
(実際 FreeBSD上のgccでは表示されない。)
int main(void) { int a; double b; printf("整数:"); scanf("%d",&a); b = a / 3 ; printf("その1/3は%fです。\n", b); return(0); }
double
型の変数で入力を受けるもの。printf
のdouble
型に対する変換指定が
%lf
になっているもの。
%lf
という変換指定はprintf
に対しては未定義(つまり処理形依存)である。
変換指定をもう一度確認しておくこと。
int |
intの例 |
double |
doubleの例 |
|
---|---|---|---|---|
printf |
%d | printf("%d", 1); |
%f | printf("%f", 3.14); |
scanf |
%d | int i; scanf("%d", &i); |
%lf |
double d; scanf("%lf", &d); |
hour3 = hour1 + hour2; minute3 = minute1 + minute2; hour4 = hour1 - hour2; minute4 = minute1 - minute2; if (minute3 >= 60) { hour3++; minute3 -= 60; } if (minute4 < 0) { hour4--; minute4 += 60; } printf(...);以下のような複雑な構造の解答が多々あった (実際の解答はもっと奇々怪々)。
if (minute3 >= 60) { if (minute4 < 0) { ... } else { ... } } else { if (minute4 < 0) { ... } else { ... } }
0 <= min < 60
のような書き方はできない。
C言語の文法では(0 <= min) < 60
と解釈されて、
0 <= min
は 0か 1なので、常に真になってしまう。
int
型では計算できない。
int
型は32bitであり、
-2,147,483,648〜2,147,483,647の数を表すことができる。
ちなみに、C言語の仕様がint
型に対して各処理形に要求しているのは
少なくとも-32767〜32767の範囲を表せることである。
int
型の限界である。
n1 > n2 || n2 > n3 || n1 > n3
という条件式は
最後の n1 > n3
は冗長である。
sin
, cos
, M_PI
などを
説明していなかったためか、ほとんどやっている人がいなかった。
sin
, cos
はおなじみの三角関数で角の単位は
ラジアンである。
M_PI
は円周率 3.1415926
を表す定数マクロである。
どちらも
#include<math.h>が必要である。