接着上次第7章繼續寫下去,現在的程序代碼比較大不像前幾張可以直接寫出來,更多的需要在紙上先畫出流程圖,勾勒出哪些部分用函數來寫,函數的入口與返回等等。
不多說直接上圖:
8.修改練習7中的假設a,是程序提供一個選擇工資等級的菜單。用switch選擇工資等級。程序運行的開頭應該像這樣:
***************************************************************************
Enter the number corresponding to the desired pay rate or action:
!) $8.75/hr 2) $9.33/hr
3)$10.00/hr 4) $11.20/hr
5)quit
****************************************************************************
如果選擇1到4,那麼程序應該請求輸入工作小時數。程序應該一直循環運行,直到輸入5.如果輸入1到5以外的選項,那麼程序應該提醒用戶合適的選項是哪些,然後再循環。用#define爲各種工資等級和稅率定義常量。
#include <stdio.h>
#define FOUD_1 8.75//基本工資8.75美元/小時
#define FOUD_2 9.33//基本工資9.33美元/小時
#define FOUD_3 10.00//基本工資10.00美元/小時
#define FOUD_4 11.20//基本工資11.20美元/小時
#define RAT_1 0.15//稅率前300美元爲15%
#define RAT_2 0.20//下一個150美元爲20%
#define RAT_3 0.25//餘下的爲25%
#define B_T 40//加班時間分界點
#define BREAK_1 300//分界點300美元
#define BREAK_2 450//分界點450美元
double tax(double fg);//用來計算稅金
void tishi(void);//用來輸出提示信息
double grade(char cc);//選擇工資等級
int main(void)
{
double total=0,taxes=0,netpay=0;//總額,稅金,淨工資
int time;//一週工作時間
char c;
double foud;//基本工資,也作標誌位
tishi();
printf("請輸入工資等級:");
while ((c=getchar())!='5')
{
if('\n'==c)//忽略換行符
continue;
foud=grade(c);//所選擇的基本工資foud
if (0==foud)
{
printf("請輸入正確的選項:\n");
continue;
}
printf("請輸入您一週工作時間:");
scanf("%d",&time);
if (time<=B_T)
{
total=foud*time;
taxes=tax(total);
netpay=total-taxes;
}
else
{
total=foud*B_T+foud*(time-B_T)*1.5;
taxes=tax(total);
netpay=total-taxes;
}
printf("您的工資總額 %.1f,稅金 %.1f,淨工資 %.1f.\n",total,taxes,netpay);
printf("請輸入工資等級:");
}
}
//函數:計算所得稅金
double tax(double fg)
{
if (fg<=BREAK_1)
return (fg*RAT_1);
else if(fg<=BREAK_2)//總額在300美元到450美元之間
return ((fg-BREAK_1)*RAT_2+BREAK_1*RAT_1);
else//總額超過450美元的時候
return (BREAK_1*RAT_1+(BREAK_2-BREAK_1)*RAT_2+(fg-BREAK_2)*RAT_3);
}
//函數:用來直到用戶輸入的提示信息
void tishi(void)
{
int i;
for(i=0;i<65;i++)
printf("*");
printf("\n");
printf("Enter the number correspond to the desired pay rate or action:\n");
printf("1) $8.75/hr 2) $9.33/hr\n"
"3) $10.00/hr 4) $11.20/hr\n"
"5) quit\n");
for(i=0;i<65;i++)
printf("*");
printf("\n");
}
//函數:選擇工資等級
double grade(char cc)
{
switch(cc)
{
case '1':
return FOUD_1;
break;
case '2':
return FOUD_2;
break;
case '3':
return FOUD_3;
break;
case '4':
return FOUD_4;
break;
default:
return 0;
}
}
9.編寫一個程序,接受一個整數輸入,然後顯示所有小於或等於該數的素數。
#include <stdio.h>
int main(void)
{
int num;
int div;
int cout=0;
int member=2;
printf("請輸入一個整數:");
scanf("%d",&num);
printf("小於或等於該數的素數有:");
while(member++<=num)
{
for(div=2;div<=member;div++)
{
if(member%div==0)
{
continue;
}
else
{
printf("%4d",member);
}
}
}
printf("\n");
}
10.1988年United States Federal Tax Schedule是近期最基本的。它分爲4類,每類有兩個等級。下面是其摘要:美元爲應徵稅的收入:
種類 | 稅金 |
單身 | 前17,850美元按15%,超出部分按28% |
戶主 |
前23,900美元按15%,超出部分按28% |
已婚,共有 | 前29,750美元按15%,超出部分按28% |
已婚,離異 | 前14,875美元按15%,超出部分按28% |
#include <stdio.h>
#define BREAK_1 17850//單身收稅分界點
#define BREAK_2 23900//戶主
#define BREAK_3 29750//已婚,共有
#define BREAK_4 14875//已婚,離異
#define RATE_1 0.15//在分界點之前的稅率
#define RATE_2 0.28//在分界點之後的稅率
void menu(void);
int main(void)
{
char varity;//稅金種類
int taxes;//用戶指定的應徵稅收入
double bill=0;//稅金
menu();
printf("請用戶輸入稅金種類和應徵稅收入:");
scanf("%c%d",&varity,&taxes);
while('#'!=varity)//當用戶第一個輸入爲#號時退出
{
switch(varity)
{
case '1'://單身情況的稅金
if(taxes<=BREAK_1)
bill=taxes*RATE_1;
else
bill=BREAK_1*RATE_1+(taxes-BREAK_1)*RATE_2;
break;
case '2'://戶主
if(taxes<=BREAK_2)
bill=taxes*RATE_1;
else
bill=BREAK_2*RATE_1+(taxes-BREAK_2)*RATE_2;
break;
case '3'://已婚,共有
if(taxes<=BREAK_3)
bill=taxes*RATE_1;
else
bill=BREAK_3*RATE_1+(taxes-BREAK_3)*RATE_2;
break;
case '4'://已婚,離異
if(taxes<=BREAK_4)
bill=taxes*RATE_1;
else
bill=BREAK_4*RATE_1+(taxes-BREAK_4)*RATE_2;
break;
default:
break;
}
printf("稅金是%.1f.\n",bill);
printf("請用戶輸入稅金種類和應徵稅收入:");
scanf("%c,%d",&varity,&taxes);
}
return 0;
}
//
void menu(void)
{
printf("1)單身 2)戶主\n"
"3)已婚,共有 4)已婚,離異\n");
}
11.ABC Mail Order Grocery朝鮮魚的售價是1.25/磅,甜菜的售價是0.65美元/磅,胡蘿蔔的售價是0.89美元/磅。在添加運輸費用之前,他們爲100美元的訂單提供5%的打折優惠。對5磅或以下的訂單收取3.50美元的運輸和裝卸費用;超過5磅而不足20磅的定單收取10.00美元的運輸和裝卸費用;20磅或以上的運輸,在8美元的基礎上每磅加收0.1美元。編寫程序,在循環中使用switch語句,以便對輸入a的響應是讓用戶輸入所需的朝鮮魚磅數,b爲甜菜的磅數,c爲胡蘿蔔的磅數,而q允許用戶退出訂購過程,然後程序計算總費用、折扣和運輸費用(如果有運輸費的話),以及總數。隨後程序應該顯示所有的購買信息:每磅的費用、訂購的磅數
該訂單每種蔬菜的費用
訂單的總費用
折扣,如果有的話加上運輸費用,以及所有費用的總數。
#include <stdio.h>
#define PRICE_1 1.25//朝鮮魚的單價
#define PRICE_2 0.65//甜菜的單價
#define PRICE_3 0.89//胡蘿蔔的單價
#define BREAK_1 5//分界點1
#define BREAK_2 20//分界點2
void menu(void);//用來顯示提示信息
int buy(void);//訂購方式
double total(void);//計算花費
int weight_1;//訂購朝鮮魚的磅數
int weight_2;//訂購甜菜的磅數
int weight_3;//訂購胡蘿蔔的磅數
int main(void)
{
int heavy;//總重量
double cost_1,cost_2,cost_3;
double traffic;//運輸費用
menu();//打印提示信息
heavy=buy();//一共有heavy磅
cost_1=total();
if(cost_1>100)
cost_2=cost_1*0.05;
if(heavy<=BREAK_1)
traffic=3.50;
else if(heavy<BREAK_2)
traffic=10.00;
else
traffic=(heavy-8)*0.1;
cost_3=cost_2+traffic;
printf("訂購的總榜數%d\n"
"訂朝鮮魚話費%.1f,訂甜菜花費%.1f,訂胡蘿蔔花費%.1f\n",heavy,weight_1*PRICE_1,
weight_1*PRICE_2,weight_3*PRICE_3);
printf("訂單的總費用%.1f\n",cost_1);
return 0;
}
//用來顯示提示信息
void menu(void)
{
printf("*******************************\n");
printf("請用戶按如下菜單項選擇:\n");
printf("a)朝鮮魚磅數 b)甜菜磅數\n"
"c)胡蘿蔔磅數 q)退出訂購\n");
printf("********************************\n");
}
//訂購方式
int buy(void)
{
char fg;
while((fg=getchar())!='q')
{
switch(fg)
{
case 'a':
printf("請輸入朝鮮魚的磅數:");
scanf("%d",&weight_1);
break;
case 'b':
printf("請輸入甜菜的磅數:");
scanf("%d",&weight_2);
break;
case 'c':
printf("請輸入胡蘿蔔的磅數:");
scanf("%d",&weight_3);
break;
default:
break;
}
}
return (weight_1+weight_2+weight_3);//共有多少磅
}
//計算花費
double total(void)
{ return (weight_1*PRICE_1+weight_2*PRICE_2+weight_3*PRICE_3);
}