目前无聊学习下C语言,顺便谢谢这些题,不一定是最好方案,但基本能符合题意。有问题欢迎多多交流哈~
编程七步骤:
1.定义程序的目标
2.设计程序
3.编写代码
4.编译
5.运行程序
6.测试和调试程序
7.维护和修改程序
目前改觉自己每次写代码都没有先进行程序设计直接就编写代码了,这是一个不好的习惯,这一章的练习我会每个练习题都先写程序设计思路再进行编码。
/*
1.编写一个程序读取输入,读到#字符停止,然后报告读取的空格
数、换行符数和所有其他字符的数量。
程序设计:
1.定义一个char字符变量,定义要统计字符3个变量
2.使用getchar方法读取输入,当读取返回#停止读取
3.使用循环打印字符, 判断空格(int值 32或' ')换行符号(\n)和其他字符
*/
#include <stdio.h>
int main(void)
{
char input;
int blank = 0;
int enter = 0;
int other = 0;
printf("请输入字符串,以#为统计停止符号\n");
while((input=getchar())!='#'){
if(input == '#'){
break;
}
if(input==' '){
blank++;
}else if(input == '\n'){
enter++;
}else{
other++;
}
}
printf("空格数量为%d,换行字符数量为:%d,其他字符数量为:%d",blank,enter,other);
}
/*
2.编写一个程序读取输入,读到#字符停止。程序要打印每个输入
的字符以及对应的ASCII码(十进制)。一行打印8个字符。建议:使用
字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。
程序设计:
1.定义一个char字符接收输入的字符
2.使用getchar方法读取输入,使用while循序读取输入字符,当读取返回#停止读取
3.使用一个计数变量统计读取到的输入字数,当%8等于零时则进行换行打印
*/
#include <stdio.h>
int main(void)
{
char input;
int count = 0;
printf("请输入字符串,以#为统计停止符号\n");
while((input=getchar())!='#'){
count++;
if(input == '#'){
break;
}
printf("%c%d ",input,input);
if(count%8==0){
printf("\n");
}
}
return 0;
}
/*
3.编写一个程序,读取整数直到用户输入 0。输入结束后,程序应
报告用户输入的偶数(不包括 0)个数、这些偶数的平均值、输入的奇
数个数及其奇数的平均值。
分析:
1.需要定义一个int类型变量接收用户输入
2. 定义一个偶数和变量,一个奇数和变量,还有奇数和偶数的计数器变量
3.写一个死循环,当用户输入0后跳出循环,计数平均值
想要获取小数的结果被除数需要乘以1.0变成小数后进行计算。
*/
#include <stdio.h>
int main(void)
{
int input;
//偶数
int count_even = 0;
long add_even = 0;
//奇数
int count_odd = 0;
long add_odd = 0;
while(1){
printf("请输入整数,输入0退出程序\n");
scanf("%d",&input);
if(input == 0){
if(count_even>0){
printf("输入的偶数个数为%d,平均值为%.2f\n",count_even,add_even*1.0/count_even);
}
if(count_odd>0){
printf("输入的奇数个数为%d,平均值为%.2f\n",count_odd,add_odd*1.0/count_odd);
}
break;
}
if(input%2 == 0){
count_even++;
add_even += input;
}else{
count_odd++;
add_odd += input;
}
}
return 0;
}
/*
4.使用if else语句编写一个程序读取输入,读到#停止。用感叹号替
换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替
换。
程序设计:
1.定义一个字符变量接收getchar()输入,使用while循环判断
2. 定义一个int类型的替换计数器,通过if语句判断输入的句号和感叹号并计数
3.当用户输入#退出循环后打印替换次数
这里只能统计英文输入
*/
#include <stdio.h>
int main(void)
{
char input;
int count = 0;
printf("请输入字符串,以#为统计停止符号\n");
while((input=getchar())!='#'){
printf("%c \n",input);
if(input == '.'){
input = '!';
count++;
} else if(input == '!'){
input = '!!';
count++;
}
}
printf("替换次数为%d",count);
return 0;
}
/*
5.使用switch编写一个程序读取输入,读到#停止。用感叹号替
换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替
换。
程序设计:
1.定义一个字符变量接收getchar()输入,使用while循环判断
2. 定义一个int类型的替换计数器,通过if语句判断输入的句号和感叹号并计数
3.当用户输入#退出循环后打印替换次数
这里只能统计英文输入
*/
#include <stdio.h>
int main(void)
{
char input;
int count = 0;
printf("请输入字符串,以#为统计停止符号\n");
while((input=getchar())!='#'){
printf("%c \n",input);
switch(input){
case '.':
input = '!';
count++;
break;
case '!':
input = '!!';
count++;
break;
default:
break;
}
}
printf("替换次数为%d",count);
return 0;
}
/*
6.编写程序读取输入,读到#停止,报告ei出现的次数。
注意
该程序要记录前一个字符和当前字符。用“Receive your eieio
award”这样的输入来测试。
程序设计:
1.使用getchar()来获取字符输入,并当输入为#号时退出程序
2.使用两个char变量记录字符,它们合并一起为ei时定义的int计数器加1
3.打印计数器
*/
#include <stdio.h>
int main(void)
{
char input;
char before;
int count = 0;
printf("请输入字符串,以#为统计停止符号\n");
while((input=getchar())!='#'){
if(before == 'e' && input == 'i')
{
count++;
}
before = input;
}
printf("ei的次数为%d\n",count);
return 0;
}
/*
6.编写程序读取输入,读到#停止,报告ei出现的次数。
注意
该程序要记录前一个字符和当前字符。用“Receive your eieio
award”这样的输入来测试。
程序设计:
1.使用getchar()来获取字符输入,并当输入为#号时退出程序
2.使用两个char变量记录字符,它们合并一起为ei时定义的int计数器加1
3.打印计数器
*/
#include <stdio.h>
int main(void)
{
char input;
char before;
int count = 0;
printf("请输入字符串,以#为统计停止符号\n");
while((input=getchar())!='#'){
if(before == 'e' && input == 'i')
{
count++;
}
before = input;
}
printf("ei的次数为%d\n",count);
return 0;
}
/*
7.编写一个程序,提示用户输入一周工作的小时数,然后打印工资
总额、税金和净收入。做如下假设:
a.基本工资 = 1000美元/小时
b.加班(超过40小时) = 1.5倍的时间
c.税率: 前300美元为15%
续150美元为20%
余下的为25%
用#define定义符号常量。不用在意是否符合当前的税法。
分析:
1.定义基本工资、税率常量
2.定义一个float类型变量接收用户输入
3.工资总额 = 时间*基本工资 +加班时间*1.5倍基本工资
税金根据总工资额分:三种,前300,300-450,450之后
净收入 = 工资总额 - 税金
*/
#include <stdio.h>
#define BASE 1000
#define TAX_RATE_1 0.15
#define TAX_RATE_2 0.20
#define TAX_RATE_3 0.25
int main(void)
{
float workTime;
float salary;
float tax;
float income;
printf("请输入一周的工作时间\n");
scanf("%f",&workTime);
if(workTime > 40){
salary = 40*BASE+(workTime - 40)*BASE*1.5;
tax = 300*TAX_RATE_1 + 150*TAX_RATE_2 + (salary - 300 - 150)*TAX_RATE_3;
income = salary - tax;
}else if(workTime > 0) {
salary = workTime*BASE;
if(salary <= 300){
tax = salary*TAX_RATE_1;
}else if(salary <= 450){
tax = 300*TAX_RATE_1+ (salary-300)*TAX_RATE_2;
}else {//大于450
tax = 300*TAX_RATE_1+ 150*TAX_RATE_2+(salary - 300 - 150)*TAX_RATE_3;
}
income = salary - tax;
}else {
printf("输入的时间有误\n");
return 0;
}
printf("工资总额为%.2f,税金为%.2f,净收入为%.2f.\n",salary,tax,income);
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) $10.00/hr 4) $11.20/hr
5) quit
*********************************************************
********
如果选择 1~4 其中的一个数字,程序应该询问用户工作的小时
数。程序要通过循环运行,除非用户输入 5。如果输入 1~5 以外的数
字,程序应提醒用户输入正确的选项,然后再重复显示菜单提示用户
输入。使用#define创建符号常量表示各工资等级和税率。
分析:
1.定义基本工资、税率常量
2.定义一个float类型变量接收用户输入
3.工资总额 = 时间*基本工资 +加班时间*1.5倍基本工资
税金根据总工资额分:三种,前300,300-450,450之后
净收入 = 工资总额 - 税金
*/
#include <stdio.h>
#define TAX_RATE_1 0.15
#define TAX_RATE_2 0.20
#define TAX_RATE_3 0.25
void worksalary(int inputNum);
void tips();
int main(void)
{
float base;
int inputNum;
tips();
scanf("%d",&inputNum);
while(inputNum != 5){
if(inputNum >0&&inputNum<5){
worksalary(inputNum);
}else{
printf("输入的值有误,请重新输入\n");
}
tips();
scanf("%d",&inputNum);
}
return 0;
}
void tips(){
printf("*********************************************************\n");
printf("Enter the number corresponding 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");
printf("*********************************************************\n");
}
void worksalary(int inputNum){
float workTime;
float salary;
float tax;
float income;
float base;
switch(inputNum){
case 1:
base = 8.75;
break;
case 2:
base = 9.33;
break;
case 3:
base = 10.00;
break;
case 4:
base = 11.20;
break;
default:
base = 0.00;
break;
}
printf("请输入一周的工作时间\n");
scanf("%f",&workTime);
if(workTime > 40){
salary = 40*base+(workTime - 40)*base*1.5;
tax = 300*TAX_RATE_1 + 150*TAX_RATE_2 + (salary - 300 - 150)*TAX_RATE_3;
income = salary - tax;
}else if(workTime > 0) {
salary = workTime*base;
if(salary <= 300){
tax = salary*TAX_RATE_1;
}else if(salary <= 450){
tax = 300*TAX_RATE_1+ (salary-300)*TAX_RATE_2;
}else {//大于450
tax = 300*TAX_RATE_1+ 150*TAX_RATE_2+(salary - 300 - 150)*TAX_RATE_3;
}
income = salary - tax;
}else {
printf("输入的时间有误\n");
}
if(workTime > 0){
printf("工资总额为%.2f,税金为%.2f,净收入为%.2f.\n",salary,tax,income);
}
}
/*
9.编写一个程序,只接受正整数输入,然后显示所有小于或等于该
数的素数。
分析:
1.只接受正整数,可以根据输入的数进行判断,输入0或负数则退出
2.接收到整数后需要对它进行循环遍历,打印等于或者小于它的素数
3.定义一个变量接收输入,通过递减对每个数遍历取模,当存在可以被整除的数,则非素数
*/
#include <stdio.h>
int main(void)
{
int input;
int count;
printf("请输入一个正整数:\n");
scanf("%d",&input);
if(input<= 0){
printf("输入有误,请重新输入一个正整数\n");
scanf("%d",&input);
}
for(int i = input;i > 1; i--){
count = 0;
for(int j = 2; j< i ; j++){
if(i%j== 0){//如果这个数能被一个小于它的数整除,则不是素数
count++;
break;
}
}
if (count == 0){
printf("%d ",i);
}
}
return 0;
}
/*
10.1988年的美国联邦税收计划是近代最简单的税收方案。它分为4
个类别,每个类别有两个等级。
下面是该税收计划的摘要(美元数为应征税的收入):
单身 17850按15% 超出按28%
户主 23900按%15 超出按28%
已婚,共有
29750按%15 超出按28%
已婚,离异
14875按%15 超出按28%
例 如 , 一 位 工 资 为 20000 美 元 的 单 身 纳 税 人 , 应 缴 纳 税 费
0.15×17850+0.28×(20000?17850)美元。编写一个程序,让用户指定
缴纳税金的种类和应纳税收入,然后计算税金。程序应通过循环让用
户可以多次输入。
分析:
1.提供四种身份给用户选择
2.需要循环输入,当输入非预期退出程序
3.定义一个变量接收用户身份选择,定义另一个变量接收用户输入的工作收入
4.定义一个变量接收税金,最后打印税金
*/
#include <stdio.h>
void tips();
int main(void)
{
int select;
float income;
int selectCount;
int incomeCount;
int base;
float tax;
while(1){
tips();
int selectCount = scanf("%d",&select);
if(selectCount!=1||select>4||select<=0){
printf("输入有误,程序退出");
break;
}
printf("请输入你的收入\n");
int incomeCount = scanf("%f",&income);
if(incomeCount!=1||income<=0){
printf("输入有误,程序退出");
break;
}
if(select==1){
base = 17850;
}else if(select==2){
base = 23900;
}else if(select==3){
base = 29750;
}else if(select==4){
base = 14875;
}
if(income>base){
tax = base*0.15+(income - base)*0.28;
}else{
tax = base*0.15;
}
printf("税金为:%.2f\n",tax);
}
return 0;
}
void tips(){
printf("*********************************************************\n");
printf("请选择你的身份\n");
printf("1.单身 2.户主 3.已婚、共有 4.已婚、离异\n 输入其他退出程序\n");
printf("*********************************************************\n");
}
这个程序觉得写的不是很好~等后续有时间再优化了
/*
11.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 是
退出订购。程序要记录累计的重量。即,如果用户输入 4 磅的甜菜,
然后输入 5磅的甜菜,程序应报告9磅的甜菜。然后,该程序要计算货
物总价、折扣(如果有的话)、运费和包装费。随后,程序应显示所
有的购买信息:物品售价、订购的重量(单位:磅)、订购的蔬菜费
用、订单的总费用、折扣(如果有的话)、运费和包装费,以及所有
的费用总额。
分析:
1.先定义常量不同的货品价格
2.货品价格超100有5%优惠
3.不同重量运费不同
4、使用循环让用户选择货品
5、根据选择的货品最终输出总费用、折扣、运费和包装费、所有总费用
*/
#include <stdio.h>
void tips();
void price(float price,float weight,char select);
int main(void)
{
const float a = 2.05;
float a_cost= 0.0;
const float b = 1.15;
float b_cost= 0.0;
const float c = 1.09;
float c_cost= 0.0;
char select = '0';
float weight = 0;
float a_weight= 0.0;
float b_weight= 0.0;
float c_weight= 0.0;
float all_weight = 0.0;
float allCost= 0.0;
float discount = 0.0;
//运费
float freight;
int isok;//输入是否有效判断
while(1){
if(select != '\n'){//避免提示两次
tips();
}
scanf("%c",&select);
if(select == '\n'){
//去掉输入行末尾结束符号
continue;
}
printf("%c品种品种\n\n",select);
if(select == 'q'){
printf("退出订购\n");
break;
}
printf("请输入购买的重量\n");
scanf("%f",&weight);
switch(select){
case 'a':
a_cost += a*weight;
a_weight+=weight;
break;
case 'b':
b_cost += b*weight;
b_weight+=weight;
break;
case 'c':
c_cost += c*weight;
c_weight+=weight;
break;
}
all_weight = a_weight+b_weight+c_weight;//总重量
allCost = a_cost+ b_cost+c_cost; //订单总费用
if(all_weight <= 5&& all_weight > 0){
freight = 6.5;
}else if(all_weight > 5 && all_weight <= 20){
freight = 14;
}else if(all_weight > 20){
freight = 14+ (all_weight - 20)*0.5;
}
if(allCost >= 100){
discount = allCost*0.05;
}
/*物品售价、订购的重量(单位:磅)、订购的蔬菜费
用、订单的总费用、折扣(如果有的话)、运费和包装费,以及所有
的费用总额。*/
if(a_cost>0){
printf("洋蓟售价为 2.05美元/磅,订购重量为%.2f,订购的蔬菜费用为%.2f,\n",a_weight,a_cost);
}
if(b_cost>0){
printf("甜菜售价为1.15 美元/磅,订购重量为%.2f,订购的蔬菜费用为%.2f,\n",b_weight,b_cost);
}
if(c_cost>0){
printf("胡萝卜售价为 1.09美元/磅,订购重量为%.2f,订购的蔬菜费用为%.2f,\n",c_weight,c_cost);
}
printf("订单的总费用为%.2f,",allCost);
if(discount > 0){
printf("折扣为%.2f,",discount);
}
printf("运费和包装费为%.2f,",freight);
printf("所有总费用为%.2f.\n\n\n",(allCost+freight-discount));
}
return 0;
}
void tips(){
printf("*********************************************************\n");
printf("请选择你要购买的货品\n");
printf("a.洋蓟 b.甜菜 c.胡萝卜 q.退出订购\n ");
printf("*********************************************************\n");
}