4循环控制结构

该笔记含有图片,欲获取原文请访问github主页:c-c-NOTE/4循环控制结构.md
*该系列是《c语言程序设计》教材的学习笔记


  • goto:语句和if语句构成循环
  • while(){}
  • do {} while() 先执行一次再判断条件
  • for语句

例子

  • goto
    goto语句不能用break语句和continue语句进行控制
void main()
{
    int i, sum = 0;
    i=1
    
        loop:if (i <= 100)
    {
        sum = sum + i;
        i++;    //计数
        goto loop;  //回到if那一行,达成循环
    }
    printf("%d\n", sum);
    system("pause");
}
  • while
void main()
{
    int i, sum = 0;
    i = 1

        while (i <= 100)
    {
        sum = sum + i;
        i++;    //计数
    }
    printf("%d\n", sum);
    system("pause");
}

统计从键盘输入一行字符的个数

void main()
{
    int n = 0;
    printf("type in a string:\n");
    while (getchar() != '\n')
    {
        n++;
    }
    printf("total num of string==%d \n", n);
    system("pause");
}

只要控制式的值为真即可循环

//打印n个正偶数:0,2,4,6,8...
void main() {
    int a = 0, n;
    printf("\n input n:");
    scanf("%d", &n);
    while (n--)
    {
        printf("%d", a++ * 2);  //相当于a*2,然后a++
    }

}

  • do while
do
{
    sum=sum+i;
    i++;
} while (i<=100);
  • for

for (循环变量赋初值;循环条件;循环变量增量)

分号不能缺省,但表达式1、2、3可以缺省

[图片上传失败...(image-120851-1548092557191)]

void main() {
    int sum = 0, i;
    for (i = 1; i <= 100; i++)
    {
        sum = sum + i;
    }
    printf("%d\n", sum);
    system("pause");
}

可以用逗号隔开多个赋值和i增量

for (i = 0, sum = 0; i < 100,j>10; i++, j--) {

}
  • 输出以下图形
*
**
***
****
*****
******
//#include
//strcat(a,b); //连接两个字符串,连接后的字符串存放在a中,数组a中有足够空间
#include
void main() {
    int i;
    char a[10] = "*";
    char b[] = "*";
    printf("initial=%s\n", a);
    for (i = 1; i <= 6; i++)
    {
        printf("%s\n", a);
        strcat(a, b);
    }

    system("pause");
}


/*解法2*/
void main() {
    int i,j;
    char a = '*';
    for (i = 1; i <= 6; i++)
    {   
        
        for (j = 1; j <= i; j++)
        {
            printf("%c", a);    //putchar('*');
        }
        printf("\n");   //打印段落
    }

    system("pause");
}


  • 题目:有1234这四个数字,能组成多少互不相同且无重复数字的三位数?都是多少?

remark:嵌套的循环是从最内部的循环开始计算的。但是是从最外部的控制式开始判断是否开始循环的。

void main() {
    int a, b, c;
    for (a = 1; a <= 4; a++)
    {
        for (b = 1; b <= 4; b++)
        {
            if (b == a) continue;   //结束本次循环重新判断
            for (c = 1; c <= 4; c++)
            {
                if (c == a || c == b) continue;
                printf("%d,%d,%d\n", a, b, c);
            }
        }
    }
    system("pause");
}

//解法2
void main() {
    int a, b, c;
    for (a = 1; a <= 4; a++)
    {
        for (b = 1; b <= 4; b++)
        {
            for (c = 1; c <= 4; c++)
            {
                if (a != b && b != c && c != a)
                    printf("%d%d%d\n", a, b, c);
            }
        }
    }
    system("pause");
}

break和continue

remark:

  • break语句只在循环语句和switch中有用
  • 多层循环中,一个break语句只向外跳一层;只跳出当前的if
void main() {
    float  area;
    int r;
    for (r = 1; r <= 10; r++)
    {
        area = 3.14159*r*r;
        if (area > 100) break;
        printf("r=%d,area=%f\n", r, area);
    }
    system("pause");
}

  • 例子
#include   //getch和putch函数的头文件
void main() {
    int i = 0;
    char c;
    while (1) {
        c = '\0';
        while (c != 13 && c != 27)
            //键盘接受字符并打印,直到按回车或esc.esc的ASCII码为27
        {
            c = getch();
            printf("%c\n", c);
        }
        if (c == 27) break; //判断若按esc则退出第一个while循环
        i++;
        printf("the no. is %d\n", i);   //打印本循环进行了多少次
    }
    printf("the end");
    system("pause");
}

  • 显示输入的字符,如果按esc则退出循环显示“the end”;如果按enter则不作任何处理,继续输入下一个字符
#include   //getch和putch函数的头文件
void main() {
    char ch;
    for (;;) {  //while(1)
        ch = getch();   //字符输入函数
        if (ch == 27) break;
        if (ch == 13) continue;
        putch(ch);  //显示输入的字符
    }
    getch();    //让程序停一下,拍任何键继续
    system("pause");
}

  • 把100~200之间不能被3整除的数输出
void main() {
    int a = 99;
    while (a < 200) {
        a++;
        if (a % 3 == 0) continue;
        printf("%d\n", a);

    }
    system("pause");
}

  • 求pi的近似值:
    pi/4=1-1/3+1/5-1/7+...

分子1正负切换,分母是奇数列

#include 
void main() {
    int i;
    long float pi = 0, x;
    for (i = 0;; i++)
    {
        x = pow(-1, i) / (2 * i + 1);   //pow(a,b)==a^b
        pi = pi + x;
        if (fabs(x) < 1e-6) break;  //计算float的绝对值。abs是计算int的绝对值
    }
    printf("%10.6f\n", 4 * pi); //小数点后6位算的很快,7位要等一秒,8位要等更久
    system("pause");
}


//解法2
    int i;
    long float pi = 0, x;
    float k = 1;    //k最好是float,不然k=1、i=0都是int算出来得x=0。
    for (i = 0;; i++)
    {
        x = k / (2 * i + 1);    //pow(a,b)==a^b
        k = -k ;
        pi = pi + x;
        if (fabs(x) < 1e-6) break;
    }
  • 求Fibonacci数列前40个数。
    x1=1
    x2=1
    x[n]=x[n-1]+x[n-2],n>2
void main() {
    int x, i;
    int a = 1, b = 1;
    printf("x[1]=1\nx[2]=1\n");
    for (i = 3; i < 41; i++)
    {
        x = a + b;
        a = b;
        b = x;
        
    }
    printf("x[%d]=%d\n", i, x);
    system("pause");
}
  • 求Fibonacci数列第n个数F[n](n>3)
void main() {
    int x, i, num, a, b;
    for (;;)
    {
        printf("\n input a number(>2):");
        scanf("%d", &num);
        getchar();
        a = 1, b = 1;
        for (i = 3; ; i++)
        {
            x = a + b;
            a = b;
            b = x;
            if (i == num)
            {
                break;
            }
        }
        printf("\t F[%d]=%d\n", i, x);
        printf("\t press enter to continue or press ESC to exit:");
        if (getch() == 27) break;
    }
    system("pause");
}
  • 判断x是否是质数
void main() {
    int x, i;
    for (;;)
    {
        printf("\ninput a integer:");
        scanf("%d", &x);
        getchar();
        if (2 == x) printf("yes the smallest prime\n");
        for (i = 2;; i++)
        {
            if (i > sqrt(x)) {
                printf("yes, this is a prime\n");
                break;
            }
            if (x % i == 0) {
                printf("no, this is not prime\n");
                break;
            }
        }
        printf("\t press enter to continue or press ESC to exit:\n");
        if (getch() == 27) break;
    }
    system("pause");
}


//改进版本
void main() {
    int x, i, r;
    for (;;)
    {
        printf("\ninput a integer:");
        scanf("%d", &x);
        getchar();
        if (2 == x) printf("yes the smallest prime\n");
        for (i = 2; i <= sqrt(x); i++)
        {
            if (x % i == 0) break;
        }
        if (i > sqrt(x)) printf("yes, this is a prime\n");
        else printf("no, this is not prime\n");
        printf("\t press enter to continue or press ESC to exit:\n");
        if (getch() == 27) break;
    }
    system("pause");
}
  • decifer密码:按以下规律将字母A-->E,a-->e,所有字符后移4位+4。

你可能感兴趣的:(4循环控制结构)