一、設計一個程序,統計從輸入到文件結尾爲止的字符數。ide
#include <stdio.h> int main(void) { int i; for(i=0; getchar() != EOF; i++); printf("There are %d char",i); return 0; }
二、編寫一個程序,把輸入做爲字符流讀取,直到遇到EOF。令該程序打印每一個輸入字符及其ASCII編碼的十進制值。注意在ASCII序列中空格字符 前面的字符 是非打印字符,要特殊處理這些字符。若是非打印字符是換行符或製表符,則分別打印\n或\t。不然,使用控制字符符號。例如,ASCII 的1是ctrl+A,能夠顯示爲^A。注意A的ASCII值是ctrl+A的值加64。對其餘非打印字符也保持類似的關係。除每次遇到一個換行符時就開始一個新行以外,每行打印10對值。函數
#include <stdio.h> int main(void) { char ch; int i; for(i=1; (ch=getchar()) != EOF; i++) { if (ch >= ' ' || ch == '\n' || ch == '\t') printf("%-5c",ch); else printf("^%-4c",ch+64); printf("%-5d",ch); if(i%8 == 0) printf("\n"); } return 0; }
三、編寫一個程序,把輸入做爲字符流讀取,直到遇到EOF。令其報告輸入中的大寫字母個數和小寫字母個數。假設小寫字母 的數值是連續的,大寫字母也是如此。或者你可使用ctype.h庫中合適的函數來區分大小寫。測試
#include <stdio.h> #include <ctype.h> int main(void) { char ch; int i,l=0,u=0; for (i=0;(ch=getchar())!='#';i++) { if(islower(ch)) l++; else if (isupper(ch)) u++; else printf("%c is not a char !\n",ch); } printf("There are %d chars, lower is %d,upper is %d.\n",i,l,u); return 0; }
四、 編寫一個程序,把輸入做爲字符流讀取,直到遇到EOF。令其報告每一個單詞的平均字母數。不要將空白字符記爲單詞中的字母。實際上標點符號也不該該計算,但如今沒必要考慮這一點(若是您想作的好一些,能夠考慮使用ctype.h中的ispunct()函數)。ui
#include <stdio.h> #include <ctype.h> #include <stdbool.h> #define STOP '|' int main (void) { char c; //讀入字符 char prev; //前一個讀入字符 long n_chars = 0L; //字符數 int n_lines = 0; //行數 int n_words = 0; //單詞數 int p_lines = 0; //不完整的行數 bool inword = false; //標誌:若是c在一個單詞中,則inword等於true printf("Enter text to be analyzed (| to terminate): \n"); prev='\n'; //用於識別完整的行 while ((c=getchar())!=STOP) { n_chars++; //統計字符 if (c=='\n') n_lines++; //統計行數 if(!isspace(c) && !inword)//若是c不是空白字符,且c不在一個單詞裏 { inword = true;//開始一個新單詞 n_words++; //統計單詞 } if(isspace(c) && inword) inword = false;//到達單詞尾部 prev = c; //保存字符值 } if(prev!='\n') p_lines = 1; printf("characters = %ld,words = %d,lines = %d ", n_chars,n_words,n_lines); printf("partial lines = %d\n",p_lines); return 0; }
五、修改程序清單8.4中的猜想程序,使其使用更智能的猜想策略。例如,程序最初猜50,讓其詢問用戶該猜想值是大是小仍是正確。若是該猜想值小,則下一次猜想值爲50和100的中值,即75.若是75大,則下一次猜想75和50的中值,等等。使用這種二分搜索策略。起碼若是用戶沒有欺騙,該程序很快會得到正確答案。編碼
#include <stdio.h> int main (void) { int guess,max=100,min=1; char response; printf("Pick an integer from 1 to 100.I will try to guess "); printf("it.\nRespond with a b if my guess is big and with"); printf("\nan l if it is little.\n"); printf("Also,Respond a y if it is right.\n"); printf("Uh...is your number %d?\n", guess = ( max + min ) / 2 ); while ((response=getchar())!='y') { if(response=='b') { max=guess-1; printf("Well,then,is it %d?\n",guess = ( max + min ) / 2 ); } else if (response=='l') { min=guess+1; printf("Well,then,is it %d?\n",guess = ( max + min ) / 2 ); } else printf("Sorry,I understand only y or n.\n"); while(getchar() != '\n'); } printf("I know I cloud do it.\n"); return 0; }
六、修改程序清單8.8中的get_first()函數,使其返回遇到的第一個非空白字符,在一個簡單的程序中測試該函數。spa
#include <stdio.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())); /*獲取一個字符並賦給ch,若是是空白字符則被丟棄*/ while (getchar()!='\n');/*跳過本行剩餘部分*/ return ch; }
七、修改第7單中的練習8,使菜單選項由字符代替數字進行標記。設計
#include<stdio.h> #include<ctype.h> char get_first(void); //b.加班 #define TIME 40 //加班(超過TIME小時) = #define ADD 1.5 //ADD倍的時間 //c.稅率 #define LIMIT1 300 //前LIMIT1美圓爲RATE1 #define RATE1 0.15 #define LIMIT2 150 //下一個LIMIT2美圓爲RATE2 #define RATE2 0.20 #define RATE3 0.25 //餘下的位RATE3 int main(void) { double basic,hours,gross,tax; printf("Enter the number corresponding to the desired pay rate or action:\n"); printf("1) $8.75/hr\t\t\t2) $9.33/hr\n"); printf("3) $10.00/hr\t\t\t4) $11.20/hr\n"); printf("5) quit\n"); switch( get_first() ) { case '1': basic = 8.75; break; case '2': basic = 9.33; break; case '3': basic = 10.00; break; case '4': basic = 11.20; break; default: printf("quit\n"); return(0); //退出程序 } printf("you have select $%.2lf\n",basic); printf("input the work hours of a week:"); scanf("%lf",&hours); if (hours > 40) hours = 40 + (hours - 40) * 1.5; gross = hours * basic; printf("gross income:\t\t%lf\n",gross); if (gross <= LIMIT1) tax = gross * RATE1; else if (gross <= LIMIT2) tax = LIMIT1 * RATE1 + (gross - LIMIT1) * RATE2; else tax = LIMIT1 * RATE1 + LIMIT2 * RATE2 + (gross - LIMIT1 - LIMIT2) * RATE3; printf("tax:\t\t\t%lf\n",tax); printf("net income:\t\t%lf\n",gross - tax); return(0); } char get_first(void) //獲得字符串中的第一個非空字符 { int ch; while( isspace( ch = getchar() ) ); while ( getchar() != '\n'); return ch; }
八、編寫一個程序,顯示一個菜單,爲您提供加法、減法、乘法或除法的選項。得到您的選擇後,該程序請求兩個數,而後執行您選擇的操做。該程序應該只接受它所提供的菜單選項。它應該使用float類型的數,而且若是用戶未能輸入數字應容許其從新輸入。在除法的狀況中,若是用戶輸入0做爲第二個數,該程序應該提示用戶輸入一個新的值。code
#include <stdio.h> char get_choice(void); char get_first(void); float get_float(void); int main(void) { char choice; float num1,num2; while((choice=get_choice())!='q') { printf("Enter first number:"); num1 = get_float(); printf("Enter second number:"); num2 = get_float(); while( choice == 'd' && num2 == 0) { printf("Enter a number other than 0:"); num2 = get_float(); } switch (choice) { case 'a': printf("%.2f + %.2f = %.2f\n",num1, num2, num1 + num2); break; case 's': printf("%.2f - %.2f = %.2f\n",num1, num2, num1 - num2); break; case 'm': printf("%.2f * %.2f = %.2f\n",num1, num2, num1 * num2); break; case 'd': printf("%.2f / %.2f = %.2f\n",num1, num2, num1 / num2); break; default: break; } } printf("Bye.\n"); return 0; } char get_choice(void) /*顯示選項,並返回選項*/ { char choice; printf("Enter the operation of your choice:\n"); printf("a.add s.subtract:\n"); printf("m.multiply d.divide\n"); printf("q.quit\n"); choice = get_first(); while( choice != 'a' && choice != 's' && choice != 'm' && choice != 'd' && choice != 'q') { printf("Please respond with a,s,m,d, or q.\n"); choice=get_first(); } return choice; } char get_first(void) { int ch; while( isspace( ch = getchar() ) ); while ( getchar() != '\n'); return ch; } float get_float(void) { float num; char str[40]; while ((scanf("%f",&num))!=1) { gets(str); printf("%s is not a number.\n",str); printf("Please enter a number such as 2.5, -1.78E8, or 3:"); } while (getchar()!='\n'); /*不要忘記跳過多餘的輸入部分*/ return num; }