加载中...

【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");
}
posted @ 2022-07-28 21:26  不会编程的小学鸡  阅读(584)  评论(0编辑  收藏  举报