- 追加された行はこの色です。
- 削除された行はこの色です。
#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;
}