C语言 第7章 编程练习

本章节深入探讨C语言编程,通过一系列蓝桥杯竞赛相关的练习题,提升编程技巧。涵盖基础语法、逻辑控制、函数应用等多个方面,适合初学者巩固知识并为参赛做准备。
摘要由CSDN通过智能技术生成
/*
7.12 编程练习
1.编写一个程序读取输入,读到#字符停止,然后报告读取的空格数、换行符数和所有其他字符的数量。
*/
#include <stdio.h>
int main(void) {
    const char 终止='#';
    char 字符;
    int 空格,行数,其他;

    空格=行数=其他=0;
    printf("输入一些字符('#' 退出):");
    while ((字符=getchar()) != 终止) {
        if (字符==' ')
            空格++;
        else if (字符=='\n')
            行数++;
        else
            其他++;
    }
    printf("空格=%d, 行数=%d, 其他=%d\n", 空格, 行数, 其他);
     
    return 0;
}

/*
2.编写一个程序读取输入,读到#字符停止。程序要打印每个输入的字符以及对应的ASCII码(十进制)。
每行打印8个“字符-ASCII码”组合。
建议:使用字符计数和求模运算符(%)在每8个循环周期时打印一个换行符。
*/
#include <stdio.h>
int main(void) {
    const char 终止 = '#';
    char 字符;
    int 统计 = 0;

    printf("输入一些字符('#' 退出):");
    while ((字符 = getchar()) != 终止) {
        if (统计++ % 8 == 0)
            putchar('\n');

        if (字符=='\n')
            printf("'\\n' == %3d ", 字符);}
        else if (字符=='\t')
            printf("'\\t' == %3d ", 字符);}
        else
            printf("'%c' == %3d ", 字符, 字符);}
    }
    return 0;
}

/*
3.编写一个程序,读取整数直到用户输入0。
输入结束后,程序应报告用户输入的偶数(不包括0)个数、
这些偶数的平均值、输入的奇数个数及其奇数的平均值。
*/
#include <stdio.h>
int main(void) {
    int 整数, 奇数, 偶数, 总偶数, 总奇数;
    奇数 = 偶数 = 总偶数 = 总奇数 = 0;
    
    printf("请输入一个整数(0退出):");
    while ((scanf("%d", &整数) == 1) && (整数 != 0)) {
        if (整数 % 2 == 0) {
            偶数++;
            总偶数 += 整数;
        }
        else {
            奇数++;
            总奇数 += 整数;
        }
        printf("您可以再次输入(0退出):");
    }

    printf("偶数:%d个\n", 偶数);
    if (偶数 > 0) {
        printf("偶数平均值:%g\n", (short)总偶数 / 偶数);
    }
    printf("奇数:%d个\n", 奇数);
    if (奇数 > 0) {
        printf("奇数平均值:%g\n", (short)总奇数 / 奇数);
    }
    printf("完毕。\n");

    return 0;
}

/*
4.使用if else语句编写一个程序读取输入,读到#停止。
用感叹号替换句号,用两个感叹号替换原来的感叹号,最后报告进行了多少次替换。
*/
#include <stdio.h>
#define 终止 '#'
int main(void)
{
    char 字符;
    int 统计 = 0;

    printf("输入一些字符(#退出):\n");
    while ((字符 = getchar()) != 终止) {
        if (字符 == '.') {
            putchar('!');
            统计++;
        }
        else if (字符 == '!') {
            printf("!!");
            统计++;
        }
        else {putchar(字符);}
    }
    printf("\n总共替换 %d 次。\n", 统计);
    printf("('.'->'!') 或 ('!'->'!!').\n");

    return 0;
}

/* 
5.使用switch重写练习4。
*/
#include <stdio.h>
#define 终止 '#'
int main(void)
{
    char 字符;
    int 统计 = 0;

    printf("输入一些字符(#退出):\n");
    while ((字符 = getchar()) != 终止) {
        switch (字符) {
            case '.':
                putchar('!');
                统计++;
                break;
            case '!':
                printf("!!");
                统计++;
                break;
            default: putchar(字符);
        }
    }
    printf("\n总共替换 %d 次。\n", 统计);
    printf("('.'->'!') 或 ('!'->'!!').\n");

    return 0;
}

/*
6.编写程序读取输入,读到#停止,报告ei出现的次数。
注意-该程序要记录前一个字符和当前字符。用“Receive your eieio award”这样的输入来测试。
*/
#include <stdio.h>
#define 终止 '#'
int main(void)
{
    char 字符;
    int 统计 = 0;
    int 标记  = 0;

    printf("输入一些字符(#退出):\n");
    while ((字符 = getchar()) != 终止) {
        switch (字符) {
            case 'e':
                标记=1;    //↑保存一个出现e的标记;
                break;
            case 'i':
                if (1 == 标记) 统计++;   //↑统计ei出现的次数;
                标记=0;
                break;
            default: 标记=0;    //↑如果e的下一个字符不是i则清除标记;
        }
    }
    printf("\n共出现%d次ei。\n", 统计);

    return 0;
}

/*
7.编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。做如下假设:

  a.基本工资 = 10.00美元/小时
  b.加班(超过40小时) = 1.5倍的时间
  c.税率: 前300美元为15%
        续150美元为20%
        余下的为25%

用#define定义符号常量。不用在意是否符合当前的税法。
*/
#include <stdio.h>
#define 基本工资 10.0f
#define 加班工时 1.5f
#define 基本税率 0.15f
#define 加班税率 0.2f
#define 超出税率 0.25f

int main(void)
{
    short 每周工时 = 0.0f;
    short 总工资, 税率, 净收入;

    printf("输入每周的工作时间:");
    while (scanf("%f", &每周工时) != 1 || (每周工时 < 0)) {
        while (getchar() != '\n')
            continue;
        printf("请输入正数:");
    }
    if (每周工时 <= 30) {
        总工资 = 每周工时 * 基本工资;
        税率 = 总工资 * 基本税率;
        净收入 = 总工资 - 税率;
    }
    else if (每周工时 <= 40) {
        总工资 = 每周工时 * 基本工资;
        税率 = 300 * 基本税率 + (总工资 - 300) * 加班税率;
        净收入 = 总工资 - 税率;
    }
    else {
        总工资 = (40 + (每周工时 - 40) * 加班工时) * 基本工资;
        if (总工资 <= 450)
            税率 = 300*基本税率 + (总工资-300)*加班税率;
        else
            税率 = 300*基本税率 + 150*加班税率 + (总工资-450)*超出税率;
        净收入 = 总工资 - 税率;
    }
    printf("总工资(税前): %g美元\n", 总工资);
    printf("税率: %g美元\n", 税率);
    printf("净收入(税后): %gm美元\n", 净收入);

    return 0;
}

/*
8.修改练习7的假设a,让程序可以给出一个供选择的工资等级菜单。
使用switch完成工资等级选择。运行程序后,显示的菜单应该类似这样:

*****************************************************************
输入所需工资率或操作对应的数字:
1) 8.75美元/小时                       2) 9.33美元/小时
3) 10.00美元/小时                      4) 11.20美元/小时
5) 退出
*****************************************************************
如果选择1~4其中的一个数字,程序应该询问用户工作的小时数。
程序要通过循环运行,除非用户输入5。如果输入1~5以外的数字,
程序应提醒用户输入正确的选项,然后再重复显示菜单提示用户输入。
使用#define创建符号常量表示各工资等级和税率。
*/
#include <stdio.h>
#include <ctype.h>
#define 加班工时 1.5f
#define 基本税率 0.15f
#define 加班税率 0.2f
#define 超出税率 0.25f

int 显示菜单(void);
void 显示工资(short 基本工资, short 每周工时);
int 获取数字(void);
void 剔除行余(void);

int main(void)
{
    int 数字;
    short 统计;

    while ((数字 = 显示菜单()) != 5) {
        printf("输入每周的工作时间:");
        while (scanf("%f", &统计)!=1 || (统计<0)) {
            剔除行余();
            printf("输入一个正数:");
        }
        剔除行余();
        switch (数字) {
            case 1:
                显示工资(8.75f, 统计);
                break;
            case 2:
                显示工资(9.33f, 统计);
                break;
            case 3:
                显示工资(10.00f, 统计);
                break;
            case 4:
                显示工资(11.20f, 统计);
                break;
        }
        putchar('\n');
    }
    printf("完毕!\n");

    return 0;
}

int 获取数字(void) {
    int 数字;

    scanf("%d", &数字);
    剔除行余();
    return 数字;
}

void 剔除行余(void) {
    while (getchar() != '\n')
        continue;
    return;
}

int 显示菜单(void) {
    int 数字;

    printf("**************************************\n");
    printf("输入与所需工资率或操作对应的数字:\n");
    printf("1) 8.75美元/小时 \t\t 2) 9.33美元/小时\n");
    printf("3) 10.00美元/小时 \t\t 4) 11.20美元/小时\n");
    printf("5) 退出\n");
    printf("**************************************\n");
    printf("您选择了:");
    数字 = 获取数字();

    while (数字!=1 && 数字!=2 && 数字!=3 && 数字!=4 && 数字!=5) {
        printf("请输入 1、2、3、4 或 5:");
        数字 = 获取数字();
    }
    return 数字;
}

void 显示工资(short 基本工资, short 每周工时) {
    short 总工资, 税率, 净收入;

    if (每周工时 <= 30) {
        总工资 = 每周工时 * 基本工资;
        税率 = 总工资 * 基本税率;
        净收入 = 总工资 - 税率;
    }
    else if (每周工时 <= 40) {
        总工资 = 每周工时 * 基本工资;
        税率 = 300 * 基本税率 + (总工资 - 300) * 加班税率;
        净收入 = 总工资 - 税率;
    }
    else {
        总工资 = (40 + (每周工时 - 40) * 加班工时) * 基本工资;
        if (总工资 <= 450)
            税率=300*基本税率+(总工资-300)*加班税率;
        else
            税率=300*基本税率+150*加班税率+(总工资-450)*超出税率;
        净收入 = 总工资 - 税率;
    }
    printf("总工资(税前):%g美元\n", 总工资);
    printf("税率:%g美元\n", 税率);
    printf("净收入(税后):%g美元\n", 净收入);
    return;
}

/*
9.编写一个程序,只接受正整数输入,然后显示所有小于或等于该数的素数。
*/
#include <stdio.h>
#include <数学模块>
int main(void)
{
    int i, j, 数字, 标记;

    printf("请输入一个数字(<= 0 退出):");
    while (scanf("%d", &数字) == 1 && (数字 > 0)) {
        if (数字 == 1) {
            printf("1 不是素数!\n");
            printf("您可以再次输入(<= 0 退出):");
            continue;
        }
        printf("这些是素数(<= %d):\n", 数字);
        遍历循环 (i = 2; i <= 数字; i++) {
            标记 = 1;        // 下面的sqrt()是求平方函数
            遍历循环 (j = 2; j <= 求平方(i); j++) {
                if (i % j == 0) {
                    标记 = 0;
                    break;
                }
            }
            if (标记) printf("%-3d", i);
        }
        printf("\n您可以再次输入(<= 0 退出):");
    }
    printf("完毕!\n");

    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)美元。
编写一个程序,让用户指定缴纳税金的种类和应纳税收入,然后计算税金。
程序应通过循环让用户可以多次输入。
*/
#include <stdio.h>
#define 单身税点 17850
#define 户主税点 23900
#define 已婚税点 29750
#define 离婚税点 14875
#define 费率1 0.15
#define 费率2 0.28

int main(void)
{
    int 数字;
    double 工资, 税金;

    while (1) {
        printf("********************************\n");
        printf("1)单身\n");
        printf("2)户主\n");
        printf("3)已婚\n");
        printf("4)离婚\n");
        printf("5)退出\n");
        printf("********************************\n");
        printf("请您选择:");
        while (scanf("%d",&数字)!=1 || (数字>5 || 数字<1)) {
            while (getchar() != '\n')
                continue;
            printf("请选择输入 1、2、3、4 或 5:");
        }
        if (数字 != 5) {
            printf("请输入您的工资:");
            scanf("%lf", &工资);
        }

        if (1 == 数字) {
            if (工资 <= 单身税点)
                税金 = 工资 * 费率1;
            else
                税金 = 单身税点 * 费率1 + (工资 - 单身税点) * 费率2;
            printf("您应纳税: %g\n\n", 税金);
        }
        else if (2 == 数字) {
            if (工资 <= 户主税点)
                税金 = 工资 * 费率1;
            else
                税金 = 户主税点 * 费率1 + (工资 - 户主税点) * 费率2;}
            printf("您应纳税: %g\n\n", 税金);
        }
        else if (3 == 数字) {
            if (工资 <= 已婚税点)
                税金 = 工资 * 费率1;
            else
                税金 = 已婚税点 * 费率1 + (工资 - 已婚税点) * 费率2;
            printf("您应纳税: %g\n\n", 税金);
        }
        else if (4 == 数字) {
            if (工资 <= 离婚税点)
                税金 = 工资 * 费率1;
            else
                税金 = 离婚税点 * 费率1 + (工资 - 离婚税点) * 费率2;
            printf("您应纳税: %g\n\n", 税金);
        }
        else if (5 == 数字)
            break;
    }
    printf("完毕!\n");

    return 0;
}

/*
11.ABC邮购杂货店出售的洋葱售价为2.05美元/磅,甜菜售价为1.15美元/磅,萝卜售价为1.09美元/磅。
在添加运费之前,100美元的订单有5%的打折优惠。少于或等于5磅的订单收取6.5美元的运费和包装费,
5磅~20磅的订单收取14美元的运费和包装费,超过20磅的订单在14美元的基础上每续重1磅增加0.5美元。
编写一个程序,在循环中用switch语句实现用户输入不同的字母时有不同的响应,
即输入a的响应是让用户输入洋葱的磅数,b是甜菜的磅数,字符是萝卜的磅数,q是退出订购。
程序要记录累计的重量。即,如果用户输入4磅的甜菜,然后输入5磅的甜菜,程序应报告9磅的甜菜。
然后,该程序要计算货物总价、折扣(如果有的话)、运费和包装费。随后,程序应显示所有的购买信息:
物品售价、订购的重量(单位:磅)、订购的蔬菜费用、订单的总费用、折扣(如果有的话)、运费和包装费,
以及所有的费用总额。
*/
#include <stdio.h>
#include <ctype.h>
int main(void) {
    const double 洋葱价 = 2.05;
    const double 甜菜价 = 1.15;
    const double 萝卜价 = 1.09;
    const double 折扣率 = 0.05;
    const double 在5斤内 = 6.50;
    const double 在20斤内 = 14.00;
    const double 超出20斤 = 14.00;
    const double 打包费 = 0.50;

    char 字符;
    double 洋葱重,甜菜重,萝卜重,需求,总重;
    洋葱重=甜菜重=萝卜重=0;

    double 洋葱成本,甜菜成本,萝卜成本;
    double 总成本,总费用,批发价,运费;

    printf("输入a买洋葱,b买甜菜,c买萝卜,q退出:");
    // tolower()函数 转换成小写字母
    while ((字符 = tolower(getchar())) != 'q') {
        if (isspace(字符))   // isspace()测是否空白符
            continue;
        while (getchar() != '\n')
            continue;
        switch (字符) {
            case 'a':
                printf("输入洋葱数量(斤): ");
                scanf("%lf", &需求);
                洋葱重 += 需求;
                break;
            case 'b':
                printf("输入甜菜数量(斤): ");
                scanf("%lf", &需求);
                甜菜重 += 需求;
                break;
            case 'c':
                printf("输入萝卜数量(斤): ");
                scanf("%lf", &需求);
                萝卜重 += 需求;
                break;
            default:
                printf("%c不是一个有效的选择。\n", 字符);
        }
        printf("输入a买洋葱,b买甜菜,c买萝卜,q退出:");
    }

    洋葱成本 = 洋葱价 * 洋葱重;
    甜菜成本 = 甜菜价 * 甜菜重;
    萝卜成本 = 萝卜价 * 萝卜重;
    总成本 = 洋葱成本 + 甜菜成本 + 萝卜成本;
    总重 = 洋葱重 + 甜菜重 + 萝卜重;

    if (总重 <= 0)
        运费 = 0.0;
    else if (总重 < 5.0)
        运费 = 在5斤内;
    else if (总重 < 20.0)
        运费 = 在20斤内;
    else
        运费 = 超出20斤 + 打包费 * 总重;
    
    if (总成本 > 100.0)
        批发价 = 折扣率 * 总成本;
    else
        批发价 = 0.0;
    总费用 = 总成本 + 运费 - 批发价;

    printf("您的订单:\n");
    printf("%.2f斤洋葱,每斤%.2f元,总共:%.2f元\n",
               洋葱重,洋葱价,洋葱成本);
    printf("%.2f斤甜菜,每斤%.2f元,总共:%.2f元\n",
               甜菜重,甜菜价,甜菜成本);
    printf("%.2f斤萝卜,每斤%.2f元,总共:%.2f元\n",
               萝卜重,萝卜价,萝卜成本);

    printf("蔬菜总成本:%.2f\n", 总成本);
    if (总成本 > 100)
        printf("批发价:%.2f\n", 批发价);
    printf("运费:%.2f\n", 运费);
    printf("总费用:%.2f\n", 总费用);

    return 0;
}
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值