【C語言】05-流程控制

此筆記由個人整理

尚觀C語言

一、流程控制簡介

  • 順序

    • 定義:語句逐句執行
  • 選擇

    • 定義:出現了一種以上的情況
  • 循環

    • 定義:在某個條件成立的前提下,重複執行某個動作
  • 關鍵詞

    • 選擇:if-else、switch-case
    • 循環:while、do-while、for、if-goto
    • 輔助控制:continue、break

二、語法詳解

1)if-else

  • 格式
if(exp)
	cmd1;//如果成立執行cmd1
else
    cmd2;//如果不成立執行cmd2
  • 案例1
#include "stdio.h"
#include "stdlib.h"

int main()
{
	int a = 9,b = 10;
    
    if(b++ < a)
        printf("1\n");
    else 
        printf("0\n");
	printf("a = %d,b = %d\n",a,b);//b比a大所以打印“0"",判斷完成後b自加1爲11,a不變
    exit(0);
}
  • 結果

image-20200613204548366

  • 案例2:else與離得最近的if相匹配
#include "stdio.h"
#include "stdlib.h"

int main()
{
	int a = 1,b = 1,c = 2;
    
    if(a==b)
        if(b == c)
    	printf("a == b ==c\n");//a等於b,但不等於c,
    else
        printf("a != b");
    exit(0);
}
//結果:a != b
//else與離得最近的if相匹配
  • 結果

image-20200613204620804

  • 案例3:成績判斷
#include "stdio.h"
#include "stdlib.h"
/*	score	[90-100]	A
 *			[80-90]		B
 *			[70-80]		C
 *			[60-70]		D
 * 			[0-60]		E
 **/
int main()
{
    int score;
    
    printf("Enter a score:[0,100]:");//顯示提示信息
    scanf("%d",&score);
    
    if(score < 0 || score > 100)
    {
    	fprintf(stderr,"Input error!\n");
        exit(1);
    }
    
    /*判斷方式一
    if(score > 90)
        puts("A");
    else if(score > 80)
        puts("B");
    	else if(score > 70)
        	puts("C");
    		else if(score > 60)
        		puts("D");
    			else
        			puts("E");
    */

    
    /*判斷方式二
    if(score <= 100 || score >= 90)
    	puts("A");
	if(score < 90 || score >= 80)
    	puts("B");
    if(score < 80 || score >= 70)
    	puts("C");
    if(score < 70 || score >= 60)
  	puts("D");
    if(score < 60 || score >= 0)
    	puts("E");
    */
    
    exit(0);
}
  • 結果

image-20200613204832783

  • 案例4:閏年判斷
#include "stdio.h"
#include "stdlib.h"
/*	當前年份能被4整除但不能被100整除,或者能被400整除
 **/
int main()
{
    int year;
    
    printf("please enter year:\n");
    scanf("%d",&year);
    
    if((year % 4 == 0 ) && (year % 100 != 0) || (year %400 == 0))
        printf("%d is leap year.\n",year);
    else
        printf("%d is not leap year.\n",year);
    exit(0);
}
  • 結果

image-20200613204904092

2)switch-case

  • 格式
switch(exp)
{
    case 常量或常量表達式:
        break;
    case 常量或常量表達式;
        break;
    ......    
    default:
}
  • 案例1
#include "stdio.h"
#include "stdlib.h"

int main()
{
    int score;
    
    printf("Please enter:");
    scanf("%d",&score);
    
    if(score < 0 || score > 100)
    {
        fprintf(stderr,"EINVAL\n");
        exit(1);
    }
    
    switch(score/10)
    {
        case 10:
        case 9:
            puts("A");
            break;
        case 8:
            puts("B");
            break;
        case 7:
            puts("C");
            break;
        case 6:
            puts("D");
            break;
        case 5:
        case 4:
        case 3:
        case 2:
        case 1:
        case 0:
            puts("E");
            break;
        default:
            break;
    }
	exit(0);
}
  • 結果

image-20200613205058159

  • 案例2
#include "stdio.h"
#include "stdlib.h"

int main()
{
	int ch;
    ch = getchar();
    
    switch(ch)
    {
        case 'a':
        case 'A':
            printf("Ant:a small insect that lives in group.\n");
        case 'b':
        case 'B':
            printf("Butterfly:a flying insect with a long thin body.\n");
        case 'c':
        case 'C':
            printf("Cobra:a highly dangerius snake.\n");
        case 'd':
        case 'D':
            printf("Donkey:a animal with short legs.\n");
            
        default:
            printf("Input error!/n");
            break;
    }
}
//沒有break程序不會跳出選擇,而是繼續執行之後的語句
  • 結果

image-20200613205219515

3)while(最少執行0次)

  • 格式
  while(exp)
  	loop;//判斷是否成立,成立運行循環體
  • 案例1:1-100的和
  #include "stdio.h"
  #include "stdlib.h"
  #define LEFT	1
  #define RIGHT	100
  
  int main()
  {
      int i;
      int sum = 0;
      
      i = LEFT;
      while(i <= RIGHT)
      {
      	sum += i;
          i++;
      }
      printf("sum = %d\n",sum);
  	exit(0);
  }
  • 結果

image-20200613205346926

  • 案例2
  #include "stdio.h"
  #include "stdlib.h"
  #define LEFT	1
  #define RIGHT	100
  int main()
  {
      int start,end = 10;
      int sum = 0;
      
      printf("please enter start number:")
      scanf("%d",&start)
          
      while(start <= end)
      {
          sum += start;
          start++;
      }
      
      printf("start = %d\n",start);
      printf("sum = %d\n",sum);
  	exit(0);
  }
  //輸入:9
  //輸出:start = 11
  //	   sum = 19
  //輸入:20
  //輸出:start = 20
  //	   sum = 0
  • 結果

image-20200613205609307

image-20200613205637690

4)do-while(最少執行1次)

  • 格式
do
{
	loop;
}while(exp);
  • 案例1:1-100的和
#include "stdio.h"
#include "stdlib.h"
#define LEFT	1
#define RIGHT	100

int main()
{
    int i;
    int sum = 0;
    
    i = LEFT;
    
    do
    {
        sum += 1;
        i++;
    }while(i <= RIGHT)
    printf("sum = %d\n",sum);

    exit(0);
}
//結果:5050
  • 結果

image-20200613205928114

  • 案例2
#include "stdio.h"
#include "stdlib.h"
#define LEFT	1
#define RIGHT	100
int main()
{
    int start,end = 10;
    int sum = 0;
    
    printf("please enter start number:")
    scanf("%d",&start)
        
    do
    {
        sum += start;
        start++;
    }while(start <= end);
    
    printf("start = %d\n",start);
    printf("sum = %d\n",sum);
	exit(0);
}
//輸入:9
//輸出:start = 11
//	   sum = 19
//輸入:20
//輸出:start = 21
//	   sum = 20
  • 結果

image-20200613210038298

image-20200613210055764

5)for(最少循環次數爲0次)

  • 格式
for(exp1;exp2;exp3)
    loop;//執行完exp1,判斷exp2是否成立,成立執行exp3進入循環
		//執行完exp1,判斷exp2是否成立,不成立退出循環
  • 案例1:1-100的和
#include "stdio.h"
#include "stdlib.h"
#define LEFT	1
#define RIGHT	100
int main()
{
    int i;
    int start,end = 10;
    int sum = 0;
    
    for(i = LEFT;i <= RIGHT;i++)
    {
        sum += i;
    }
    
    printf("sum = %d\n",sum);
}
//結果:5050
#include "stdio.h"
#include "stdlib.h"
#define LEFT	1
#define RIGHT	100
int main()
{
    int i;
    int start,end = 10;
    int sum = 0;
    
    i =LEFT;
    
    for( ; ; )
    {
        sum += i;
        i++;
        if(i > RIGHT)
        	break;
    }
    
    printf("sum = %d\n",sum);
}
//結果:5050

6)if-goto(慎用:goto實現無條件的跳轉,不能實現跨函數跳轉)

  • 案例1
#include "stdio.h"
#include "stdlib.h"
#define LEFT	1
#define RIGHT	100
int main()
{
    int i;
    int start,end = 10;
    int sum = 0;
    
    i =LEFT;

loop:    
    sum += i;
    i++;
    
    if(i <= RIGHT)
        goto loop;

    
    printf("sum = %d\n",sum);
}
//結果:5050

7)死循環

  • while(1);
  • for(;😉;

三、練習

1)A以10%的單利息投資了100美元,B以每年5%的複合利息投資了100美元。編寫程序計算需要多少年B的投資總額才能超過A的,並且顯示出到那個時刻爲止兩個人的各自的資產總額是多少

#include "stdio.h"
#include "stdlib.h"
#define INIT	100
#define SIMP	0.10
#define MULT	0.05

static void test1(void)
{	
    int year = 0;
    double suma = INIT,sumb = INIT;
    
    while(sumb <= suma)
    {
        suma += INIT * SIMP;
        sumb += MULT * sumb;
        year ++;
    }
    printf("year = %d\n",year);
    printf("suma = %f\tsumb = %f\n",suma,sumb);
}

int main()
{
    test1();
    exit(0);
}
  • 結果

image-20200613210326866

2)從終端讀入數據,直到輸入0值爲止,計算出其中的偶數的個數及平均值和奇數的個數及平均值

#include "stdio.h"
#include "stdlib.h"

static void test2(void)
{
    int n;
    int ct_odd = 0,ct_even = 0;
    double sum_odd = 0,sum_even = 0;
    
    while(scanf("%d",&n) == 1 && n != 0)
    {
        if(n % 2 ==1)
        {
            ct_odd ++;
            sum_odd += n;
        }
        else
        {
            ct_even ++;
            sum_even += n;
        }
    }
    printf("odd:%d,AVE:%f\n",ct_odd,sum_odd/ct_odd);
    printf("even:%d,AVE:%f\n",ct_even,sum_even/ct_even);
}

int main()
{
    test2();
    exit(0);
}
  • 結果

image-20200613210419634

3)從終端輸入若干個字符,對其中的元音字母進行統計

#include "stdio.h"
#include "stdlib.h"

static void test3(void)
{
    int ct_a = 0,ct_e = 0,ct_i = 0,ct_o = 0,ct_u = 0;
    int ch;
    while((ch = getchar()) != '#')
    {
        switch(ch)
        {
            case 'a':
            case 'A':
                ct_a ++;
                break;
            case 'e':
            case 'E':
                ct_e ++;
                break;
            case 'i':
            case 'I':
                ct_i ++;
                break;
            case 'o':
            case 'O':
                ct_o ++;
                break;
            case 'u':
            case 'U':
                ct_u ++;
                break;
        }
    }
    printf("%d %d %d %d %d\n",ct_a,ct_e,ct_i,ct_o,ct_u);
}

int main()
{
    test3();
    exit(0);
}
  • 結果

image-20200613210740289

4)斐波那契數列的前四十項(不能用數組實現)

#include "stdio.h"
#include "stdlib.h"

static void test4(void)
{
    long int f1 = 1,f2 = 1;
    int i;
    for(i = 1;i <= 20;i++)
    {
        printf("%12ld %12ld",f1,f2);
        if(i % 2 == 0)
            printf("\n")
        f1 += f2;
        f2 += f1;
    }
}

int main()
{
    test4();
    exit(0);
}
  • 結果

image-20200613210822676

5)輸出九九乘法表

#include "stdio.h"
#include "stdlib.h"

static void test5(void)
{
    int i,j;
    for(i = 1;i < 10;i++)
    {
        for(j = 1;j < 10;j++)
        {
			if(j == 9)
				printf("%d*%d=%d\n",i,j,i*j);
			else
				printf("%d*%d=%d\t",i,j,i*j);
        }
    }
}

int main()
{
    test5();
    exit(0);
}
  • 結果

image-20200613211538640

6)雞翁一,值錢五;雞母一,值錢三;三雛雞,值錢一,百錢買百雞,問雞翁、雞母、雛雞各幾何?

#include "stdio.h"
#include "stdlib.h"

static void test6(void)
{
    int i,j,k;
    
    for(i = 0;i < 100/5;i++)
    {
        for(j = 0;j < 100/3;j++)
        {
            k = 100 - i -j;
            if(k % 3 == 0 && 5*i+3*j+k/3 == 100 )
            {
                printf("%d %d %d\n",i,j,k);
            }
        }
    }
}

int main()
{
    test6();
    exit(0);
}
  • 結果

image-20200613211638640

7)求出1000以內的水仙花數:153=1+125+27

#include "stdio.h"
#include "stdlib.h"

static void test7(void)
{
    int i;
    int a,b,c;
    
    for(i = 100;i < 1000;i++)
    {
        a = i/100;
        b = i%100/10;
        c = i%10;
        if(i == a*a*a + b*b*b + c*c*c)
            printf("%d\n",i);
    }
}

int main()
{
    test7();
    exit(0);
}
  • 結果

image-20200613211658839

8)求出1000以內的所有的質數:2、3、5、7、11、13、17、19…

#include "stdio.h"
#include "stdlib.h"

static void test8(void)
{
    int i,j,mark;
    
    for(i = 2;i <= 1000;i++)
    {
        mark = 1;
        for(j = 2;j <= i/2;j++)
        {
            if(i %j == 0)
            {
                mark = 0;
                break;
            }
        }
        if(mark)
            printf("%d is a prime\n",i);
    }
}

int main()
{
    test8();
    exit(0);
}

9)在終端上實現如下結果:

ABCDEF
BCDEF
CDEF
DEF
EF
F
#include "stdio.h"
#include "stdlib.h"

static void test9(void)
{
    int line = 6,i,chars = 6;
    char ch;
    
    for(i = 0;i < line;i++)
    {
        for(ch = 'A'+i;ch < 'A'+chars;ch++)
        {
            printf("%c",ch);
        }
        printf("\n");
    }
}

int main()
{
    test9();
    exit(0);
}
  • 結果

image-20200613211741659

10)從終端輸入N個數(以字母Q/q作爲終止),求和

#include "stdio.h"
#include "stdlib.h"

static void test10()
{
    int num;
    int sum = 0;
    
    printf("please enter the first integet(q to quit):");
    while(scanf("%d",&num) == 1)
    {
        sum += num;
        printf("please enter the next integet(q to quit):");
    }
    printf("sum = %d\n",sum);
}

int main()
{
    test10();
    exit(0);
}
  • 結果

image-20200613211825577

11)從半徑爲1開始,輸出圓的面積,直到面積大於100爲止

#include "stdio.h"
#include "stdlib.h"
#define	PI 3.14
static void test11()
{
    int r;
    float area=0;
    
    for(r = 1; ; r++)
    {
        area = PI * r * r;
        if(area > 100)
            break;
        printf("area = %f\n",area);
    }
}

int main()
{
    test11();
    exit(0);
}
  • 結果

image-20200613211848528

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章