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


第八章文字入力/出力と入力確認
プログラミングの練習:
次のプログラムでは、EOFで終了するように入力する必要があります.オペレーティングシステムがリダイレクトを使用しにくい場合や使用できない場合は、読み取り&文字などの他の判断を使用して入力を終了します.
  • は、ファイルの最後に入力された文字数を統計するプログラムを設計します.
  • #include <stdio.h>
    
    int main(void)
    {
    	int count = 0;
    
    	while (getchar() != EOF)
    		count++;
    	printf("       :%d
    ", count); return 0; }

    2.EOFに遭遇するまで、入力を文字ストリームとして読み出すプログラムを作成します.プログラムに各入力文字とそのASCII符号化の10進数値を印刷させる.注意ASCIIシーケンスのスペース文字の前の文字は非印刷文字であり、これらの文字を特殊に処理します.非印刷文字が改行またはタブである場合、分割印刷またはt.そうでない場合は、制御文字記号を使用します.例えば、ASCIIの1はCtrl+Aであり、^Aと表示することができる.なお、AのASCII値はCtrl+Aの値プラス64である.他の非印刷文字についても同様の関係を維持します.改行が発生するたびに新しい行が開始されることを除いて、各行に10対の値が印刷されます.
    # include <stdio.h>
    # define ENTER '
    ' # define TAB '\t' # define BLANK ' ' int main(void) { int input[100]; int conut = 1; int i = 0; while ((input[i++] = getchar()) != EOF) ; for (i = 0; input[i] != EOF; i++) { if (input[i] == ENTER) printf("\
    |%-4d", input[i]); else if (input[i] == TAB) printf("\\t|%-4d", input[i]); else if (input >= 0 && input < BLANK) printf("%c|%-4d", input[i] + 64, input[i]); else printf("%c|%-4d", input[i], input[i]); if (conut++ % 10 == 0) putchar(ENTER); } putchar(ENTER); return 0; }

    3.EOFに遭遇するまで、入力を文字ストリームとして読み出すプログラムを作成します.入力中の大文字の個数と小文字の個数をレポートします.小文字の数値が連続していると仮定し、大文字も同様です.ctypcを使うこともできますhライブラリの適切な関数は、大文字と小文字を区別します.
    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
    {
    	char ch;
    	int count_x = 0;
    	int count_d = 0;
    
    	while ((ch = getchar(0)) != EOF)
    	{
    		if (islower(ch))
    			count_x++;
    		else if (isupper(ch))
    			count_d++;
    	}
    	printf("      :%d
    :%d
    ", count_d, count_x); return 0; }

    4.EOFに遭遇するまで、入力を文字ストリームとして読み出すプログラムを作成します.各単語の平均アルファベット数をレポートします.空白の文字を単語のアルファベットに記入しないでください.実際には、句読点も計算すべきではありませんが、今はそれを考慮する必要はありません.
    (うまくやりたい場合はctype.hシリーズのispunct()関数を使用することも考えられます).
    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
    {
    	char ch;
    	int count_word = 0;
    	int count_letter = 0;
    	int i = 0;
    
    	while ((ch = getchar()) != EOF)
    	{
    		if (isalpha(ch))
    		{
    			i = 1;
    			count_letter++;
    		}
    
    		else if (1 == i)
    		{
    			count_word++;
    			i = 0;
    		}
    	}
    	printf("    :%d
    ", count_word); printf(" :%d
    ", count_letter); printf(" :%.2f
    ",  (float)count_letter/(float)count_word); return 0; }

    5,プログラムリスト8,4の推測プログラムを修正し,よりスマートな推測戦略を使用させる.例えば、プログラムは、最初に50を当てて、ユーザに推測値が大きいか、小さいか、正しいかを尋ねさせる.この推定値が小さい場合、次の推定値は50と100の中値、すなわち75となる.75が大きい場合、次の推測値は75と50の中値などである.この二分検索(binary search)ポリシーを使用すると、少なくともユーザーがだまされていない場合、プログラムはすぐに正しい答えを得ることができます.
    #include <stdio.h>
    #include <ctype.h>
    
    int main(void)
    {
    	int big = 100;
    	int small = 1;
    	int guess = 50;
    	char ch;
    
    	printf("    (1-100),         ,        。
    "); printf(" : b、 s、 y。
    "); printf(" :%d
    ", guess); while ((ch = getchar()) != 'y') { while (getchar() != '
    ') ; switch (ch) { case 'b':  printf(" :
    "); big = guess; guess = (small + guess)  / 2; break; case 's':  printf(" :
    "); small = guess; guess = (big + guess) / 2; break; default: printf(" : , ?
    "); continue; } printf(" :%d
    ", guess); } if ('y' == ch) printf(" : !!
    "); printf(" : …… 。
    "); return 0; }

    6.プログラムリスト8.8のget_を修正するfirst()関数は、出会った最初の空白以外の文字を返します.簡単なプログラムで関数をテストします.
    #include <stdio.h>
    #include <ctype.h>
    char get_first(void);
    
    int main(void)
    {
    	char ch;
    	while ((ch = get_first()) != EOF)
    	{
    		putchar(ch);
    	}
    	return 0;
    }
    
    char get_first(void)
    {
    	int ch;
    	while (isspace(ch = getchar()));
    	while (getchar() != '
    '); return ch; }

    7.7章の練習8を修正し、メニューオプションを数字の代わりに文字でマークする.
    #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);
    char getfirst(void);
    
    int main(void)
    {
    
    	char ch;
    
    	menu();
    
    	while ((ch = getfirst()) != 'q')
    	{
    		switch (ch)
    		{
    		case 'a': fun(BASE1);
    			break;
    		case 'b': fun(BASE2);
    			break;
    		case 'c': fun(BASE3);
    			break;
    		case 'd': fun(BASE4);
    			break;
    		default: printf("         (a b c d or q):");
    		}
    		putchar('
    '); menu(); } return 0; } void menu(void) { printf("Enter the number corresponding to"); printf(" the desired pay rate or action :
    "); printf("a) $8.75 / hr         b) $9.33 / hr 
    "); printf("c) $lO.OO / hr        d) $11.20 / hr
    "); printf("q) 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); } char getfirst(void) { char ch; ch = getchar(); while (isspace(ch)) ch = getchar(); while (getchar() != '
    ') ; return ch; }

    8.加算、減算、乗算または除算のオプションを提供するメニューを表示するプログラムを作成します.選択を取得すると、プログラムは2つの数を要求し、選択した操作を実行します.このプログラムは、提供されるメニューオプションのみを受け入れる必要があります.floatタイプの数を使用し、ユーザーが数値を入力できない場合は再入力を許可します.除算の場合、ユーザがOを2番目の数として入力した場合、プログラムはユーザに新しい値を入力するように促すべきである.典型的なプログラムの実行は次のようになります.
    Enter the operation of your choice:
    a. add       s. subtract
    m. multiply   d. divide
    q. quit
    a
    Enter first number: 22.4
    Enter second number: one
    one is not an number.
    Please enter a number, such as 2.5. -1.78E8, or 3. 1
    22.4 + 1 = 23.4
    Enter the operation of your choice:
    a. add        s. subtract
    m. multiply   d. divide
    q. quit
    d
    Enter first number: 18.4
    Enter second number: O
    Enter a number other than 0: 0.2
    18.4/0.2 = 92
    Enter the operation of your choice:
    a. add        s. subtract
    m. multiply   d. divide
    q. quit
    q
    Bye.
    #include <stdio.h>
    #include <ctype.h>
    void menu(void);
    char input_ch(void);
    float input_num(void);
    
    int main(void)
    {
    	char ch;
    	float sum1, sum2;
    
    	menu();
    	while ((ch = input_ch()) != 'q')
    	{
    		printf("Enter first number:");
    		sum1 = input_num();
    		printf("Enter second number:");
    		sum2 = input_num();
    		switch (ch)
    		{
    		case 'a': printf("%.1f + %.1f = %.1f
    ", sum1, sum2, sum1 + sum2); break; case 's': printf("%.1f - %.1f = %.1f
    ", sum1, sum2, sum1 - sum2); break; case 'm': printf("%.1f * %.1f = %.1f
    ", sum1, sum2, sum1 * sum2); break; case 'd':; while (sum2 == 0.00) { printf("Enter a number other than 0:"); sum2 = input_num(); } printf("%.1f / %.1f = %.1f
    ", sum1, sum2, sum1 / sum2); break; default: printf("Error! please response with a,s,m,d or q: "); ; } menu(); } printf("Bye.
    "); return 0; } void menu(void) { printf("Enter the operation of your choice:
    "); printf("a.add s.subtract
    "); printf("m.multiply d.divide
    "); printf("q.quit
    "); } char input_ch(void) { char ch; while (ch = getchar()) { while (isspace(ch)) ch = getchar(); while (getchar() != '
    ') ; if (ch != 'a' && ch != 's' && ch != 'm' && ch != 'd' && ch != 'q') printf("Error! please response with a,s,m,d or q: "); else return ch; } } float input_num(void) { float number; char ch; while (scanf("%f", &number) != 1) { while ((ch = getchar()) != '
    ') putchar(ch); printf(" is not an number.
    "); printf("Please enter a number, such as 2.5. - 1.78E8, or 3.:"); } return number; }