#author(崎間) C言語プログラミングの練習用に書いたプログラムです. #contents * カレンダーを表示 [#g00ed97b] /* ===================================================================== 引数で指定した 月 年 のカレンダーを表示する May 26 2003 ===================================================================== */ #include <stdio.h> #include <stdlib.h> /* for atoi() */ /* --------------------------------------------------------------------- 曜日 -- ツェラー(Zeller)の公式による計算 --------------------------------------------------------------------- */ int dayOfWeek(int year, int month, int day){ if (month==1 || month==2) { year--; month += 12; } /* 0:日, 1:月, 2:火, 3:水, 4:木, 5:金, 6:土 */ return (year + year/4 - year/100 + year/400 + (13*month+8)/5 + day)%7; } /* --------------------------------------------------------------------- 閏年の判定 -- 閏年なら1を返す --------------------------------------------------------------------- */ int leapYear(int year){ return (year%4 == 0) && (year%100 != 0 || year%400 == 0); } /* --------------------------------------------------------------------- 月の日数計算 --------------------------------------------------------------------- */ int daysOfMonth(int year, int month){ static int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* 1--12以外では1月とみなす */ if (month<1 || month>12) month = 1; /* うるう年のとき */ if (month == 2) return days[1] + leapYear(year); else return days[month-1]; } /* --------------------------------------------------------------------- カレンダーを表示 --------------------------------------------------------------------- */ void dispCalender(int month, int year){ int i, k, days; /* for (month=1; month<=12; month++) { */ printf(" %d月 %d\n", month, year); printf("Su Mo Te We Th Fr Sa\n"); k = dayOfWeek(year, month, 1); days = daysOfMonth(year, month); /* 1日目まで空白で埋める */ for (i=0; i<k; i++) printf(" "); /* 月の最終日まで表示 */ for (i=1; i<=days; i++) { printf("%2d ", i); /* 日曜日の直前で改行 */ if (++k%7 == 0) printf("\n"); } printf("\n\n"); /* } */ } /* --------------------------------------------------------------------- main --------------------------------------------------------------------- */ int main(int argc, char* argv[]){ int year, month; if (argc<=2) { printf("usage:calender [month] [year]\n"); return 1; } month = atoi(argv[1]); year = atoi(argv[2]); dispCalender(month, year); return 0; } * 現在時刻を表示 [#u84e461f] /* ===================================================================== time 関数をつかって現在時刻を表示 Oct 3 2002 ===================================================================== */ #include <stdio.h> #include <time.h> /* fot time() */ int main(void){ time_t t1; time(&t1); printf("%s", ctime(&t1)); return 0; } * 現在のディレクトリを表示 [#l22c44c1] #include <stdio.h> int main(void){ char dirName[64]; /* カレントディレクトリ名を取得 */ getcwd(dirName, 64); printf("%s\n", dirName); return 0; } * ファイル中の文字を数える [#b03d51a7] /* ===================================================================== ファイルから特定の文字を指定して数える May 20 2002 ===================================================================== */ #include <stdio.h> int main(void){ char filename[64]; char seek; int c, s = 0; FILE *fp; printf("検索したい文字を入力してください.\n"); scanf("%c", &seek); printf("ファイル名を入力して下さい.\n"); scanf("%s",&filename); fp = fopen(filename, "r"); if (fp == NULL){ printf("ファイル %s が見つかりません.\n", filename); return -1; } printf("文字 %c を検索します.\n", seek); while ((c = fgetc(fp)) != EOF){ if (c == seek){ s = s++; printf("*"); } } printf("\n"); printf("%d 文字です.\n", s); fclose(fp); return 0; } * バブルソート [#d05bc646] /* ===================================================================== 昇順のバブルソート Jun 4 2003 ===================================================================== */ #include <stdio.h> /* --------------------------------------------------------------------- bubble sort --------------------------------------------------------------------- */ void bubbleSort(int a[], int n) { int i, j, tmp; for (i=n-1; i>=2; i--) { /* 配列の最後は n-1 */ for (j=0; j<i; j++) { if (a[j]>a[j+1]) { tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp; } } } } /* --------------------------------------------------------------------- main --------------------------------------------------------------------- */ int main(void){ static int N=6; int i, a[N]; printf("%d個の整数をバブルソートで整列します.入力してください.\n>>", N); for (i=0; i<N; i++) scanf("%d", &a[i]); printf("sorting...\n"); /* 配列の先頭のポインタを渡す */ bubbleSort(a, N); for (i=0; i<N; i++) printf("%d ", a[i]); printf("\n"); return 0; } * ユークリッドの互助法 [#affd0d26] /* ===================================================================== ユーグリッドの互除法 Sep 20 2003 ===================================================================== */ /* --------------------------------------------------------------------- アルゴリズム --------------------------------------------------------------------- 1. 二つの数値 A, B のうち, 大きい方を X とし, 小さい方を Y とする. 2. X を Y で割った余り R1 を求める. 3. 次に Y を R1 で割った余り R2 を求める. 4. さらに R1 を R2 で割った余り R3 を求める. 5. 以下同様に, 新しく求めた余りで一つ前の余りを割って次々に余りを求 めていく. 6. 繰り返していくと余りが 0 となる.そのときの除数が A と B の最大公 約数である. --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- フローチャート --------------------------------------------------------------------- 方法1 方法2 _____ _____ ( 開 始 ) ( 開 始 )  ̄ ̄│ ̄ ̄  ̄ ̄│ ̄ ̄ ┌───┴───┐ ┌───┴───┐ │ a → m │ │ a → m │ │ b → n │ │ b → n │ └───┬───┘ └───┬───┘ ┌───┴───┐ ──┴── │ m mod n → r │ / ループ2 \ └───┬───┘ │ │ ──┴── └───┬───┘ / ループ1 \ ┌───┴───┐ │ r = 0 │ │ m mod n → r │ └───┬───┘ └───┬───┘ ┌───┴───┐ ┌───┴───┐ │ n → m │ │ n → m │ └───┬───┘ └───┬───┘ ┌───┴───┐ ┌───┴───┐ │ r → n │ │ r → n │ └───┬───┘ └───┬───┘ ┌───┴───┐ ┌───┴───┐ │ m mod n → r │ │ r = 0 │ └───┬───┘ \ ループ2 / ┌───┴───┐ ──┬── │ │ ──┴── \ ループ1 / ( 終 了 ) ──┬──  ̄ ̄ ̄ ̄ ̄ ──┴── ( 終 了 )  ̄ ̄ ̄ ̄ ̄ 下のプログラムは方法1. --------------------------------------------------------------------- */ #include <stdio.h> int main(void){ int m, n, r; m = 18; n = 12; r = m % n; while (r!=0) { m = n; n = r; r = m % n; } printf("最大公約数 = %d\n", n); return 0; } * 自然数を素因数分解 [#n743d08d] /* ===================================================================== 自然数を素因数分解 Sep 22 2003 (出典: H14.秋 基本情報技術者試験 午後.問6) ===================================================================== */ /* --------------------------------------------------------------------- アルゴリズム --------------------------------------------------------------------- (1) 変数 factor の値を 2 から始めて 1 ずつ増やしながら, num を factor で割った結果が factor である間,(2) を実行する. (2) num が factor で割り切れる場合,次の処理を num が factor で 割り切れなくなるまで繰り返す. 1. factor の値を素因数として抽出する. 2. num を factor で割った商を新たな num とする. (3) 最終的に割り切る factor がなかった場合には, num は素数であると 判定する. このプログラムでは (1) での繰り返し処理の回数を減らすために,まず最初 に自然数 num が 2 の倍数であるかどうかを判定する.num が 2 の倍数の場 合には, (2) によって最初に 2 の因子をすべて抽出する.続いて, 変数 factor の値を, 3 から始めて 2 ずつ増やしながら,num を factor で割っ た結果が factor 以上である間, 素因数の抽出を繰り返す. --------------------------------------------------------------------- */ #include <stdio.h> #define TRUE 1 #define FALSE 0 int main(void) { int num, prime = TRUE, factor = 2; printf("数値 (2以上の自然数) を入力してください : "); scanf("%d", &num); printf("%d =", num); if (num!=factor) while (num%factor == 0) { /* 数値が2の倍数? */ if (prime == FALSE) printf(" ×"); printf(" %d", factor); num /= factor; prime = FALSE; } factor++; while (num/factor >= factor) { while (num%factor == 0) { if (prime == FALSE) printf(" ×"); printf(" %d", factor); num /= factor; prime = FALSE; } factor += 2; } if (prime == TRUE) printf(" 素数\n"); else if (num > 1) printf(" × %d\n", num); else printf("\n"); return 0; }