C语言程序设计 现代设计方法

C语言程序设计 现代设计方法,第1张

代码

3.1 tprintf.c
程序  用printf 函数格式化数
下面的程序举例说明了用printf 函数以各种格式显示整数和浮点数的方法。

/* Prints int and float values in various formats */
#include 
int main(void)
{
	int i;
	float x;
	i = 40;
	x = 839.21f;
	printf("|%d|%5d|%-5d|%5.3d|\n", i, i, i, i);
	printf("|%10.3f|%10.3e|%-10g|\n", x, x, x);
	return 0;
}

在显示时,printf 函数格式串中的字符| 只是用来帮助显示每个数所占用的空格数量;不同于% 或\ ,字符| 对printf 函数而言没有任何特殊意义。此程序的输出如下:
|40| 40|40 | 040|
| 839.210| 8.392e+02|839.21 |
下面仔细看一下上述程序中使用的转换说明。
%d ——以十进制形式显示变量i ,且占用最少的空间。
%5d ——以十进制形式显示变量i ,且至少占用5个字符的空间。因为变量i 只占两个字符,所以添加了3个空格。
%-5d ——以十进制形式显示变量i ,且至少占用5个字符的空间。因为表示变量i 的值不需要用满5个字符,所以在后续位置上添加空格(更确切地说,变量i 在长度为5的字段内是左对齐的)。
%5.3d ——以十进制形式显示变量i ,且至少占用5个字符的空间并至少有3位数字。因为变量i 只有2个字符长度,所以要添加一个额外的零来保证有3位数字。现在只有3个字符长度,为了保证占有5个字符,还要添加2个空格(变量i 是右对齐的)。
%10.3f ——以定点十进制形式显示变量x ,且总共用10个字符,其中小数点后保留3位数字。因为变量x 只需要7个字符(即小数点前3位,小数点后3位,再加上小数点本身1位),所以在变量x 前面有3个空格。
%10.3e ——以指数形式显示变量x ,且总共用10个字符,其中小数点后保留3位数字。因为变量x 总共需要9个字符(包括指数),所以在变量x 前面有1个空格。
%-10g ——既可以以定点十进制形式显示变量x ,也可以以指数形式显示变量x ,且总共用10个字符。在这种情况下,printf 函数选择用定点十进制形式显示变量x 。负号的出现强制进行左对齐,所以有4个空格跟在变量x 后面。

3.2 addfrac.c
程序  分数相加
为了显示scanf 函数的模式匹配能力,考虑读入由用户键入的分数。分数通常的形式为分子/分母 。scanf 函数允许读入整个分数,而不用将分子和分母视为两个整数分别读入。下面的分数相加程序体现了这一方法。

/* Adds two fractions*/
#define _CRT_SECURE_NO_WARNINGS
#include 

int main(void)
{
	int num1, denom1, num2, denom2, result_num, result_denom;

	printf("Enter first fraction: ");
	scanf("%d/%d", &num1, &denom1);
	printf("Enter second fraction: ");
	scanf("%d/%d", &num2, &denom2);

	result_num = num1 * denom2 + num2 * denom1;
	result_denom = denom1 * denom2;

	printf("The sum is %d/%d\n", result_num, result_denom);

	return 0;
}

注意,结果并没有化为最简分数

练习题

  1. 下面的printf 函数调用产生的输出分别是什么?
      (a) printf(“%6d,%4d”, 86, 1040);
      (b) printf(“%12.5e”, 30.253);
      © printf(“%.4f”, 83.162);
      (d) printf(“%-6.2g”, .0000009979);
    Solution
    (a) 86,1040
    (b) 3.02530e+01
    © 83.1620
    (d) 1e-06

  2. 编写printf 函数调用,以下列格式显示float 型变量x:
      (a) 指数表示形式,字段宽度8,左对齐,小数点后保留1位数字。
      (b) 指数表示形式,字段宽度10,右对齐,小数点后保留6位数字。
      © 定点十进制表示形式,字段宽度8,左对齐,小数点后保留3位数字。
      (d) 定点十进制表示形式,字段宽度6,右对齐,小数点后无数字。
    Solution
    (a) printf("%-8.1e", x);
    (b) printf("%10.6e", x);
    © printf("%-8.3f", x);
    (d) printf("%6.0f", x);

  3. 说明下列每对scanf 格式串是否等价?如果不等价,请指出它
    们的差异。
      (a) “%d” 与" %d" 。
      (b) “%d-%d-%d” 与"%d -%d -%d" 。
      © “%f” 与"%f " 。
      (d) “%f,%f” 与"%f, %f" 。
     
    Solution
    (a), (b) and (d) are equivalent, because the scanf function matches zero or more whitespace characters on each whitespace character, except the final character, as shown in ©. © is not equivalent because the trailing space will require the user to input a non-whitespace character at the end of the input signifying the end of the whitespace sequence matched by the space.

  4. 假设scanf函数调用的格式如下:
    scanf(“%d%f%d”, &i, &x, &j);
      如果用户录入10.3 5 6
      调用执行后,变量i 、x 和j 的值分别是多少?(假设变量i 和变量j 都是int 型,而变量x 是float 型。)
    i = 10
    x = 0.3
    j = 5

  5. 假设scanf 函数调用的格式如下:
    scanf(“%f%d%f”, &x, &i, &y);
      如果用户录入12.3 45.6 789
      调用执行后,变量x 、i 和y 的值分别是多少?(假设变量x 和变量y 都是float 型,而变量i 是int 型。)
    i = 10
    x = 0.3
    j = 5

  6. 指出如何修改3.2节中的addfrac.c 程序,使用户可以输入在字符/的前后都有空格的分数。
    Add a space after the first %d for each scanf statement. This will allow
    pattern matching for whitespace between the two %ds and the / character.

/* Adds two fractions */

#include 

int main(void) {
    int num1, denom1, num2, denom2, result_num, result_denom;

    printf("Enter first fraction: ");
    scanf("%d /%d", &num1, &denom1);

    printf("Enter second fraction: ");
    scanf("%d /%d", &num2, &denom2);

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

    return 0;
}
编程题
  1. 编写一个程序,以月/日/年(即 )的格式接受用户录入的日期信息,并以年月日(即 )的格式将其显示出来:
    Enter a date (mm/dd/yyyy): 2/17/2011
    You entered the date 20110217
#define _CRT_SECURE_NO_WARNINGS
#include 

int main(void)
{
	
	int year, month, day;

	printf("Enter a date (mm/dd/yyyy) : ");
	scanf("%d /%d /%d", &month, &day, &year);

	printf("You entered the date %.4d%.2d%.2d\n", year, month, day);
		
	return 0;
}
  1. 编写一个程序,对用户录入的产品信息进行格式化。程序会话应类似下面这样:
    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的美元。提示 :各个列使用制表符控制。

#define _CRT_SECURE_NO_WARNINGS
#include 

int main(void)
{
	
	int year, month, day, itemNumber;
	float unitPrice;

	printf("Enter item number: ");
	scanf("%d", &itemNumber);
	printf("Enter unit price: ");
	scanf("%f", &unitPrice);
	getchar();
	printf("Enter purchase date (mm/dd/yyyy) : ");
	scanf("%d /%d /%d", &month, &day, &year);

	printf("\nItem\t\tUnit\t\tPurchase\n");
	printf("%d\t\t$%7.2f\t\t%d/%d/%d\n", itemNumber, unitPrice, month, day, year);

	return 0;
}

存在问题:
不知道怎么显示第二行;显示对齐问题;

  1. 图书用国际标准书号(ISBN)进行标识。2007年1月1日之后分配的ISBN包含13位数字(旧的ISBN使用10位数字),分为5组,如978-0-393-97950-3。第一组(GS1前缀 )目前为978或979。第二组(组标识 )指明语言或者原出版国(如0和1用于讲英语的国家)。第三组(出版商编号 )表示出版商(393是W. W. Norton出版社的编号)。第四组(产品编号 )是由出版商分配的用于识别具体哪一本书的(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值(通常放在书的封底和版权页上)测试你编写的程序。

  2. 编写一个程序,提示用户以(xxx) xxx-xxxx的格式输入电话号码,并以xxx.xxx.xxxx的格式显示该号码:
    Enter phone number [(xxx) xxx-xxxx]: (404) 817-6900
    You entered 404.817.6900

  3. 编写一个程序,要求用户(按任意次序)输入从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. 修改3.2节的addfrac.c 程序,使用户可以同时输入两个分数,中间用加号隔开:
    Enter two fractions separated by a plus sign: 5/6+3/4
    The sum is 38/24

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/707136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存