C语言程序设计(第4版)课后练习题 第三章:顺序程序设计

练习环境
windows 10 Visual Studio 2017

习题
3.3

三种基本结构

N-S流程图用以下流程图符号。
(1)顺序结构。顺序结构用图3.4形式表示。表示执行完A操作后,接着执行B操作。
在这里插入图片描述

(2)选择结构。选择结构用图3.5表示。当p条件成立时执行A操作,p不成立则执行B操作。
在这里插入图片描述

图3.2可以改用N-S流程图表示,如图3.6所示。

在这里插入图片描述

(3)循环结构。循环结构可用图3.7形式表示。图3.7表示当p1条件成立时反复执行A操作,直到p1条件不成立为止。
在这里插入图片描述

输出1到10的算法,用N-S流程图表示如图3.8所示。它的流程与图3.3相同。
在这里插入图片描述

顺序结构

(1)顺序结构。各操作步骤是顺序执行的,如图3.10所示,虚线框内是一个顺序结构。其中A和B两个框是顺序执行的,即在执行完A框所指定的操作后,必然接着执行B框所指定的操作。顺序结构是最简单的一种基本结构。

在这里插入图片描述

选择结构

(2)选择结构。选择结构又称为判断结构或分支结构,根据是否满足给定的条件而从两组操作中选择- -种操作,如图 3.11所示。虚线框内是一个选择结构。此结构中必包含一个判断条件p(以菱形框表示),根据给定的条件p是否成立而选择执行A组操作或B组操作。p所代表的条件可以是x<0或x>y,a+b<c+d等,详见第4章。

在这里插入图片描述

循环结构

(3)循环结构。它又称为重复结构,即在一定条件下反复执行某一部分的操作。图3.13所示的就是一-种循环结构。执行过程是:当给定的条件p成立时,执行A操作,执行完A后,再判断条件p是否成立,如果仍然成立,再执行A,如此反复执行A,直到某一次p条件不成立为止,此时不执行A,而脱离循环结构。
在这里插入图片描述

在这里插入图片描述

例3.1 先后输出几个字符(putchar)

putchar的作用是输出字符变量c的值

#include <stdio.h>

int main()
{
	char a, b, c;   //定义三个字符型变量
	a = 'B', b = 'O', c = 'Y';
	//putchar = put character
	putchar(a);     //向显示器输出字符B
	putchar(b);
	putchar(c);
	putchar('\n');
	return 0;
}

运行结果
在这里插入图片描述

变更

#include <stdio.h>

int main()
{
	int a, b, c;   //定义三个整型变量
	a = 66, b = 79, c = 89;
	//putchar = put character
	putchar(a);     //向显示器输出字符B
	putchar(b);
	putchar(c);
	putchar('\n');
	return 0;
}

运行结果
在这里插入图片描述

结论: putchar©中的c可以是字符变量或整型变量(其值在字符的ASCII码范围内),当然也可以是字符常量或整型常量,如putchar( ‘B’)或putchar( 66)。

例子3.2 用getchar输入字符

#include <stdio.h>

int main()
{
	char a, b, c;
	a = getchar();
	b = getchar();
	c = getchar();
	putchar(a);
	putchar(b);
	putchar(c);
	putchar('\n');
	return 0;
}

运行结果
(输入BOY,输出BOY)
在这里插入图片描述

说明:在用键盘输入信息时,并不是在键盘上敲一个字符,该字符就立即送到计算机中的。这些字符先暂存在键盘的缓冲器中,只有按了Enter 键才把这些字符一起输入到计算机中,按先后顺序分别赋给相应的变量。

输入一个字符后马上按Enter,会发生什么?
运行结果

第二种情况,打两个字母出两个字母在这里插入图片描述

注意:第1行输入的不是一个字符B,而是两个字符: B和换行符,其中字符B赋给了变量a,换行符赋给了变量b。第2行接着输入两个字符: O和换行符,其中字符O赋给了变量c,换行符没有送入任何变量。在用putchar函数输出变量a,b,c的值时,就输出了字符B,然后输出换行,再输出字符O,然后执行putchar(’\n’),换行。

改写

#include <stdio.h>

int main()
{
	
	putchar(getchar());
	putchar(getchar());
	putchar(getchar());
	putchar('\n');
	return 0;
}

在这里插入图片描述
第二种情况,打一个出一个字母
在这里插入图片描述

例子3.3 用printf函数输出字符数据

#include <stdio.h>

int main()
{
	char c = 'a';
	int i = 97;
	printf("c=%c,c=%d\n", c, c);
	printf("i=%c,i=%d\n", i, i);
	return 0;
}

运行结果
在这里插入图片描述

例子:3.4 分析输出实数时的有效位数

#include <stdio.h>
int main()
{
	float a, b;
	a = 111111.111; b = 222222.222;
	printf("%f\n",a+b);
	return 0;
}

运行结果

这个结果有误差,只有前7为数字是有效数字,后面几位有误差,因为float 型数据的存储单元只能容纳6~7位有效数字,因此实际上a,b中并不能存入给出的9位有效数字。a+b 也只能保证6-7位的精度。%f 格式输出的有效位数一般为16位,给出小数6位。

在这里插入图片描述

例子3.5 输出双精度数时的有效位数

#include <stdio.h>
int main()
{
	double a, b;
	a = 11111111.11111111; b = 22222222.22222222;
	printf("%f\n", a + b);
	return 0;
}

运行效果

a和b是双精度变量,能提供16位精度,但是由于用%f 格式输出,只能输出6位小数。所以我们可以看到有两位小数呗忽略了,后面可以看下3.9节的指定输出数值的宽度和小数位数的方法。

在这里插入图片描述

例子3.6 用scanf函数输入数据

scanf(格式控制,地址列表) &a,&代表是地址运算符,&a 指的是变量。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{	
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	printf("a=%d,b=%d,c=%d\n", a, b, c);
	return 0;
}

运行效果

输入数据中间用以空格分隔
内存中的地址。上面scanf函数的作用是:读人a,b,c的值并存放到变量a,b,c的存储单元中( &a,&.b, &.c指出变量a,b,c在内存中的地址)

在这里插入图片描述
在这里插入图片描述

  • 这里特别要注意一下格式控制,如果在“格式控制字符串”中除了格式声明以外还有其他字符,则在输入数据时在对应位置应输入与这些字符相同的字符。scanf("%d %d", &a, &b); 由于在两个%d间有两个空格,因此在输入时,两个数据间应有两个或更多的空格字符。

例子3.7 输入三角形的三个边长,求三角形面积

(1)输人三角形的三个边长a,b,c。为简单起见,假设这三个边能构成三角形(如果不能确定这三边能否构成-一个三角形,应先检查此条件是否成立。在学习了第4章“选择结构程序设计”后,就可以进行检查了)。
(2)确定从三个边长求三角形面积的方法。从中学数学知识可以知道求三角形面积的公式为:
在这里插入图片描述
(3)输出计算出的三角形面积area。

#include <stdio.h>
#include<math.h>  //调用sqrt函数
int main()
{	
	double a, b, c, s,area;
	scanf("%lf,%lf,%lf", &a, &b, &c);  //输入三角形的三个边值
	s = (a + b + c) / 2.0;	//计算s
	area = sqrt(s*(s - a)*(s - b)*(s - c));   //计算三角形面积area
	printf("a=%f\nb=%f\nc=%f\narea=%f\n", a, b, c, area);  //输出结果
	return 0;
}

运行结果
在这里插入图片描述

例子3.8 从键盘输入一个大写字母,要求改写小写字母输出。

#include <stdio.h>
int main()
{	
	char c1, c2;
	c1 = getchar();
	printf("%c,%d\n", c1, c1);
	c2 = c1 + 32;
	printf("%c,%d\n", c2, c2);
	return 0;
}

在这里插入图片描述

优化输入三个大写字母,输出相应的三个小写字母

#include <stdio.h>
int main()
{	
	printf("%c", getchar() + 32);
	printf("%c", getchar() + 32);
	printf("%c\n", getchar() + 32);
	return 0;
}

此程序没有定义字符变量,在执行printf函数过程中输入一个大写字母,不赋给变量。由于getchar丽数的值就是刚输人的字符,因此加32就得到相应的小写字母的ASCII码,用格式声明“%c”进行输出,就输出了该小写字母,也可以用putchar丽数输出

#include <stdio.h>
int main()
{	
	putchar(getchar() + 32);
	putchar(getchar() + 32);
	putchar(getchar() + 32);
	putchar('\n');
	return 0;
}

例3.9 求ax2+bx+c=0方程的根。a、b、c. 由键盘输人,设b2-4ac>0。

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
int main()
{	
	double a, b, c, disc, x1, x2, p, q;
	scanf("a=%lf,b=%lf,c=%lf", &a, &b, &c);   //输入双精度数要用格式声明%lf
	disc = b * b - 4 * a * c;
	p = -b / (2 * a);
	q = sqrt(disc) / (2 * a);
	x1 = p + q;
	x2 = p - q;
	printf("x1=%5.2f\nx2=%5.2f\n", x1, x2);
	return 0;
}

运行结果

注意此程序未优化,在第4章后可以用if来检查该程序是否可以有两个实根。
在这里插入图片描述

例子3.10 有符号整数赋值给无符号整型变量,数据会失真

#include <stdio.h>
int main()
{	
	unsigned short a;
	short int b;
	b = -1;
	a = b;
	printf("%u\n", a);
	return 0;
}

运行结果

2的16次方-1

在这里插入图片描述

例子3.11无符号整数赋值给有符号整型变量

#include <stdio.h>
int main()
{	
	unsigned short int a;
	short int b;
	a = 65535;
	b = a;
	printf("%d\n", b);
	return 0;
}



在这里插入图片描述

例子3.12无符号数据的输出


#include <stdio.h>
int main()
{	
	unsigned short a = 65535;   //变量a最右边的16个二进制的值全是1
	short int b = -2;
	printf("a=%d,%o,%x,%u\n", a, a, a, a);
	printf("b=%d,%o,%x,%u\n", b, b, b, b);
	return 0;
}

运行结果
在这里插入图片描述

例子3.13字符串的输出

#include <stdio.h>
int main()
{	
	printf("%3s,%7.2s,%.4s,%-5.3s\n", "CHINA", "CHINA", "CHINA", "CHINA");
	return 0;
}

运行结果

在这里插入图片描述

例子3.14输出实数时指定输出两位小数

#include <stdio.h>
int main()
{	
	float f = 123.456;
	printf("%f  %10f  %10.2f  %.2f  %-10.2f\n", f, f, f, f, f);
	return 0;
}

运行效果
在这里插入图片描述

例子3.15求3个圆的周长,输出结果时上下按小数点对齐,取两位小数

#define PI 3.1415926
#include <stdio.h>
int main()
{	
	double r1 = 1.53, r2 = 21.83, r3 = 123.71, s1, s2, s3;
	s1 = 2.0 * PI * r1;
	s2 = 2.0 * PI * r2;
	s3 = 2.0 * PI * r3;
	printf("r1=%10.2f\nr2=%10.2f\nr3=%10.2f\n", r1, r2, r3);
	return 0;
}


在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊酒弟弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值