目录
第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;
}