習作プログラム

著者:崎間

C言語プログラミングの練習用に書いたプログラムです.

カレンダーを表示

/* ===================================================================== 
   引数で指定した 月 年 のカレンダーを表示する 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;
}

現在時刻を表示

/* =====================================================================
   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;
}

現在のディレクトリを表示

#include <stdio.h>

int main(void){
  char dirName[64];

  /* カレントディレクトリ名を取得 */
  getcwd(dirName, 64);

  printf("%s\n", dirName);

  return 0;
}

ファイル中の文字を数える

/* =====================================================================
   ファイルから特定の文字を指定して数える  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;
}

バブルソート

/* ===================================================================== 
   昇順のバブルソート 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;
}

ユークリッドの互助法

/* ===================================================================== 
   ユーグリッドの互除法 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;
}

自然数を素因数分解

/* ===================================================================== 
   自然数を素因数分解 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.2.17HTML convert time to 0.033 sec.