書籍
- C言語プログラミング ハーベイ M.ダイテル (著), ポール J.ダイテル (著), 小嶋 隆一 (翻訳)
- development environment
- Visual Stdio Code
- gcc 8.1.0
4.9: 一連の整数の合計を求めるプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int num;
int data;
int sum;
sum=0;
num=0;
while(num<=0)
{
printf("正整数を入力してください\n");
scanf("%d",&num);
}
while(num>0)
{
scanf("%d",&data);
sum+=data;
num--;
}
printf("合計 %d\n",sum);
getch();
return 0;
}
4.10: いくつかの整数の平均を計算してプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int count = 0;
int num;
int sum = 0;
int end;
printf("いくつかの整数値を入力してください(番兵値9999)\n");
do
{
scanf("%d", &num);
if (num == 9999)
{
end = 1;
}
else
{
sum += num;
count++;
}
}
while (end == 0);
printf("平均値は%d\n", sum / count);
return 0;
}
4.11: いくつかの整数の中から最小値を見つけるプログラム
source
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <limits.h>
int main()
{
int count;
int min;
int num;
min = INT_MAX;
printf("最初に入力数する数値の個数を入力してください\n");
scanf("%d", &count);
while (count > 0)
{
printf("数値を入力してください\n");
scanf("%d", &num);
if (num < min)
{
min = num;
}
count--;
}
printf("最小値は %d です\n", min);
getch();
return 0;
}
4.12: 2から30までの偶数の和を計算してプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
int sum;
sum=0;
for(i=2;i<=30;i+=2)
{
sum+=i;
}
printf("%d",sum);
getch();
return 0;
}
4.13: 1から15までの奇数の積を計算してプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
int sum;
sum=1;
for(i=3;i<=15;i+=2)
{
sum*=i;
}
printf("積の合計は%dです\n",sum);
getch();
return 0;
}
4.14: 1から5までの整数の階乗を計算して表示するプログラム
source
#include <stdio.h>
#include <conio.h>
#include <math.h>
unsigned int factorial(int);
int main()
{
printf("5!=%u",factorial(5));
getch();
return 0;
}
/************************************************************/
/* 階乗を求める */
/* 12!まで正しく求まる。 */
/************************************************************/
unsigned int factorial(int num)
{
unsigned int fac;
fac=1;
if(num==0)
{
return 1U;
}
else
{
while(num>0)
{
fac*=num;
num--;
}
return fac;
}
}
4.15: リスト4.4(P.98)の複利計算プログラムを変更して、年利率を5%から、6、7、8、9、10%まで段階的に変えながら元利計算できるようにしたプログラム
source
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
int year;
double amount,principal=1000.0,rate;
printf("%4s%10s%21s\n\n","年利率","年数","貯金残高");
for(rate=0.05;rate<=0.10;rate+=0.01)
{
printf("%.0f% \n",rate*100);
for(year=1;year<=10;year++)
{
amount=principal*pow(1.0+rate,year);
printf("%15d%21.2f\n",year,amount);
}
printf("\n");
}
getch();
return 0;
}
4.16: (A)から(D)までのパターンを表示するプログラム
- A
source
#include <stdio.h>
#include <conio.h>
int main()
{
int i,j;
for(i=1;i<=10;i++)
{
for(j=1;j<=i;j++)
{
printf("*");
}
printf("\n");
}
getch();
return 0;
}
- B
source
#include <stdio.h>
#include <conio.h>
int main()
{
int i,j;
for(i=1;i<=10;i++)
{
for(j=10;j>=i;j--)
{
printf("*");
}
printf("\n");
}
getch();
return 0;
}
- C
source
#include <stdio.h>
#include <conio.h>
int main()
{
int i,j;
int space;
for(i=1;i<=10;i++)
{
for(space=i-1;space>0;space--)
{
printf(" ");
}
for(j=10;j>=i;j--)
{
printf("*");
}
printf("\n");
}
getch();
return 0;
}
- D
source
#include <stdio.h>
#include <conio.h>
int main()
{
int i,j;
int space;
for(i=1;i<=10;i++)
{
for(space=10-i;space>0;space--)
{
printf(" ");
}
for(j=1;j<=i;j++)
{
printf("*");
}
printf("\n");
}
getch();
return 0;
}
4.17: 銀行の顧客の貸付状況を分析するプログラム
source
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#define DEBUG_DEFINE //デバッグ用
#include "debug.h"
/*----------- マクロ定義 -------------------*/
#define CLIENT_NUM 3 //顧客人数
#define MAX_SIZE 50 //最大入力数
/*----------- 構造体 --------------------*/
//顧客構造体
typedef struct client{
int acount; //口座番号
double pre_credit; //以前の信用限度額
double loan; //借入残高
}CLIENT,*PCLIENT;
/*---------- プロタイプ宣言 --------------*/
void client_data_input(CLIENT []);
void print_list(CLIENT []);
void check_upper(CLIENT []);
static int check_is_num(char []); //client_data_inputで呼ばれる
static int check_acount(CLIENT [],int); //client_data_inputで呼ばれる
static void newline_to_null(char []); //client_data_inputで呼ばれる
/************************************************************/
/* メイン関数 */
/************************************************************/
int main()
{
CLIENT list[CLIENT_NUM];
client_data_input(list);//顧客データ入力
DEB(print_list(list);)
check_upper(list); //借入残高が信用限度を超えてるか
//調べる
getch();
return 0;
}
/*************************************************************/
/* クライアントの情報を入力する */
/*************************************************************/
void client_data_input(CLIENT list[])
{
int check_1; //check_is_num用
int check_2; //check_acount用
int i;
char data[MAX_SIZE];
for(i=0;i<CLIENT_NUM;i++)
{
printf("\n(%d人目)\n",i+1);
do
{
printf("顧客の口座番号を入力してください\n");
fgets(data,sizeof(data),stdin);
newline_to_null(data);
check_1=check_is_num(data);
if(check_1==0) //整数ならば
{
list[i].acount=atoi(data);
check_2=check_acount(list,i);
}
else
{
printf("\n整数を入力してください\n\n");
}
}
while(check_2!=0 || check_1!=0);
do
{
printf("顧客の以前の信用限度額を入力してください(正の値)\n");
fgets(data,sizeof(data),stdin);
newline_to_null(data);
check_1=check_is_num(data);
if(check_1!=2) //整数か小数数なら
{
list[i].pre_credit=atof(data);
}
else
{
printf("\n数値を入力してください\n\n");
}
}
while(check_1==2);
do
{
printf("顧客の借入残高を入力してください(正の値)\n");
fgets(data,sizeof(data),stdin);
newline_to_null(data);
check_1=check_is_num(data);
if(check_1!=2) //整数か小数数なら
{
list[i].loan=atof(data);
}
else
{
printf("\n数値を入力してください\n\n");
}
}
while(check_1==2);
}
return;
}
/*-----------------------------------------------------------*/
/* 入力されたアカウントが適切な番号であるかを調べる */
/* */
/* 戻り値 1:異常 0:正常 */
/*-----------------------------------------------------------*/
static int check_acount(CLIENT list[],int now)
{
int i;
if(list[now].acount<0) //アカウントの番号が負なら
{
printf("アカウントは0以上の番号を使用してください\n\n");
return 1;
}
if(now==0) //最初の顧客なら
{
return 0;
}
else
{
for(i=0;i<now;i++)
{
if(list[i].acount==list[now].acount)
{
printf("すでに同じ番号が登録されています\n\n");
return 1;
}
}
}
return 0;
}
/*************************************************************/
/* CLIENT listの中身を確認する(デバッグ) */
/*************************************************************/
void print_list(CLIENT list[])
{
int i;
printf("\nアカウント,以前の信用限度額,借入残高\n");
for(i=0;i<CLIENT_NUM;i++)
{
printf("%10d%16.0f%10.0f\n",list[i].acount,list[i].pre_credit,list[i].loan);
}
getch();
return;
}
/*************************************************************/
/* 顧客の借入残高が新しい */
/* 信用限度額を超えているか調べる */
/*************************************************************/
void check_upper(CLIENT list[])
{
int i;
for(i=0;i<CLIENT_NUM;i++)
{
if(list[i].loan>(list[i].pre_credit)/2)
{
printf("アカウント番号%dの借入残高は新しい信用限度額を超過しています\n",list[i].acount);
}
}
return;
}
/*************************************************************/
/* 入力された文字列がどのような数値であるか */
/* を調べる */
/* 戻り値 2:数値でない 1:小数 0:整数 */
/*************************************************************/
static int check_is_num(char data[])
{
int i;
for(i=0;isspace(data[i]);i++);//先頭からの空白を取り除く
if(data[i]=='+' || data[i]=='-') //先頭が符号なら
{
i++;
}
if(isdigit(data[i])==0) //整数部が存在しないなら
{
return 2;
}
for(;isdigit(data[i]);i++);
if(data[i]=='.')//小数
{
i++;
if(isdigit(data[i])==0) //小数部が存在しないならば
{
return 2;
}
for(;isdigit(data[i]);i++);
if(data[i]=='\0')
{
return 1;
}
return 2;
}
else if(data[i]=='\0') //整数
{
return 0;
}
return 2;
}
/*************************************************************/
/* 改行を見つけてナル文字に変換 */
/* (fgets用) */
/*************************************************************/
static void newline_to_null(char data[])
{
int i;
for(i=0;i<MAX_SIZE;i++)
{
if(data[i]=='\n')
{
data[i]='\0';
}
}
return;
}
4.18: 横棒をプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
/*----------- マクロ定義 -------------------*/
#define COUNT 5 //何回入力するか
/*---------- プロタイプ宣言 --------------*/
void print_histgram(int);
int main()
{
int i;
int count;
for(i=0;i<COUNT;i++)
{
do
{
printf("1-30までの数値を入力してください\n");
scanf("%d",&count);
}
while(count<=0 || 31<=count);
printf("ヒストグラムを表示します\n");
print_histgram(count);
}
getch();
return 0;
}
/*************************************************************/
/* ヒストグラムを表示する */
/*************************************************************/
void print_histgram(int count)
{
int i;
for(i=0;i<count;i++)
{
printf("*");
}
printf("\n");
return;
}
4.19: 商品の番号と1日の販売個数を入力すると、1週間(7日間)の売上金額を計算して表示するプログラム
source
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
/*----------- マクロ定義 -------------------*/
#define MAX_SIZE 50 //最大入力数
#define PRINT_VALUE(value) \
printf("一週間の売り上げ%.3fドル",sell_num*value*7);
/*---------- プロタイプ宣言 --------------*/
int check_is_num(char []);
/************************************************************/
/* メイン関数 */
/************************************************************/
int main()
{
int check;
int good_num; //商品番号
int sell_num; //一日の販売個数
char data[MAX_SIZE];
do
{
printf("商品番号を入力してください\n");
fgets(data,sizeof(data),stdin);
check=check_is_num(data);
if(check==0)
{
good_num=atoi(data);
if(good_num<0 || good_num>5)
{
printf("\n1-5の整数を入力してください\n\n");
check=1;
}
}
else
{
printf("\n整数を入力してください\n\n");
}
}
while(check!=0);
do
{
printf("その商品の一日の販売個数を入力してください\n");
fgets(data,sizeof(data),stdin);
check=check_is_num(data);
if(check==0)
{
sell_num=atoi(data);
if(sell_num<0)
{
printf("\n負以外の整数を入力してください\n\n");
check=1;
}
}
else
{
printf("\n整数を入力してください\n\n");
}
}
while(check!=0);
switch(good_num)
{
case 1:
PRINT_VALUE(29.8)
break;
case 2:
PRINT_VALUE(4.50)
break;
case 3:
PRINT_VALUE(9.98)
break;
case 4:
PRINT_VALUE(4.49)
break;
case 5:
PRINT_VALUE(6.87)
break;
default:
break;
}
getch();
return 0;
}
/*************************************************************/
/* 入力された文字列がどのような数値であるか */
/* を調べる */
/* 戻り値 2:数値でない 1:小数 0:整数 */
/*************************************************************/
int check_is_num(char data[])
{
int i;
for(i=0;isspace(data[i]);i++);//先頭からの空白を取り除く
if(data[i]=='+' || data[i]=='-') //先頭が符号なら
{
i++;
}
if(isdigit(data[i])==0) //整数部が存在しないなら
{
return 2;
}
for(;isdigit(data[i]);i++);
if(data[i]=='.')//小数
{
i++;
if(isdigit(data[i])==0) //小数部が存在しないならば
{
return 2;
}
for(;isdigit(data[i]);i++);
if(data[i]=='\0' || data[i]=='\n')
{
data[i]='\0';
return 1;
}
return 2;
}
else if(data[i]=='\0' || data[i]=='\n') //整数
{
data[i]='\0';
return 0;
}
return 2;
}
4.21: リスト4.2(P.93)のプログラムを書きなおして、変数counterの初期設定を型宣言の中で行うようにしたプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int counter;
counter=1;
for(;counter<=10;counter++)
{
printf("%d\n",counter);
}
getch();
return 0;
}
4.22: 試験の平均点を計算するプログラム
source
#include <stdio.h>
#include <conio.h>
/*----------- マクロ定義 -------------------*/
#define STUDENT 3
/************************************************************/
/* メイン関数 */
/************************************************************/
int main()
{
int grade;
int mean;
int sum;
int i;
sum=0;
printf("%d人分のデータを入力してください\n",STUDENT);
for(i=0;i<STUDENT;i++)
{
printf("%d人目",i+1);
printf("\n試験の成績(A,B,C,D,F)を入力してください。\n");
while((grade=getchar())!=EOF)
{
switch(grade)
{
case 'A': case 'a':
sum+=4;
break;
case 'B': case 'b':
sum+=3;
break;
case 'C': case 'c':
sum+=2;
break;
case 'D': case 'd':
sum+=1;
break;
case 'F': case 'f':
break;
case '\n': case ' ':
break;
default:
printf("成績を表す文字が正しくありません\n");
printf("もう一度入力してください\n");
break;
}
}
}
printf("クラスの平均点は%d点です\n",sum/STUDENT);
getch();
return 0;
}
4.23: 預金残高を計算するプログラム
source
#include <stdio.h>
#include <math.h>
void print_doll_sent(double);
int main()
{
int year;
double amount,principal=1000.0;
double rate=0.05;
printf("%4s%21s\n","年数","預金残高");
for(year=1;year<=10;year++){
amount=principal*pow(1.0+rate,year);
printf("%4d",year);
print_doll_sent(amount);
}
getchar();
return 0;
}
void print_doll_sent(double amount)
{
printf("%17d.%02d\n",(int)amount,(int)(amount*100)%100);
}
4.25: 整数を2進数等で表記するプログラム
source
#include <stdio.h>
#include <conio.h>
#define MASK 1U
#define MAX_NUMBER 1000
void print_decimal_to_binary(unsigned int);
/************************************************************/
/* メイン関数 */
/************************************************************/
int main()
{
unsigned int i;
printf("%32s %8s %8s %8s\n","2進数","8進数","10進数","16進数");
for(i=0;i<=MAX_NUMBER;i++)
{
print_decimal_to_binary(i);
printf(" %8o %8d %8x\n",i,i,i);
if(i%100==0 && i!=0)
{
getch();
}
}
getch();
return 0;
}
void print_decimal_to_binary(unsigned int num)
{
int i;
i=sizeof(unsigned int)*8;
for(;i>0;i--)
{
if(num & (MASK<<(i-1)))
{
printf("1");
}
else
{
printf("0");
}
}
return;
}
4.26: 円周率を求めるプログラム
source
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <limits.h>
#define DEBUG
#include "debug.h"
//#define MAX_KOU 60000
double check_pi(void);
int main()
{
printf("\npi %.18lf",check_pi());
getch();
return 0;
}
double check_pi()
{
double pi;
unsigned int i;
unsigned int n;
pi=0.0;
n=1;
for(i=1;i<=UINT_MAX-1;i+=2)
{
pi+=pow(-1,n-1)*4/i;
DEB(printf("%.18f\n",pi);)
n++;
}
return pi;
}
4.27: 斜辺を求めるプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int hypotenuse;
int side1,side2;
int sum;
sum=0;
for(hypotenuse=1;hypotenuse<=500;hypotenuse++)
{
for(side1=1;side1<=500;side1++)
{
for(side2=1;side2<=500;side2++)
{
if((hypotenuse*hypotenuse)==((side1*side1)+(side2*side2)))
{
printf("hypotenuse %3d side1 %3d side2 %3d\n",hypotenuse,side1,side2);
sum++;
if(sum%10==0)
{
getch();
}
}
}
}
}
printf("%3d\n",sum);
getch();
return 0;
}
4.28: 被雇用者の種類に応じて賃金を計算するプログラム
source
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>
typedef enum{
MANAGER=1,
HOURLY,
PERCENTAGE,
PROGRESS_PAYMENT
}EMPLOYEE; //雇用者
unsigned int num;
EMPLOYEE *input_employee_num(void);
void input_employee_type(EMPLOYEE *);
void print_employee_fare(EMPLOYEE *);
static void print_manager_fare(void);
static void print_hourly_fare(void);
static void print_percentage_fare(void);
static void print_progress_payment_fare(void);
int main()
{
EMPLOYEE *data;
data=input_employee_num();
input_employee_type(data);
print_employee_fare(data);
getch();
return 0;
}
EMPLOYEE *input_employee_num()
{
EMPLOYEE *p;
do
{
printf("従業員数を入力してください\n");
scanf("%d",&num);
}
while(num<1);
p=(EMPLOYEE *)malloc(sizeof(EMPLOYEE)*num);
if(p==NULL)
{
fprintf(stderr,"エラー");
exit(-1);
}
return p;
}
void input_employee_type(EMPLOYEE *data)
{
unsigned int count;
EMPLOYEE *q;
q=data;
count=1;
while(count<=num)
{
printf("従業員の種類を入力してください\n");
printf("1,管理者 2.時給社員 3.歩合給社員 4.出来高払い社員\n");
printf("(%d人目)\n",count);
scanf("%d",q);
if(MANAGER<=*q && *q<=PROGRESS_PAYMENT)
{
q++;
count++;
}
else
{
printf("正しい値を入力してください\n");
}
}
return ;
}
void print_employee_fare(EMPLOYEE *data)
{
int fare;
int time;
unsigned int count;
count=1;
while(count<=num)
{
printf("(%d人目)\n",count);
switch(*data)
{
case MANAGER:
print_manager_fare();
break;
case HOURLY:
print_hourly_fare();
break;
case PERCENTAGE:
print_percentage_fare();
break;
case PROGRESS_PAYMENT:
print_progress_payment_fare();
break;
default:
break;
}
data++;
count++;
}
return ;
}
static void print_manager_fare()
{
int time;
int fare;
do
{
printf("時給はいくらですか\n");
scanf("%d",&fare);
}
while(fare<0);
do
{
printf("先週何時間働きましたか\n");
scanf("%d",&time);
}
while(time<0);
printf("給料は%dドルです\n",fare*time);
return ;
}
static void print_hourly_fare()
{
int time;
int fare;
do
{
printf("時給はいくらですか\n");
scanf("%d",&fare);
}
while(fare<0);
do
{
printf("先週何時間働きましたか\n");
scanf("%d",&time);
}
while(time<0);
if(time>40)
{
printf("給料は%.0fドルです\n",fare*40+fare*(time-40)*1.5);
}
else
{
printf("給料は%dドルです\n",fare*time);
}
return ;
}
static void print_percentage_fare()
{
int sell;
do
{
printf("週間販売高はいくつですか\n");
scanf("%d",&sell);
}
while(sell<0);
printf("給料は%fドルです\n",250+sell*0.057);
return ;
}
static void print_progress_payment_fare()
{
int sell_output;
int sell_num;
do
{
printf("商品の生産高を入力してください\n");
scanf("%d",&sell_output);
}
while(sell_output<0);
do
{
printf("商品は何個売れましたか\n");
scanf("%d",&sell_num);
}
while(sell_num<0);
printf("給料は%dドルです\n",sell_output*sell_num);
return ;
}
4.29: ド・モルガンの法則(同値条件判定を堪能するプログラム)
- a
source
#include <stdio.h>
#include <conio.h>
int main()
{
int check;
int x,y;
int data_x[4]={3,3,5,5};
int data_y[4]={8,5,8,5};
printf("!(i>4) && !(j<=6)\n");
printf("i<=4 && j>6\n");
for(check=0;check<4;check++)
{
x=data_x[check];
y=data_y[check];
printf("i %d\n",x);
printf("j %d\n",y);
if(!(x>4) && !(y<=6))
{
printf("真\n");
}
else
{
printf("偽\n");
}
if(x<=4 && y>6)
{
printf("真\n");
}
else
{
printf("偽\n");
}
printf("\n");
}
getch();
return 0;
}
- b
source
#include <stdio.h>
#include <conio.h>
#define PATERN 4
int main()
{
int check;
int x,y;
int g;
int data_x[PATERN]={0,0,0,0};
int data_y[PATERN]={1,1,0,0};
int data_g[PATERN]={5,6,5,6};
printf("!(a==b)||!(g!=5)\n");
printf("(a!=b)||(g==5)\n");
for(check=0;check<PATERN;check++)
{
x=data_x[check];
y=data_y[check];
g=data_g[check];
printf("a %d\n",x);
printf("b %d\n",y);
printf("g %d\n",g);
if(!(x==y)||!(g!=5))
{
printf("真\n");
}
else
{
printf("偽\n");
}
if((x!=y)||(g==5))
{
printf("真\n");
}
else
{
printf("偽\n");
}
printf("\n");
}
getch();
return 0;
}
- c
source
#include <stdio.h>
#include <conio.h>
int main()
{
int check;
int x,y;
int data_x[4]={8,8,4,3};
int data_y[4]={0,9,6,8};
printf("!(x<5)&&!(y>=7)\n");
printf("x>=5 && y<7\n");
for(check=0;check<4;check++)
{
x=data_x[check];
y=data_y[check];
printf("x %d\n",x);
printf("y %d\n",y);
if(!(x<5)&&!(y>=7))
{
printf("真\n");
}
else
{
printf("偽\n");
}
if(x>=5 && y<7)
{
printf("真\n");
}
else
{
printf("偽\n");
}
printf("\n");
}
getch();
return 0;
}
- d
source
#include <stdio.h>
#include <conio.h>
int main()
{
int check;
int x,y;
int data_x[4]={3,3,5,5};
int data_y[4]={8,5,8,5};
printf("!(i>4) && !(j<=6)\n");
printf("i<=4 && j>6\n");
for(check=0;check<4;check++)
{
x=data_x[check];
y=data_y[check];
printf("i %d\n",x);
printf("j %d\n",y);
if(!(x>4) && !(y<=6))
{
printf("真\n");
}
else
{
printf("偽\n");
}
if(x<=4 && y>6)
{
printf("真\n");
}
else
{
printf("偽\n");
}
printf("\n");
}
getch();
return 0;
}
4.30
- リスト4.5(P.100)のプログラムのswitch文をネストされたif/elseで置き換えたプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int grade;
int aCount=0,bCount=0,cCount=0,
dCount=0,fCount=0;
printf("試験の成績(A,B,C,D,F)を入力してください\n");
printf("入力を終了するには.EOF文字をタイプしてください\n");
while((grade=getchar())!=EOF)
{
if(grade=='a' || grade=='A')
{
aCount++;
}
else if(grade=='b' || grade=='B')
{
bCount++;
}
else if(grade=='c' || grade=='C')
{
cCount++;
}
else if(grade=='d' || grade=='D')
{
dCount++;
}
else if(grade=='f' || grade=='F')
{
fCount++;
}
else if(grade=='\n' || grade==' ')
{
;
}
else
{
printf("成績を表す文字が正しくありません\n");
printf("もう一度,入力してください\n");
}
}
printf("\n各成績の集計結果\n");
printf("A: %d\n",aCount);
printf("B: %d\n",bCount);
printf("C: %d\n",cCount);
printf("D: %d\n",dCount);
printf("F: %d\n",fCount);
getch();
return 0;
}
- if/elseバージョンを一連のif分で書き換えたプログラム
source
#include <stdio.h>
#include <conio.h>
#define TRUE 1
#define FALSE 0
int main()
{
int grade;
int check;
int aCount=0,bCount=0,cCount=0,
dCount=0,fCount=0;
check=FALSE;
printf("試験の成績(A,B,C,D,F)を入力してください\n");
printf("入力を終了するには.EOF文字をタイプしてください\n");
while((grade=getchar())!=EOF)
{
if(grade=='a' || grade=='A')
{
aCount++;
check=TRUE;
}
if(grade=='b' || grade=='B')
{
bCount++;
check=TRUE;
}
if(grade=='c' || grade=='C')
{
cCount++;
check=TRUE;
}
if(grade=='d' || grade=='D')
{
dCount++;
check=TRUE;
}
if(grade=='f' || grade=='F')
{
fCount++;
check=TRUE;
}
if(grade=='\n' || grade==' ')
{
;
check=TRUE;
}
if(check==FALSE)
{
printf("成績を表す文字が正しくありません\n");
printf("もう一度,入力してください\n");
check=FALSE;
}
check=FALSE;
}
printf("\n各成績の集計結果\n");
printf("A: %d\n",aCount);
printf("B: %d\n",bCount);
printf("C: %d\n",cCount);
printf("D: %d\n",dCount);
printf("F: %d\n",fCount);
getch();
return 0;
}
4.31: 菱形を描くプログラム
source
#include <stdio.h>
#include <conio.h>
#define MAX 9
int main()
{
int i,j,m,k;
for(i=1;i<=MAX;i++)
{
if(i<=MAX/2+1)
{
m=(MAX-((i-1)*2+1))/2+1;
for(j=1;j<=MAX;j++)
{
if(j==m)
{
for(k=m;k<m+((i-1)*2+1);k++)
{
printf("*");
}
}
else
{
printf(" ");
}
}
}
else
{
m=(((i-1)*2+1)-MAX)/2+1;
for(j=1;j<=MAX;j++)
{
if(j==m)
{
for(k=m;k<=MAX-m+1;k++)
{
printf("*");
}
}
else
{
printf(" ");
}
}
}
printf("\n");
}
getch();
return 0;
}
4.32: 4.31のプログラムを、1から19までの奇数を入力して菱形を描く行数を指定できるように変更したプログラム
source
#include <stdio.h>
#include <conio.h>
int print_diamond(int);
int main()
{
int n;
printf("1-19の奇数を入力してください\n");
scanf("%d",&n);
if(print_diamond(n)==-1)
{
printf("エラー\n");
return -1;
}
getch();
return 0;
}
int print_diamond(int n)
{
int i,j,m,k;
if(n<1 || n>19)
{
return -1;
}
for(i=1;i<=n;i++)
{
if(i<=n/2+1)
{
m=(n-((i-1)*2+1))/2+1;
for(j=1;j<=n;j++)
{
if(j==m)
{
for(k=m;k<m+((i-1)*2+1);k++)
{
printf("*");
}
}
else
{
printf(" ");
}
}
}
else
{
m=(((i-1)*2+1)-n)/2+1;
for(j=1;j<=n;j++)
{
if(j==m)
{
for(k=m;k<=n-m+1;k++)
{
printf("*");
}
}
else
{
printf(" ");
}
}
}
printf("\n");
}
return 0;
}
4.33: 1から100までの10進数に対応するローマ数字を表の形にプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define DATA_SIZE 14
char **data_malloc(void);
void input_roman_numeral(char **);
static char *data_calloc(void);
void print_roman_numeral(char **);
void free_data(char **);
int main()
{
int i;
char **p;
p=data_malloc();
input_roman_numeral(p);
print_roman_numeral(p);
free_data(p);
free(p);
getch();
return 0;
}
char **data_malloc()
{
char **p;
p=(char **)malloc(sizeof(char *)*100);
if(p==NULL)
{
printf("メモリ領域が確保できませんでした\n");
exit(-1);
}
return p;
}
void input_roman_numeral(char **data)
{
int i;
int ten_count;
ten_count=0;
for(i=1;i<=100;i++,data++)
{
*data=data_calloc();
if(i%10==0 && i!=0)
{
ten_count++;
}
if(ten_count>0)
{
switch(ten_count%11)
{
case 1:
strcat(*data,"X");
break;
case 2:
strcat(*data,"XX");
break;
case 3:
strcat(*data,"XXX");
break;
case 4:
strcat(*data,"XL");
break;
case 5:
strcat(*data,"L");
break;
case 6:
strcat(*data,"LX");
break;
case 7:
strcat(*data,"LXX");
break;
case 8:
strcat(*data,"LXXX");
break;
case 9:
strcat(*data,"XC");
break;
case 10:
strcat(*data,"C");
break;
default:
break;
}
}
switch(i%10)
{
case 1:
strcat(*data,"I");
break;
case 2:
strcat(*data,"II");
break;
case 3:
strcat(*data,"III");
break;
case 4:
strcat(*data,"IV");
break;
case 5:
strcat(*data,"V");
break;
case 6:
strcat(*data,"VI");
break;
case 7:
strcat(*data,"VII");
break;
case 8:
strcat(*data,"VIII");
break;
case 9:
strcat(*data,"IX");
break;
default:
break;
}
}
}
static char *data_calloc()
{
char *
data=(char *)calloc(DATA_SIZE,sizeof(char));
if(data==NULL)
{
printf("メモリ領域が確保できませんでした\n");
exit(-1);
}
return data;
}
void print_roman_numeral(char **data)
{
int i;
for(i=1;i<=100;i++,data++)
{
printf("%4d ",i);
printf("%8s",*data);
if(i%5==0)
{
printf("\n");
}
}
}
void free_data(char **data)
{
int i;
for(i=0;i<100;i++)
{
free(*data);
}
return;
}
4.34: 1から256までの10進数に相当する2進数、8進数、16進数の表をプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
#define MASK 1U
#define MAX_NUMBER 256
void print_decimal_to_binary(unsigned int);
/************************************************************/
/* メイン関数 */
/************************************************************/
int main()
{
unsigned int i;
printf("%32s %8s %8s %8s\n","2進数","8進数","10進数","16進数");
for(i=1;i<=MAX_NUMBER;i++)
{
print_decimal_to_binary(i);
printf(" %8o %8d %8x\n",i,i,i);
if(i%100==0 && i!=0)
{
getch();
}
}
getch();
return 0;
}
void print_decimal_to_binary(unsigned int num)
{
int i;
i=sizeof(unsigned int)*8;
for(;i>0;i--)
{
if(num & (MASK<<(i-1)))
{
printf("1");
}
else
{
printf("0");
}
}
return;
}
4.36: 1994から1999までの西暦年を入力し、forループを使ってきれいに凝縮したその年のカレンダーをプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
#define NO_LEAP 0
#define LEAP 1
#define MAX_YEAR 1999
#define MIN_YEAR 1994
enum day_type{
SUNDAY,
MONDAY,
TUESDAY,
WENDENSDAY,
THOURSDAY,
FRIDAY,
SATURDAY
};
void input_seireki(int *);
int check_leap_year(int);
void print_calendar(int,int);
int main()
{
int *seireki;
int leap;
input_seireki(seireki);
leap=check_leap_year(*seireki);
print_calendar(*seireki,leap);
getch();
return 0;
}
void input_seireki(int *seireki)
{
do
{
printf("1994-1999を入力してください\n");
scanf("%d",seireki);
}
while(*seireki<MIN_YEAR || MAX_YEAR<*seireki);
return;
}
int check_leap_year(int seireki)
{
if((((seireki%4)==0) && ((seireki%100)!=0) || (seireki%400)==0))
{
return LEAP;
}
else
{
return NO_LEAP;
}
}
void print_calendar(int seireki,int leap)
{
int i,j;
int leap_count;
int now_yobi;
int end_yobi;
static int day_of_month[2][13]={
{-1,31,28,31,30,31,30,31,31,30,31,30,31},
{-1,31,29,31,30,31,30,31,31,30,31,30,31}
};
leap_count=0;
for(i=MIN_YEAR;i<=seireki;i++)
{
if(i%4==1)
{
leap_count++;
}
}
now_yobi=((seireki-1994)+6+leap_count)%7;
for(i=1;i<=12;i++)
{
printf("\n\n%d月\n",i);
printf("\n 日 月 火 水 木 金 土\n");
for(j=now_yobi*4-1;j>=0;j--)
{
printf(" ");
}
for(j=1;j<=day_of_month[leap][i];j++,now_yobi++)
{
printf("%4d",j);
if(now_yobi==SATURDAY)
{
if(j==day_of_month[leap][i])
{
now_yobi=-1;
}
else
{
printf("\n");
now_yobi=-1;
}
}
}
}
return;
}
4.37: ループからbreak文を取り除き、それと等価な構造化された文でリスト4.7(P.109)を書き換えたプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int x;
int end;
end=0;
for(x=1;x<=10 && end==0;x++)
{
if(x==5)
{
end=1;
}
printf("%d ",x);
}
printf("\nループを抜け出したときのxは %d\n",x);
getch();
return 0;
}
4.39: ループからcontinue文を取り除き、それと等価な構造化された文でリスト4.8(P.110)を書き換えたプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int x;
for(x=1;x<=10;x++)
{
if(x!=5)
{
printf("%d ",x);
}
}
printf("\ncontinue文を使って,5のプリントだけをスキップしました\n");
getch();
return 0;
}
4.40: switch構造からbreak文を取り除き、それと等価な構造化された文でリスト4.5(P.100)を書き換えたプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int grade;
int aCount=0,bCount=0,cCount=0,dCount=0,fCount=0;
printf("試験の成績(A,B,C,D,E,F)を入力してください\n");
printf("入力を終了するには,EOF文字をタイプしてください\n");
while((grade=getchar())!=EOF)
{
if(grade=='A' || grade=='a')
{
aCount++;
}
else if(grade=='B' || grade=='b')
{
bCount++;
}
else if(grade=='C' || grade=='c')
{
cCount++;
}
else if(grade=='D' || grade=='d')
{
dCount++;
}
else if(grade=='F' || grade=='f')
{
fCount++;
}
else if(grade=='\n' || grade==' ')
{
;
}
else
{
printf("成績を表す文字が正しくありません\n");
printf("もう一度入力してください\n");
}
}
printf("\n各成績の集計結果\n");
printf("A: %d\n",aCount);
printf("B: %d\n",bCount);
printf("C: %d\n",cCount);
printf("D: %d\n",dCount);
printf("F: %d\n",fCount);
getch();
return 0;
}
