C Primer Plus(第5版)第7章プログラミング練習


第七章C制御文:分岐とジャンプ
プログラミングの練習:
1.プログラムを作成します.このプログラムは、入力が#文字に遭遇するまで読み込まれ、読み込まれたスペースの数、読み込まれた改行文字の数、および読み込まれた他のすべての文字の数をレポートします.
#include <stdio.h>

int main(void)
{
	int a=0, b=0, c=0;
	char ch;
	
	while ((ch = getchar()) != '#')
	{
		if (ch != ' ' && ch != '
') c++; else if (ch != ' ') b++; else a++; } printf("        :%3d
", a); printf("        :%3d
", b); printf(" :%3d
", c); return 0; }

2.#文字がヒットするまで入力を読み込むプログラムを作成します.プログラムに各入力の文字とその10進数ASCIIコードを印刷させます.行ごとに8文字/エンコードペアを印刷します.推奨:文字カウントとモジュール演算子(%)を使用して、8サイクルごとに改行を印刷します.
#include <stdio.h>

int main(void)
{
	int i = 0;
	char ch;
	char str[100];
	
	printf("     (  #  ):");
	do 
	{	
		ch = getchar();
		str[i++] = ch;
	} 
	while (ch != '#');

	for (i = 0; str[i] != '#'; i++)
	{
		if (str[i] == '
') printf(" '\
'/%-3d ", str[i]); else if (str[i] == '\t') printf(" '\\t'/%-3d ", str[i]); else printf("  '%c'/%-3d ", str[i], str[i]); if (i % 8 == 7) putchar('
'); } putchar('
'); return 0; }

3.プログラムを作成します.プログラムは、0が入力されるまで整数を読み込みます.入力終了後、プログラムは入力した偶数(0を含まない)の総個数、偶数の平均値、入力した奇数の総個数、奇数の平均値を報告しなければならない.
#include <stdio.h>

int main(void)
{
	int input;
	int even = 0, odd = 0;
	int even_sum = 0, odd_sum = 0;

	printf("     (  0  ):");
	while (scanf("%d", &input) == 1 && 0 != input)
	{
		if (input % 2 == 0)
		{
			even++;
			even_sum += input;
		}
		else
		{
			odd++;
			odd_sum += input;
		}
	}
	if (0 == even) 
		printf("      :0    :0
"); else printf(" :%d  :%d
", even, even_sum / even); if (0 == odd) printf(" :0  :0
"); else printf(" :%d  :%d
", odd, odd_sum / odd); return 0; }

4.if else文作成プログラムを使用して、#まで入力を読み込みます.各句点を1つの感嘆符で置き換え、既存の感嘆符を2つの感嘆符で置き換え、最後に何度報告したかを報告します.
#include <stdio.h>

int main(void)
{
	char ch;
	int a = 0, b = 0;

	printf("      , “#”  : 
"); while ((ch = getchar()) != '#') { if (ch == '.') { putchar('!'); a++; } else { if (ch == '!') { putchar('!'); putchar('!'); b++; } else { putchar(ch); } } } printf("
"); printf("'.' %d '!'
", a); printf("'!' %d '!!'
", b); printf(" %d
", a + b); return 0; }

5.switchで練習3をやり直してプログラムを作成します.プログラムは、0が入力されるまで整数を読み込みます.入力終了後、プログラムは入力した偶数(0を含まない)の総個数、偶数の平均値、入力した奇数の総個数、奇数の平均値を報告しなければならない.
#include <stdio.h>

int main(void)
{
	int input;
	int even = 0, odd = 0;
	int even_sum = 0, odd_sum = 0;

	printf("     (  0  ):");
	while (scanf("%d", &input) == 1 && 0 != input)
	{
		switch (input % 2)
		{
		case 0: even++; even_sum += input;
			break;
		case 1: odd++; odd_sum += input;
			break;
		}
	}
	if (0 == even)
		printf("      :0    :0
"); else printf(" :%d  :%d
", even, even_sum / even); if (0 == odd) printf(" :0  :0
"); else printf(" :%d  :%d
", odd, odd_sum / odd); return 0; }

6.入力を読み取り、シーケンスeiが発生した回数を報告するプログラムを作成します.このプログラムでは、前の文字と現在の文字を覚えておく必要があります."Receive your eio award."の入力テストを行います.
#include <stdio.h>

int main(void)
{
	char ch = '*',temp;
	int i = 0;

	printf("     ,  #  :");
	while (temp = ch, ch = getchar(), '#' != ch)	
		if ('e' == temp && 'i' == ch)
			i++;

	printf("ei      :%d
", i); return 0; }

7.1週間の勤務時間数を入力し、給与総額、税金、純給与を印刷するプログラムを作成します.次のように仮定します.
a.基本給等級=10.00ドル/時間
b.残業(40時間超)=1.5倍の時間
c.税率前300ドルは15%
次の150ドルは20%です
残りは25%
定数をdefineで定義します.この例が現在の税法に合致しているかどうかは気にしないでください.
#include <stdio.h>

#define LIMIT1 300
#define TAX1 0.15
#define LIMIT2 150
#define TAX2 0.2
#define LIMIT3 450
#define TAX3 0.25
#define TIME 40
#define ADD 1.5
#define BASE 10.00

int main(void)
{
	float time;
	float total, tax, salary;

	printf("            :");
	scanf("%f", &time);
	if (time > TIME)
		time = (time - TIME) * ADD + TIME;

	total = time * BASE;

	if (total <= LIMIT1)
		tax = total * TAX1;
	else if (total <= LIMIT3)
		tax = LIMIT1 * TAX1 + (total - LIMIT1) * TAX2;
	else
		tax = LIMIT1 * TAX1 + LIMIT2 * TAX2 + (total - LIMIT3) * TAX3;
	salary = total - tax;


	printf("     :%.2f;  :%.2f;    :%.2f
", total, tax, salary); return 0; }

8.練習7の仮説aを修正し、プログラムに給与等級を選択するメニューを提供させる.switchで給与等級を選択します.プログラムの実行の先頭には、次のようなものがあります.
Enter the number corresponding to the desired pay rate or action:
1) $8.75/hr                  2) $9.33/hr
3) $lO.OO/hr                 4) $11.20/hr
5) quit
lから4.を選択した場合、プログラムは勤務時間の入力を要求する必要があります.プログラムは5を入力するまでループしなければならない.lから5以外のオプションを入力すると、プログラムは、ユーザに適切なオプションがどれであるかを注意し、リサイクルする必要があります.#defineで各種給与等級と税率の定数を定義します.
#include <stdio.h>

#define LIMIT1 300
#define TAX1 0.15
#define LIMIT2 150
#define TAX2 0.2
#define LIMIT3 450
#define TAX3 0.25
#define TIME 40
#define ADD 1.5
#define BASE1 8.75
#define BASE2 9.33
#define BASE3 10.00
#define BASE4 11.20

void menu(void);
void fun(float base);

int main(void)
{
	
	char ch;
	
	menu();

	while (( ch = getchar()) != '5')
	{
		while (getchar() != '
') continue; switch (ch) { case '1': fun(BASE1); break; case '2': fun(BASE2); break; case '3': fun(BASE3); break; case '4': fun(BASE4); break; default: printf("Please enter the correct option(1 2 3 4 or 5):"); } while (getchar() != '
') continue; putchar('
'); menu(); } return 0; } void menu(void) { printf("Enter the number corresponding to"); printf(" the desired pay rate or action :
"); printf("1) $8.75 / hr         2) $9.33 / hr 
"); printf("3) $lO.OO / hr        4) $11.20 / hr
"); printf("5) quit
"); } void fun(float base) { float time; float total, tax, salary; printf(" ( ):"); scanf("%f", &time); if (time > TIME) time = (time - TIME) * ADD + TIME; total = time * base; if (total <= LIMIT1) tax = total * TAX1; else if (total <= LIMIT3) tax = LIMIT1 * TAX1 + (total - LIMIT1) * TAX2; else tax = LIMIT1 * TAX1 + LIMIT2 * TAX2 + (total - LIMIT3) * TAX3; salary = total - tax; printf(" :%.2f; :%.2f; :%.2f
", total, tax, salary); }

9.整数入力を受け入れるプログラムを作成し、その数以下のすべての素数を表示します.
#include <stdio.h>

int main(void)
{
	int a;
	int i, j;

	printf("       :");
	scanf("%d", &a);
	printf("    1   
"); for (i = 2; i <= a; i++) { for (j = 2; j*j <= i; j++) { if (i % j == 0) break; } if (j*j > i) { printf("%5d
", i); } } return 0; }

10.1988年のUnited States Federal Tax Scheduleは最近最も基本的なものである.4つのクラスに分けられ、各クラスには2つのレベルがあります.以下はその要約です.ドル数は課税すべき収入である.
┏━━━━━━┳━━━━━━━━━━━━━━━━━━┓
玍種類玍税金玍
┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫
玍单身玍前17850米ドル按15%,超过部分按28%玍
┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫
玍戸主玍前23900米ドル按15%,超过部分按28%玍
┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫
イ.既婚共有
┣━━━━━━╋━━━━━━━━━━━━━━━━━━┫
イ.既婚離異.前14875ドルはl 5%で、超えた部分は28%である.
┗━━━━━━┻━━━━━━━━━━━━━━━━━━┛
例えば、20,000ドルの課税所得を有する独身雇用労働者は、税金0.15を納付しなければならない.×17,850ドル+0.28×(20,000ドル-17,850ドル).
税金の種類と課税所得を指定し、税金を計算するプログラムを作成します.ループを使用して、ユーザーが複数回入力できるようにします.
#include <stdio.h>
#define TAXD 0.15
#define TAXU 0.28
#define KIND1 17850.00
#define KIND2 23900.00
#define KIND3 29750.00
#define KIND4 14875.00

void menu(void);
void fun(double);

int main(void)
{
	char ch;
	menu();

	while ((ch = getchar()) != '5')
	{
		while (getchar() != '
') continue; switch (ch) { case '1': fun(KIND1); break; case '2': fun(KIND2); break; case '3': fun(KIND3); break; case '4': fun(KIND4); break; default: printf(" (1 2 3 4 or 5):"); } putchar('
'); menu(); while (getchar() != '
') continue; } return 0; } void menu(void) { printf(" :
"); printf("1) 。 2) 。
"); printf("3) , 。 4) , 。
"); printf("5) 。
"); } void fun(double kind) { double income; double tax; printf(" :"); scanf("%lf", &income); if (income <= kind) tax = income * TAXD; else tax = kind * TAXD + (income - kind) * TAXU; printf(" :%.2lf
", tax); }

11.ABC Mail Order Groceryアザミの価格は1.25ドル/ポンド、デザートの価格は0.65ドル/ポンド、ニンジンの価格は0.89ドル/ポンドです.輸送費を追加する前に、100ドルの注文に5%の割引を提供します.5ポンド以下の注文に対して3.50ドルの輸送と積み下ろし費用を受け取る.5ポンドを超えて20ポンド未満の注文は1 Oを受け取る.OOドルの輸送と積み下ろし費用:20ポンド以上の輸送で、8ドルに基づいて1ポンド当たり0.1ドル加算されます.プログラムを記述し、サイクル中にswitch文を使用して、aの入力に対する応答は、ユーザに必要なアザミのポンド数を入力させ、bは甘菜のポンド数、cはニンジンのポンド数であり、qはユーザが注文プロセスを終了することを許可する.その後、プログラムは総費用、割引および輸送費用(輸送費がある場合)を計算し、合計数を計算します.その後、プログラムはすべての購入情報を表示する必要があります.1ポンド当たりの費用、注文されたポンド数、この注文された野菜ごとの費用、注文された総費用、割引、ある場合は輸送費用、およびすべての費用の合計数.
#include <stdio.h>
#define PRICE 100
#define DISCOUNT_RATE 0.05

void menu(void);
double in_lb(void);
void empty(void);

int main(void)
{
	const double price_a = 1.25;
	const double price_b = 0.65;
	const double price_c = 0.89;

	char ch;
	double lb_a = 0.00;
	double lb_b = 0.00;
	double lb_c = 0.00;
	double lb_total = 0.00;

	double cost_a = 0.00;
	double cost_b = 0.00;
	double cost_c = 0.00;
	double cost_total = 0.00;
	double final_total = 0.00;
	double discount = 0.00;
	double shipping = 0.00;

	menu();

	while ((ch = getchar()) != 'q')
	{
		empty();
		switch (ch)
		{
		case 'a': lb_a += in_lb(); empty();
			break;
		case 'b': lb_b += in_lb(); empty();
			break;
		case 'c': lb_c += in_lb(); empty();
			break;
		default: printf("        (a b c or q):");
		}
		menu();
		
	}
	
	//   
	cost_a = price_a * lb_a;
	cost_b = price_b * lb_b;
	cost_c = price_c * lb_c;
	lb_total = lb_a + lb_b + lb_c;
	cost_total = cost_a + cost_b + cost_c;

	//  
	if (cost_total > PRICE)
		discount = cost_total * DISCOUNT_RATE;

	//    
	if (lb_total < 5)
		shipping = 3.50;
	else if (lb_total < 20)
		shipping = 10.00;
	else
		shipping = 8 + (int)lb_total * 0.10;


	printf("

"); printf(" $%.2f。 %.2f $%.2f
", price_a, lb_a, cost_a); printf(" $%.2f。 %.2f $%.2f
", price_b, lb_b, cost_b); printf(" $%.2f。 %.2f $%.2f
", price_c, lb_c, cost_c); printf(" :%.2lf
", cost_total); printf(" :%.2lf
", discount); printf(" :%.2lf
", shipping); printf(" :%.2lf
", cost_total  - discount); return 0; } void menu(void) { printf(" :
"); printf(" a) b)
"); printf(" c) q)
"); } double in_lb(void) { double a; printf(" :"); scanf("%lf", &a); return a; } void empty(void) { while (getchar() != '
') ; }