『キックオフC言語 2022年度用』のサポートページです。
アンケートを実施しているので、回答にご協力をお願いします。
https://docs.google.com/forms/d/e/1FAIpQLScdTwgxEu8hoUMzLRdqJBoD4ClyuoCl7Re93B8VwAyDzVIJQg/viewform?usp=sf_link
製本した印刷物は、授業の初回で配布します。A5版以外に、少量ですが大きめの手作りのB5版も用意しています。
PDF は以下で公開します。
『自動清算』→『自動精算』
#define EPS 0.000001
#include <stdio.h>
int main(void) {
int a;
for (int i=1; i<=5; i++) {
a = i * 10;
}
printf("%d\n", a);
return 0;
}T(y,m) = (y + y/4 - y/100 + y/400 + 13*(m+1)/5) % 7そして、現実の y年m月1日の曜日との関係で、気づいたことを述べよ。なお、13月、14月は、翌年の1月、2月と対応付けて考えよ。』
6. [ある?ない?]
ソースコード 6.5 の is_prime3() を利用して、次の関数を作れ。
• int is_sum_of_2primes(int n) は、 n が 2 つの素数の和で表せれば論理型の TRUE、そうでなければ FALSE を返す。(追記)2つの素数は同じものでもよい。
そして main() 関数で、2 から 100 までの整数のうち、素数でもなく、2 つの素数の和でも表せないものを、すべて求めて表示せよ。
7. 廃止
3.5節での説明は不十分でした。仮引数のスコープはその関数全体であるため、仮引数がどんな名前であるかは、別の関数(呼び出し側)からは感知できないことに注意してください。
#include <stdio.h>
/* 点(x,y)が、原点を中心とする半径rの円の内側なら、論理型の TRUE、
そうでなければ FALSE を返す */
int is_in_circle(double x, double y, double r) {
return (x * x + y * y <= r * r);
}
void print_is_in_circle(double x, double y, double r) {
printf("(%g,%g)は、原点を中心とする半径 %g の円の", x, y, r);
if ( /* ここを埋めよ */ ) {
printf("内側\n");
} else {
printf("外側\n");
}
}
int main(void) {
print_is_in_circle(1.0, 1.0, 1.4142); // 外
print_is_in_circle(1.0, 1.0, 1.4143); // 内
print_is_in_circle(11, 4, 12); // 内
print_is_in_circle(11, 5, 12); // 外
return 0;
}#include <stdio.h>
int main(void) {
set_year(0); // 無効
set_month(0); // 無効
printf("year = %d, month = %d\n", get_year(), get_month());
set_year(2022);
set_month(6);
printf("year = %d, month = %d\n", get_year(), get_month());
return 0;
}int main(void) {
int d = 31;
for (int i=0; i<=13; i++) {
if (! is_valid_date(i, d)) {
printf("%d月%d日は存在しません\n", i, d);
}
}
return 0;
}東京 品川 新横浜 名古屋 京都 新大阪 0.0 6.8 28.8 366.0 513.6 552.6である。この距離を1次元配列に格納し、以下の表のように、各駅の間の距離を計算で求めて表示するプログラムを作れ。
実行結果
( 東京)( 品川)(新横浜)(名古屋)( 京都)(新大阪)
( 東京) 0.0 6.8 28.8 366.0 513.6 552.6
( 品川) 6.8 0.0 22.0 359.2 506.8 545.8
(新横浜) 28.8 22.0 0.0 337.2 484.8 523.8
(名古屋) 366.0 359.2 337.2 0.0 147.6 186.6
( 京都) 513.6 506.8 484.8 147.6 0.0 39.0
(新大阪) 552.6 545.8 523.8 186.6 39.0 0.0
』void print_cancel_or_not(char weather[]) {
/* ここを作る */
}
int main(void) {
print_cancel_or_not("暴風雪警報");
print_cancel_or_not("大雪警報");
print_cancel_or_not("特別警報(大雪)");
}int char2int(char c) { return c - '0'; }
これを使うと、次のように、「1文字」から「整数」に変換されます。
char2int('0') → 0
char2int('1') → 1
...
char2int('9') → 9| 変数定義 | 配列要素 | 文字列の長さ | 末尾の文字 | |||
|---|---|---|---|---|---|---|
| [0] | [1] | [2] | [3] | |||
| char s[ ]="abc"; | 'a' | 'b' | 'c' | '\0' | strlen(s)=3 | s[strlen(s)-1] |
#include <time.h> // time(), struct tm
/* 10章 構造体 */
struct tm get_current_time(void) {
time_t t = time(NULL);
return *localtime(&t);
}
/* 10章 構造体 */
int decide_fee(void) {
//printf("駐車開始時刻を入力してください\n");
//printf("時 => "); int h = input_int();
//printf("分 => "); int m = input_int();
//printf("秒 => "); int s = input_int();
struct tm now = get_current_time();
printf("現在時刻は %02d:%02d:%02d です\n",
now.tm_hour, now.tm_min, now.tm_sec);
int sec = 0;
/* ここを作る */
printf("経過時間は %d 秒です。\n", sec);
int fee = 0;
/* ここを作る */
printf("駐車料金は %d 円です。\n\n", fee);
return fee;
}
input_int() の使い方の注意です。scanf() と混在すると、以下のような不可解な動作になるので、input_int() だけに統一するか、scanf() だけに統一するか、どちらかにしてください。
#include <stdio.h> #include <stdlib.h> int input_int(void) { char buff[BUFSIZ]; if (fgets(buff, BUFSIZ, stdin) == NULL) exit(EXIT_FAILURE); return atoi(buff); // 文字列→int変換 } int main(void) { int a; scanf("%d", &a); int b = input_int(); printf("a=%d, b=%d\n", a, b); }例えば "1[Enter]2[Enter]" と入力したとします。"1"はaに読み取られますが、[Enter] は、scanf() は%dの読み取り対象ではなく、標準入力に残ります。次の input_int() はこの[Enter]のみを読み取って、空行になります。つまり、"2"を入力するまでもなく、b は 0 になります。
/* プロトタイプ宣言 */ int input_int(void); int sec2fee(int sec); int is_coin_note(int value); int get_coin_note(void); int hms2sec(int h, int m, int s); int sec_diff(int h1, int m1, int s1, int h2, int m2, int s2); void put_change(int x); struct tm get_current_time(void); int decide_fee(void); int receive_fee(int fee);