書籍
- C言語プログラミング ハーベイ M.ダイテル (著), ポール J.ダイテル (著), 小嶋 隆一 (翻訳)
- development environment
- Visual Stdio Code
- gcc 8.1.0
3.17: 走行に関するデータを計算するプログラム
source
#include<stdio.h>
int main()
{
double soukou,kyuyu;//走行距離,給油量
int i;//入力回数カウンタ
double amount;//1リットル当たりの走行キロ数
double average;//1リットル当たりの平均走行キロ数
double sum;//1リットル当たりの走行キロ数のこれまでの合計
i=0;
sum=0;
while(1){
printf("ガソリンの給油量を入力してください(-1で終了):");
scanf("%lf",&kyuyu);
if(kyuyu==-1.0){
break;
}
printf("その間の走行距離を入力してください(-1で終了):");
scanf("%lf",&soukou);
if(soukou==-1){
break;
}
amount=soukou/kyuyu;
printf("1リットル当たりの走行キロ数は%lf\n",amount);
i++;
sum+=amount;
}
if(i==0){
printf("データがありません\n");
return -1;
}
average=sum/i;
printf("この期間における1リットル当たりの平均走行キロ数は%lf\n",average);
return 0;
}
3.18: デパートの顧客が信用限度額を超えたか判定するプログラム
source
#include<stdio.h>
int main()
{
int account;//口座番号
double miharai;//月初の未払い残高
double zenseikyuu;//全請求金額
double zenseisan;//全清算金額
double sinyougendo;//信用限度額
double newmiharai;//新しい未払い残高
while(1){
printf("口座番号を入力してください(-1で終了): ");
scanf("%d",&account);
if(account==-1){
break;
}
printf("\n月初の未払い残高を入力してください; ");
scanf("%lf",&miharai);
printf("\n今月の全請求金額を入力してください: ");
scanf("%lf",&zenseikyuu);
printf("\n今月の全清算金額を入力してください: ");
scanf("%lf",&zenseisan);
printf("設定された信用限度額を入力してください: ");
scanf("%lf",&sinyougendo);
newmiharai=miharai+zenseikyuu-zenseisan;
if(newmiharai>=sinyougendo){
printf("\n信用限度額を超過しました。\n");
}
}
return 0;
}
3.19: 各販売員の先週の売上高を入力して、その販売員の週給を計算し表示するプログラム
source
#include<stdio.h>
int main()
{
double kotei;//固定給
double uriage;//先週の売上高
double syuukyuu;//今週の週給
kotei=200.0;//固定給の初期化
while(1){
printf("この販売員の先週の売上高を入力してください(-1で終了): ");
scanf("%lf",&uriage);
if(uriage==-1){
break;
}
syuukyuu=kotei+uriage*0.09;
printf("この販売員の週給は: %.2lfドル\n",syuukyuu);
}
return 0;
}
3.20: ローンの利息を計算するプログラム
source
#include<stdio.h>
int main()
{
double interest;//利息
double principal;//借入金額
double rate;//年利
int days;//借入期間
while(1){
printf("ローンの借入金額を入力してください(-1で終了): ");
scanf("%lf",&principal);
if(principal==-1){
break;
}
printf("借入金利(年利)を入力してください:" );
scanf("%lf",&rate);
printf("借入期間(日数)を入力してください:" );
scanf("%d",&days);
interest=principal*rate*days/365;
printf("ローンの利息は: %.2lfドル\n",interest);
}
return 0;
}
3.21: 何人かの従業員の週給を計算するプログラム)
source
#include <stdio.h>
int main()
{
int work_time; //先週の勤務時間
double pay_hour; //従業員の時給
double pay_week; //従業員の週給
while(1)
{
printf("この従業員の先週の勤務時間を入力してください(-1で終了): ");
scanf("%d",&work_time);
if(work_time==-1)//-1なら終了
{
break;
}
else if(work_time>=0)
{
printf("この従業員の時給を入力してください(小数点以下2桁で) :");
scanf("%lf",&pay_hour);
if(pay_hour>=0)
{
if(work_time>=40)
{
pay_week=pay_hour*work_time+(work_time-40)*pay_hour*0.5;
printf("この従業員の時給は %.2lfドル\n\n\n",pay_week);
}
else
{
pay_week=pay_hour*work_time;
printf("この従業員の時給は %.2lfドル\n\n\n",pay_week);
}
}
else//時給が負ならば
{
printf("不正な入力です\n\n\n");
}
}
else //勤務時間が負ならば
{
printf("不正な入力です\n");
}
}
return 0;
}
3.23: 1から10までの数字を、各数字を空白3つで区切って一行にプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int i;
for(i=1;i<=10;i++)
{
if(i==1)
{
printf("%d",i);
}
else
{
printf(" %d",i);
}
}
getch();
return 0;
}
3.24: 10個の数値を1個ずつ入力し、その中で最も大きな数値を決定してプリントするプログラム
source
#include <stdio.h>
#include <limits.h>
int main()
{
int counter;
int largest;
int number;
largest=INT_MIN;
counter=0;
while(1)
{
scanf("%d",&number);
if(number>=largest)
{
largest=number;
}
counter++;
if(counter>=10)
{
printf("最大値 %d",largest);
break;
}
}
return 0;
}
3.25: 数値の表を反復構造とタブ文字\tを使ってプリントするプログラム
source
#include <stdio.h>
int main()
{
for(i=1;i<=5;i++)
{
if(i==1)
{
printf("N\t%d*N\t%d*N\t%d*N\n\n\n",i*10,i*100,i*1000);
printf("%d\t%d\t%d\t%d\n",i*10,i*100,i*1000);
}
else
{
printf("%d\t%d\t%d\t%d\n",i*10,i*100,i*1000);
}
}
return 0;
}
3.26: 反復構造を使って表をプリントするプログラム
source
#include <stdio.h>
int main()
{
int i;
for(i=0;i<=5;i++)
{
if(i==0)
{
printf("A\tA+%d\tA+%d\tA+%d\n\n\n",i+2,i+4,i+6);
}
else if(i>0)
{
printf("%d\t%d\t%d\t%d\n",i*3,i*3+2,i*3+4,i*3+6);
}
}
return 0;
}
3.27: 2番目に大きな値を求めるプログラム
source
#include <stdio.h>
#include <limits.h>
int main()
{
int counter;
int number;
int largest,second_largest;
largest=second_largest=INT_MIN;
while(1)
{
scanf("%d",&number);
if(number>=second_largest)
{
if(number>=largest)
{
second_largest=largest;
largest=number;
}
else
{
second_largest=number;
}
}
counter++;
if(counter>=10)
{
printf("2番目に大きな値は%d\n",second_largest);
break;
}
}
return 0;
}
3.28: 入力された値を検証するようにリスト3.6(P.70)のプログラムを変更したプログラム
source
#include <stdio.h>
int main()
{
int passes=0,failures=0,student=1,result;
while(student<=10)
{
printf("試験の結果を入力してください(1=合格,2=不合格): ");
while(1)
{
scanf("%d",&result);
if(result!=1 && result!=2)
{
printf("1または2を入力してください\n");
}
else
{
break;
}
}
if(result==1)
{
passes=passes+1;
}
else
{
failures=failures+1;
}
student++;
}
printf("合格者 %d\n",passes);
printf("不合格者 %d\n",failures);
if(passes>=8)
{
printf("授業料を値上げしてよい\n");
}
scanf("%d",&result);
return 0;
}
3.33: 正方形の一辺の長さを入力して、その大きさの正方形をアスタリスクでプリントするプログラム
source
#include <stdio.h>
void print_square(int);
int main()
{
int count;
while(1)
{
printf("1-20を入力してください\n");
scanf("%d",&count);
if(count>=1 && count<=20)
{
break;
}
}
print_square(count);
scanf("%d",&count);
return 0;
}
void print_square(int count)
{
int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<count;j++)
{
printf("*");
}
printf("\n");
}
return;
}
3.34: 3.33のプログラムを中空の正方形をプリントするよう変更したプログラム
source
#include <stdio.h>
void print_square(int);
int main()
{
int count;
while(1)
{
printf("1-20を入力してください\n");
scanf("%d",&count);
if(count>=1 && count<=20)
{
break;
}
}
print_square(count);
scanf("%d",&count);
return 0;
}
void print_square(int count)
{
int i,j;
if(count<3)
{
for(i=0;i<count;i++)
{
for(j=0;j<count;j++)
{
printf("*");
}
printf("\n");
}
}
else
{
for(i=0;i<count;i++)
{
if(i==0 || i==(count-1))
{
for(j=0;j<count;j++)
{
printf("*");
}
}
else
{
for(j=0;j<count;j++)
{
if(j==0 || j==(count-1))
{
printf("*");
}
else
{
printf(" ");
}
}
}
printf("\n");
}
}
return;
}
3.35: 5桁の整数を入力して、それが回分(左から読んでも右から読んでも同じ文字列)を判定するプログラム
source
#include <stdio.h>
#include <math.h>
#define KETA 5
int check_time_sentence(int,int);
/* 戻り値 1 回文である 0 回文でない
引数 データ,桁数 */
int main()
{
int data;
while(1)
{
printf("5桁の数字を入力してください\n");
scanf("%d",&data);
if(data>=10000 && data<=99999)
{
break;
}
else
{
printf("5桁の数字を入力してください\n");
}
}
if(check_time_sentence(data,KETA))
{
printf("回文です\n");
}
else
{
printf("回文ではありません\n");
}
scanf("%d",&data);
return 0;
}
int check_time_sentence(int data,int keta)
{
int i;
int data1[KETA];
int n;
n=pow(10,keta-1);
for(i=0;i<keta;i++)
{
data1[i]=data/n;
data=data%n;
n=n/10;
}
for(i=0;i<keta/2;i++)
{
if(data1[i]!=data1[keta-i-1])
{
return 0;
}
}
return 1;
}
3.36: 2進数を10進数に変換するプログラム
source
#include <stdio.h>
#include <math.h>
#include <limits.h>
int main()
{
char buf[33];
int i,j;
int end_flag;
int size;
unsigned int sum;
end_flag=0;
size=0;
sum=0;
while(1)
{
printf("二進数を入力してください(最大32桁まで入力可)\n");
if((fgets(buf,sizeof(buf),stdin))==NULL)
{
//ウインドウズでは^ZがEOFらしい
printf("エラー\n");
return -2;
}
for(i=0;i<sizeof(buf);i++)
{
if(buf[i]==0)
{
if(buf[i-1]==10)
{
size=i-2;
end_flag=1;
break;
}
else
{
size=i-1;
end_flag=1;
break;
}
}
else if(buf[i]!=48 && buf[i]!=49 && buf[i]!=10)
{
printf("0-1を入力してください\n");
break;
}
}
if(end_flag==1)
{
break;
}
}
for(i=size,j=0;i>=0;i--,j++)
{
if(buf[i]==49)
{
sum=sum+pow(2,j);
}
}
printf("\n10進数では%uです(符号なし)\n",sum);
scanf("%d",&sum);
return 0;
}
3.37: 自身の環境での計算能力を測定するプログラム
source
#include <stdio.h>
#include <time.h>
int main()
{
int i;
clock_t start,end;
start=clock();
for(i=0;i<3000000;i++)
{
if(i%1000000==0)
{
printf("%d\n",i);
}
}
end=clock();
printf("%f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
scanf("%d",&end);
return 0;
}
3.38: 一度に100個のアスタリスクをプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
#define NUM 100
/* アスタリスクを10文字おきに改行して表示
引数 印字するアスタリスクの数 */
void print_asuta(int);
int main()
{
print_asuta(NUM);
getch();
return 0;
}
void print_asuta(int num)
{
int i;
for(i=1;i<=num;i++)
{
printf("*");
if(i%10==0)
{
printf("\n");
}
}
return;
}
3.39: 入力された整数に7がいくつあるか判定するプログラム
source
#include <stdio.h>
#include <conio.h>
#define SIZE 100
int main()
{
char buf[SIZE];
int count;
int i;
count=0;
printf("整数を入力してください\n");
fgets(buf,sizeof(buf),stdin);
for(i=0;i<SIZE;i++)
{
if(buf[i]=='7')
{
count++;
}
else if(buf[i]=='\n' || buf[i]=='\0')
{
break;
}
}
printf("7の個数は%dです\n",count);
getch();
return 0;
}
3.40: 格子模様を表示するプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
int i,j;
for(i=0;i<8;i++)
{
if(i%2==0)
{
for(j=0;j<16;j++)
{
printf("* ");
}
}
else
{
for(j=0;j<16;j++)
{
if(j==0)
{
printf(" ");
}
printf("* ");
}
}
printf("\n");
}
getch();
return 0;
}
3.41: 整数2の倍数をプリントし続けるプログラム(注: 無限ループ)
source
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
int i;
i=1;
while(1)
{
printf("%d\n",(int)pow(2,i));
getch();
i++;
}
return 0;
}
3.42: 円の直径、円周、面積を計算してプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
#define PI 3.14159f
int main()
{
float r;
float square;
while(1)
{
printf("円の半径を入力してください\n");
scanf("%f",&r);
if(r<=0)
{
printf("円の半径を入力して下さい\n");
}
else
{
break;
}
}
printf("面積は%fです\n",r*r*PI);
getch();
return 0;
}
3.43: 間違いを修正したプログラム
source
#include <stdio.h>
int main()
{
int x,y;
x=y=1;
x=(x+y);
x++;
printf("%d",x);
return 0;
}
3.44: 三角形を構成するか否かを判定するプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
float a,b,c;
printf("それぞれの辺の長さを入力してください\n");
while(1)
{
scanf("%f %f %f",&a,&b,&c);
if(a<=0 || b<=0 || c<=0)
{
printf("不正な入力です\n");
}
else if(a+b>c && b+c>a && c+a>b)
{
printf("これらの辺は三角形を構成します\n");
break;
}
else
{
printf("これらの辺は三角形を構成しません\n");
break;
}
}
getch();
return 0;
}
3.45: 三角形を構成するか否かを判定するプログラム
source
#include <stdio.h>
#include <conio.h>
int main()
{
unsigned int a,b,c;
printf("それぞれの辺の長さを入力してください\n");
while(1)
{
scanf("%d %d %d",&a,&b,&c);
if(a<=0 || b<=0 || c<=0)
{
printf("不正な入力です\n");
}
else if(a+b>c && b+c>a && c+a>b)
{
printf("これらの辺は三角形を構成します\n");
break;
}
else
{
printf("これらの辺は三角形を構成しません\n");
break;
}
}
getch();
return 0;
}
3.46: 暗・復号化プログラム
source
#include <stdio.h>
#include <conio.h>
#define MAX_LEN 4
char *encrypt(char *,char *);
char *decrypt(char *,char *);
int main()
{
char data[MAX_LEN];
char dec_table[MAX_LEN];
printf("4桁の整数を入力してください\n");
scanf("%s",data);
printf("暗号化された整数 %s\n",encrypt(data,dec_table));
printf("暗号化された整数を入力してください\n");
scanf("%s",data);
printf("複合化された整数 %s\n",decrypt(data,dec_table));
getch();
return 0;
}
char *encrypt(char data[],char dec_table[])
{
int i;
if(data[0]=='-')
{
for(i=1;i<=MAX_LEN;i++)
{
dec_table[i]=(data[i]-'0'+7)/10;
data[i]=(data[i]-'0'+7)%10+'0';
}
data[i]='\0';
}
else
{
for(i=0;i<MAX_LEN;i++)
{
dec_table[i]=(data[i]-'0'+7)/10;
data[i]=(data[i]-'0'+7)%10+'0';
}
}
return data;
}
char *decrypt(char data[],char dec_table[])
{
int i;
if(data[0]=='-')
{
for(i=1;i<=MAX_LEN;i++)
{
data[i]=10*dec_table[i]+(data[i]-'0'-7)+'0';
}
data[i]='\0';
}
else
{
for(i=0;i<MAX_LEN;i++)
{
data[i]=10*dec_table[i]+(data[i]-'0'-7)+'0';
}
}
return data;
}
3.47: 階乗を扱うプログラム
- a: 整数の階乗を計算してプリントするプログラム
source
#include <stdio.h>
#include <conio.h>
#include <math.h>
unsigned int factorial(int);
int main()
{
int num;
while(1)
{
printf("負でない整数を入力してください\n");
scanf("%d",&num);
if(num>=0)
{
break;
}
}
printf("%d!=%u\n",num,factorial(num));
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;
}
}
- b: ネイピア数を求めるプログラム
source
#include <stdio.h>
#include <conio.h>
#include <math.h>
unsigned int factorial(int);
double print_exp(void);
int main()
{
printf("eの近似値は%.18f",print_exp());
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;
}
}
/************************************************************/
/* 数学定数eの値を近似する */
/* 精度 小数点以下第9桁 */
/************************************************************/
double print_exp()
{
double exp;
int num;
exp=0.0;
num=0;
while(num<=12)
{
exp+=1.0/factorial(num);
num++;
}
return exp;
}
- c: ネイピア数のx乗を計算するプログラム
source
#include <stdio.h>
#include <conio.h>
#include <math.h>
unsigned int factorial(int);
double print_exp(double);
int main()
{
double x;
printf("xの値を入力してください\n");
scanf("%lf",&x);
printf("eの%.4f乗の近似値は%.18f",x,print_exp(x));
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;
}
}
/************************************************************/
/* 数学定数eのx乗の値を近似する */
/* */
/************************************************************/
double print_exp(double x)
{
double result;
int num;
result=0.0;
num=0;
while(num<=12)
{
result+=pow(x,num)/factorial(num);
num++;
}
return result;
}
