習作プログラム のバックアップソース(No.3)

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;
 }

Valid XHTML 1.1! home >
トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Modified by 物理のかぎプロジェクト PukiWiki 1.4.5_1 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-jiPowered by PHP 5.3.29HTML convert time to 0.003 sec.