下午本来说要陪一个同学回高中宣讲,但他的学校通知他延后,于是下午两点开始写第七章课后题……
晚上19:26才调试完成……
各位看出什么BUG一定要在下面留言啊
编写一个程序读取输入,读到#字符停止,然后报告读取空格数,换行符数目以及所有的其它字符数目。
#include<stdio.h>
int main(void)
{
char input;
int space=0,enter=0,others=0;
printf("Please type a stentence,type # to end my act.\n");
while((input=getchar())!='#')
{
switch(input)
{
case ' ':
space++;
break;
case '\n':
enter++;
break;
default:
others++;
break;
}
}
printf("Space\tEnter\tOthers\n%d\t%d\t%d\n",space,enter,others);
return 0;
}
编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASCII码(十进制)。一行打印8个字符。建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。
#include<stdio.h>
int main(void)
{
char input[2000];
int a=0;
while((input[a]=getchar())!='#')
{
a++;
}
int b=0;
for(b;b<a;b++){
printf("%c-%d\t",input[b],input[b]);
if((b+1)%8==0)
printf("\n");
}
return 0;
}
编写一个程序,读取整数,直到用户输入0。输入结束后,程序应该报告输入的偶数(不包括0)个数、这些偶数的平均值,输入的奇数个数以及奇数的平均值。
#include<stdio.h>
int main(void)
{
int input=0,evensum=0,oddsum=0,even=0,odd=0;
printf("Please enter an integer,0 to end.\n");
scanf("%d",&input);
while(input!=0)
{
if(input%2==0){
even++;
evensum+=input;
}
else{
odd++;
oddsum+=input;
}
printf("Please enter next integer,0 to end.\n");
scanf("%d",&input);
}
printf("number of even number:%d\naverage of even number:%f\nnumber of odd number:%d\naverage of odd number:%f\n",even,(float)evensum/even,odd,(float)oddsum/odd);
return 0;
}
使用if else语句编写一个程序读取输入,读到#停止。用感叹号代替句号,用两个感叹号代替原来的感叹号,最后报告进行了多少次替代。
#include<stdio.h>
int main(void)
{
char input,replace=0;
while((input=getchar())!='#')
{
if(input=='.'){
input='!';
replace++;
}
else if(input=='!'){
printf("%c",'!');//这个不叫替换吧?
replace++;
}
putchar(input);
}
printf("\nReplace times:%d\n",replace);
return 0;
}
虽然感觉输出两次’!'不叫替换,但效果和题目描述一样吧?
用switch重写练习4。
#include<stdio.h>
int main(void)
{
char input,replace=0;
while((input=getchar())!='#')
{
switch(input){
case '.':
input='!';
replace++;
break;
case '!':
putchar(input);
replace++;
default:
break;
}
putchar(input);
}
printf("\nReplace times:%d\n",replace);
return 0;
}
编写程序输入,读到#停止,报告ei出现的次数。
#include<stdio.h>
int main(void)
{
char a,next;
int count=0;
printf("Please type in stences,type # to end.\n");
a=getchar();
while((next=getchar())!='#'&&a!='#')
{
if(a=='e'&&next=='i'){
count++;
}
a=next;
}
printf("Times:%d\n",count);
return 0;
}
一开始思路是混乱的……
编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入
做如下假设:
a.基本工资 = 1000美元 / 小时
b.加班(超过40小时) = 1.5倍时间
c.税率: 前300美元为15%
续150美元为20%
余下的为25%
用#define定义符号常量,不用在意是否符合当前的税法
#include<stdio.h>
#define salary 10.00
#define overtime 40//超过40h为加班时间
#define ratio 1.5//加班工时为1.5倍
#define tax1 0.15//第一部分税率
#define tax2 0.2//第二部分税率
#define tax3 0.25//第三部分税率
#define break1 300//税率第一个分界点(收入)
#define break2 450//税率第二个分界点(收入)
//#define salary1 break1*(1-tax1)//恰好达到第一个分界点税后收入
//#define salary2 ((break2-break1)*(1-tax2)+salary1)//恰好达到第二个分界点税后收入
int main(void)
{
float time,origin,total,tax,after_tax;
printf("Please enter your working hours.\n");
scanf("%f",&time);
origin=time;
if(time>overtime)
time=(time-overtime)*ratio+overtime;
total=time*salary;//计算税前薪水
if(total>=0&&total<=break1){
tax=total*tax1;
after_tax=total-tax;
}
else if(total>break1&&total<=break2){
tax=break1*tax1+(total-break1)*tax2;
after_tax=total- tax;
}
else {
tax=break1*tax1+(break2-break1)*tax2+(total-break2)*tax3;
after_tax=total-tax;
}
printf("Hours\tTotal wages\tTax\tAfter-tax income\n"
"%.2f\t%.2f\t\t%.2f\t%.2f\n",origin,total,tax,after_tax);
return 0;
}
和书上那道收电费的例题还是有点区别的
修改练习7的假设a,让程序可以给出一个供选择的工资等级菜单
使用 switch 完成工资等级的选择。
运行程序后,显示的菜单应该类似这样:
*******************************************************************************
Enter the number corresponding to the desired pay rate of action:
1) $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 overtime 40//超过40h为加班时间
#define ratio 1.5//加班工时为1.5倍
#define tax1 0.15//第一部分税率
#define tax2 0.2//第二部分税率
#define tax3 0.25//第三部分税率
#define break1 300//税率第一个分界点(收入)
#define break2 450//税率第二个分界点(收入)
int main(void)
{
float salary;
int a;
printf("************************************************************************************\n"
"Enter the number corresponding to the desired pay rate or action:\n"
"1) $8.75/hr\t\t2) $9.33/hr\n3) $10.00/hr\t\t4) $11.20/hr\n5) quit\n"
"************************************************************************************\n");
while((a=getchar())!='5'){
switch(a)
{
case '1':
salary=8.75;
break;
case '2':
salary=9.33;
break;
case '3':
salary=10.00;
break;
case '4':
salary=11.20;
break;
default:
printf("Please enter a correct option.\n");
}
if(a=='1'||a=='2'||a=='3'||a=='4'){
float time,origin,total,tax,after_tax;
printf("Please enter your working hours.\n");
scanf("%f",&time);
origin=time;
if(time>overtime)
time=(time-overtime)*ratio+overtime;
total=time*salary;//计算税前薪水
if(total>=0&&total<=break1){
tax=total*tax1;
after_tax=total-tax;
}
else if(total>break1&&total<=break2){
tax=break1*tax1+(total-break1)*tax2;
after_tax=total- tax;
}
else {
tax=break1*tax1+(break2-break1)*tax2+(total-break2)*tax3;
after_tax=total-tax;
}
printf("Hours\tTotal wages\tTax\tAfter-tax income\n"
"%.2f\t%.2f\t\t%.2f\t%.2f\n\n\n",origin,total,tax,after_tax);
// "\nEnter the number corresponding to the desired pay……(Enter '5' to quit)\n"
printf("************************************************************************************\n"
"Enter the number corresponding to the desired pay rate or action:\n"
"1) $8.75/hr\t\t2) $9.33/hr\n3) $10.00/hr\t\t4) $11.20/hr\n5) quit\n"
"************************************************************************************\n");
}
getchar();//读取在摁回车时产生的\n,若无这个,则会被循环读取并赋值给a...
}
return 0;
}
编写一个程序,只接受正整数输入,
然后显示所有小于等于该数的素数。
//这个程序太夸张了……
#include<stdio.h>
int main(void)
{
int a,b,c;
scanf("%d",&a);
if(a>=0)
for(b=2;b<=a;b++){
for(c=2;c<b;c++){
if(b%c==0)//判断b是否为素数
break;
}
if(c==b)
printf("%d ",b);
}
return 0;
}
我写出来的代码我自己都看不懂( ̄_ ̄|||)
不过好像能用……
1988年的美国联邦税收计划是近代最简单的税收方案。
它分为4个类别,每个类别有两个等级。
下面是税收计划的摘要(美元数为应征税的收入):
类别 税金
单身 17850美元按15%计,超出部分按28%计
户主 23900美元按15%计,超出部分按28%计
已婚,共有 29750美元按15%计,超出部分按28%计
已婚,离异 14875美元按15%计,超出部分按28%计
例如:一位工资为20000美元的单身纳税人,应缴纳税费 0.15x17850+0.28x(20000-17850)美元。
编写一个程序,让用户指定缴纳税金的种类和应纳税收入,然后计算税金。
程序应通过循环让用户可以多次输入。
#include<stdio.h>
#define tax1 0.15
#define tax2 0.28
int main(void)
{
int part1,part2;
float tax;
char a;
printf("*************************************************\n"
"请选择您的类别,键入一个数字并按回车\n1)单身\t\t2)户主\n3)已婚,共有\t4)已婚,离异\n退出请按5\n"
"*************************************************\n");
while((a=getchar())!='5'){
switch(a)
{
case '1':
part1=17850;
break;
case '2':
part1=23900;
break;
case '3':
part1=29750;
break;
case '4':
part1=14875;
break;
default:
printf("请输入正确的选项\n");
break;
}
if(a=='1'||a=='2'||a=='3'||a=='4'){
printf("请输入您的应纳税收入:");
scanf("%d",&part2);
if(part2<=part1){
tax=part2*tax1;
}
else
{
tax=part1*tax1+(part2-part1)*tax2;
}
printf("您需缴纳的税金为:%.2f\n\n\n",tax);
}
printf("*************************************************\n"
"请选择您的类别,键入一个数字并按回车\n1)单身\t\t2)户主\n3)已婚,共有\t4)已婚,离异\n退出请按5\n"
"*************************************************\n");
getchar();
}
return 0;
}
还是有些BUG,不过我目前好像没办法完美解决……
就是输入一串数字再回车,你们懂的,又是缓冲区的问题……
ABC邮政杂货店出售的鲜蓟售价为2.05美元/磅,甜菜售价为1.15美元/磅,胡萝卜售价为1.09美元/磅。添加运费之前,100美元的订单有%5的打折优惠。少于或等于5磅的订单收取6.5美元的运费和包装费,5磅~20磅的订单收取14美元的运费和包装费,超过20磅的订单在14美元的基础上每续重1磅增加0.5美元。编写一个程序,在循环中用switch语句实现用户输入不同的字母时有不同的响应,即输入a响应是让用户输入鲜蓟的磅数,b是甜菜的磅数,c是胡萝卜的磅数,q退出订购。程序要记录累计的重量。然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装费。随后,程序要显示所有的购买信息:物品售价、订购的重量(磅)、订购的蔬菜费用、订单的总费用、折扣(if you)、运费和包装费、以及所有的费用总额。
#include<stdio.h>
#define artichoke 2.05//洋蓟价格
#define beet 1.15//甜菜价格
#define carrot 1.09
#define discount 0.05
#define edge 100//大于等于这个数会打折
#define break1 5//运费的第一个断点:5磅
#define break2 20
#define freight1 6.5//第一种运费
#define freight2 14//第二种运费
#define freight3 0.5//超出,每磅收取的运费
int main(void)
{
char a;
float ar=0,be=0,ca=0,b,weight=0,cost,freight,total;//三种蔬菜分别的重量,b就是个中间量,weight为总重量,cost为蔬菜花费,freight为运费,total为总费用
int c=0;
printf("************************************************\n"
"a)洋蓟\t\tb)甜菜\nc)胡萝卜\tq)退出并打印账单\n"
"************************************************\n");
while((a=getchar())!='q'){
switch(a)
{
case 'a':
printf("请输入需要购买的洋蓟磅数:");
scanf("%f",&b);
ar+=b;
break;
case 'b':
printf("请输入需要购买的甜菜磅数:");
scanf("%f",&b);
be+=b;
break;
case 'c':
printf("请输入需要购买的胡萝卜磅数:");
scanf("%f",&b);
ca+=b;
break;
default:
printf("请选择正确的选项\n");
break;
}
printf("************************************************\n"
"a)洋蓟\t\tb)甜菜\nc)胡萝卜\tq)退出并打印账单\n"
"************************************************\n请继续选择:");
getchar();
}
//计算买菜费用与折扣
cost=artichoke*ar+beet*be+carrot*ca;
if(cost>100){
cost*=(1-discount);
c=1;
}
//计算运费及包装费
weight=ar+be+ca;
if(weight==0)
freight=0;
else if(0<weight<=break1)
freight=freight1;
else if(weight<=break2)
freight=freight2;
else
freight=freight3+(weight-break2)*0.5;
total=cost+freight;
//输出部分
printf("\t洋蓟\t\t甜菜\t\t胡萝卜\n物品售价:%.2f\t\t%.2f\t\t%.2f\n"
"订购重量:%.2f\t\t%.2f\t\t%.2f\n"
"总重量:%.2f\n",artichoke,beet,carrot,ar,be,ca,weight);
if(c==1)
printf("折扣:%.2f\n",discount);
printf("运费和包装费:%.2f\n"
"订单总费用:%.2f\n",freight,total);
return 0;
}
这几道题的代码长度真的吓到我了
写到最后一道题时头有点晕
2019年1月22日21点34分