習作プログラム のバックアップの現在との差分(No.3)


 #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;
  }
 
 
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.007 sec.