循环结构
(3)循环结构。它又称为重复结构,即在一定条件下反复执行某一部分的操作。图3.13所示的就是一-种循环结构。执行过程是:当给定的条件p成立时,执行A操作,执行完A后,再判断条件p是否成立,如果仍然成立,再执行A,如此反复执行A,直到某一次p条件不成立为止,此时不执行A,而脱离循环结构。
例3.1 先后输出几个字符(putchar)
putchar的作用是输出字符变量c的值
#include int main()
{char a, b, c; a = 'B', b = 'O', c = 'Y';putchar(a); putchar(b);putchar(c);putchar('\n');return 0;
}
运行结果
变更
#include int main()
{int a, b, c; a = 66, b = 79, c = 89;putchar(a); putchar(b);putchar(c);putchar('\n');return 0;
}
运行结果
结论: putchar©中的c可以是字符变量或整型变量(其值在字符的ASCII码范围内),当然也可以是字符常量或整型常量,如putchar( ‘B’)或putchar( 66)。
例子3.2 用getchar输入字符 #include 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 int main()
{putchar(getchar());putchar(getchar());putchar(getchar());putchar('\n');return 0;
}
第二种情况,打一个出一个字母
例子3.3 用printf函数输出字符数据 #include 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
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
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
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在内存中的地址)
例子3.7 输入三角形的三个边长,求三角形面积 (1)输人三角形的三个边长a,b,c。为简单起见,假设这三个边能构成三角形(如果不能确定这三边能否构成-一个三角形,应先检查此条件是否成立。在学习了第4章“选择结构程序设计”后,就可以进行检查了)。
(2)确定从三个边长求三角形面积的方法。从中学数学知识可以知道求三角形面积的公式为:
(3)输出计算出的三角形面积area。
#include
#include
int main()
{ double a, b, c, s,area;scanf("%lf,%lf,%lf", &a, &b, &c); s = (a + b + c) / 2.0; area = sqrt(s*(s - a)*(s - b)*(s - c)); printf("a=%f\nb=%f\nc=%f\narea=%f\n", a, b, c, area); return 0;
}
运行结果
例子3.8 从键盘输入一个大写字母,要求改写小写字母输出。 #include
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
int main()
{ printf("%c", getchar() + 32);printf("%c", getchar() + 32);printf("%c\n", getchar() + 32);return 0;
}
此程序没有定义字符变量,在执行printf函数过程中输入一个大写字母,不赋给变量。由于getchar丽数的值就是刚输人的字符,因此加32就得到相应的小写字母的ASCII码,用格式声明“%c”进行输出,就输出了该小写字母,也可以用putchar丽数输出
#include
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
int main()
{ double a, b, c, disc, x1, x2, p, q;scanf("a=%lf,b=%lf,c=%lf", &a, &b, &c); 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
int main()
{ unsigned short a;short int b;b = -1;a = b;printf("%u\n", a);return 0;
}
运行结果
2的16次方-1
例子3.11无符号整数赋值给有符号整型变量 #include
int main()
{ unsigned short int a;short int b;a = 65535;b = a;printf("%d\n", b);return 0;
}
例子3.12无符号数据的输出
#include
int main()
{ unsigned short a = 65535; 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
int main()
{ printf("%3s,%7.2s,%.4s,%-5.3s\n", "CHINA", "CHINA", "CHINA", "CHINA");return 0;
}
运行结果
例子3.14输出实数时指定输出两位小数 #include
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
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;
}