《C语言程序设计:现代方法》(第2版·修订版)第3章编程题试解

目录

第1题        第2题        第3题        第4题        第5题        第6题


第1题

1. 编写一个程序,以月/日/年(即mm/dd/yy)的格式接受用户输入的日期信息,并以年月日(即yyyymmdd)的格式将其显示出来:

        Enter a date (mm/dd/yyyy):2/17/2011

        You entered the date 20110217

/* 以"月/日/年"的格式接受用户输入,并以"年月日"的格式显示 */

#include <stdio.h>

int main(void)
{
    int year, month, day;   // 分别用于存储年、月、日
    
    printf("Enter a date (mm/dd/yyyy): ");  // 提示用户按照"月/日/年"的格式输入日期
    scanf("%d /%d /%d", &month, &day, &year);
        /*
         * 将用户输入的信息分别存入变量month、day和year
         * 为提高输入容错性,在斜杠前加空格,scanf()函数会忽略数据和斜杠之间的空白字符
         */
    printf("You entered the date %4d%.2d%.2d", year, month, day);
        /*
         * 以"年月日"的格式显示用户输入的日期
         * 修饰符"4"保证年份占4个字宽,".2"保证月、日占2个字宽,不足时补零
         */
    
    return 0;
}
第2题

2. 编写一个程序,对用户输入的产品信息进行格式化。程序会话应类似下面这样:

Enter item number: 583

Enter unit price: 13.5

Enter purchase date (mm/dd/yyyy) : 10/24/2010

Item                Unit                        Purchase

                       Price                      Date

583                 $  13.50                 10/24/2010

其中,产品编号和日期项采用左对齐方式,单位价格采用右对齐方式,允许美元金额最大取值为9999.99。提示:各个列使用制表符控制。

/* 格式化输出产品信息 */

#include <stdio.h>

int main(void)
{
    int item_num, year, month, day;     // 分别用于存储产品编号、年、月、日
    float price;    // 存储单位价格
    
    printf("Enter item number: ");
    scanf("%d", &item_num);
    // 提示用户输入并存储产品编号到变量item_num
    printf("Enter unit price: ");
    scanf("%f", &price);
    // 提示用户输入并存储单位价格到变量price
    printf("Enter purchase date (mm/dd/yyyy): ");
    scanf("%d /%d /%d", &month, &day, &year);
    // 提示用户输入生产日期,并分别存储到变量month、day、year
    
    printf("Item\t\tUnit\t\tPurchase\n");
    printf("\t\tPrice\t\tDate\n");
    // 打印表头
    printf("%d\t\t$%7.2f\t%.2d/%.2d/%4d", item_num, price, month, day, year);
    // 按表头的字符宽度顺序输出产品编号、单位价格、月、日、年
    
    return 0;
}
第3题

3. 图书用国际标准书号(ISBN)进行标识。2007年1月1日之后分配的ISBN包含13位数字(旧的ISBN使用10位数字),分为5组,如 978-0-393-97950-3。第一组(GS1前缀)目前为978或979。第二组(组标识)指明语言或者原出版国及地区(如0和1用于讲英语的国家)。第三组(出版商编号)表示出版商(393是W. W. Norton 出版社的编号)。第四组(产品编号)是由出版商分配的1用于识别具体哪一本书的编号(97950)。ISBN的末尾是一个校验数字,用于验证前面数字的准确性。编写一个程序来分解用户输入的ISBN信息:

        Enter ISBN: 978-0-393-97950-3

        GS1 prefix: 978

        Group identifier: 0

        Publisher code: 393

        Item number: 97950

        Check digit: 3

注意:每组中数字的个数是可变的,不能认为每组的长度都与示例一样。用实际的ISBN值(通常放在书的封底和版权页上)测试你编写的程序。

/* 分解ISBN */
#include <stdio.h>

int main(void)
{
    int gs1, group, publisher, item, digit;

    printf("Enter ISBN: ");
    scanf("%d -%d -%d -%d -%d", &gs1, &group, &publisher, &item, &digit);
    // 以"-"为分隔符,读取五个int型数据,分别存入变量gs1,group,publisher,item,digit

    printf("GS1 prefix: %d\n", gs1);
    printf("Group identifier: %d\n", group);
    printf("Publisher code: %d\n", publisher);
    printf("Item number: %d\n", item);
    printf("Check digit: %d\n", digit);
    // 这个程序没有错误检测机制,即使数字不是13位,只要五组数据间有四个短横线"-",即可被正确执行

    return 0;
}
第4题

编写一个程序,提示用户以(XXX) XXX-XXXX的格式输入电话号码,并以XXX.XXX.XXXX的格式显示该号码:

        Enter phone number [(xxx) xxx-xxxx]: (404) 817-6900

        You entered 404.817.6900

/* 输出电话号码 */

#include <stdio.h>

int main(void)
{
    int num1, num2, num3;   // 分别用于存储前3位,中3位和后4位
    
    printf("Enter phone number [(xxx) xxx-xxxx]: ");
    scanf("(%d ) %d -%d", &num1, &num2, &num3);
    printf("You entered %d.%d.%d\n", num1, num2, num3);
    
    return 0;
}
第5题

5. 编写一个程序,要求用户(按任意次序)输入1~16的所有整数,然后用4×4矩阵的形式将它们显示出来,再计算出每行、每列和每条对角线上的和:

Enter the numbers from 1 to 16 in any order: 

16 3 2 13 5 10 11 8 9 6 7 12 4 15 14 1

16    3     2     13

  5  10    11      8

  9    6      7    12

  4   15   14      1

Row sums: 34 34 34 34

Column sums: 34 34 34 34

Diagonal sums: 34 34

如果行、列和对角线上的和都一样(如本例所示),则称这些数组成一个幻方(magic square)。这里给出的幻方出现于艺术家和数学家 Albrecht Dürer 创作于1514年的一幅画中。(注意,矩阵的最后一行中间的两个数给出了该画的创作年代。)

/* 用4 * 4矩阵打印幻方 */
#include <stdio.h>

int main(void)
{
    int a1, a2, a3, a4, b1, b2, b3, b4, c1, c2, c3, c4, d1, d2, d3, d4;
    /*
     * 本书前3章未介绍数组,谈及指针也没有深入介绍,故而这里选择最机械的方式,
     * 为4*4矩阵中的每个数字都声明一个变量,a、b、c、d是行标签,1、2、3、4是列标签
     */
    int suma, sumb, sumc, sumd, sum1, sum2, sum3, sum4, sum_dia_1, sum_dia_2;
    // 用于存储每行、每列和两条对角线的和

    printf("Enter the numbers from 1 to 15 in any order: ");
    scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",
     &a1, &a2, &a3, &a4, &b1, &b2, &b3, &b4, &c1, &c2, &c3, &c4, &d1, &d2, &d3, &d4);
    // 将用户输入的16个整数分别存储到变量a1~d4中

    suma = a1 + a2 + a3 + a4;
    sumb = b1 + b2 + b3 + b4;
    sumc = c1 + c2 + c3 + c4;
    sumd = d1 + d2 + d3 + d4;
    // 计算a、b、c、d行的和
    sum1 = a1 + b1 + c1 + d1;
    sum2 = a2 + b2 + c2 + d2;
    sum3 = a3 + b3 + c3 + d3;
    sum4 = a4 + b4 + c4 + d4;
    // 计算1、2、3、4列的和
    sum_dia_1 = a1 + b2 + c3 + d4;
    sum_dia_2 = a4 + b3 + c2 + d1;
    // 计算两条对角线的和
    
    printf("%2d\t%2d\t%2d\t%2d\t\n", a1, a2, a3, a4);
    printf("%2d\t%2d\t%2d\t%2d\t\n", b1, b2, b3, b4);
    printf("%2d\t%2d\t%2d\t%2d\t\n", c1, c2, c3, c4);
    printf("%2d\t%2d\t%2d\t%2d\t\n", d1, d2, d3, d4);
    // 以4*4矩阵的形式打印用户输入的16个整数
    printf("Row sums: %d %d %d %d\n", suma, sumb, sumc, sumd);
    printf("Column sums: %d %d %d %d\n", sum1, sum2, sum3, sum4);
    printf("Diagonal sums: %d %d\n", sum_dia_1, sum_dia_2);
    // 分别输出矩阵每行、每列和两条对角线的和
    
    return 0;
}
 第6题

6. 修改3.2节的addfrac.c程序,使用户可以同时输入两个分数,中间用加号隔开:

        Enter two fractions separated by a plus sign: 5/6+3/4

        The sum is 38/24

/* 同时输入两个分数并求和 */

#include <stdio.h>

int main(void)
{
    int num1, denom1, num2, denom2, result_num, result_denom;
    // 保留"addfrac.c"程序原来声明的变量

    printf("Enter two fractions separated by a plus sign: ");
    scanf("%d /%d + %d /%d", &num1, &denom1, &num2, &denom2);
    /*
     * 依题意,将"addfrac.c"中的两个输入合并为一个
     * 使用scanf()函数时,在每个数字和非数字字符之间加空格,以提高读取输入的容错性
     */

    result_num = num1 * denom2 + num2 * denom1;
    result_denom = denom1 * denom2;
    printf("The sum is %d/%d\n", result_num, result_denom);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值