【C语言基础】循环
while循环
scanf函数的返回值:scanf函数返回成功读取的项数,即在scanf("%d%d",&a,&b);如果a,b都能按指定格式输入,且被读取成功,则返回2,如果只有一个被读取成功,返回1,如果都没有被读取,返回值为0,如果遇到错误或者end of file,返回值为EOF。
根据用户从键盘输入的整数进行求和:
#include<stdio.h>
int main(){
int num,stat,sum=0;
printf("please enter number(q to end):");
while(scanf("%d",&num)==1){
sum=sum+num;
printf("please enter number again(q to end):");
}
printf("sunm=%d\n",sum);
return 0;
}
代码说明:在上述程序中,while循环的条件式stat==1,stat接受scanf的返回值,程序在每次循环完成以后,都会对num进行赋一个新值,这些新值会和sum进行求和。
while语句
while语句的格式:
while(判断语句){
执行代码
}
在屏幕上打印出1~100个数字
#include<stdio.h>
int main(){
int i=1;
while(i<=100){
printf("%d\t",i);
i++;
}
return 0;
}
break
#include<stdio.h>
int main()
{
int i=1;
while(i<=10){
printf("%d\t",i);
if(i==3){
printf("progream end\n");
break;
}
i++;
}
}
break:在循环中的作用,循环只要遇到break就会永久停止所有的循环。
continue
#include <stdio.h>
int main(){
int i = 1;
while(i<=10){
if(i == 5){
continue;
}
printf("%d\t", i);
i++;
}
return 0;
}
continue:终止本次循环,进行下一次循环入口的判断。
用关系运算符和表达式比较
运算关系符:
在while和if语句中,其中只要是条件判断为真,那么就会执行代码块里面的内容,如果不为真,就不会执行。在C语言中,一般而言,所有的非零值都视为真,只有0被视为假。关系表达式为真,求值得1;关系表达式为假,求值得0。
在编程中,表示真或假的变量被称为布尔变量(Boolean variable),所以_Bool是C语言中布尔变量的类型名。_Bool类型的变量只能储存1(真)或0(假)。
不确定循环和计数循环
在创建一个重复执行固定次数的循环中涉及了3个行为:
1.必须初始化计数器;
2.计数器与有限的值作比较;
3.每次循环时递增计数器。
for循环
语法
for(式1;式2;式3){
循环语句;
}
式1:初始化部分,用于初始化循环变量
式2:条件判断部分,用于判断循环什么式结束
式3:调整部分,用于循环的调整
打印1~100的数字:
#include<stdio.h>
int main(){
int i;
for(i=1;i<=100;i++){
printf("%d\t",i);
}
}
使用递减运算来设计递减计数器:
#include<stdio.h>
int main()
{
int i;
for(i=100;i>0;i--){
printf("%d\t",i);
}
}
#include<stdio.h>
int main(void)
{
int num=0;
for(printf("Keep entering numbers!\n");num!=6;)
scanf("%d",&num);
printf("That's the one I want!\n");
return 0;
}
其他赋值运算符:+=,-=,*=,/=,%=
运算符 | 等价式子 |
---|---|
scores += 20 | scores = scores + 20 |
dimes -= 2 | dimes = dimes - 2 |
bunnies *= 2 | bunnies = bunnies * 2 |
time /= 2.73 | time = time / 2.73 |
reduce %= 3 | reduce = reduce % 3 |
逗号运算符
逗号运算符扩展了for循环的灵活性,以便在循环头中包含更多的表达式。
打印一类邮件资费:在撰写本书时,邮资为首重40美分/盎司,续重20美分/盎司,可以在互联网上查看当前邮资。
#include<stdio.h>
int main(void)
{
const int FIRST_OZ = 46;// 2013邮资
const int NEXT_OZ = 20;// 2013邮资
int ounces,cost;
printf("ounces cost\n");
for(ounces=1,cost=FIRST_OZ;ounces<=16;ounces++,cost+=NEXT_OZ){
// ounces=1,cost=FIRST_OZ;ounces<=16;ounces++,cost+=NEXT_OZ
// 对ounces和cost赋值运算
// 判断ounces是否小于16
// ounces自增,cost加上20在付给cost
printf("%5d $%4.2f\n",ounces,cost/100.0);
}
printf("**************************************\n");
// 上述代码由while循环实现:
ounces=1;
cost=FIRST_OZ;
printf("ounces cost\n");
while(ounces<=16){
printf("%5d $%4.2f\n",ounces,cost/100.0);
cost+=NEXT_OZ;
ounces++;
}
return 0;
}
出口条件循环:do while
while循环和for循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。
#include<stdio.h>
int main(void)
{
const int secret_code=13;
int code_entered;
do
{
printf("To enter the triskaidekaphobia therapy club,\n");
printf("please enter the secret code number: ");
scanf("%d",&code_entered);
} while(code_entered!=secret_code);
printf("Congratulations! You are cured!\n");
return 0;
}
下面是do while循环的通用形式:
do
statement
while ( expression );
如何选择使用哪一种循环?首先,确定是需要入口条件循环还是出口条件循环。通常,入口条件循环用得比较多,有几个原因。其一,一般原则是在执行循环之前测试条件比较好。其二,测试放在循环的开头,程序的可读性更高。另外,在许多应用中,要求在一开始不满足测试条件时就直接跳过整个循环。
假设需要一个入口条件循环,用for循环还是while循环?这取决于个人喜好,因为二者皆可。要让for循环看起来像while循环,可以省略第1个和第3个表达式。例如:
for ( ; test ; )
与下面的while效果相同:
while ( test )
要让while循环看起来像for循环,可以在while循环的前面初始化变量,并在while循环体中包含更新语句。例如:
初始化;
while ( 测试 )
{
其他语句
更新语句
}
与下面的for循环效果相同:
for ( 初始化 ;测试 ; 更新 )
其他语句
一般而言,当循环涉及初始化和更新变量时,用for循环比较合适,而在其他情况下用while循环更好。对于下面这种条件,用while循环就很合适:
while (scanf("%ld", &num) == 1)
对于涉及索引计数的循环,用for循环更适合。例如:
for (count = 1; count <= 100; count++)
嵌套循环
嵌套循环(nested loop)指在一个循环内包含另一个循环。嵌套循环常用于按行和列显示数据,也就是说,一个循环处理一行中的所有列,另一个循环处理所有的行。
使用函数返回值的循环实例
#include<stdio.h>
double power(double n, int p); // ANSI函数原型
int main(void)
{
double x,xpow;
int exp;
printf("Enter a number and the positive integer power");
printf(" to which\nthe number will be raised. Enter q");
printf(" to quit.\n");
while(scanf("%lf%d",&x,&exp)==2)
{
xpow = power(x, exp);// 函数调用
printf("%.3g to the power %d is %.5g\n",x,exp,xpow);
printf("Enter next pair of numbers or q to quit.\n");
}
printf("Hope you enjoyed this power trip -- bye!\n");
return 0;
}
double power(double n, int p)// 函数定义
{
double pow=1;
int i;
for(i=1;i<=p;i++)
pow *= n;
return pow;// 返回pow的值
}
goto语句
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
goto语言真正适合的场景如下:
for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况
编程练习
计算 n的阶乘。
#include<stdio.h>
int main(){
int n,i,num;
printf("请输入n的值:");
scanf("%d",&num);
i=1;
n=1;
while (i<=num)
{
n=n*i;
i++;
}
printf("%d的阶乘%d!\n",num,n);
}
计算 1!+2!+3!+……+10!
#include<stdio.h>
int main(){
int n,i;
int sum1=1;
int sum2=0;
for(i=1;i<=10;i++){
for(n=1;n<=i;n++){
sum1=sum1*n;
printf("sum1=%d\t",sum1);
}
sum2=sum2+sum1;
printf("\n");
printf("sum2=%d\t",sum2);
}
printf("\n");
printf("sum=%d\n",sum2);
}
编写一个程序
创建一个包含26个元素的数组,并在其中储存26个小写字母。然后打印数组的所有内容。
#include<stdio.h>
int main()
{
// A对应ascll为41,a为97
int a;
char zimu[25];
for(a=0;a<=25;a++){
zimu[a]=(char)(a+97);
}
for(a=0;a<=25;a++){
printf("%c\n",zimu[a]);
}
}
使用嵌套循环,按下面的格式打印字符:
$
$$
$$$
$$$$
$$$$$
#include<stdio.h>
int main(){
int i,j,n;
printf("请输入打印的层数:");
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
printf("$");
}
printf("\n");
}
}
使用嵌套循环,按下面的格式打印字母:
F
FE
FED
FEDC
FEDCB
FEDCBA
#include<stdio.h>
int main(){
int i,j,n,n1;
// A=65,a=97
n1=1;
printf("请输入打印的层数:");
scanf("%d",&n);
for(i=n;i>=0;i--){
for(j=n-1,n1=0;j>=i;j--){
printf("%c",j+65);
n1=n1-1;
}
if(n1==0){
continue;
}
printf("\n");
}
}
使用嵌套循环,按下面的格式打印字母:
A
BC
DEF
GHIJ
KLMNO
#include<stdio.h>
int main(){
int i,j,n,n1;
// A=65,a=97
n1=0;
printf("请输入打印的层数:");
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
printf("%c",n1+65);
n1=n1+1;
}
printf("\n");
}
}
编写一个程序,提示用户输入大写字母。使用嵌套循环以下面金字塔型的格式打印字母:
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
#include<stdio.h>
int main(){
int i,j,n,n1,n2;
// A=65,a=97
n1=0;
printf("请输入打印的层数:");
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<=i;j++){
printf("%c",j+65);
n1=j+65;
// printf("%d",n1);
}
for(j=0;j<i;j++){
printf("%c",n1-j-1);
}
printf("\n");
}
}
编写一个程序
打印一个表格,每一行打印一个整数、该数的平方、该数的立方。要求用户输入表格的上下限。使用一个for循环。
#include<stdio.h>
int main(){
int i;
int max,min;
printf("entr max:");
scanf("%d",&max);
fflush(stdin);
printf("enter min:");
scanf("%d",&min);
for(i=min;i<=max;i++){
printf("原值=%d,平方=%d,立方=%d\n",i,i*i,i*i*i);
}
return 0;
}
编写一个程序
把一个单词读入一个字符数组中,然后倒序打印这个单词。提示:strlen()函数(第4章介绍过)可用于计算数组最后一个字符的下标。
#include<stdio.h>
#include<string.h>
int main(){
int i;
int max,min;
char char1[40];
printf("enter char:");
scanf("%s",char1);
min=strlen(char1);
for(i=min;i>=0;i--){
printf("%c",char1[i]);
}
printf("\n");
return 0;
}
编写一个程序
要求用户输入两个浮点数,并打印两数之差除以两数乘积的结果。在用户输入非数字之前,程序应循环处理用户输入的每对值。
#include<stdio.h>
int main(){
float max,min;
printf("entr two float number:");
while(scanf("%f %f",&min,&max)==2){
printf("%.2f*%.2f=%.2f\n",max,min,min*max);
printf("entr two float number:\n");
}
return 0;
}
修改上面代码,使用一个函数返回计算的结果
#include<stdio.h>
float cheng(float max,float min){
return (max*min);
}
int main(){
float max,min;
printf("entr two float number:");
while(scanf("%f %f",&min,&max)==2){
printf("%.2f*%.2f=%.2f\n",max,min,cheng(max,min));
printf("entr two float number:\n");
}
return 0;
}
编写一个程序
要求用户输入一个上限整数和一个下限整数,计算从上限到下限范围内所有整数的平方和,并显示计算结果。然后程序继续提示用户输入上限和下限整数,并显示结果,直到用户输入的上限整数小于下限整数为止。程序的运行示例如下:
Enter lower and upper integer limits: 5 9
The sums of the squares from 25 to 81 is 255
Enter next set of limits: 3 25
The sums of the squares from 9 to 625 is 5520
Enter next set of limits: 5 5
Done
#include<stdio.h>
int main(){
int a,max,min,sum;
printf("Enter lower and upper integer limits:");
while (scanf("%d %d",&min,&max)==2)
{
if(min>=max){
break;
}
sum=0;
a=min;
while(a<=max){
sum=sum+a*a;
a++;
}
printf("The sums of the squares from %d to %d is %d\n",min*min,max*max,sum);
printf("Enter lower and upper integer limits:");
}
printf("Done\n");
}